Front-end: Fix issue #147: ensure layout(index=N) has N in [0,1].
This commit is contained in:
parent
119f8f6906
commit
133253b6ee
3 changed files with 13 additions and 1 deletions
|
|
@ -148,3 +148,5 @@ void fooKeyMem()
|
||||||
{
|
{
|
||||||
KeyMem.precise;
|
KeyMem.precise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
layout(location=28, index=2) out vec4 outIndex2; // ERROR index out of range
|
||||||
|
|
@ -37,7 +37,8 @@ ERROR: 0:140: 'textureQueryLod' : no matching overloaded function found
|
||||||
ERROR: 0:140: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
ERROR: 0:140: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
||||||
ERROR: 0:141: 'textureQueryLod' : no matching overloaded function found
|
ERROR: 0:141: 'textureQueryLod' : no matching overloaded function found
|
||||||
ERROR: 0:141: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
ERROR: 0:141: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
||||||
ERROR: 38 compilation errors. No code generated.
|
ERROR: 0:152: 'index' : value must be 0 or 1
|
||||||
|
ERROR: 39 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
Shader version: 330
|
Shader version: 330
|
||||||
|
|
@ -122,6 +123,7 @@ ERROR: node is still EOpNull!
|
||||||
0:? 'samp2Ds' (uniform sampler2DShadow)
|
0:? 'samp2Ds' (uniform sampler2DShadow)
|
||||||
0:? 'precise' (global int)
|
0:? 'precise' (global int)
|
||||||
0:? 'KeyMem' (global structure{global int precise})
|
0:? 'KeyMem' (global structure{global int precise})
|
||||||
|
0:? 'outIndex2' (layout(location=28 index=0 ) out 4-component vector of float)
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
Linked fragment stage:
|
||||||
|
|
@ -211,4 +213,5 @@ ERROR: node is still EOpNull!
|
||||||
0:? 'samp2Ds' (uniform sampler2DShadow)
|
0:? 'samp2Ds' (uniform sampler2DShadow)
|
||||||
0:? 'precise' (global int)
|
0:? 'precise' (global int)
|
||||||
0:? 'KeyMem' (global structure{global int precise})
|
0:? 'KeyMem' (global structure{global int precise})
|
||||||
|
0:? 'outIndex2' (layout(location=28 index=0 ) out 4-component vector of float)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4225,6 +4225,13 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
|
||||||
requireProfile(loc, ECompatibilityProfile | ECoreProfile, "index layout qualifier on fragment output");
|
requireProfile(loc, ECompatibilityProfile | ECoreProfile, "index layout qualifier on fragment output");
|
||||||
const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };
|
const char* exts[2] = { E_GL_ARB_separate_shader_objects, E_GL_ARB_explicit_attrib_location };
|
||||||
profileRequires(loc, ECompatibilityProfile | ECoreProfile, 330, 2, exts, "index layout qualifier on fragment output");
|
profileRequires(loc, ECompatibilityProfile | ECoreProfile, 330, 2, exts, "index layout qualifier on fragment output");
|
||||||
|
|
||||||
|
// "It is also a compile-time error if a fragment shader sets a layout index to less than 0 or greater than 1."
|
||||||
|
if (value < 0 || value > 1) {
|
||||||
|
value = 0;
|
||||||
|
error(loc, "value must be 0 or 1", "index", "");
|
||||||
|
}
|
||||||
|
|
||||||
publicType.qualifier.layoutIndex = value;
|
publicType.qualifier.layoutIndex = value;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue