Commit 67cf1f61 by John Kessenich

Turn on basic support for shader storage buffer objects, but not yet the entire extension.

parent 79cddfcb
...@@ -12,6 +12,18 @@ const int total = gl_MaxComputeWorkGroupCount.y ...@@ -12,6 +12,18 @@ const int total = gl_MaxComputeWorkGroupCount.y
+ gl_MaxComputeAtomicCounters + gl_MaxComputeAtomicCounters
+ gl_MaxComputeAtomicCounterBuffers; + gl_MaxComputeAtomicCounterBuffers;
buffer ShaderStorageBlock
{
int value;
float values[];
};
buffer InvalidShaderStorageBlock
{
float values[]; // ERROR
int value;
} invalid;
void main() void main()
{ {
barrier(); barrier();
...@@ -21,6 +33,7 @@ void main() ...@@ -21,6 +33,7 @@ void main()
memoryBarrierShared(); memoryBarrierShared();
memoryBarrierImage(); memoryBarrierImage();
groupMemoryBarrier(); groupMemoryBarrier();
value = int(values[gl_LocalInvocationIndex]);
} }
layout(location = 2) in vec3 v3; // ERROR layout(location = 2) in vec3 v3; // ERROR
...@@ -36,3 +49,15 @@ layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR ...@@ -36,3 +49,15 @@ layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out; // ERROR
int arrX[gl_WorkGroupSize.x]; int arrX[gl_WorkGroupSize.x];
int arrY[gl_WorkGroupSize.y]; int arrY[gl_WorkGroupSize.y];
int arrZ[gl_WorkGroupSize.z]; int arrZ[gl_WorkGroupSize.z];
readonly buffer roblock
{
int value;
float values[];
} ro;
void foo()
{
ro.values[2] = 4.7; // ERROR, readonly
ro.values.length();
}
...@@ -5,7 +5,7 @@ ERROR: 0:8: 'vertex input arrays' : not supported with this profile: es ...@@ -5,7 +5,7 @@ ERROR: 0:8: 'vertex input arrays' : not supported with this profile: es
ERROR: 0:8: 'location' : overlapping use of location 10 ERROR: 0:8: 'location' : overlapping use of location 10
ERROR: 0:12: 'layout' : cannot specify matrix layout on a variable declaration ERROR: 0:12: 'layout' : cannot specify matrix layout on a variable declaration
ERROR: 0:12: 'layout' : cannot specify packing on a variable declaration ERROR: 0:12: 'layout' : cannot specify packing on a variable declaration
ERROR: 0:19: 'badf' : member of uniform block cannot have an auxiliary or interpolation qualifier ERROR: 0:19: 'badf' : member of uniform or buffer block cannot have an auxiliary or interpolation qualifier
ERROR: 0:20: 'badg' : member storage qualifier cannot contradict block storage qualifier ERROR: 0:20: 'badg' : member storage qualifier cannot contradict block storage qualifier
ERROR: 0:21: 'bad1' : member of block cannot have a packing layout qualifier ERROR: 0:21: 'bad1' : member of block cannot have a packing layout qualifier
ERROR: 0:22: 'bad2' : member of block cannot have a packing layout qualifier ERROR: 0:22: 'bad2' : member of block cannot have a packing layout qualifier
......
...@@ -38,8 +38,8 @@ ERROR: 0:107: '' : image variables not declared 'writeonly' must have a format l ...@@ -38,8 +38,8 @@ ERROR: 0:107: '' : image variables not declared 'writeonly' must have a format l
ERROR: 0:114: 'imageAtomicMin' : only supported on image with format r32i or r32ui ERROR: 0:114: 'imageAtomicMin' : only supported on image with format r32i or r32ui
ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found
ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:122: '' : memory qualifiers can only be used on image types ERROR: 0:122: '' : memory qualifiers cannot be used on this type
ERROR: 0:123: '' : memory qualifiers can only be used on image types ERROR: 0:123: '' : memory qualifiers cannot be used on this type
ERROR: 0:135: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter ERROR: 0:135: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:139: 'rg8i' : does not apply to unsigned integer images ERROR: 0:139: 'rg8i' : does not apply to unsigned integer images
ERROR: 0:140: 'rgba32i' : does not apply to floating point images ERROR: 0:140: 'rgba32i' : does not apply to floating point images
......
...@@ -2,32 +2,64 @@ ...@@ -2,32 +2,64 @@
Warning, version 430 is not yet complete; most version-specific features are present, but some are missing. Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.
ERROR: 0:4: 'local_size' : cannot change previously set size ERROR: 0:4: 'local_size' : cannot change previously set size
ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize
ERROR: 0:26: 'in' : global storage input qualifier cannot be used in a compute shader ERROR: 0:23: 'values' : only the last member of a buffer block can be run-time sized
ERROR: 0:26: 'location qualifier on input' : not supported in this stage: compute ERROR: 0:39: 'in' : global storage input qualifier cannot be used in a compute shader
ERROR: 0:27: 'in' : global storage input qualifier cannot be used in a compute shader ERROR: 0:39: 'location qualifier on input' : not supported in this stage: compute
ERROR: 0:28: 'out' : global storage output qualifier cannot be used in a compute shader ERROR: 0:40: 'in' : global storage input qualifier cannot be used in a compute shader
ERROR: 0:31: 'shared' : cannot apply layout qualifiers to a shared variable ERROR: 0:41: 'out' : global storage output qualifier cannot be used in a compute shader
ERROR: 0:31: 'location' : can only appy to uniform, buffer, in, or out storage qualifiers ERROR: 0:44: 'shared' : cannot apply layout qualifiers to a shared variable
ERROR: 0:32: 'shared' : cannot initialize this type of qualifier ERROR: 0:44: 'location' : can only appy to uniform, buffer, in, or out storage qualifiers
ERROR: 0:34: 'local_size' : can only apply to 'in' ERROR: 0:45: 'shared' : cannot initialize this type of qualifier
ERROR: 0:34: 'local_size' : can only apply to 'in' ERROR: 0:47: 'local_size' : can only apply to 'in'
ERROR: 0:34: 'local_size' : can only apply to 'in' ERROR: 0:47: 'local_size' : can only apply to 'in'
ERROR: 12 compilation errors. No code generated. ERROR: 0:47: 'local_size' : can only apply to 'in'
ERROR: 0:61: 'assign' : l-value required "ro" (can't modify a readonly buffer)
ERROR: 14 compilation errors. No code generated.
Shader version: 430 Shader version: 430
local_size = (2, 1, 4096) local_size = (2, 1, 4096)
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:15 Function Definition: main( (void) 0:27 Function Definition: main( (void)
0:15 Function Parameters: 0:27 Function Parameters:
0:17 Sequence 0:29 Sequence
0:17 Barrier (void) 0:29 Barrier (void)
0:18 MemoryBarrier (void) 0:30 MemoryBarrier (void)
0:19 MemoryBarrierAtomicCounter (void) 0:31 MemoryBarrierAtomicCounter (void)
0:20 MemoryBarrierBuffer (void) 0:32 MemoryBarrierBuffer (void)
0:21 MemoryBarrierShared (void) 0:33 MemoryBarrierShared (void)
0:22 MemoryBarrierImage (void) 0:34 MemoryBarrierImage (void)
0:23 GroupMemoryBarrier (void) 0:35 GroupMemoryBarrier (void)
0:36 move second child to first child (int)
0:36 value: direct index for structure (layout(column_major shared ) buffer int)
0:36 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:36 Constant:
0:36 0 (const uint)
0:36 Convert float to int (int)
0:36 indirect index (layout(column_major shared ) float)
0:36 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:36 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:36 Constant:
0:36 1 (const uint)
0:36 'gl_LocalInvocationIndex' (in uint)
0:59 Function Definition: foo( (void)
0:59 Function Parameters:
0:61 Sequence
0:61 move second child to first child (float)
0:61 direct index (layout(column_major shared ) float)
0:61 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:61 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:61 Constant:
0:61 1 (const int)
0:61 Constant:
0:61 2 (const int)
0:61 Constant:
0:61 4.700000
0:62 array length (int)
0:62 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:62 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:62 Constant:
0:62 1 (const int)
0:? Linker Objects 0:? Linker Objects
0:? 'gl_WorkGroupSize' (const 3-component vector of uint) 0:? 'gl_WorkGroupSize' (const 3-component vector of uint)
0:? 2 (const uint) 0:? 2 (const uint)
...@@ -35,6 +67,8 @@ ERROR: node is still EOpNull! ...@@ -35,6 +67,8 @@ ERROR: node is still EOpNull!
0:? 4096 (const uint) 0:? 4096 (const uint)
0:? 'total' (const int) 0:? 'total' (const int)
0:? 66592 (const int) 0:? 66592 (const int)
0:? 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:? 'invalid' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer implicitly-sized array of float values, layout(column_major shared ) buffer int value})
0:? 'v3' (layout(location=2 ) in 3-component vector of float) 0:? 'v3' (layout(location=2 ) in 3-component vector of float)
0:? 'f' (in float) 0:? 'f' (in float)
0:? 'fo' (out float) 0:? 'fo' (out float)
...@@ -44,6 +78,7 @@ ERROR: node is still EOpNull! ...@@ -44,6 +78,7 @@ ERROR: node is still EOpNull!
0:? 'arrX' (2-element array of int) 0:? 'arrX' (2-element array of int)
0:? 'arrY' (1-element array of int) 0:? 'arrY' (1-element array of int)
0:? 'arrZ' (4096-element array of int) 0:? 'arrZ' (4096-element array of int)
0:? 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
Linked compute stage: Linked compute stage:
...@@ -52,16 +87,46 @@ Linked compute stage: ...@@ -52,16 +87,46 @@ Linked compute stage:
Shader version: 430 Shader version: 430
local_size = (2, 1, 4096) local_size = (2, 1, 4096)
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:15 Function Definition: main( (void) 0:27 Function Definition: main( (void)
0:15 Function Parameters: 0:27 Function Parameters:
0:17 Sequence 0:29 Sequence
0:17 Barrier (void) 0:29 Barrier (void)
0:18 MemoryBarrier (void) 0:30 MemoryBarrier (void)
0:19 MemoryBarrierAtomicCounter (void) 0:31 MemoryBarrierAtomicCounter (void)
0:20 MemoryBarrierBuffer (void) 0:32 MemoryBarrierBuffer (void)
0:21 MemoryBarrierShared (void) 0:33 MemoryBarrierShared (void)
0:22 MemoryBarrierImage (void) 0:34 MemoryBarrierImage (void)
0:23 GroupMemoryBarrier (void) 0:35 GroupMemoryBarrier (void)
0:36 move second child to first child (int)
0:36 value: direct index for structure (layout(column_major shared ) buffer int)
0:36 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:36 Constant:
0:36 0 (const uint)
0:36 Convert float to int (int)
0:36 indirect index (layout(column_major shared ) float)
0:36 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:36 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:36 Constant:
0:36 1 (const uint)
0:36 'gl_LocalInvocationIndex' (in uint)
0:59 Function Definition: foo( (void)
0:59 Function Parameters:
0:61 Sequence
0:61 move second child to first child (float)
0:61 direct index (layout(column_major shared ) float)
0:61 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:61 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:61 Constant:
0:61 1 (const int)
0:61 Constant:
0:61 2 (const int)
0:61 Constant:
0:61 4.700000
0:62 array length (int)
0:62 values: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of float)
0:62 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:62 Constant:
0:62 1 (const int)
0:? Linker Objects 0:? Linker Objects
0:? 'gl_WorkGroupSize' (const 3-component vector of uint) 0:? 'gl_WorkGroupSize' (const 3-component vector of uint)
0:? 2 (const uint) 0:? 2 (const uint)
...@@ -69,6 +134,8 @@ ERROR: node is still EOpNull! ...@@ -69,6 +134,8 @@ ERROR: node is still EOpNull!
0:? 4096 (const uint) 0:? 4096 (const uint)
0:? 'total' (const int) 0:? 'total' (const int)
0:? 66592 (const int) 0:? 66592 (const int)
0:? 'anon@0' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
0:? 'invalid' (layout(column_major shared ) buffer block{layout(column_major shared ) buffer implicitly-sized array of float values, layout(column_major shared ) buffer int value})
0:? 'v3' (layout(location=2 ) in 3-component vector of float) 0:? 'v3' (layout(location=2 ) in 3-component vector of float)
0:? 'f' (in float) 0:? 'f' (in float)
0:? 'fo' (out float) 0:? 'fo' (out float)
...@@ -78,4 +145,5 @@ ERROR: node is still EOpNull! ...@@ -78,4 +145,5 @@ ERROR: node is still EOpNull!
0:? 'arrX' (2-element array of int) 0:? 'arrX' (2-element array of int)
0:? 'arrY' (1-element array of int) 0:? 'arrY' (1-element array of int)
0:? 'arrZ' (4096-element array of int) 0:? 'arrZ' (4096-element array of int)
0:? 'ro' (layout(column_major shared ) readonly buffer block{layout(column_major shared ) buffer int value, layout(column_major shared ) buffer implicitly-sized array of float values})
...@@ -35,10 +35,6 @@ ERROR: 0:106: '' : vertex input cannot be further qualified ...@@ -35,10 +35,6 @@ ERROR: 0:106: '' : vertex input cannot be further qualified
ERROR: 0:106: 'redeclaration' : cannot change storage, memory, or auxiliary qualification of gl_FrontColor ERROR: 0:106: 'redeclaration' : cannot change storage, memory, or auxiliary qualification of gl_FrontColor
ERROR: 0:112: 'ColorIvn' : identifier not previously declared ERROR: 0:112: 'ColorIvn' : identifier not previously declared
WARNING: 0:118: '' : unknown requalification WARNING: 0:118: '' : unknown requalification
ERROR: 0:123: '' : memory qualifiers can only be used on image types
ERROR: 0:122: '' : memory qualifiers can only be used on image types
ERROR: 0:128: '' : memory qualifiers can only be used on image types
ERROR: 0:129: '' : memory qualifiers can only be used on image types
ERROR: 0:132: 'shared' : not supported in this stage: vertex ERROR: 0:132: 'shared' : not supported in this stage: vertex
ERROR: 0:134: '' : function does not return a value: funcA ERROR: 0:134: '' : function does not return a value: funcA
ERROR: 0:136: '' : function does not return a value: funcB ERROR: 0:136: '' : function does not return a value: funcB
...@@ -47,7 +43,7 @@ ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to ...@@ -47,7 +43,7 @@ ERROR: 0:170: 'coherent' : argument cannot drop memory qualifier when passed to
ERROR: 0:192: 'constructor' : constructing from a non-dereferenced array ERROR: 0:192: 'constructor' : constructing from a non-dereferenced array
ERROR: 0:193: 'constructor' : constructing from a non-dereferenced array ERROR: 0:193: 'constructor' : constructing from a non-dereferenced array
ERROR: 0:194: 'constructor' : constructing from a non-dereferenced array ERROR: 0:194: 'constructor' : constructing from a non-dereferenced array
ERROR: 45 compilation errors. No code generated. ERROR: 41 compilation errors. No code generated.
Shader version: 430 Shader version: 430
...@@ -314,8 +310,8 @@ ERROR: node is still EOpNull! ...@@ -314,8 +310,8 @@ ERROR: node is still EOpNull!
0:? 'c' (in 4-component vector of float) 0:? 'c' (in 4-component vector of float)
0:? 'd' (in 4-component vector of float) 0:? 'd' (in 4-component vector of float)
0:? 'v' (smooth out 4-component vector of float) 0:? 'v' (smooth out 4-component vector of float)
0:? 'anon@6' (layout(row_major shared ) coherent uniform block{layout(row_major shared ) readonly uniform 4-component vector of float member1, layout(row_major shared ) uniform 4-component vector of float member2}) 0:? 'anon@6' (layout(column_major shared ) coherent buffer block{layout(column_major shared ) readonly buffer 4-component vector of float member1, layout(column_major shared ) buffer 4-component vector of float member2})
0:? 'anon@7' (layout(row_major shared ) uniform block{layout(row_major shared ) coherent readonly uniform 4-component vector of float member1A, layout(row_major shared ) coherent uniform 4-component vector of float member2A}) 0:? 'anon@7' (layout(column_major shared ) buffer block{layout(column_major shared ) coherent readonly buffer 4-component vector of float member1A, layout(column_major shared ) coherent buffer 4-component vector of float member2A})
0:? 'shv' (shared 4-component vector of float) 0:? 'shv' (shared 4-component vector of float)
0:? 'img1' (layout(rgba32f ) uniform image2D) 0:? 'img1' (layout(rgba32f ) uniform image2D)
0:? 'img2' (layout(rgba32f ) coherent uniform image2D) 0:? 'img2' (layout(rgba32f ) coherent uniform image2D)
...@@ -590,8 +586,8 @@ ERROR: node is still EOpNull! ...@@ -590,8 +586,8 @@ ERROR: node is still EOpNull!
0:? 'c' (in 4-component vector of float) 0:? 'c' (in 4-component vector of float)
0:? 'd' (in 4-component vector of float) 0:? 'd' (in 4-component vector of float)
0:? 'v' (smooth out 4-component vector of float) 0:? 'v' (smooth out 4-component vector of float)
0:? 'anon@6' (layout(row_major shared ) coherent uniform block{layout(row_major shared ) readonly uniform 4-component vector of float member1, layout(row_major shared ) uniform 4-component vector of float member2}) 0:? 'anon@6' (layout(column_major shared ) coherent buffer block{layout(column_major shared ) readonly buffer 4-component vector of float member1, layout(column_major shared ) buffer 4-component vector of float member2})
0:? 'anon@7' (layout(row_major shared ) uniform block{layout(row_major shared ) coherent readonly uniform 4-component vector of float member1A, layout(row_major shared ) coherent uniform 4-component vector of float member2A}) 0:? 'anon@7' (layout(column_major shared ) buffer block{layout(column_major shared ) coherent readonly buffer 4-component vector of float member1A, layout(column_major shared ) coherent buffer 4-component vector of float member2A})
0:? 'shv' (shared 4-component vector of float) 0:? 'shv' (shared 4-component vector of float)
0:? 'img1' (layout(rgba32f ) uniform image2D) 0:? 'img1' (layout(rgba32f ) uniform image2D)
0:? 'img2' (layout(rgba32f ) coherent uniform image2D) 0:? 'img2' (layout(rgba32f ) coherent uniform image2D)
......
...@@ -197,9 +197,10 @@ Shader Functionality to Implement/Finish ...@@ -197,9 +197,10 @@ Shader Functionality to Implement/Finish
+ Clarify that textureGatherOffset() can take non-constants for the offsets. + Clarify that textureGatherOffset() can take non-constants for the offsets.
GLSL 4.3 GLSL 4.3
- Add shader storage buffer objects, as per the ARB_shader_storage_buffer_object extension. This includes - Add shader storage buffer objects, as per the ARB_shader_storage_buffer_object extension. This includes
- allowing the last member of a storage buffer block to be an array that does not know its size until render time + allowing the last member of a storage buffer block to be an array that does not know its size until render time
- read/write memory shared with the application and other shader invocations - read/write memory shared with the application and other shader invocations
- adding the std430 layout qualifier for shader storage blocks + adding the std430 layout qualifier for shader storage blocks
- add atomic built-ins
- Allow .length() on all arrays; returning a compile-time constant or not, depending on how the - Allow .length() on all arrays; returning a compile-time constant or not, depending on how the
array is sized, as per the ARB_shader_storage_buffer_object extension. array is sized, as per the ARB_shader_storage_buffer_object extension.
- Be clear that implicit array sizing is only within a stage, not cross stage. - Be clear that implicit array sizing is only within a stage, not cross stage.
......
...@@ -67,8 +67,8 @@ enum TStorageQualifier { ...@@ -67,8 +67,8 @@ enum TStorageQualifier {
EvqConst, // User-defined constant values, will be semantically constant and constant folded EvqConst, // User-defined constant values, will be semantically constant and constant folded
EvqVaryingIn, // pipeline input, read only EvqVaryingIn, // pipeline input, read only
EvqVaryingOut, // pipeline ouput, read/write EvqVaryingOut, // pipeline ouput, read/write
EvqUniform, // read only, shader with app EvqUniform, // read only, shared with app
EvqBuffer, // read only, shader with app EvqBuffer, // read/write, shared with app
EvqShared, // compute shader's read/write 'shared' qualifier EvqShared, // compute shader's read/write 'shared' qualifier
// parameters // parameters
......
...@@ -406,7 +406,7 @@ public: ...@@ -406,7 +406,7 @@ public:
} }
} }
bool isUniform() const bool isUniformOrBuffer() const
{ {
switch (storage) { switch (storage) {
case EvqUniform: case EvqUniform:
...@@ -802,10 +802,15 @@ public: ...@@ -802,10 +802,15 @@ public:
vectorSize = 0; vectorSize = 0;
} }
bool isScalar() bool isScalar() const
{ {
return matrixCols == 0 && vectorSize == 1 && arraySizes == 0 && userDef == 0; return matrixCols == 0 && vectorSize == 1 && arraySizes == 0 && userDef == 0;
} }
bool isImage() const
{
return basicType == EbtSampler && sampler.image;
}
}; };
typedef std::map<TTypeList*, TTypeList*> TStructureMap; typedef std::map<TTypeList*, TTypeList*> TStructureMap;
...@@ -1008,9 +1013,11 @@ public: ...@@ -1008,9 +1013,11 @@ public:
virtual bool isVector() const { return vectorSize > 1; } virtual bool isVector() const { return vectorSize > 1; }
virtual bool isMatrix() const { return matrixCols ? true : false; } virtual bool isMatrix() const { return matrixCols ? true : false; }
virtual bool isArray() const { return arraySizes != 0; } virtual bool isArray() const { return arraySizes != 0; }
virtual bool isImplicitlySizedArray() const { return isArray() && ! getArraySize(); } virtual bool isImplicitlySizedArray() const { return isArray() && ! getArraySize() && qualifier.storage != EvqBuffer; }
virtual bool isExplicitlySizedArray() const { return ! isImplicitlySizedArray(); } virtual bool isExplicitlySizedArray() const { return isArray() && getArraySize(); }
virtual bool isRuntimeSizedArray() const { return isArray() && ! getArraySize() && qualifier.storage == EvqBuffer; }
virtual bool isStruct() const { return structure != 0; } virtual bool isStruct() const { return structure != 0; }
virtual bool isImage() const { return basicType == EbtSampler && getSampler().image; }
// Recursively checks if the type contains the given basic type // Recursively checks if the type contains the given basic type
virtual bool containsBasicType(TBasicType checkType) const virtual bool containsBasicType(TBasicType checkType) const
......
...@@ -1213,7 +1213,7 @@ storage_qualifier ...@@ -1213,7 +1213,7 @@ storage_qualifier
| BUFFER { | BUFFER {
parseContext.globalCheck($1.loc, "buffer"); parseContext.globalCheck($1.loc, "buffer");
$$.init($1.loc); $$.init($1.loc);
$$.qualifier.storage = EvqUniform; // TODO: 4.0 functionality: implement BUFFER $$.qualifier.storage = EvqBuffer;
} }
| SHARED { | SHARED {
parseContext.requireProfile($1.loc, ~EEsProfile, "shared"); parseContext.requireProfile($1.loc, ~EEsProfile, "shared");
......
...@@ -257,6 +257,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) ...@@ -257,6 +257,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
case EOpAny: out.debug << "any"; break; case EOpAny: out.debug << "any"; break;
case EOpAll: out.debug << "all"; break; case EOpAll: out.debug << "all"; break;
case EOpArrayLength: out.debug << "array length"; break;
case EOpEmitStreamVertex: out.debug << "EmitStreamVertex"; break; case EOpEmitStreamVertex: out.debug << "EmitStreamVertex"; break;
case EOpEndStreamPrimitive: out.debug << "EndStreamPrimitive"; break; case EOpEndStreamPrimitive: out.debug << "EndStreamPrimitive"; break;
......
...@@ -604,13 +604,15 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ ...@@ -604,13 +604,15 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
set = 0; set = 0;
else if (qualifier.isPipeOutput()) else if (qualifier.isPipeOutput())
set = 1; set = 1;
else if (qualifier.isUniform()) else if (qualifier.storage == EvqUniform)
set = 2; set = 2;
else if (qualifier.storage == EvqBuffer)
set = 3;
else else
return -1; return -1;
int size; int size;
if (qualifier.isUniform()) { if (qualifier.isUniformOrBuffer()) {
if (type.isArray()) if (type.isArray())
size = type.getArraySize(); size = type.getArraySize();
else else
......
...@@ -310,7 +310,7 @@ protected: ...@@ -310,7 +310,7 @@ protected:
TGraph callGraph; TGraph callGraph;
std::set<TString> ioAccessed; // set of names of statically read/written I/O that might need extra checking std::set<TString> ioAccessed; // set of names of statically read/written I/O that might need extra checking
std::vector<TIoRange> usedIo[3]; // sets of used locations, one for each of in, out, and uniform std::vector<TIoRange> usedIo[4]; // sets of used locations, one for each of in, out, uniform and buffers
std::vector<TXfbBuffer> xfbBuffers; // all the data we need to track per xfb buffer std::vector<TXfbBuffer> xfbBuffers; // all the data we need to track per xfb buffer
private: private:
......
...@@ -265,7 +265,7 @@ public: ...@@ -265,7 +265,7 @@ public:
// We have an array or structure or block dereference, see if it's a uniform // We have an array or structure or block dereference, see if it's a uniform
// based dereference (if not, skip it). // based dereference (if not, skip it).
TIntermSymbol* base = findBase(topNode); TIntermSymbol* base = findBase(topNode);
if (! base || base->getQualifier().storage != EvqUniform) if (! base || ! base->getQualifier().isUniformOrBuffer())
return; return;
// See if we've already processed this (e.g., in the middle of something // See if we've already processed this (e.g., in the middle of something
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment