spirv-reader: support OpImageQuerySamples
Bug: tint:109 Change-Id: I1a7677c9322f5f2f01d6bf436222b58ab9bdbf95 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/39721 Commit-Queue: David Neto <dneto@google.com> Auto-Submit: David Neto <dneto@google.com> Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
parent
90da745fbd
commit
f2d687137c
|
@ -4408,9 +4408,13 @@ bool FunctionEmitter::EmitImageQuery(const spvtools::opt::Instruction& inst) {
|
||||||
return Fail() << "WGSL does not support querying the level of detail of "
|
return Fail() << "WGSL does not support querying the level of detail of "
|
||||||
"an image: "
|
"an image: "
|
||||||
<< inst.PrettyPrint();
|
<< inst.PrettyPrint();
|
||||||
case SpvOpImageQueryLevels: {
|
case SpvOpImageQueryLevels:
|
||||||
|
case SpvOpImageQuerySamples: {
|
||||||
|
const auto* name = (opcode == SpvOpImageQueryLevels)
|
||||||
|
? "textureNumLevels"
|
||||||
|
: "textureNumSamples";
|
||||||
auto* levels_ident = create<ast::IdentifierExpression>(
|
auto* levels_ident = create<ast::IdentifierExpression>(
|
||||||
Source{}, builder_.Symbols().Register("textureNumLevels"));
|
Source{}, builder_.Symbols().Register(name));
|
||||||
ast::Expression* ast_expr = create<ast::CallExpression>(
|
ast::Expression* ast_expr = create<ast::CallExpression>(
|
||||||
Source{}, levels_ident,
|
Source{}, levels_ident,
|
||||||
ast::ExpressionList{GetImageExpression(inst)});
|
ast::ExpressionList{GetImageExpression(inst)});
|
||||||
|
@ -4424,7 +4428,6 @@ bool FunctionEmitter::EmitImageQuery(const spvtools::opt::Instruction& inst) {
|
||||||
TypedExpression expr{result_type, ast_expr};
|
TypedExpression expr{result_type, ast_expr};
|
||||||
return EmitConstDefOrWriteToHoistedVar(inst, expr);
|
return EmitConstDefOrWriteToHoistedVar(inst, expr);
|
||||||
}
|
}
|
||||||
case SpvOpImageQuerySamples: // TODO(dneto)
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4693,6 +4693,129 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
}
|
}
|
||||||
})"}}));
|
})"}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
ImageQuerySamples_SignedResult,
|
||||||
|
SpvParserTest_SampledImageAccessTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
|
// Multsample 2D
|
||||||
|
{"%float 2D 0 0 1 1 Unknown", "%99 = OpImageQuerySamples %int %im\n",
|
||||||
|
R"(Variable{
|
||||||
|
Decorations{
|
||||||
|
GroupDecoration{2}
|
||||||
|
BindingDecoration{1}
|
||||||
|
}
|
||||||
|
x_20
|
||||||
|
uniform_constant
|
||||||
|
__multisampled_texture_2d__f32
|
||||||
|
})",
|
||||||
|
R"(VariableDeclStatement{
|
||||||
|
VariableConst{
|
||||||
|
x_99
|
||||||
|
none
|
||||||
|
__i32
|
||||||
|
{
|
||||||
|
Call[not set]{
|
||||||
|
Identifier[not set]{textureNumSamples}
|
||||||
|
(
|
||||||
|
Identifier[not set]{x_20}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})"},
|
||||||
|
|
||||||
|
// Multisample 2D array
|
||||||
|
{"%float 2D 0 1 1 1 Unknown", "%99 = OpImageQuerySamples %int %im\n",
|
||||||
|
R"(Variable{
|
||||||
|
Decorations{
|
||||||
|
GroupDecoration{2}
|
||||||
|
BindingDecoration{1}
|
||||||
|
}
|
||||||
|
x_20
|
||||||
|
uniform_constant
|
||||||
|
__multisampled_texture_2d_array__f32
|
||||||
|
})",
|
||||||
|
R"(VariableDeclStatement{
|
||||||
|
VariableConst{
|
||||||
|
x_99
|
||||||
|
none
|
||||||
|
__i32
|
||||||
|
{
|
||||||
|
Call[not set]{
|
||||||
|
Identifier[not set]{textureNumSamples}
|
||||||
|
(
|
||||||
|
Identifier[not set]{x_20}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})"}}));
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
// Translation must inject a type coersion from signed to unsigned.
|
||||||
|
ImageQuerySamples_UnsignedResult,
|
||||||
|
SpvParserTest_SampledImageAccessTest,
|
||||||
|
::testing::ValuesIn(std::vector<ImageAccessCase>{
|
||||||
|
// Multsample 2D
|
||||||
|
{"%float 2D 0 0 1 1 Unknown", "%99 = OpImageQuerySamples %uint %im\n",
|
||||||
|
R"(Variable{
|
||||||
|
Decorations{
|
||||||
|
GroupDecoration{2}
|
||||||
|
BindingDecoration{1}
|
||||||
|
}
|
||||||
|
x_20
|
||||||
|
uniform_constant
|
||||||
|
__multisampled_texture_2d__f32
|
||||||
|
})",
|
||||||
|
R"(VariableDeclStatement{
|
||||||
|
VariableConst{
|
||||||
|
x_99
|
||||||
|
none
|
||||||
|
__u32
|
||||||
|
{
|
||||||
|
TypeConstructor[not set]{
|
||||||
|
__u32
|
||||||
|
Call[not set]{
|
||||||
|
Identifier[not set]{textureNumSamples}
|
||||||
|
(
|
||||||
|
Identifier[not set]{x_20}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})"},
|
||||||
|
|
||||||
|
// Multisample 2D array
|
||||||
|
{"%float 2D 0 1 1 1 Unknown", "%99 = OpImageQuerySamples %uint %im\n",
|
||||||
|
R"(Variable{
|
||||||
|
Decorations{
|
||||||
|
GroupDecoration{2}
|
||||||
|
BindingDecoration{1}
|
||||||
|
}
|
||||||
|
x_20
|
||||||
|
uniform_constant
|
||||||
|
__multisampled_texture_2d_array__f32
|
||||||
|
})",
|
||||||
|
R"(VariableDeclStatement{
|
||||||
|
VariableConst{
|
||||||
|
x_99
|
||||||
|
none
|
||||||
|
__u32
|
||||||
|
{
|
||||||
|
TypeConstructor[not set]{
|
||||||
|
__u32
|
||||||
|
Call[not set]{
|
||||||
|
Identifier[not set]{textureNumSamples}
|
||||||
|
(
|
||||||
|
Identifier[not set]{x_20}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})"}}));
|
||||||
|
|
||||||
struct ImageCoordsCase {
|
struct ImageCoordsCase {
|
||||||
// SPIR-V image type, excluding result ID and opcode
|
// SPIR-V image type, excluding result ID and opcode
|
||||||
std::string spirv_image_type_details;
|
std::string spirv_image_type_details;
|
||||||
|
|
Loading…
Reference in New Issue