tint/resolver: Fix NPE in CollectTextureSamplerPairs()
Fixed: tint:1715 Change-Id: Ie46d1348e44c4719ef318e7d18393713148338d7 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/105620 Auto-Submit: Ben Clayton <bclayton@google.com> Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Commit-Queue: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
4fe330fff4
commit
92264f8bb2
|
@ -2091,14 +2091,16 @@ void Resolver::CollectTextureSamplerPairs(const sem::Builtin* builtin,
|
|||
if (texture_index == -1) {
|
||||
TINT_ICE(Resolver, diagnostics_) << "texture builtin without texture parameter";
|
||||
}
|
||||
auto* texture = args[static_cast<size_t>(texture_index)]->As<sem::VariableUser>()->Variable();
|
||||
if (!texture->Type()->UnwrapRef()->Is<sem::StorageTexture>()) {
|
||||
int sampler_index = signature.IndexOf(sem::ParameterUsage::kSampler);
|
||||
const sem::Variable* sampler =
|
||||
sampler_index != -1
|
||||
? args[static_cast<size_t>(sampler_index)]->As<sem::VariableUser>()->Variable()
|
||||
: nullptr;
|
||||
current_function_->AddTextureSamplerPair(texture, sampler);
|
||||
if (auto* user = args[static_cast<size_t>(texture_index)]->As<sem::VariableUser>()) {
|
||||
auto* texture = user->Variable();
|
||||
if (!texture->Type()->UnwrapRef()->Is<sem::StorageTexture>()) {
|
||||
int sampler_index = signature.IndexOf(sem::ParameterUsage::kSampler);
|
||||
const sem::Variable* sampler =
|
||||
sampler_index != -1
|
||||
? args[static_cast<size_t>(sampler_index)]->As<sem::VariableUser>()->Variable()
|
||||
: nullptr;
|
||||
current_function_->AddTextureSamplerPair(texture, sampler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2212,6 +2212,51 @@ TEST_F(ResolverTest, TextureSampler_TextureDimensions) {
|
|||
EXPECT_TRUE(pairs[0].second == nullptr);
|
||||
}
|
||||
|
||||
TEST_F(ResolverTest, TextureSampler_Bug1715) { // crbug.com/tint/1715
|
||||
// @binding(0) @group(0) var s: sampler;
|
||||
// @binding(1) @group(0) var t: texture_2d<f32>;
|
||||
// @binding(2) @group(0) var<uniform> c: vec2<f32>;
|
||||
//
|
||||
// @fragment
|
||||
// fn main() -> @location(0) vec4<f32> {
|
||||
// return helper(&s, &t);
|
||||
// }
|
||||
//
|
||||
// fn helper(sl: ptr<function, sampler>, tl: ptr<function, texture_2d<f32>>) -> vec4<f32> {
|
||||
// return textureSampleLevel(*tl, *sl, c, 0.0);
|
||||
// }
|
||||
GlobalVar("s", ty.sampler(ast::SamplerKind::kSampler), Group(0_a), Binding(0_a));
|
||||
GlobalVar("t", ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()), Group(0_a),
|
||||
Binding(1_a));
|
||||
GlobalVar("c", ty.vec2<f32>(), ast::AddressSpace::kUniform, Group(0_a), Binding(2_a));
|
||||
|
||||
Func("main", utils::Empty, ty.vec4<f32>(),
|
||||
utils::Vector{
|
||||
Return(Call("helper", AddressOf("s"), AddressOf("t"))),
|
||||
},
|
||||
utils::Vector{
|
||||
Stage(ast::PipelineStage::kFragment),
|
||||
},
|
||||
utils::Vector{
|
||||
Location(0_u),
|
||||
});
|
||||
|
||||
Func("helper",
|
||||
utils::Vector{
|
||||
Param("sl", ty.pointer(ty.sampler(ast::SamplerKind::kSampler),
|
||||
ast::AddressSpace::kFunction)),
|
||||
Param("tl", ty.pointer(ty.sampled_texture(ast::TextureDimension::k2d, ty.f32()),
|
||||
ast::AddressSpace::kFunction)),
|
||||
},
|
||||
ty.vec4<f32>(),
|
||||
utils::Vector{
|
||||
Return(Call("textureSampleLevel", Deref("tl"), Deref("sl"), "c", 0.0_a)),
|
||||
});
|
||||
|
||||
ASSERT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(r()->error(), "error: cannot take the address of expression in handle address space");
|
||||
}
|
||||
|
||||
TEST_F(ResolverTest, ModuleDependencyOrderedDeclarations) {
|
||||
auto* f0 = Func("f0", utils::Empty, ty.void_(), utils::Empty);
|
||||
auto* v0 = GlobalVar("v0", ty.i32(), ast::AddressSpace::kPrivate);
|
||||
|
|
Loading…
Reference in New Issue