Front-end: Fix issue #147: ensure layout(index=N) has N in [0,1].

This commit is contained in:
John Kessenich 2016-06-05 17:25:34 -06:00
parent 119f8f6906
commit 133253b6ee
3 changed files with 13 additions and 1 deletions

View File

@ -148,3 +148,5 @@ void fooKeyMem()
{
KeyMem.precise;
}
layout(location=28, index=2) out vec4 outIndex2; // ERROR index out of range

View File

@ -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:141: 'textureQueryLod' : no matching overloaded function found
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
@ -122,6 +123,7 @@ ERROR: node is still EOpNull!
0:? 'samp2Ds' (uniform sampler2DShadow)
0:? 'precise' (global int)
0:? 'KeyMem' (global structure{global int precise})
0:? 'outIndex2' (layout(location=28 index=0 ) out 4-component vector of float)
Linked fragment stage:
@ -211,4 +213,5 @@ ERROR: node is still EOpNull!
0:? 'samp2Ds' (uniform sampler2DShadow)
0:? 'precise' (global int)
0:? 'KeyMem' (global structure{global int precise})
0:? 'outIndex2' (layout(location=28 index=0 ) out 4-component vector of float)

View File

@ -4225,6 +4225,13 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
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 };
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;
return;
}