@@ -347,6 +347,7 @@ TEST_F(DescriptorTypeTest, StorageImage) {
347347 EXPECT_FALSE (type->IsVulkanStorageTexelBuffer ());
348348 EXPECT_FALSE (type->IsVulkanStorageBuffer ());
349349 EXPECT_FALSE (type->IsVulkanUniformBuffer ());
350+ EXPECT_FALSE (type->IsVulkanReadOnlyStorageBuffer ());
350351
351352 Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
352353 EXPECT_FALSE (variable->IsReadOnlyPointer ());
@@ -387,6 +388,7 @@ TEST_F(DescriptorTypeTest, SampledImage) {
387388 EXPECT_FALSE (type->IsVulkanStorageTexelBuffer ());
388389 EXPECT_FALSE (type->IsVulkanStorageBuffer ());
389390 EXPECT_FALSE (type->IsVulkanUniformBuffer ());
391+ EXPECT_FALSE (type->IsVulkanReadOnlyStorageBuffer ());
390392
391393 Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
392394 EXPECT_TRUE (variable->IsReadOnlyPointer ());
@@ -427,6 +429,7 @@ TEST_F(DescriptorTypeTest, StorageTexelBuffer) {
427429 EXPECT_TRUE (type->IsVulkanStorageTexelBuffer ());
428430 EXPECT_FALSE (type->IsVulkanStorageBuffer ());
429431 EXPECT_FALSE (type->IsVulkanUniformBuffer ());
432+ EXPECT_FALSE (type->IsVulkanReadOnlyStorageBuffer ());
430433
431434 Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
432435 EXPECT_FALSE (variable->IsReadOnlyPointer ());
@@ -470,6 +473,7 @@ TEST_F(DescriptorTypeTest, StorageBuffer) {
470473 EXPECT_FALSE (type->IsVulkanStorageTexelBuffer ());
471474 EXPECT_TRUE (type->IsVulkanStorageBuffer ());
472475 EXPECT_FALSE (type->IsVulkanUniformBuffer ());
476+ EXPECT_FALSE (type->IsVulkanReadOnlyStorageBuffer ());
473477
474478 Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
475479 EXPECT_FALSE (variable->IsReadOnlyPointer ());
@@ -478,6 +482,51 @@ TEST_F(DescriptorTypeTest, StorageBuffer) {
478482 EXPECT_FALSE (object_copy->IsReadOnlyPointer ());
479483}
480484
485+ TEST_F (DescriptorTypeTest, ReadOnlyStorageBuffer) {
486+ const std::string text = R"(
487+ OpCapability Shader
488+ %1 = OpExtInstImport "GLSL.std.450"
489+ OpMemoryModel Logical GLSL450
490+ OpEntryPoint Fragment %2 "main"
491+ OpExecutionMode %2 OriginUpperLeft
492+ OpSource GLSL 430
493+ OpName %3 "myStorageImage"
494+ OpDecorate %3 DescriptorSet 0
495+ OpDecorate %3 Binding 0
496+ OpDecorate %9 BufferBlock
497+ OpDecorate %9 NonWritable
498+ %4 = OpTypeVoid
499+ %5 = OpTypeFunction %4
500+ %6 = OpTypeFloat 32
501+ %7 = OpTypeVector %6 4
502+ %8 = OpTypeRuntimeArray %7
503+ %9 = OpTypeStruct %8
504+ %10 = OpTypePointer Uniform %9
505+ %3 = OpVariable %10 Uniform
506+ %2 = OpFunction %4 None %5
507+ %11 = OpLabel
508+ %12 = OpCopyObject %8 %3
509+ OpReturn
510+ OpFunctionEnd
511+ )" ;
512+
513+ std::unique_ptr<IRContext> context =
514+ BuildModule (SPV_ENV_UNIVERSAL_1_2, nullptr , text);
515+ Instruction* type = context->get_def_use_mgr ()->GetDef (10 );
516+ EXPECT_FALSE (type->IsVulkanStorageImage ());
517+ EXPECT_FALSE (type->IsVulkanSampledImage ());
518+ EXPECT_FALSE (type->IsVulkanStorageTexelBuffer ());
519+ EXPECT_TRUE (type->IsVulkanStorageBuffer ());
520+ EXPECT_FALSE (type->IsVulkanUniformBuffer ());
521+ EXPECT_TRUE (type->IsVulkanReadOnlyStorageBuffer ());
522+
523+ Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
524+ EXPECT_TRUE (variable->IsReadOnlyPointer ());
525+
526+ Instruction* object_copy = context->get_def_use_mgr ()->GetDef (12 );
527+ EXPECT_FALSE (object_copy->IsReadOnlyPointer ());
528+ }
529+
481530TEST_F (DescriptorTypeTest, UniformBuffer) {
482531 const std::string text = R"(
483532 OpCapability Shader
@@ -513,6 +562,7 @@ TEST_F(DescriptorTypeTest, UniformBuffer) {
513562 EXPECT_FALSE (type->IsVulkanStorageTexelBuffer ());
514563 EXPECT_FALSE (type->IsVulkanStorageBuffer ());
515564 EXPECT_TRUE (type->IsVulkanUniformBuffer ());
565+ EXPECT_FALSE (type->IsVulkanReadOnlyStorageBuffer ());
516566
517567 Instruction* variable = context->get_def_use_mgr ()->GetDef (3 );
518568 EXPECT_TRUE (variable->IsReadOnlyPointer ());
0 commit comments