Track separate precision defaults for each kind of sampler, give initial defaults as per spec. Also make fragment floats have no default. Modify/add tests to adapt to these changes.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22066 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-06-19 05:41:25 +00:00
parent c59d0cd9e6
commit 41a36bbb2f
13 changed files with 91 additions and 34 deletions

View File

@ -1,23 +1,23 @@
#version 300 es #version 300 es
uniform sampler2D s2D; uniform sampler2D s2D;
uniform sampler3D s3D; uniform lowp sampler3D s3D;
uniform samplerCube sCube; uniform samplerCube sCube;
uniform samplerCubeShadow sCubeShadow; uniform lowp samplerCubeShadow sCubeShadow;
uniform sampler2DShadow s2DShadow; uniform lowp sampler2DShadow s2DShadow;
uniform sampler2DArray s2DArray; uniform lowp sampler2DArray s2DArray;
uniform sampler2DArrayShadow s2DArrayShadow; uniform lowp sampler2DArrayShadow s2DArrayShadow;
uniform isampler2D is2D; uniform lowp isampler2D is2D;
uniform isampler3D is3D; uniform lowp isampler3D is3D;
uniform isamplerCube isCube; uniform lowp isamplerCube isCube;
uniform isampler2DArray is2DArray; uniform lowp isampler2DArray is2DArray;
uniform usampler2D us2D;
uniform usampler3D us3D;
uniform usamplerCube usCube;
uniform usampler2DArray us2DArray;
uniform lowp usampler2D us2D;
uniform lowp usampler3D us3D;
uniform lowp usamplerCube usCube;
uniform lowp usampler2DArray us2DArray;
precision lowp float;
in float c1D; in float c1D;
in vec2 c2D; in vec2 c2D;
in vec3 c3D; in vec3 c3D;
@ -33,7 +33,7 @@ precision lowp uint; // ERROR
struct s { struct s {
int i; int i;
sampler2D s; // ERROR sampler2D s;
}; };
out s badout; // ERROR out s badout; // ERROR

View File

