Tessellation: Implicit array sizing and consistency checking of control-shader output arrays based on layout(vertices=...).

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24518 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-12-13 18:38:43 +00:00
parent 116c30b6ed
commit f3e2a89452
19 changed files with 434 additions and 104 deletions

View file

@ -88,8 +88,14 @@ void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
if (vertices == 0)
vertices = unit.vertices;
else if (vertices != unit.vertices)
error(infoSink, "Contradictory layout max_vertices values");
else if (vertices != unit.vertices) {
if (language == EShLangGeometry)
error(infoSink, "Contradictory layout max_vertices values");
else if (language == EShLangTessControl)
error(infoSink, "Contradictory layout vertices values");
else
assert(0);
}
if (vertexSpacing == EvsNone)
vertexSpacing = unit.vertexSpacing;
@ -297,11 +303,14 @@ void TIntermediate::finalCheck(TInfoSink& infoSink)
switch (language) {
case EShLangVertex:
break;
case EShLangTessControl:
if (vertices == 0)
error(infoSink, "At least one shader must specify an output layout(vertices=...)");
break;
case EShLangTessEvaluation:
if (inputPrimitive == ElgNone)
error(infoSink, "At least one tessellation shader must specify an input layout primitive");
error(infoSink, "At least one shader must specify an input layout primitive");
if (vertexSpacing == EvsNone)
vertexSpacing = EvsEqual;
if (vertexOrder == EvoNone)
@ -309,13 +318,14 @@ void TIntermediate::finalCheck(TInfoSink& infoSink)
break;
case EShLangGeometry:
if (inputPrimitive == ElgNone)
error(infoSink, "At least one geometry shader must specify an input layout primitive");
error(infoSink, "At least one shader must specify an input layout primitive");
if (outputPrimitive == ElgNone)
error(infoSink, "At least one geometry shader must specify an output layout primitive");
error(infoSink, "At least one shader must specify an output layout primitive");
if (vertices == 0)
error(infoSink, "At least one geometry shader must specify a layout(max_vertices = value)");
error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
break;
case EShLangFragment:
break;
case EShLangCompute:
break;
}