mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 20:10:06 +00:00
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:
parent
c59d0cd9e6
commit
41a36bbb2f
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#version 110
|
||||||
|
|
||||||
uniform vec4 bigColor;
|
uniform vec4 bigColor;
|
||||||
varying vec4 BaseColor;
|
varying vec4 BaseColor;
|
||||||
uniform float d;
|
uniform float d;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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
|
|||||||
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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user