mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 12:00:05 +00:00
GLSL front-end: Check recursively for opaque types in a block; these are all illegal.
This commit is contained in:
parent
ee21fc9081
commit
3cd0024ea8
@ -18,10 +18,10 @@ uniform fooBlock {
|
||||
uvec4 bv;
|
||||
uniform mat2 bm2;
|
||||
lowp isampler2D sampler; // ERROR
|
||||
struct T2 { // ERROR
|
||||
struct T2 { // ERROR
|
||||
int a;
|
||||
} t;
|
||||
S fbs;
|
||||
S fbs; // ERROR, contains a sampler
|
||||
};
|
||||
|
||||
uniform barBlock {
|
||||
|
@ -1,7 +1,8 @@
|
||||
300block.frag
|
||||
ERROR: 0:10: '' : cannot nest a structure definition inside a structure or block
|
||||
ERROR: 0:21: '' : cannot nest a structure definition inside a structure or block
|
||||
ERROR: 0:20: 'sampler' : member of block cannot be a sampler type
|
||||
ERROR: 0:20: 'sampler' : member of block cannot be or contain a sampler, image, or atomic_uint type
|
||||
ERROR: 0:24: 'fbs' : member of block cannot be or contain a sampler, image, or atomic_uint type
|
||||
ERROR: 0:45: 'variable indexing uniform block array' : not supported for this version or the enabled extensions
|
||||
ERROR: 0:46: 'fooBlock' : cannot be used (maybe an instance name is needed)
|
||||
ERROR: 0:46: 'fooBlock' : undeclared identifier
|
||||
@ -15,7 +16,7 @@ ERROR: 0:55: 'barBlockArray' : cannot be used (maybe an instance name is needed)
|
||||
ERROR: 0:55: 'barBlockArray' : undeclared identifier
|
||||
ERROR: 0:55: '*' : wrong operand types: no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type 'temp float' (or there is no acceptable conversion)
|
||||
ERROR: 0:58: 'fooBlock' : redefinition
|
||||
ERROR: 16 compilation errors. No code generated.
|
||||
ERROR: 17 compilation errors. No code generated.
|
||||
|
||||
|
||||
Shader version: 300
|
||||
|
@ -15,7 +15,7 @@ ERROR: 0:79: 'vertex-shader array-of-struct output' : not supported with this pr
|
||||
ERROR: 0:81: 'vertex-shader struct output containing an array' : not supported with this profile: es
|
||||
ERROR: 0:83: 'vertex-shader struct output containing structure' : not supported with this profile: es
|
||||
ERROR: 0:85: 'std430 on a uniform block' : not supported with this profile: es
|
||||
ERROR: 0:97: 's' : member of block cannot be a sampler type
|
||||
ERROR: 0:97: 's' : member of block cannot be or contain a sampler, image, or atomic_uint type
|
||||
ERROR: 0:105: 'location' : overlapping use of location 12
|
||||
ERROR: 0:107: 'input block' : not supported in this stage: vertex
|
||||
ERROR: 0:109: 'gl_PerVertex' : block redeclaration has extra members
|
||||
|
@ -1161,6 +1161,19 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool containsOpaque() const
|
||||
{
|
||||
if (basicType == EbtSampler || basicType == EbtAtomicUint)
|
||||
return true;
|
||||
if (! structure)
|
||||
return false;
|
||||
for (unsigned int i = 0; i < structure->size(); ++i) {
|
||||
if ((*structure)[i].type->containsOpaque())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Array editing methods. Array descriptors can be shared across
|
||||
// type instances. This allows all uses of the same array
|
||||
// to be updated at once. E.g., all nodes can be explicitly sized
|
||||
|
@ -2,5 +2,5 @@
|
||||
// For the version, it uses the latest git tag followed by the number of commits.
|
||||
// For the date, it uses the current date (when then script is run).
|
||||
|
||||
#define GLSLANG_REVISION "3.0.775"
|
||||
#define GLSLANG_DATE "21-Sep-2015"
|
||||
#define GLSLANG_REVISION "3.0.776"
|
||||
#define GLSLANG_DATE "30-Sep-2015"
|
||||
|
@ -4981,9 +4981,8 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
|
||||
profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
|
||||
}
|
||||
|
||||
TBasicType basicType = memberType.getBasicType();
|
||||
if (basicType == EbtSampler)
|
||||
error(memberLoc, "member of block cannot be a sampler type", typeList[member].type->getFieldName().c_str(), "");
|
||||
if (memberType.containsOpaque())
|
||||
error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), "");
|
||||
}
|
||||
|
||||
// This might be a redeclaration of a built-in block. If so, redeclareBuiltinBlock() will
|
||||
|
Loading…
Reference in New Issue
Block a user