зеркало из https://github.com/stride3d/xkslang.git
Fix issue #382: Detect implicitly-sized atomic_uint arrays.
This commit is contained in:
Родитель
f2cfe27021
Коммит
934855a642
|
@ -10,3 +10,5 @@ void main()
|
||||||
|
|
||||||
layout(depth_less) in float depth; // ERROR: depth_less only applies to gl_FragDepth
|
layout(depth_less) in float depth; // ERROR: depth_less only applies to gl_FragDepth
|
||||||
layout(depth_any) out float gl_FragDepth; // ERROR, done after use
|
layout(depth_any) out float gl_FragDepth; // ERROR, done after use
|
||||||
|
|
||||||
|
layout(binding=0) uniform atomic_uint a[];
|
||||||
|
|
|
@ -3,6 +3,7 @@ Warning, version 420 is not yet complete; most version-specific features are pre
|
||||||
ERROR: 0:4: 'redeclaration' : all redeclarations must use the same depth layout on gl_FragDepth
|
ERROR: 0:4: 'redeclaration' : all redeclarations must use the same depth layout on gl_FragDepth
|
||||||
ERROR: 0:11: 'layout qualifier' : can only apply depth layout to gl_FragDepth
|
ERROR: 0:11: 'layout qualifier' : can only apply depth layout to gl_FragDepth
|
||||||
ERROR: 0:12: 'gl_FragDepth' : cannot redeclare after use
|
ERROR: 0:12: 'gl_FragDepth' : cannot redeclare after use
|
||||||
|
WARNING: 0:14: 'atomic_uint' : implicitly sized atomic_uint array treated as having one element for tracking the default offset
|
||||||
ERROR: 3 compilation errors. No code generated.
|
ERROR: 3 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ ERROR: node is still EOpNull!
|
||||||
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
||||||
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
||||||
0:? 'depth' (smooth in float)
|
0:? 'depth' (smooth in float)
|
||||||
|
0:? 'a' (layout(binding=0 offset=0 ) uniform implicitly-sized array of atomic_uint)
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
Linked fragment stage:
|
||||||
|
@ -39,4 +41,5 @@ ERROR: node is still EOpNull!
|
||||||
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
||||||
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
0:? 'gl_FragDepth' (gl_FragDepth float FragDepth)
|
||||||
0:? 'depth' (smooth in float)
|
0:? 'depth' (smooth in float)
|
||||||
|
0:? 'a' (layout(binding=0 offset=0 ) uniform 1-element array of atomic_uint)
|
||||||
|
|
||||||
|
|
|
@ -4753,8 +4753,18 @@ void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol)
|
||||||
|
|
||||||
// Check for overlap
|
// Check for overlap
|
||||||
int numOffsets = 4;
|
int numOffsets = 4;
|
||||||
if (symbol.getType().isArray())
|
if (symbol.getType().isArray()) {
|
||||||
numOffsets *= symbol.getType().getCumulativeArraySize();
|
if (symbol.getType().isExplicitlySizedArray())
|
||||||
|
numOffsets *= symbol.getType().getCumulativeArraySize();
|
||||||
|
else {
|
||||||
|
// TODO: functionality: implicitly-sized atomic_uint arrays.
|
||||||
|
// We don't know the full size until later. This might
|
||||||
|
// be a specification problem, will report to Khronos. For the
|
||||||
|
// cases that is not true, the rest of the checking would need
|
||||||
|
// to be done at link time instead of compile time.
|
||||||
|
warn(loc, "implicitly sized atomic_uint array treated as having one element for tracking the default offset", "atomic_uint", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
int repeated = intermediate.addUsedOffsets(qualifier.layoutBinding, offset, numOffsets);
|
int repeated = intermediate.addUsedOffsets(qualifier.layoutBinding, offset, numOffsets);
|
||||||
if (repeated >= 0)
|
if (repeated >= 0)
|
||||||
error(loc, "atomic counters sharing the same offset:", "offset", "%d", repeated);
|
error(loc, "atomic counters sharing the same offset:", "offset", "%d", repeated);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче