spirv-reader: ImageQuerySize can be on readonly image
Fix how handle usage is collected. OpImageQuerySize
is usable for *any* image that is either MS=1 or Sampled=0 or 2.
(Sampled=0 is not allowed by Vulkan).
So it's usable by storage images or multisampled image.
OpImageQuerySizeLod is usable by Sampled=1 MS=0 images, ie. sampled
images.
Fixed: tint:422
Change-Id: Ibfbcab2daa8b38f17758a0428a08cb9660496bac
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36061
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 5ceea7b..3cb8646 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -2087,9 +2087,12 @@
// Image queries
case SpvOpImageQuerySizeLod:
+ // Vulkan requires Sampled=1 for this. SPIR-V already requires MS=0.
+ handle_usage_[get_image(inst)].AddSampledTexture();
+ break;
case SpvOpImageQuerySize:
- // Applies to NonReadable, and hence a write-only storage image
- handle_usage_[get_image(inst)].AddStorageWriteTexture();
+ // Applies to either MS=1 or Sampled=0 or 2.
+ // So we can't force it to be multisampled, or storage image.
break;
case SpvOpImageQueryLod:
handle_usage_[get_image(inst)].AddSampledTexture();
diff --git a/src/reader/spirv/parser_impl_handle_test.cc b/src/reader/spirv/parser_impl_handle_test.cc
index d4ad95a..5cccc1a 100644
--- a/src/reader/spirv/parser_impl_handle_test.cc
+++ b/src/reader/spirv/parser_impl_handle_test.cc
@@ -1070,18 +1070,17 @@
// Image queries
// OpImageQuerySizeLod
- // Applies to NonReadable, hence write-only storage
UsageRawImageCase{"f_storage_2d",
"%result = OpImageQuerySizeLod "
"%v2uint %im %uint_1",
- "Usage(Texture( write ))"},
+ "Usage(Texture( is_sampled ))"},
// OpImageQuerySize
- // Applies to NonReadable, hence write-only storage
+ // Could be MS=1 or storage image. So it's non-committal.
UsageRawImageCase{"f_storage_2d",
"%result = OpImageQuerySize "
"%v2uint %im",
- "Usage(Texture( write ))"},
+ "Usage()"},
// OpImageQueryLevels
UsageRawImageCase{"f_texture_2d",