spirv-reader: support textureLoad

Both OpImageRead and OpImageFetch map to WGSL textureLoad.

Bug: tint:109
Change-Id: I3c99840c2e62c52dcaaf7177773a3c972de90cc1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34425
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: David Neto <dneto@google.com>
This commit is contained in:
David Neto 2020-12-01 20:37:37 +00:00 committed by Commit Bot service account
parent 91ad3961df
commit 782f6a5e3e
2 changed files with 130 additions and 0 deletions

View File

@ -3719,6 +3719,14 @@ bool FunctionEmitter::EmitImageAccess(const spvtools::opt::Instruction& inst) {
return Fail() << " image gather is not yet supported"; return Fail() << " image gather is not yet supported";
case SpvOpImageQueryLod: case SpvOpImageQueryLod:
return Fail() << " image query Lod is not yet supported"; return Fail() << " image query Lod is not yet supported";
case SpvOpImageFetch:
// Read a single texel from a sampled image.
builtin_name = "textureLoad";
break;
case SpvOpImageRead:
// Read a single texel from a storage image.
builtin_name = "textureLoad";
break;
case SpvOpImageWrite: case SpvOpImageWrite:
builtin_name = "textureStore"; builtin_name = "textureStore";
if (arg_index < num_args) { if (arg_index < num_args) {

View File

@ -2823,6 +2823,128 @@ INSTANTIATE_TEST_SUITE_P(
) )
})"}})); })"}}));
INSTANTIATE_TEST_SUITE_P(
ImageRead_OptionalParams,
SpvParserTest_ImageAccessTest,
::testing::ValuesIn(std::vector<ImageAccessCase>{
// OpImageRead with no extra params
{"%float 2D 0 0 0 2 Rgba32f", "%99 = OpImageRead %v4float %im %vu12",
R"(DecoratedVariable{
Decorations{
SetDecoration{2}
BindingDecoration{1}
}
x_20
uniform_constant
__storage_texture_read_only_2d_rgba32float
})",
R"(VariableDeclStatement{
VariableConst{
x_99
none
__vec_4__f32
{
Call[not set]{
Identifier[not set]{textureLoad}
(
Identifier[not set]{x_20}
Identifier[not set]{vu12}
)
}
}
}
})"},
// OpImageRead with ConstOffset
{"%float 2D 0 0 0 2 Rgba32f",
"%99 = OpImageRead %v4float %im %vu12 ConstOffset %offsets2d",
R"(DecoratedVariable{
Decorations{
SetDecoration{2}
BindingDecoration{1}
}
x_20
uniform_constant
__storage_texture_read_only_2d_rgba32float
})",
R"(VariableDeclStatement{
VariableConst{
x_99
none
__vec_4__f32
{
Call[not set]{
Identifier[not set]{textureLoad}
(
Identifier[not set]{x_20}
Identifier[not set]{vu12}
Identifier[not set]{offsets2d}
)
}
}
}
})"}}));
INSTANTIATE_TEST_SUITE_P(
ImageFetch_OptionalParams,
SpvParserTest_ImageAccessTest,
::testing::ValuesIn(std::vector<ImageAccessCase>{
// OpImageFetch with no extra params
{"%float 2D 0 0 0 1 Rgba32f", "%99 = OpImageFetch %v4float %im %vu12",
R"(DecoratedVariable{
Decorations{
SetDecoration{2}
BindingDecoration{1}
}
x_20
uniform_constant
__sampled_texture_2d__f32
})",
R"(VariableDeclStatement{
VariableConst{
x_99
none
__vec_4__f32
{
Call[not set]{
Identifier[not set]{textureLoad}
(
Identifier[not set]{x_20}
Identifier[not set]{vu12}
)
}
}
}
})"},
// OpImageFetch with ConstOffset
{"%float 2D 0 0 0 1 Rgba32f",
"%99 = OpImageFetch %v4float %im %vu12 ConstOffset %offsets2d",
R"(DecoratedVariable{
Decorations{
SetDecoration{2}
BindingDecoration{1}
}
x_20
uniform_constant
__sampled_texture_2d__f32
})",
R"(VariableDeclStatement{
VariableConst{
x_99
none
__vec_4__f32
{
Call[not set]{
Identifier[not set]{textureLoad}
(
Identifier[not set]{x_20}
Identifier[not set]{vu12}
Identifier[not set]{offsets2d}
)
}
}
}
})"}}));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
// The SPIR-V result type could be integral but of different signedness // The SPIR-V result type could be integral but of different signedness
// than the sampled texel type. In these cases the result should be // than the sampled texel type. In these cases the result should be