@ -1,9 +1,11 @@
#version 300 es #version 300 es
precision mediump float;
struct S { struct S {
vec4 u; vec4 u;
uvec4 v; uvec4 v;
isampler3D sampler; lowp isampler3D sampler;
vec3 w; vec3 w;
struct T1 { // ERROR struct T1 { // ERROR
int a; int a;
@ -15,7 +17,7 @@ uniform S s;
uniform fooBlock { uniform fooBlock {
uvec4 bv; uvec4 bv;
mat2 bm2; mat2 bm2;
isampler2D sampler; // ERROR lowp isampler2D sampler; // ERROR
struct T2 { // ERROR struct T2 { // ERROR
int a; int a;
} t; } t;

View File

@ -1,5 +1,5 @@
#version 300 es #version 300 es
precision mediump float;
in vec4 pos; in vec4 pos;
layout (location = 2) in vec4 color; // ERROR layout (location = 2) in vec4 color; // ERROR

View File

@ -1,7 +1,7 @@
#version 300 es #version 300 es
uniform block { uniform block {
float f; mediump float f;
} instanceName; } instanceName;
struct S { struct S {

View File

@ -1,3 +1,5 @@
#version 110
uniform vec4 bigColor; uniform vec4 bigColor;
varying vec4 BaseColor; varying vec4 BaseColor;
uniform float d; uniform float d;

View File

@ -1,6 +1,6 @@
#version 100 #version 100
varying vec3 color; varying vec3 color; // ERRROR, there is no default qualifier for float
lowp vec2 foo(mediump vec3 mv3) lowp vec2 foo(mediump vec3 mv3)
{ {

View File

@ -1,7 +1,7 @@
#version 300 es #version 300 es
uniform int c, d; uniform int c, d;
in float x; highp in float x;
void main() void main()
{ {

View File

@ -11,6 +11,7 @@ versionsErrors.vert
130.frag 130.frag
140.frag 140.frag
precision.frag precision.frag
precision.vert
nonSquare.vert nonSquare.vert
matrixError.vert matrixError.vert
cppSimple.vert cppSimple.vert

View File

@ -1,8 +1,8 @@
#version 300 es #version 300 es
in uvec2 badu; // ERROR in uvec2 badu; // ERROR
flat in uvec2 t; flat in uvec2 t;
in float f; in highp float f;
in vec2 tc; in highp vec2 tc;
in bool bad; // ERROR in bool bad; // ERROR
uniform uvec4 v; uniform uvec4 v;
uniform int i; uniform int i;
@ -10,7 +10,7 @@ uniform bool b;
out uvec4 c; out uvec4 c;
uniform usampler2D usampler; uniform lowp usampler2D usampler;
void main() void main()
{ {

View File

@ -33,10 +33,10 @@
// //
#version 300 es #version 300 es
in vec3 color; in highp vec3 color;
out vec4 foo; out highp vec4 foo;
uniform sampler2DArrayShadow bar; uniform highp sampler2DArrayShadow bar;
void main() void main()
{ {

View File

@ -51,7 +51,16 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, E
for (int type = 0; type < EbtNumTypes; ++type) for (int type = 0; type < EbtNumTypes; ++type)
defaultPrecision[type] = EpqNone; defaultPrecision[type] = EpqNone;
for (int type = 0; type < maxSamplerIndex; ++type)
defaultSamplerPrecision[type] = EpqNone;
if (profile == EEsProfile) { if (profile == EEsProfile) {
TSampler sampler;
sampler.set(EbtFloat, Esd2D);
defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
sampler.set(EbtFloat, EsdCube);
defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
switch (language) { switch (language) {
case EShLangVertex: case EShLangVertex:
defaultPrecision[EbtInt] = EpqHigh; defaultPrecision[EbtInt] = EpqHigh;
@ -809,7 +818,13 @@ void TParseContext::setDefaultPrecision(int line, TPublicType& publicType, TPrec
{ {
TBasicType basicType = publicType.basicType; TBasicType basicType = publicType.basicType;
if (basicType == EbtSampler || basicType == EbtInt || basicType == EbtFloat) { if (basicType == EbtSampler) {
defaultSamplerPrecision[computeSamplerTypeIndex(publicType.sampler)] = qualifier;
return; // all is well
}
if (basicType == EbtInt || basicType == EbtFloat) {
if (publicType.isScalar()) { if (publicType.isScalar()) {
defaultPrecision[basicType] = qualifier; defaultPrecision[basicType] = qualifier;
if (basicType == EbtInt) if (basicType == EbtInt)
@ -822,6 +837,35 @@ void TParseContext::setDefaultPrecision(int line, TPublicType& publicType, TPrec
error(line, "cannot apply precision statement to this type; use 'float', 'int' or a sampler type", TType::getBasicString(basicType), ""); error(line, "cannot apply precision statement to this type; use 'float', 'int' or a sampler type", TType::getBasicString(basicType), "");
} }
// used to flatten the sampler type space into a single dimension
// correlates with the declaration of defaultSamplerPrecision[]
int TParseContext::computeSamplerTypeIndex(TSampler& sampler)
{
int arrayIndex = sampler.arrayed ? 1 : 0;
int shadowIndex = sampler.shadow ? 1 : 0;
return EsdNumDims * (EbtNumTypes * (2 * arrayIndex + shadowIndex) + sampler.type) + sampler.dim;
}
TPrecisionQualifier TParseContext::getDefaultPrecision(TPublicType& publicType)
{
if (publicType.basicType == EbtSampler)
return defaultSamplerPrecision[computeSamplerTypeIndex(publicType.sampler)];
else
return defaultPrecision[publicType.basicType];
}
void TParseContext::precisionQualifierCheck(int line, TPublicType& publicType)
{
if (profile != EEsProfile)
return;
if (publicType.basicType == EbtFloat || publicType.basicType == EbtUint || publicType.basicType == EbtInt || publicType.basicType == EbtSampler) {
if (publicType.qualifier.precision == EpqNone)
error(line, "type requires declaration of default precision qualifier", TType::getBasicString(publicType.basicType), "");
}
}
void TParseContext::parameterSamplerCheck(int line, TStorageQualifier qualifier, const TType& type) void TParseContext::parameterSamplerCheck(int line, TStorageQualifier qualifier, const TType& type)
{ {
if ((qualifier == EvqOut || qualifier == EvqInOut) && type.getBasicType() != EbtStruct && type.getBasicType() == EbtSampler) if ((qualifier == EvqOut || qualifier == EvqInOut) && type.getBasicType() != EbtStruct && type.getBasicType() == EbtSampler)

View File

@ -91,6 +91,8 @@ struct TParseContext {
struct TPragma contextPragma; struct TPragma contextPragma;
TPrecisionQualifier defaultPrecision[EbtNumTypes]; TPrecisionQualifier defaultPrecision[EbtNumTypes];
static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2)); // see computeSamplerTypeIndex()
TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex];
TQualifier defaultGlobalQualification; TQualifier defaultGlobalQualification;
TString HashErrMsg; TString HashErrMsg;
bool AfterEOF; bool AfterEOF;
@ -130,6 +132,9 @@ struct TParseContext {
bool structQualifierErrorCheck(int line, const TPublicType& pType); bool structQualifierErrorCheck(int line, const TPublicType& pType);
void mergeQualifiers(int line, TPublicType& dst, const TPublicType& src, bool force); void mergeQualifiers(int line, TPublicType& dst, const TPublicType& src, bool force);
void setDefaultPrecision(int line, TPublicType&, TPrecisionQualifier); void setDefaultPrecision(int line, TPublicType&, TPrecisionQualifier);
int computeSamplerTypeIndex(TSampler&);
TPrecisionQualifier getDefaultPrecision(TPublicType&);
void precisionQualifierCheck(int line, TPublicType&);
void parameterSamplerCheck(int line, TStorageQualifier qualifier, const TType& type); void parameterSamplerCheck(int line, TStorageQualifier qualifier, const TType& type);
bool containsSampler(const TType& type); bool containsSampler(const TType& type);
void nonInitConstCheck(int line, TString& identifier, TPublicType& type); void nonInitConstCheck(int line, TString& identifier, TPublicType& type);

View File

@ -1484,6 +1484,7 @@ fully_specified_type
$2.arraySizes = 0; $2.arraySizes = 0;
parseContext.mergeQualifiers($2.line, $2, $1, true); parseContext.mergeQualifiers($2.line, $2, $1, true);
parseContext.precisionQualifierCheck($2.line, $2);
$$ = $2; $$ = $2;
@ -1724,11 +1725,11 @@ type_name_list
type_specifier type_specifier
: type_specifier_nonarray { : type_specifier_nonarray {
$$ = $1; $$ = $1;
$$.qualifier.precision = parseContext.defaultPrecision[$$.basicType]; $$.qualifier.precision = parseContext.getDefaultPrecision($$);
} }
| type_specifier_nonarray array_specifier { | type_specifier_nonarray array_specifier {
$$ = $1; $$ = $1;
$$.qualifier.precision = parseContext.defaultPrecision[$$.basicType]; $$.qualifier.precision = parseContext.getDefaultPrecision($$);
$$.arraySizes = $2.arraySizes; $$.arraySizes = $2.arraySizes;
} }
; ;
@ -2466,6 +2467,7 @@ struct_declaration
$$ = $2; $$ = $2;
parseContext.voidErrorCheck($1.line, (*$2)[0].type->getFieldName(), $1); parseContext.voidErrorCheck($1.line, (*$2)[0].type->getFieldName(), $1);
parseContext.precisionQualifierCheck($1.line, $1);
for (unsigned int i = 0; i < $$->size(); ++i) for (unsigned int i = 0; i < $$->size(); ++i)
(*$$)[i].type->mergeType($1); (*$$)[i].type->mergeType($1);
@ -2482,6 +2484,7 @@ struct_declaration
parseContext.voidErrorCheck($2.line, (*$3)[0].type->getFieldName(), $2); parseContext.voidErrorCheck($2.line, (*$3)[0].type->getFieldName(), $2);
parseContext.mergeQualifiers($2.line, $2, $1, true); parseContext.mergeQualifiers($2.line, $2, $1, true);
parseContext.precisionQualifierCheck($2.line, $2);
for (unsigned int i = 0; i < $$->size(); ++i) for (unsigned int i = 0; i < $$->size(); ++i)
(*$$)[i].type->mergeType($2); (*$$)[i].type->mergeType($2);