SPV: Fix #995: Include memory decorations on parameters.

This commit is contained in:
John Kessenich 2017-07-18 02:58:06 -06:00
Родитель fad6297206
Коммит 961cd35b73
6 изменённых файлов: 171 добавлений и 0 удалений

Просмотреть файл

@ -2918,6 +2918,7 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF
spv::Decoration paramPrecision = TranslatePrecisionDecoration(type);
if (paramPrecision != spv::NoPrecision)
decorations.push_back(paramPrecision);
TranslateMemoryDecoration(type.getQualifier(), decorations);
};
for (int f = 0; f < (int)glslFunctions.size(); ++f) {

Просмотреть файл

@ -184,6 +184,7 @@ gl_FragCoord origin is upper left
MemberDecorate 9 0 NonWritable
MemberDecorate 9 0 Offset 0
Decorate 9 BufferBlock
Decorate 13(sb) NonWritable
Decorate 17 ArrayStride 16
MemberDecorate 18 0 Offset 0
Decorate 18 BufferBlock

Просмотреть файл

@ -166,6 +166,7 @@ local_size = (256, 1, 1)
MemberDecorate 9 0 NonWritable
MemberDecorate 9 0 Offset 0
Decorate 9 BufferBlock
Decorate 14(buffer) NonWritable
Decorate 44(g_input) DescriptorSet 0
Decorate 44(g_input) Binding 0
Decorate 50(g_output) DescriptorSet 0

Просмотреть файл

@ -0,0 +1,137 @@
spv.paramMemory.frag
// Module Version 10000
// Generated by (magic number): 80001
// 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 ESSL 310
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 38 "image1"
Name 39 "param"
Name 42 "read2"
Name 45 "image2"
Name 46 "param"
Name 49 "image3"
Name 53 "param"
Name 55 "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 38(image1) DescriptorSet 0
Decorate 38(image1) Binding 0
Decorate 38(image1) Coherent
Decorate 38(image1) NonWritable
Decorate 45(image2) DescriptorSet 0
Decorate 45(image2) Binding 2
Decorate 45(image2) NonWritable
Decorate 49(image3) DescriptorSet 0
Decorate 49(image3) Binding 1
Decorate 49(image3) Coherent
Decorate 49(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: TypeImage 6(float) 2D nonsampled format:Rgba32f
37: TypePointer UniformConstant 36
38(image1): 37(ptr) Variable UniformConstant
43: TypeImage 6(float) 2D nonsampled format:Rgba16f
44: TypePointer UniformConstant 43
45(image2): 44(ptr) Variable UniformConstant
49(image3): 37(ptr) Variable UniformConstant
51: 6(float) Constant 1056964608
57(image4): 44(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
39(param): 11(ptr) Variable Function
42(read2): 18(ptr) Variable Function
46(param): 11(ptr) Variable Function
53(param): 11(ptr) Variable Function
55(param): 18(ptr) Variable Function
61(param): 11(ptr) Variable Function
63(param): 18(ptr) Variable Function
40: 10(ivec2) Load 27(in_coords)
Store 39(param) 40
41: 12(fvec4) FunctionCall 16(image_load(I21;vi2;) 38(image1) 39(param)
Store 35(read1) 41
47: 10(ivec2) Load 27(in_coords)
Store 46(param) 47
48: 12(fvec4) FunctionCall 16(image_load(I21;vi2;) 45(image2) 46(param)
Store 42(read2) 48
50: 12(fvec4) Load 35(read1)
52: 12(fvec4) VectorTimesScalar 50 51
54: 10(ivec2) Load 27(in_coords)
Store 53(param) 54
Store 55(param) 52
56: 2 FunctionCall 23(image_store(I21;vi2;vf4;) 49(image3) 53(param) 55(param)
58: 12(fvec4) Load 42(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

30
Test/spv.paramMemory.frag Normal file
Просмотреть файл

@ -0,0 +1,30 @@
#version 310 es
readonly coherent uniform layout(set = 0, binding = 0, rgba32f) highp image2D image1;
readonly uniform layout(set = 0, binding = 2, rgba16f) highp image2D image2;
writeonly coherent uniform layout(set = 0, binding = 1, rgba32f) highp image2D image3;
writeonly uniform layout(set = 0, binding = 3, rgba16f) highp image2D image4;
flat in layout(location = 0) highp ivec2 in_coords;
out layout(location = 0) highp vec4 out_color;
highp vec4 image_load(readonly coherent highp image2D image, highp ivec2 coords)
{
return imageLoad(image, in_coords);
}
void image_store(writeonly coherent highp image2D image, highp ivec2 coords, highp vec4 data)
{
imageStore(image, in_coords, data);
}
void main()
{
highp vec4 read1 = image_load(image1, in_coords);
highp 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);
}

Просмотреть файл

@ -275,6 +275,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.noWorkgroup.comp",
"spv.offsets.frag",
"spv.Operations.frag",
"spv.paramMemory.frag",
"spv.precision.frag",
"spv.prepost.frag",
"spv.qualifiers.vert",