spirv-writer: Add SampledCubeArray cap when needed
Fixed: tint:371
Change-Id: I13f568725370f446f154af26c326edfd4abec3c8
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34003
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 2681e9a..f87eb8f 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2479,7 +2479,7 @@
bool Builder::GenerateTextureType(ast::type::TextureType* texture,
const Operand& result) {
uint32_t array_literal = 0u;
- auto dim = texture->dim();
+ const auto dim = texture->dim();
if (dim == ast::type::TextureDimension::k1dArray ||
dim == ast::type::TextureDimension::k2dArray ||
dim == ast::type::TextureDimension::kCubeArray) {
@@ -2520,6 +2520,12 @@
sampled_literal = 1u;
}
+ if (dim == ast::type::TextureDimension::kCubeArray) {
+ if (texture->IsSampled() || texture->IsDepth()) {
+ push_capability(SpvCapabilitySampledCubeArray);
+ }
+ }
+
uint32_t type_id = 0u;
if (texture->IsDepth()) {
ast::type::F32Type f32;
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index d7403ba..f72120d 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -665,6 +665,7 @@
EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
%1 = OpTypeImage %2 Cube 1 0 0 1 Unknown
)");
+ EXPECT_EQ(DumpInstructions(b.capabilities()), "");
}
TEST_F(BuilderTest_Type, DepthTexture_Generate_CubeArray) {
@@ -678,6 +679,9 @@
EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
%1 = OpTypeImage %2 Cube 1 1 0 1 Unknown
)");
+ EXPECT_EQ(DumpInstructions(b.capabilities()),
+ R"(OpCapability SampledCubeArray
+)");
}
TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_i32) {
@@ -825,6 +829,7 @@
R"(%2 = OpTypeFloat 32
%1 = OpTypeImage %2 Cube 0 0 0 1 Unknown
)");
+ EXPECT_EQ(DumpInstructions(b.capabilities()), "");
}
TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) {
@@ -838,6 +843,9 @@
R"(%2 = OpTypeFloat 32
%1 = OpTypeImage %2 Cube 0 1 0 1 Unknown
)");
+ EXPECT_EQ(DumpInstructions(b.capabilities()),
+ R"(OpCapability SampledCubeArray
+)");
}
TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_1d_R16Float) {