From e1b2e39a56c6ffd62636437dd9e20daa92e4ebfa Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Sat, 7 Dec 2013 00:28:07 +0000 Subject: [PATCH] Allow layout aliasing for desktop vertex inputs. git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24400 e7fa87d3-cd2b-0410-9028-fcbf551c1848 --- Test/430.vert | 3 +++ Test/baseResults/430.vert.out | 4 +++- Todo.txt | 5 ++--- glslang/Include/revision.h | 4 ++-- glslang/MachineIndependent/ParseHelper.cpp | 2 -- glslang/MachineIndependent/linkValidate.cpp | 14 ++++++++------ 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Test/430.vert b/Test/430.vert index 4a6b5c81..e5b27c4a 100644 --- a/Test/430.vert +++ b/Test/430.vert @@ -41,4 +41,7 @@ layout(location = 10) out S cs[2]; // 10 through 10 + 2 * 22 - 1 = 53 layout(location = 54) out float cf; layout(location = 53) out float cg; // ERROR, collision at 31 +layout(location = 10) in vec4 alias1; +layout(location = 10) in vec4 alias2; // okay for vertex input on desktop + float gl_ClipDistance[17]; // ERROR, size too big \ No newline at end of file diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out index 20418023..486d0c00 100644 --- a/Test/baseResults/430.vert.out +++ b/Test/baseResults/430.vert.out @@ -12,7 +12,7 @@ ERROR: 0:28: '' : cannot use invariant qualifier on a function parameter ERROR: 0:30: '' : cannot use layout qualifiers on a function parameter ERROR: 0:31: '' : cannot use auxiliary or interpolation qualifiers on a function parameter ERROR: 0:42: 'location' : repeated use of location 53 -ERROR: 0:44: 'gl_ClipDistance array size' : must be less than gl_MaxClipDistances (8) +ERROR: 0:47: 'gl_ClipDistance array size' : must be less than gl_MaxClipDistances (8) ERROR: 13 compilation errors. No code generated. @@ -45,6 +45,8 @@ ERROR: node is still EOpNull! 0:? 'cs' (layout(location=10 ) smooth out 2-element array of structure{m,f}) 0:? 'cf' (layout(location=54 ) smooth out float) 0:? 'cg' (layout(location=53 ) smooth out float) +0:? 'alias1' (layout(location=10 ) in 4-component vector of float) +0:? 'alias2' (layout(location=10 ) in 4-component vector of float) 0:? 'gl_VertexID' (gl_VertexId int) 0:? 'gl_InstanceID' (gl_InstanceId int) diff --git a/Todo.txt b/Todo.txt index 6d6fdbe7..16b13067 100644 --- a/Todo.txt +++ b/Todo.txt @@ -33,9 +33,8 @@ Link Validation - ... + exactly one main + ES 3.0: fragment outputs all have locations, if more than one - - ES 3.0: location aliasing/overlap (except desktop vertex shader inputs) - - Non ES: binding overlap - + location overlap + + location aliasing/overlap (except desktop vertex shader inputs) + - Non ES: binding overlap for atomic counters + Non ES: geometry shader input array sizes and input layout qualifier declaration + Non ES: read or write to both gl_ClipVertex and gl_ClipDistance + Non ES: write to only one of gl_FragColor, gl_FragData, or user-declared diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index c2ee2195..85375b63 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -9,5 +9,5 @@ // source have to figure out how to create revision.h just to get a build // going. However, if it is not updated, it can be a version behind. -#define GLSLANG_REVISION "24396" -#define GLSLANG_DATE "2013/12/06 14:45:15" +#define GLSLANG_REVISION "24397" +#define GLSLANG_DATE "2013/12/06 16:57:42" diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index af6265d8..2b77f215 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -2694,8 +2694,6 @@ void TParseContext::layoutTypeCheck(TSourceLoc loc, const TSymbol& symbol) // an array of size N, all elements of the array from binding through binding + N – 1 must be within this // range." // - // TODO: 4.2 binding limits: binding error checking against limits, arrays - // if (type.getBasicType() != EbtSampler && type.getBasicType() != EbtBlock) error(loc, "requires block, or sampler/image, or atomic-counter type", "binding", ""); // TODO: 4.2 functionality: atomic counter: include in test above diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp index b4f32d9d..f0057284 100644 --- a/glslang/MachineIndependent/linkValidate.cpp +++ b/glslang/MachineIndependent/linkValidate.cpp @@ -476,12 +476,14 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ TRange range = { qualifier.layoutSlotLocation, qualifier.layoutSlotLocation + size - 1 }; - // check for collisions - for (size_t r = 0; r < usedLocations[set].size(); ++r) { - if (range.last >= usedLocations[set][r].start && - range.start <= usedLocations[set][r].last) { - // there is a collision; pick one - return std::max(range.start, usedLocations[set][r].start); + // check for collisions, except for vertex inputs on desktop + if (! (profile != EEsProfile && language == EShLangVertex && qualifier.isPipeInput())) { + for (size_t r = 0; r < usedLocations[set].size(); ++r) { + if (range.last >= usedLocations[set][r].start && + range.start <= usedLocations[set][r].last) { + // there is a collision; pick one + return std::max(range.start, usedLocations[set][r].start); + } } }