HLSL: Correct which things flattening tracks for linkage, based on caller, not type.
Includes related trackLinkage() code removal and name improvements.
This commit is contained in:
parent
7497e7c9f3
commit
d5aedc199f
@ -81,6 +81,9 @@ gl_FragCoord origin is upper left
|
|||||||
0:35 Function Call: @main( ( temp 4-component vector of float)
|
0:35 Function Call: @main( ( temp 4-component vector of float)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'tex' ( uniform texture2D)
|
0:? 'tex' ( uniform texture2D)
|
||||||
|
0:? 's2D' ( uniform sampler)
|
||||||
|
0:? 's2D' ( uniform sampler)
|
||||||
|
0:? 'tex' ( uniform texture2D)
|
||||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
|
||||||
|
|
||||||
@ -169,6 +172,9 @@ gl_FragCoord origin is upper left
|
|||||||
0:35 Function Call: @main( ( temp 4-component vector of float)
|
0:35 Function Call: @main( ( temp 4-component vector of float)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'tex' ( uniform texture2D)
|
0:? 'tex' ( uniform texture2D)
|
||||||
|
0:? 's2D' ( uniform sampler)
|
||||||
|
0:? 's2D' ( uniform sampler)
|
||||||
|
0:? 'tex' ( uniform texture2D)
|
||||||
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float)
|
||||||
|
|
||||||
// Module Version 10000
|
// Module Version 10000
|
||||||
|
@ -46,18 +46,33 @@ gl_FragCoord origin is upper left
|
|||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'g_samp' ( uniform sampler)
|
0:? 'g_samp' ( uniform sampler)
|
||||||
0:? 'g_tex' ( uniform texture1D)
|
0:? 'g_tex' ( uniform texture1D)
|
||||||
|
0:? 'samp' ( uniform sampler)
|
||||||
|
0:? 'tex' ( uniform texture1D)
|
||||||
|
0:? 'nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[0].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[0].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[0].nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[1].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[1].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[1].nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[2].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[2].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[2].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[0].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[0].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[0].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[0].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[0].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[0].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[0].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[0].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[0].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[1].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[1].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[1].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[1].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[1].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[1].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[1].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[1].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[1].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[2].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[2].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[2].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[2].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[2].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[2].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[2].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[2].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[2].nonopaque_thing' ( uniform int)
|
||||||
0:? 'color' (layout( location=0) out 4-component vector of float)
|
0:? 'color' (layout( location=0) out 4-component vector of float)
|
||||||
|
|
||||||
|
|
||||||
@ -111,23 +126,38 @@ gl_FragCoord origin is upper left
|
|||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'g_samp' ( uniform sampler)
|
0:? 'g_samp' ( uniform sampler)
|
||||||
0:? 'g_tex' ( uniform texture1D)
|
0:? 'g_tex' ( uniform texture1D)
|
||||||
|
0:? 'samp' ( uniform sampler)
|
||||||
|
0:? 'tex' ( uniform texture1D)
|
||||||
|
0:? 'nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[0].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[0].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[0].nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[1].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[1].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[1].nonopaque_thing' ( uniform int)
|
||||||
|
0:? 'g_texdata_array[2].samp' ( uniform sampler)
|
||||||
|
0:? 'g_texdata_array[2].tex' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array[2].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[0].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[0].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[0].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[0].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[0].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[0].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[0].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[0].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[0].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[1].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[1].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[1].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[1].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[1].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[1].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[1].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[1].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[1].nonopaque_thing' ( uniform int)
|
||||||
0:? 'g_texdata_array2[2].samp[0]' ( uniform sampler)
|
0:? 'g_texdata_array2[2].samp[0]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[2].samp[1]' ( uniform sampler)
|
0:? 'g_texdata_array2[2].samp[1]' ( uniform sampler)
|
||||||
0:? 'g_texdata_array2[2].tex[0]' ( uniform texture1D)
|
0:? 'g_texdata_array2[2].tex[0]' ( uniform texture1D)
|
||||||
0:? 'g_texdata_array2[2].tex[1]' ( uniform texture1D)
|
0:? 'g_texdata_array2[2].tex[1]' ( uniform texture1D)
|
||||||
|
0:? 'g_texdata_array2[2].nonopaque_thing' ( uniform int)
|
||||||
0:? 'color' (layout( location=0) out 4-component vector of float)
|
0:? 'color' (layout( location=0) out 4-component vector of float)
|
||||||
|
|
||||||
// Module Version 10000
|
// Module Version 10000
|
||||||
// Generated by (magic number): 80001
|
// Generated by (magic number): 80001
|
||||||
// Id's are bound by 66
|
// Id's are bound by 78
|
||||||
|
|
||||||
Capability Shader
|
Capability Shader
|
||||||
Capability Sampled1D
|
Capability Sampled1D
|
||||||
@ -152,16 +182,27 @@ gl_FragCoord origin is upper left
|
|||||||
Name 51 "color"
|
Name 51 "color"
|
||||||
Name 54 "g_samp"
|
Name 54 "g_samp"
|
||||||
Name 55 "g_tex"
|
Name 55 "g_tex"
|
||||||
Name 56 "g_texdata_array2[0].samp[0]"
|
Name 57 "nonopaque_thing"
|
||||||
Name 57 "g_texdata_array2[0].samp[1]"
|
Name 58 "g_texdata_array[0].samp"
|
||||||
Name 58 "g_texdata_array2[0].tex[0]"
|
Name 59 "g_texdata_array[0].tex"
|
||||||
Name 59 "g_texdata_array2[0].tex[1]"
|
Name 60 "g_texdata_array[0].nonopaque_thing"
|
||||||
Name 60 "g_texdata_array2[1].samp[1]"
|
Name 61 "g_texdata_array[1].nonopaque_thing"
|
||||||
Name 61 "g_texdata_array2[1].tex[1]"
|
Name 62 "g_texdata_array[2].samp"
|
||||||
Name 62 "g_texdata_array2[2].samp[0]"
|
Name 63 "g_texdata_array[2].tex"
|
||||||
Name 63 "g_texdata_array2[2].samp[1]"
|
Name 64 "g_texdata_array[2].nonopaque_thing"
|
||||||
Name 64 "g_texdata_array2[2].tex[0]"
|
Name 65 "g_texdata_array2[0].samp[0]"
|
||||||
Name 65 "g_texdata_array2[2].tex[1]"
|
Name 66 "g_texdata_array2[0].samp[1]"
|
||||||
|
Name 67 "g_texdata_array2[0].tex[0]"
|
||||||
|
Name 68 "g_texdata_array2[0].tex[1]"
|
||||||
|
Name 69 "g_texdata_array2[0].nonopaque_thing"
|
||||||
|
Name 70 "g_texdata_array2[1].samp[1]"
|
||||||
|
Name 71 "g_texdata_array2[1].tex[1]"
|
||||||
|
Name 72 "g_texdata_array2[1].nonopaque_thing"
|
||||||
|
Name 73 "g_texdata_array2[2].samp[0]"
|
||||||
|
Name 74 "g_texdata_array2[2].samp[1]"
|
||||||
|
Name 75 "g_texdata_array2[2].tex[0]"
|
||||||
|
Name 76 "g_texdata_array2[2].tex[1]"
|
||||||
|
Name 77 "g_texdata_array2[2].nonopaque_thing"
|
||||||
Decorate 18(tex) DescriptorSet 0
|
Decorate 18(tex) DescriptorSet 0
|
||||||
Decorate 22(samp) DescriptorSet 0
|
Decorate 22(samp) DescriptorSet 0
|
||||||
Decorate 28(g_texdata_array[1].tex) DescriptorSet 0
|
Decorate 28(g_texdata_array[1].tex) DescriptorSet 0
|
||||||
@ -171,16 +212,20 @@ gl_FragCoord origin is upper left
|
|||||||
Decorate 51(color) Location 0
|
Decorate 51(color) Location 0
|
||||||
Decorate 54(g_samp) DescriptorSet 0
|
Decorate 54(g_samp) DescriptorSet 0
|
||||||
Decorate 55(g_tex) DescriptorSet 0
|
Decorate 55(g_tex) DescriptorSet 0
|
||||||
Decorate 56(g_texdata_array2[0].samp[0]) DescriptorSet 0
|
Decorate 58(g_texdata_array[0].samp) DescriptorSet 0
|
||||||
Decorate 57(g_texdata_array2[0].samp[1]) DescriptorSet 0
|
Decorate 59(g_texdata_array[0].tex) DescriptorSet 0
|
||||||
Decorate 58(g_texdata_array2[0].tex[0]) DescriptorSet 0
|
Decorate 62(g_texdata_array[2].samp) DescriptorSet 0
|
||||||
Decorate 59(g_texdata_array2[0].tex[1]) DescriptorSet 0
|
Decorate 63(g_texdata_array[2].tex) DescriptorSet 0
|
||||||
Decorate 60(g_texdata_array2[1].samp[1]) DescriptorSet 0
|
Decorate 65(g_texdata_array2[0].samp[0]) DescriptorSet 0
|
||||||
Decorate 61(g_texdata_array2[1].tex[1]) DescriptorSet 0
|
Decorate 66(g_texdata_array2[0].samp[1]) DescriptorSet 0
|
||||||
Decorate 62(g_texdata_array2[2].samp[0]) DescriptorSet 0
|
Decorate 67(g_texdata_array2[0].tex[0]) DescriptorSet 0
|
||||||
Decorate 63(g_texdata_array2[2].samp[1]) DescriptorSet 0
|
Decorate 68(g_texdata_array2[0].tex[1]) DescriptorSet 0
|
||||||
Decorate 64(g_texdata_array2[2].tex[0]) DescriptorSet 0
|
Decorate 70(g_texdata_array2[1].samp[1]) DescriptorSet 0
|
||||||
Decorate 65(g_texdata_array2[2].tex[1]) DescriptorSet 0
|
Decorate 71(g_texdata_array2[1].tex[1]) DescriptorSet 0
|
||||||
|
Decorate 73(g_texdata_array2[2].samp[0]) DescriptorSet 0
|
||||||
|
Decorate 74(g_texdata_array2[2].samp[1]) DescriptorSet 0
|
||||||
|
Decorate 75(g_texdata_array2[2].tex[0]) DescriptorSet 0
|
||||||
|
Decorate 76(g_texdata_array2[2].tex[1]) DescriptorSet 0
|
||||||
2: TypeVoid
|
2: TypeVoid
|
||||||
3: TypeFunction 2
|
3: TypeFunction 2
|
||||||
6: TypeFloat 32
|
6: TypeFloat 32
|
||||||
@ -209,16 +254,28 @@ gl_FragCoord origin is upper left
|
|||||||
51(color): 50(ptr) Variable Output
|
51(color): 50(ptr) Variable Output
|
||||||
54(g_samp): 21(ptr) Variable UniformConstant
|
54(g_samp): 21(ptr) Variable UniformConstant
|
||||||
55(g_tex): 17(ptr) Variable UniformConstant
|
55(g_tex): 17(ptr) Variable UniformConstant
|
||||||
56(g_texdata_array2[0].samp[0]): 21(ptr) Variable UniformConstant
|
56: TypePointer UniformConstant 14(int)
|
||||||
57(g_texdata_array2[0].samp[1]): 21(ptr) Variable UniformConstant
|
57(nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
58(g_texdata_array2[0].tex[0]): 17(ptr) Variable UniformConstant
|
58(g_texdata_array[0].samp): 21(ptr) Variable UniformConstant
|
||||||
59(g_texdata_array2[0].tex[1]): 17(ptr) Variable UniformConstant
|
59(g_texdata_array[0].tex): 17(ptr) Variable UniformConstant
|
||||||
60(g_texdata_array2[1].samp[1]): 21(ptr) Variable UniformConstant
|
60(g_texdata_array[0].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
61(g_texdata_array2[1].tex[1]): 17(ptr) Variable UniformConstant
|
61(g_texdata_array[1].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
62(g_texdata_array2[2].samp[0]): 21(ptr) Variable UniformConstant
|
62(g_texdata_array[2].samp): 21(ptr) Variable UniformConstant
|
||||||
63(g_texdata_array2[2].samp[1]): 21(ptr) Variable UniformConstant
|
63(g_texdata_array[2].tex): 17(ptr) Variable UniformConstant
|
||||||
64(g_texdata_array2[2].tex[0]): 17(ptr) Variable UniformConstant
|
64(g_texdata_array[2].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
65(g_texdata_array2[2].tex[1]): 17(ptr) Variable UniformConstant
|
65(g_texdata_array2[0].samp[0]): 21(ptr) Variable UniformConstant
|
||||||
|
66(g_texdata_array2[0].samp[1]): 21(ptr) Variable UniformConstant
|
||||||
|
67(g_texdata_array2[0].tex[0]): 17(ptr) Variable UniformConstant
|
||||||
|
68(g_texdata_array2[0].tex[1]): 17(ptr) Variable UniformConstant
|
||||||
|
69(g_texdata_array2[0].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
|
70(g_texdata_array2[1].samp[1]): 21(ptr) Variable UniformConstant
|
||||||
|
71(g_texdata_array2[1].tex[1]): 17(ptr) Variable UniformConstant
|
||||||
|
72(g_texdata_array2[1].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
|
73(g_texdata_array2[2].samp[0]): 21(ptr) Variable UniformConstant
|
||||||
|
74(g_texdata_array2[2].samp[1]): 21(ptr) Variable UniformConstant
|
||||||
|
75(g_texdata_array2[2].tex[0]): 17(ptr) Variable UniformConstant
|
||||||
|
76(g_texdata_array2[2].tex[1]): 17(ptr) Variable UniformConstant
|
||||||
|
77(g_texdata_array2[2].nonopaque_thing): 56(ptr) Variable UniformConstant
|
||||||
4(main): 2 Function None 3
|
4(main): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
46(ps_output): 9(ptr) Variable Function
|
46(ps_output): 9(ptr) Variable Function
|
||||||
|
@ -155,8 +155,6 @@ Shader version: 500
|
|||||||
0:? 'd' (layout( location=0) in 4-component vector of float)
|
0:? 'd' (layout( location=0) in 4-component vector of float)
|
||||||
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
||||||
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
||||||
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
|
||||||
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
|
||||||
0:? 'coord' (layout( location=3) in 4-component vector of float)
|
0:? 'coord' (layout( location=3) in 4-component vector of float)
|
||||||
0:? 'b' (layout( location=4) in 4-component vector of float)
|
0:? 'b' (layout( location=4) in 4-component vector of float)
|
||||||
0:? 'e' (layout( location=5) in 4-component vector of float)
|
0:? 'e' (layout( location=5) in 4-component vector of float)
|
||||||
@ -321,8 +319,6 @@ Shader version: 500
|
|||||||
0:? 'd' (layout( location=0) in 4-component vector of float)
|
0:? 'd' (layout( location=0) in 4-component vector of float)
|
||||||
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
||||||
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
||||||
0:? 'm[0]' (layout( location=1) in 4-component vector of float)
|
|
||||||
0:? 'm[1]' (layout( location=2) in 4-component vector of float)
|
|
||||||
0:? 'coord' (layout( location=3) in 4-component vector of float)
|
0:? 'coord' (layout( location=3) in 4-component vector of float)
|
||||||
0:? 'b' (layout( location=4) in 4-component vector of float)
|
0:? 'b' (layout( location=4) in 4-component vector of float)
|
||||||
0:? 'e' (layout( location=5) in 4-component vector of float)
|
0:? 'e' (layout( location=5) in 4-component vector of float)
|
||||||
|
@ -1106,7 +1106,7 @@ void HlslParseContext::split(const TVariable& variable)
|
|||||||
{
|
{
|
||||||
// Create a new variable:
|
// Create a new variable:
|
||||||
TType& splitType = split(*variable.getType().clone(), variable.getName());
|
TType& splitType = split(*variable.getType().clone(), variable.getName());
|
||||||
splitIoVars[variable.getUniqueId()] = makeInternalVariable(variable.getName(), splitType);
|
splitNonIoVars[variable.getUniqueId()] = makeInternalVariable(variable.getName(), splitType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recursive implementation of split().
|
// Recursive implementation of split().
|
||||||
@ -1169,7 +1169,7 @@ bool HlslParseContext::shouldFlatten(const TType& type) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Top level variable flattening: construct data
|
// Top level variable flattening: construct data
|
||||||
void HlslParseContext::flatten(const TVariable& variable)
|
void HlslParseContext::flatten(const TVariable& variable, bool linkage)
|
||||||
{
|
{
|
||||||
const TType& type = variable.getType();
|
const TType& type = variable.getType();
|
||||||
|
|
||||||
@ -1178,7 +1178,7 @@ void HlslParseContext::flatten(const TVariable& variable)
|
|||||||
type.getQualifier().layoutLocation)));
|
type.getQualifier().layoutLocation)));
|
||||||
|
|
||||||
// the item is a map pair, so first->second is the TFlattenData itself.
|
// the item is a map pair, so first->second is the TFlattenData itself.
|
||||||
flatten(variable, type, entry.first->second, "");
|
flatten(variable, type, entry.first->second, "", linkage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recursively flatten the given variable at the provided type, building the flattenData as we go.
|
// Recursively flatten the given variable at the provided type, building the flattenData as we go.
|
||||||
@ -1209,14 +1209,14 @@ void HlslParseContext::flatten(const TVariable& variable)
|
|||||||
// so the 4th flattened member in traversal order is ours.
|
// so the 4th flattened member in traversal order is ours.
|
||||||
//
|
//
|
||||||
int HlslParseContext::flatten(const TVariable& variable, const TType& type,
|
int HlslParseContext::flatten(const TVariable& variable, const TType& type,
|
||||||
TFlattenData& flattenData, TString name)
|
TFlattenData& flattenData, TString name, bool linkage)
|
||||||
{
|
{
|
||||||
// If something is an arrayed struct, the array flattener will recursively call flatten()
|
// If something is an arrayed struct, the array flattener will recursively call flatten()
|
||||||
// to then flatten the struct, so this is an "if else": we don't do both.
|
// to then flatten the struct, so this is an "if else": we don't do both.
|
||||||
if (type.isArray())
|
if (type.isArray())
|
||||||
return flattenArray(variable, type, flattenData, name);
|
return flattenArray(variable, type, flattenData, name, linkage);
|
||||||
else if (type.isStruct())
|
else if (type.isStruct())
|
||||||
return flattenStruct(variable, type, flattenData, name);
|
return flattenStruct(variable, type, flattenData, name, linkage);
|
||||||
else {
|
else {
|
||||||
assert(0); // should never happen
|
assert(0); // should never happen
|
||||||
return -1;
|
return -1;
|
||||||
@ -1226,7 +1226,7 @@ int HlslParseContext::flatten(const TVariable& variable, const TType& type,
|
|||||||
// Add a single flattened member to the flattened data being tracked for the composite
|
// Add a single flattened member to the flattened data being tracked for the composite
|
||||||
// Returns true for the final flattening level.
|
// Returns true for the final flattening level.
|
||||||
int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType& type, TFlattenData& flattenData,
|
int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType& type, TFlattenData& flattenData,
|
||||||
const TString& memberName, bool track)
|
const TString& memberName, bool linkage)
|
||||||
{
|
{
|
||||||
if (isFinalFlattening(type)) {
|
if (isFinalFlattening(type)) {
|
||||||
// This is as far as we flatten. Insert the variable.
|
// This is as far as we flatten. Insert the variable.
|
||||||
@ -1252,13 +1252,13 @@ int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType&
|
|||||||
flattenData.offsets.push_back(static_cast<int>(flattenData.members.size()));
|
flattenData.offsets.push_back(static_cast<int>(flattenData.members.size()));
|
||||||
flattenData.members.push_back(memberVariable);
|
flattenData.members.push_back(memberVariable);
|
||||||
|
|
||||||
if (track)
|
if (linkage)
|
||||||
trackLinkage(*memberVariable);
|
trackLinkage(*memberVariable);
|
||||||
|
|
||||||
return static_cast<int>(flattenData.offsets.size()) - 1; // location of the member reference
|
return static_cast<int>(flattenData.offsets.size()) - 1; // location of the member reference
|
||||||
} else {
|
} else {
|
||||||
// Further recursion required
|
// Further recursion required
|
||||||
return flatten(variable, type, flattenData, memberName);
|
return flatten(variable, type, flattenData, memberName, linkage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1267,7 +1267,7 @@ int HlslParseContext::addFlattenedMember(const TVariable& variable, const TType&
|
|||||||
//
|
//
|
||||||
// Assumes shouldFlatten() or equivalent was called first.
|
// Assumes shouldFlatten() or equivalent was called first.
|
||||||
int HlslParseContext::flattenStruct(const TVariable& variable, const TType& type,
|
int HlslParseContext::flattenStruct(const TVariable& variable, const TType& type,
|
||||||
TFlattenData& flattenData, TString name)
|
TFlattenData& flattenData, TString name, bool linkage)
|
||||||
{
|
{
|
||||||
assert(type.isStruct());
|
assert(type.isStruct());
|
||||||
|
|
||||||
@ -1282,7 +1282,7 @@ int HlslParseContext::flattenStruct(const TVariable& variable, const TType& type
|
|||||||
TType& dereferencedType = *members[member].type;
|
TType& dereferencedType = *members[member].type;
|
||||||
const TString memberName = name + (name.empty() ? "" : ".") + dereferencedType.getFieldName();
|
const TString memberName = name + (name.empty() ? "" : ".") + dereferencedType.getFieldName();
|
||||||
|
|
||||||
const int mpos = addFlattenedMember(variable, dereferencedType, flattenData, memberName, false);
|
const int mpos = addFlattenedMember(variable, dereferencedType, flattenData, memberName, linkage);
|
||||||
flattenData.offsets[pos++] = mpos;
|
flattenData.offsets[pos++] = mpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1294,7 +1294,7 @@ int HlslParseContext::flattenStruct(const TVariable& variable, const TType& type
|
|||||||
//
|
//
|
||||||
// Assumes shouldFlatten() or equivalent was called first.
|
// Assumes shouldFlatten() or equivalent was called first.
|
||||||
int HlslParseContext::flattenArray(const TVariable& variable, const TType& type,
|
int HlslParseContext::flattenArray(const TVariable& variable, const TType& type,
|
||||||
TFlattenData& flattenData, TString name)
|
TFlattenData& flattenData, TString name, bool linkage)
|
||||||
{
|
{
|
||||||
assert(type.isArray() && !type.isImplicitlySizedArray());
|
assert(type.isArray() && !type.isImplicitlySizedArray());
|
||||||
|
|
||||||
@ -1313,7 +1313,7 @@ int HlslParseContext::flattenArray(const TVariable& variable, const TType& type,
|
|||||||
char elementNumBuf[20]; // sufficient for MAXINT
|
char elementNumBuf[20]; // sufficient for MAXINT
|
||||||
snprintf(elementNumBuf, sizeof(elementNumBuf)-1, "[%d]", element);
|
snprintf(elementNumBuf, sizeof(elementNumBuf)-1, "[%d]", element);
|
||||||
const int mpos = addFlattenedMember(variable, dereferencedType, flattenData,
|
const int mpos = addFlattenedMember(variable, dereferencedType, flattenData,
|
||||||
name + elementNumBuf, true);
|
name + elementNumBuf, linkage);
|
||||||
|
|
||||||
flattenData.offsets[pos++] = mpos;
|
flattenData.offsets[pos++] = mpos;
|
||||||
}
|
}
|
||||||
@ -1375,13 +1375,13 @@ TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TT
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find and return the split IO TVariable for id, or nullptr if none.
|
// Find and return the split IO TVariable for id, or nullptr if none.
|
||||||
TVariable* HlslParseContext::getSplitIoVar(int id) const
|
TVariable* HlslParseContext::getSplitNonIoVar(int id) const
|
||||||
{
|
{
|
||||||
const auto splitIoVar = splitIoVars.find(id);
|
const auto splitNonIoVar = splitNonIoVars.find(id);
|
||||||
if (splitIoVar == splitIoVars.end())
|
if (splitNonIoVar == splitNonIoVars.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return splitIoVar->second;
|
return splitNonIoVar->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass through to base class after remembering built-in mappings.
|
// Pass through to base class after remembering built-in mappings.
|
||||||
@ -1491,7 +1491,7 @@ void HlslParseContext::assignToInterface(TVariable& variable)
|
|||||||
for (auto member = memberList.begin(); member != memberList.end(); ++member)
|
for (auto member = memberList.begin(); member != memberList.end(); ++member)
|
||||||
assignLocation(**member);
|
assignLocation(**member);
|
||||||
} else if (wasSplit(variable.getUniqueId())) {
|
} else if (wasSplit(variable.getUniqueId())) {
|
||||||
TVariable* splitIoVar = getSplitIoVar(variable.getUniqueId());
|
TVariable* splitIoVar = getSplitNonIoVar(variable.getUniqueId());
|
||||||
assignLocation(*splitIoVar);
|
assignLocation(*splitIoVar);
|
||||||
} else {
|
} else {
|
||||||
assignLocation(variable);
|
assignLocation(variable);
|
||||||
@ -1626,7 +1626,7 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l
|
|||||||
if (shouldFlatten(variable->getType())) {
|
if (shouldFlatten(variable->getType())) {
|
||||||
// Expand the AST parameter nodes (but not the name mangling or symbol table view)
|
// Expand the AST parameter nodes (but not the name mangling or symbol table view)
|
||||||
// for structures that need to be flattened.
|
// for structures that need to be flattened.
|
||||||
flatten(*variable);
|
flatten(*variable, false);
|
||||||
const TTypeList* structure = variable->getType().getStruct();
|
const TTypeList* structure = variable->getType().getStruct();
|
||||||
for (int mem = 0; mem < (int)structure->size(); ++mem) {
|
for (int mem = 0; mem < (int)structure->size(); ++mem) {
|
||||||
paramNodes = intermediate.growAggregate(paramNodes,
|
paramNodes = intermediate.growAggregate(paramNodes,
|
||||||
@ -1876,12 +1876,12 @@ TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunct
|
|||||||
// struct inputs to the vertex stage and outputs from the fragment stage must be flattened
|
// struct inputs to the vertex stage and outputs from the fragment stage must be flattened
|
||||||
if ((language == EShLangVertex && qualifier == EvqVaryingIn) ||
|
if ((language == EShLangVertex && qualifier == EvqVaryingIn) ||
|
||||||
(language == EShLangFragment && qualifier == EvqVaryingOut))
|
(language == EShLangFragment && qualifier == EvqVaryingOut))
|
||||||
flatten(variable);
|
flatten(variable, false /* don't track linkage here, it will be tracked in assignToInterface() */);
|
||||||
// Structs containing built-ins must be split
|
// Structs containing built-ins must be split
|
||||||
else if (variable.getType().containsBuiltIn())
|
else if (variable.getType().containsBuiltIn())
|
||||||
split(variable);
|
split(variable);
|
||||||
else if (!variable.getType().getQualifier().isArrayedIo(language))
|
else if (!variable.getType().getQualifier().isArrayedIo(language))
|
||||||
flatten(variable);
|
flatten(variable, false);
|
||||||
//else
|
//else
|
||||||
// TODO: unify split and flatten, so all paths can create flattened I/O
|
// TODO: unify split and flatten, so all paths can create flattened I/O
|
||||||
}
|
}
|
||||||
@ -2652,10 +2652,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
|
|||||||
// If either left or right was a split structure, we must read or write it, but still have to
|
// If either left or right was a split structure, we must read or write it, but still have to
|
||||||
// parallel-recurse through the unsplit structure to identify the built-in IO vars.
|
// parallel-recurse through the unsplit structure to identify the built-in IO vars.
|
||||||
if (isSplitLeft)
|
if (isSplitLeft)
|
||||||
splitLeft = intermediate.addSymbol(*getSplitIoVar(left->getAsSymbolNode()->getId()), loc);
|
splitLeft = intermediate.addSymbol(*getSplitNonIoVar(left->getAsSymbolNode()->getId()), loc);
|
||||||
|
|
||||||
if (isSplitRight)
|
if (isSplitRight)
|
||||||
splitRight = intermediate.addSymbol(*getSplitIoVar(right->getAsSymbolNode()->getId()), loc);
|
splitRight = intermediate.addSymbol(*getSplitNonIoVar(right->getAsSymbolNode()->getId()), loc);
|
||||||
|
|
||||||
// This makes the whole assignment, recursing through subtypes as needed.
|
// This makes the whole assignment, recursing through subtypes as needed.
|
||||||
traverse(left, right, splitLeft, splitRight);
|
traverse(left, right, splitLeft, splitRight);
|
||||||
@ -6120,133 +6120,6 @@ TSymbol* HlslParseContext::redeclareBuiltinVariable(const TSourceLoc& /*loc*/, c
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Either redeclare the requested block, or give an error message why it can't be done.
|
|
||||||
//
|
|
||||||
// TODO: functionality: explicitly sizing members of redeclared blocks is not giving them an explicit size
|
|
||||||
void HlslParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName,
|
|
||||||
const TString* instanceName, TArraySizes* arraySizes)
|
|
||||||
{
|
|
||||||
// Redeclaring a built-in block...
|
|
||||||
|
|
||||||
// Blocks with instance names are easy to find, lookup the instance name,
|
|
||||||
// Anonymous blocks need to be found via a member.
|
|
||||||
bool builtIn;
|
|
||||||
TSymbol* block;
|
|
||||||
if (instanceName)
|
|
||||||
block = symbolTable.find(*instanceName, &builtIn);
|
|
||||||
else
|
|
||||||
block = symbolTable.find(newTypeList.front().type->getFieldName(), &builtIn);
|
|
||||||
|
|
||||||
// If the block was not found, this must be a version/profile/stage
|
|
||||||
// that doesn't have it, or the instance name is wrong.
|
|
||||||
const char* errorName = instanceName ? instanceName->c_str() : newTypeList.front().type->getFieldName().c_str();
|
|
||||||
if (block == nullptr) {
|
|
||||||
error(loc, "no declaration found for redeclaration", errorName, "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Built-in blocks cannot be redeclared more than once, which if happened,
|
|
||||||
// we'd be finding the already redeclared one here, rather than the built in.
|
|
||||||
if (! builtIn) {
|
|
||||||
error(loc, "can only redeclare a built-in block once, and before any use", blockName.c_str(), "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the block to make a writable version, to insert into the block table after editing.
|
|
||||||
block = symbolTable.copyUpDeferredInsert(block);
|
|
||||||
|
|
||||||
if (block->getType().getBasicType() != EbtBlock) {
|
|
||||||
error(loc, "cannot redeclare a non block as a block", errorName, "");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Edit and error check the container against the redeclaration
|
|
||||||
// - remove unused members
|
|
||||||
// - ensure remaining qualifiers/types match
|
|
||||||
TType& type = block->getWritableType();
|
|
||||||
TTypeList::iterator member = type.getWritableStruct()->begin();
|
|
||||||
size_t numOriginalMembersFound = 0;
|
|
||||||
while (member != type.getStruct()->end()) {
|
|
||||||
// look for match
|
|
||||||
bool found = false;
|
|
||||||
TTypeList::const_iterator newMember;
|
|
||||||
TSourceLoc memberLoc;
|
|
||||||
memberLoc.init();
|
|
||||||
for (newMember = newTypeList.begin(); newMember != newTypeList.end(); ++newMember) {
|
|
||||||
if (member->type->getFieldName() == newMember->type->getFieldName()) {
|
|
||||||
found = true;
|
|
||||||
memberLoc = newMember->loc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found) {
|
|
||||||
++numOriginalMembersFound;
|
|
||||||
// - ensure match between redeclared members' types
|
|
||||||
// - check for things that can't be changed
|
|
||||||
// - update things that can be changed
|
|
||||||
TType& oldType = *member->type;
|
|
||||||
const TType& newType = *newMember->type;
|
|
||||||
if (! newType.sameElementType(oldType))
|
|
||||||
error(memberLoc, "cannot redeclare block member with a different type",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
if (oldType.isArray() != newType.isArray())
|
|
||||||
error(memberLoc, "cannot change arrayness of redeclared block member",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
else if (! oldType.sameArrayness(newType) && oldType.isExplicitlySizedArray())
|
|
||||||
error(memberLoc, "cannot change array size of redeclared block member",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
if (newType.getQualifier().isMemory())
|
|
||||||
error(memberLoc, "cannot add memory qualifier to redeclared block member",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
if (newType.getQualifier().hasLayout())
|
|
||||||
error(memberLoc, "cannot add layout to redeclared block member",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
if (newType.getQualifier().patch)
|
|
||||||
error(memberLoc, "cannot add patch to redeclared block member",
|
|
||||||
member->type->getFieldName().c_str(), "");
|
|
||||||
oldType.getQualifier().centroid = newType.getQualifier().centroid;
|
|
||||||
oldType.getQualifier().sample = newType.getQualifier().sample;
|
|
||||||
oldType.getQualifier().invariant = newType.getQualifier().invariant;
|
|
||||||
oldType.getQualifier().noContraction = newType.getQualifier().noContraction;
|
|
||||||
oldType.getQualifier().smooth = newType.getQualifier().smooth;
|
|
||||||
oldType.getQualifier().flat = newType.getQualifier().flat;
|
|
||||||
oldType.getQualifier().nopersp = newType.getQualifier().nopersp;
|
|
||||||
|
|
||||||
// go to next member
|
|
||||||
++member;
|
|
||||||
} else {
|
|
||||||
// For missing members of anonymous blocks that have been redeclared,
|
|
||||||
// hide the original (shared) declaration.
|
|
||||||
// Instance-named blocks can just have the member removed.
|
|
||||||
if (instanceName)
|
|
||||||
member = type.getWritableStruct()->erase(member);
|
|
||||||
else {
|
|
||||||
member->type->hideMember();
|
|
||||||
++member;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (numOriginalMembersFound < newTypeList.size())
|
|
||||||
error(loc, "block redeclaration has extra members", blockName.c_str(), "");
|
|
||||||
if (type.isArray() != (arraySizes != nullptr))
|
|
||||||
error(loc, "cannot change arrayness of redeclared block", blockName.c_str(), "");
|
|
||||||
else if (type.isArray()) {
|
|
||||||
if (type.isExplicitlySizedArray() && arraySizes->getOuterSize() == UnsizedArraySize)
|
|
||||||
error(loc, "block already declared with size, can't redeclare as implicitly-sized", blockName.c_str(), "");
|
|
||||||
else if (type.isExplicitlySizedArray() && type.getArraySizes() != *arraySizes)
|
|
||||||
error(loc, "cannot change array size of redeclared block", blockName.c_str(), "");
|
|
||||||
else if (type.isImplicitlySizedArray() && arraySizes->getOuterSize() != UnsizedArraySize)
|
|
||||||
type.changeOuterArraySize(arraySizes->getOuterSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
symbolTable.insert(*block);
|
|
||||||
|
|
||||||
// Save it in the AST for linker use.
|
|
||||||
trackLinkage(*block);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generate index to the array element in a structure buffer (SSBO)
|
// Generate index to the array element in a structure buffer (SSBO)
|
||||||
//
|
//
|
||||||
@ -7287,7 +7160,7 @@ TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, const TStr
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
if (flattenVar)
|
if (flattenVar)
|
||||||
flatten(*symbol->getAsVariable());
|
flatten(*symbol->getAsVariable(), symbolTable.atGlobalLevel());
|
||||||
|
|
||||||
if (initializer == nullptr)
|
if (initializer == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -8028,13 +7901,6 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This might be a redeclaration of a built-in block. If so, redeclareBuiltinBlock() will
|
|
||||||
// do all the rest.
|
|
||||||
// if (! symbolTable.atBuiltInLevel() && builtInName(*blockName)) {
|
|
||||||
// redeclareBuiltinBlock(loc, typeList, *blockName, instanceName, arraySizes);
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Make default block qualification, and adjust the member qualifications
|
// Make default block qualification, and adjust the member qualifications
|
||||||
|
|
||||||
TQualifier defaultQualification;
|
TQualifier defaultQualification;
|
||||||
@ -8897,7 +8763,6 @@ void HlslParseContext::addPatchConstantInvocation()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// If we synthesize a built-in interface variable, we must add it to the linkage.
|
// If we synthesize a built-in interface variable, we must add it to the linkage.
|
||||||
const auto addToLinkage = [&](const TType& type, const TString* name, TIntermSymbol** symbolNode) {
|
const auto addToLinkage = [&](const TType& type, const TString* name, TIntermSymbol** symbolNode) {
|
||||||
if (name == nullptr) {
|
if (name == nullptr) {
|
||||||
|
@ -133,7 +133,6 @@ public:
|
|||||||
void mergeQualifiers(TQualifier& dst, const TQualifier& src);
|
void mergeQualifiers(TQualifier& dst, const TQualifier& src);
|
||||||
int computeSamplerTypeIndex(TSampler&);
|
int computeSamplerTypeIndex(TSampler&);
|
||||||
TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);
|
TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&);
|
||||||
void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);
|
|
||||||
void paramFix(TType& type);
|
void paramFix(TType& type);
|
||||||
void specializationCheck(const TSourceLoc&, const TType&, const char* op);
|
void specializationCheck(const TSourceLoc&, const TType&, const char* op);
|
||||||
|
|
||||||
@ -256,19 +255,17 @@ protected:
|
|||||||
TType& split(TType& type, TString name, const TType* outerStructType = nullptr);
|
TType& split(TType& type, TString name, const TType* outerStructType = nullptr);
|
||||||
void split(const TVariable&);
|
void split(const TVariable&);
|
||||||
bool wasSplit(const TIntermTyped* node) const;
|
bool wasSplit(const TIntermTyped* node) const;
|
||||||
bool wasSplit(int id) const { return splitIoVars.find(id) != splitIoVars.end(); }
|
bool wasSplit(int id) const { return splitNonIoVars.find(id) != splitNonIoVars.end(); }
|
||||||
TVariable* getSplitIoVar(const TIntermTyped* node) const;
|
TVariable* getSplitNonIoVar(int id) const;
|
||||||
TVariable* getSplitIoVar(const TVariable* var) const;
|
|
||||||
TVariable* getSplitIoVar(int id) const;
|
|
||||||
void addPatchConstantInvocation();
|
void addPatchConstantInvocation();
|
||||||
TIntermTyped* makeIntegerIndex(TIntermTyped*);
|
TIntermTyped* makeIntegerIndex(TIntermTyped*);
|
||||||
|
|
||||||
void fixBuiltInIoType(TType&);
|
void fixBuiltInIoType(TType&);
|
||||||
|
|
||||||
void flatten(const TVariable& variable);
|
void flatten(const TVariable& variable, bool linkage);
|
||||||
int flatten(const TVariable& variable, const TType&, TFlattenData&, TString name);
|
int flatten(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage);
|
||||||
int flattenStruct(const TVariable& variable, const TType&, TFlattenData&, TString name);
|
int flattenStruct(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage);
|
||||||
int flattenArray(const TVariable& variable, const TType&, TFlattenData&, TString name);
|
int flattenArray(const TVariable& variable, const TType&, TFlattenData&, TString name, bool linkage);
|
||||||
|
|
||||||
bool hasUniform(const TQualifier& qualifier) const;
|
bool hasUniform(const TQualifier& qualifier) const;
|
||||||
void clearUniform(TQualifier& qualifier);
|
void clearUniform(TQualifier& qualifier);
|
||||||
@ -382,7 +379,7 @@ protected:
|
|||||||
TMap<const TTypeList*, tIoKinds> ioTypeMap;
|
TMap<const TTypeList*, tIoKinds> ioTypeMap;
|
||||||
|
|
||||||
// Structure splitting data:
|
// Structure splitting data:
|
||||||
TMap<int, TVariable*> splitIoVars; // variables with the built-in interstage IO removed, indexed by unique ID.
|
TMap<int, TVariable*> splitNonIoVars; // variables with the built-in interstage IO removed, indexed by unique ID.
|
||||||
|
|
||||||
// Structuredbuffer shared types. Typically there are only a few.
|
// Structuredbuffer shared types. Typically there are only a few.
|
||||||
TVector<TType*> structBufferTypes;
|
TVector<TType*> structBufferTypes;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user