From 2067d1a93e6edc17f2a6b7e3e5138a9bbcd35ef9 Mon Sep 17 00:00:00 2001 From: David Neto Date: Wed, 7 Oct 2020 18:10:27 -0400 Subject: [PATCH] Add test case for read-only storage texture passed to helper function (#2414) This is based on spv.paramMemory.frag.out which exercises the writeonly storage image case. This appears to need desktop GLSL. The generated SPIR-V fails validation because the image_write function takes a parameter which is pointer to an OpTypeImage with Unknown format. But the parameters passed in are pointer to OpTypeImage with formats Rgba32f and Rgba16f. The validator rejects this, saying the parameter types must match. --- Test/baseResults/spv.paramMemory.420.frag.out | 139 ++++++++++++++++++ Test/spv.paramMemory.420.frag | 33 +++++ gtests/Spv.FromFile.cpp | 1 + 3 files changed, 173 insertions(+) create mode 100644 Test/baseResults/spv.paramMemory.420.frag.out create mode 100644 Test/spv.paramMemory.420.frag diff --git a/Test/baseResults/spv.paramMemory.420.frag.out b/Test/baseResults/spv.paramMemory.420.frag.out new file mode 100644 index 00000000..4cdc35f7 --- /dev/null +++ b/Test/baseResults/spv.paramMemory.420.frag.out @@ -0,0 +1,139 @@ +spv.paramMemory.420.frag +Validation failed +// Module Version 10000 +// Generated by (magic number): 8000a +// Id's are bound by 69 + + Capability Shader + Capability StorageImageReadWithoutFormat + Capability StorageImageWriteWithoutFormat + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 27 66 + ExecutionMode 4 OriginUpperLeft + Source GLSL 420 + SourceExtension "GL_EXT_shader_image_load_formatted" + Name 4 "main" + Name 16 "image_load(I21;vi2;" + Name 14 "image" + Name 15 "coords" + Name 23 "image_store(I21;vi2;vf4;" + Name 20 "image" + Name 21 "coords" + Name 22 "data" + Name 27 "in_coords" + Name 35 "read1" + Name 36 "image1" + Name 37 "param" + Name 40 "read2" + Name 41 "image2" + Name 42 "param" + Name 47 "image3" + Name 51 "param" + Name 53 "param" + Name 57 "image4" + Name 61 "param" + Name 63 "param" + Name 66 "out_color" + Decorate 14(image) Coherent + Decorate 14(image) NonWritable + Decorate 20(image) Coherent + Decorate 20(image) NonReadable + Decorate 27(in_coords) Flat + Decorate 27(in_coords) Location 0 + Decorate 36(image1) DescriptorSet 0 + Decorate 36(image1) Binding 0 + Decorate 36(image1) Coherent + Decorate 36(image1) NonWritable + Decorate 41(image2) DescriptorSet 0 + Decorate 41(image2) Binding 2 + Decorate 41(image2) NonWritable + Decorate 47(image3) DescriptorSet 0 + Decorate 47(image3) Binding 1 + Decorate 47(image3) Coherent + Decorate 47(image3) NonReadable + Decorate 57(image4) DescriptorSet 0 + Decorate 57(image4) Binding 3 + Decorate 57(image4) NonReadable + Decorate 66(out_color) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeImage 6(float) 2D nonsampled format:Unknown + 8: TypePointer UniformConstant 7 + 9: TypeInt 32 1 + 10: TypeVector 9(int) 2 + 11: TypePointer Function 10(ivec2) + 12: TypeVector 6(float) 4 + 13: TypeFunction 12(fvec4) 8(ptr) 11(ptr) + 18: TypePointer Function 12(fvec4) + 19: TypeFunction 2 8(ptr) 11(ptr) 18(ptr) + 26: TypePointer Input 10(ivec2) + 27(in_coords): 26(ptr) Variable Input + 36(image1): 8(ptr) Variable UniformConstant + 41(image2): 8(ptr) Variable UniformConstant + 45: TypeImage 6(float) 2D nonsampled format:Rgba32f + 46: TypePointer UniformConstant 45 + 47(image3): 46(ptr) Variable UniformConstant + 49: 6(float) Constant 1056964608 + 55: TypeImage 6(float) 2D nonsampled format:Rgba16f + 56: TypePointer UniformConstant 55 + 57(image4): 56(ptr) Variable UniformConstant + 59: 6(float) Constant 1073741824 + 65: TypePointer Output 12(fvec4) + 66(out_color): 65(ptr) Variable Output + 67: 6(float) Constant 0 + 68: 12(fvec4) ConstantComposite 67 67 67 67 + 4(main): 2 Function None 3 + 5: Label + 35(read1): 18(ptr) Variable Function + 37(param): 11(ptr) Variable Function + 40(read2): 18(ptr) Variable Function + 42(param): 11(ptr) Variable Function + 51(param): 11(ptr) Variable Function + 53(param): 18(ptr) Variable Function + 61(param): 11(ptr) Variable Function + 63(param): 18(ptr) Variable Function + 38: 10(ivec2) Load 27(in_coords) + Store 37(param) 38 + 39: 12(fvec4) FunctionCall 16(image_load(I21;vi2;) 36(image1) 37(param) + Store 35(read1) 39 + 43: 10(ivec2) Load 27(in_coords) + Store 42(param) 43 + 44: 12(fvec4) FunctionCall 16(image_load(I21;vi2;) 41(image2) 42(param) + Store 40(read2) 44 + 48: 12(fvec4) Load 35(read1) + 50: 12(fvec4) VectorTimesScalar 48 49 + 52: 10(ivec2) Load 27(in_coords) + Store 51(param) 52 + Store 53(param) 50 + 54: 2 FunctionCall 23(image_store(I21;vi2;vf4;) 47(image3) 51(param) 53(param) + 58: 12(fvec4) Load 40(read2) + 60: 12(fvec4) VectorTimesScalar 58 59 + 62: 10(ivec2) Load 27(in_coords) + Store 61(param) 62 + Store 63(param) 60 + 64: 2 FunctionCall 23(image_store(I21;vi2;vf4;) 57(image4) 61(param) 63(param) + Store 66(out_color) 68 + Return + FunctionEnd +16(image_load(I21;vi2;): 12(fvec4) Function None 13 + 14(image): 8(ptr) FunctionParameter + 15(coords): 11(ptr) FunctionParameter + 17: Label + 25: 7 Load 14(image) + 28: 10(ivec2) Load 27(in_coords) + 29: 12(fvec4) ImageRead 25 28 + ReturnValue 29 + FunctionEnd +23(image_store(I21;vi2;vf4;): 2 Function None 19 + 20(image): 8(ptr) FunctionParameter + 21(coords): 11(ptr) FunctionParameter + 22(data): 18(ptr) FunctionParameter + 24: Label + 32: 7 Load 20(image) + 33: 10(ivec2) Load 27(in_coords) + 34: 12(fvec4) Load 22(data) + ImageWrite 32 33 34 + Return + FunctionEnd diff --git a/Test/spv.paramMemory.420.frag b/Test/spv.paramMemory.420.frag new file mode 100644 index 00000000..15f175a2 --- /dev/null +++ b/Test/spv.paramMemory.420.frag @@ -0,0 +1,33 @@ +#version 420 + +// Need this extension to permit passing a formatless readonly image to a helper function. +#extension GL_EXT_shader_image_load_formatted : require + +readonly coherent uniform layout(set = 0, binding = 0) image2D image1; +readonly uniform layout(set = 0, binding = 2) image2D image2; +writeonly coherent uniform layout(set = 0, binding = 1, rgba32f) image2D image3; +writeonly uniform layout(set = 0, binding = 3, rgba16f) image2D image4; + +flat in layout(location = 0) ivec2 in_coords; +out layout(location = 0) vec4 out_color; + +vec4 image_load(readonly coherent image2D image, ivec2 coords) +{ + return imageLoad(image, in_coords); +} + +void image_store(writeonly coherent image2D image, ivec2 coords, vec4 data) +{ + imageStore(image, in_coords, data); +} + +void main() +{ + vec4 read1 = image_load(image1, in_coords); + vec4 read2 = image_load(image2, in_coords); + + image_store(image3, in_coords, read1*0.5); + image_store(image4, in_coords, read2*2.0); + + out_color = vec4(0.0); +} diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index 309fe756..df68f521 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -376,6 +376,7 @@ INSTANTIATE_TEST_SUITE_P( "spv.offsets.frag", "spv.Operations.frag", "spv.paramMemory.frag", + "spv.paramMemory.420.frag", "spv.precision.frag", "spv.precisionArgs.frag", "spv.precisionNonESSamp.frag",