Commit 41a36bbb by John Kessenich

Track separate precision defaults for each kind of sampler, give initial…

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
parent c59d0cd9
#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;
...@@ -28,15 +28,15 @@ flat in ivec2 ic2D; ...@@ -28,15 +28,15 @@ flat in ivec2 ic2D;
flat in ivec3 ic3D; flat in ivec3 ic3D;
flat in ivec4 ic4D; flat in ivec4 ic4D;
noperspective in vec4 badv; // ERROR noperspective in vec4 badv; // ERROR
in sampler2D bads; // ERROR in sampler2D bads; // ERROR
precision lowp uint; // ERROR 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
void main() void main()
{ {
......
#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; ...@@ -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;
...@@ -35,5 +37,5 @@ uniform barBlockArray { ...@@ -35,5 +37,5 @@ uniform barBlockArray {
void main() void main()
{ {
texture(s.sampler, vec3(inst.ni, bv.y, insts[2].nbv.z)); texture(s.sampler, vec3(inst.ni, bv.y, insts[2].nbv.z));
insts[s.v.x]; // ERROR insts[s.v.x]; // ERROR
} }
#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
......
#version 300 es #version 300 es
uniform block { uniform block {
float f; mediump float f;
} instanceName; } instanceName;
struct S { struct S {
......
#version 110
uniform vec4 bigColor; uniform vec4 bigColor;
varying vec4 BaseColor; varying vec4 BaseColor;
uniform float d; uniform float d;
......
#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)
{ {
......
#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()
{ {
......
...@@ -11,6 +11,7 @@ versionsErrors.vert ...@@ -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
......
#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; ...@@ -10,7 +10,7 @@ uniform bool b;
out uvec4 c; out uvec4 c;
uniform usampler2D usampler; uniform lowp usampler2D usampler;
void main() void main()
{ {
......
...@@ -33,10 +33,10 @@ ...@@ -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()
{ {
......
...@@ -51,7 +51,16 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, E ...@@ -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 ...@@ -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 ...@@ -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)
......
...@@ -91,6 +91,8 @@ struct TParseContext { ...@@ -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 { ...@@ -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);
......
...@@ -1484,6 +1484,7 @@ fully_specified_type ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment