Implement specification change in 'restrict', allowing it to come and go across function calls.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@29195 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2014-12-11 00:17:42 +00:00
parent 1575e0d7c7
commit 6df2904391
5 changed files with 37 additions and 40 deletions

View file

@ -127,12 +127,12 @@ void passr(coherent readonly iimage2D image)
} }
layout(r32i) coherent readonly uniform iimage2D qualim1; layout(r32i) coherent readonly uniform iimage2D qualim1;
layout(r32i) coherent restrict readonly uniform iimage2D qualim2; layout(r32i) coherent volatile readonly uniform iimage2D qualim2;
void passrc() void passrc()
{ {
passr(qualim1); passr(qualim1);
passr(qualim2); // ERROR, drops restrict passr(qualim2); // ERROR, drops volatile
passr(iimg2D); passr(iimg2D);
} }

View file

@ -24,7 +24,6 @@ ERROR: 0:90: 'imageAtomicMax' : no matching overloaded function found
ERROR: 0:94: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter ERROR: 0:94: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:97: '' : memory qualifiers cannot be used on this type ERROR: 0:97: '' : memory qualifiers cannot be used on this type
ERROR: 0:98: '' : memory qualifiers cannot be used on this type ERROR: 0:98: '' : memory qualifiers cannot be used on this type
ERROR: 0:110: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:114: 'image load-store format' : not supported with this profile: es ERROR: 0:114: 'image load-store format' : not supported with this profile: es
ERROR: 0:114: 'rg8i' : does not apply to unsigned integer images ERROR: 0:114: 'rg8i' : does not apply to unsigned integer images
ERROR: 0:115: 'rgba32i' : does not apply to floating point images ERROR: 0:115: 'rgba32i' : does not apply to floating point images
@ -73,7 +72,7 @@ ERROR: 0:207: 'constructor' : can't read from writeonly object: wo
ERROR: 0:208: '~' : can't read from writeonly object: wo ERROR: 0:208: '~' : can't read from writeonly object: wo
ERROR: 0:221: 'assign' : can't read from writeonly object: wo ERROR: 0:221: 'assign' : can't read from writeonly object: wo
ERROR: 0:222: '~' : can't read from writeonly object: wo ERROR: 0:222: '~' : can't read from writeonly object: wo
ERROR: 73 compilation errors. No code generated. ERROR: 72 compilation errors. No code generated.
Shader version: 310 Shader version: 310

View file

@ -41,7 +41,7 @@ ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found
ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:122: '' : memory qualifiers cannot be used on this type ERROR: 0:122: '' : memory qualifiers cannot be used on this type
ERROR: 0:123: '' : memory qualifiers cannot be used on this type ERROR: 0:123: '' : memory qualifiers cannot be used on this type
ERROR: 0:135: 'restrict' : argument cannot drop memory qualifier when passed to formal parameter ERROR: 0:135: 'volatile' : argument cannot drop memory qualifier when passed to formal parameter
ERROR: 0:139: 'rg8i' : does not apply to unsigned integer images ERROR: 0:139: 'rg8i' : does not apply to unsigned integer images
ERROR: 0:140: 'rgba32i' : does not apply to floating point images ERROR: 0:140: 'rgba32i' : does not apply to floating point images
ERROR: 0:141: 'rgba32f' : does not apply to unsigned integer images ERROR: 0:141: 'rgba32f' : does not apply to unsigned integer images
@ -236,7 +236,7 @@ ERROR: node is still EOpNull!
0:134 Function Call: passr(iI21; (void) 0:134 Function Call: passr(iI21; (void)
0:134 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 0:134 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
0:135 Function Call: passr(iI21; (void) 0:135 Function Call: passr(iI21; (void)
0:135 'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D) 0:135 'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
0:136 Function Call: passr(iI21; (void) 0:136 Function Call: passr(iI21; (void)
0:136 'iimg2D' (layout(r32i ) uniform iimage2D) 0:136 'iimg2D' (layout(r32i ) uniform iimage2D)
0:? Linker Objects 0:? Linker Objects
@ -282,7 +282,7 @@ ERROR: node is still EOpNull!
0:? 'vol' (volatile float) 0:? 'vol' (volatile float)
0:? 'vol2' (readonly int) 0:? 'vol2' (readonly int)
0:? 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 0:? 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
0:? 'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D) 0:? 'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
0:? 'i1bad' (layout(rg8i ) uniform uimage2D) 0:? 'i1bad' (layout(rg8i ) uniform uimage2D)
0:? 'i2bad' (layout(rgba32i ) uniform image2D) 0:? 'i2bad' (layout(rgba32i ) uniform image2D)
0:? 'i3bad' (layout(rgba32f ) uniform uimage2D) 0:? 'i3bad' (layout(rgba32f ) uniform uimage2D)
@ -481,7 +481,7 @@ ERROR: node is still EOpNull!
0:134 Function Call: passr(iI21; (void) 0:134 Function Call: passr(iI21; (void)
0:134 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 0:134 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
0:135 Function Call: passr(iI21; (void) 0:135 Function Call: passr(iI21; (void)
0:135 'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D) 0:135 'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
0:136 Function Call: passr(iI21; (void) 0:136 Function Call: passr(iI21; (void)
0:136 'iimg2D' (layout(r32i ) uniform iimage2D) 0:136 'iimg2D' (layout(r32i ) uniform iimage2D)
0:? Linker Objects 0:? Linker Objects
@ -527,7 +527,7 @@ ERROR: node is still EOpNull!
0:? 'vol' (volatile float) 0:? 'vol' (volatile float)
0:? 'vol2' (readonly int) 0:? 'vol2' (readonly int)
0:? 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 0:? 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D)
0:? 'qualim2' (layout(r32i ) coherent restrict readonly uniform iimage2D) 0:? 'qualim2' (layout(r32i ) coherent volatile readonly uniform iimage2D)
0:? 'i1bad' (layout(rg8i ) uniform uimage2D) 0:? 'i1bad' (layout(rg8i ) uniform uimage2D)
0:? 'i2bad' (layout(rgba32i ) uniform image2D) 0:? 'i2bad' (layout(rgba32i ) uniform image2D)
0:? 'i3bad' (layout(rgba32f ) uniform uimage2D) 0:? 'i3bad' (layout(rgba32f ) uniform uimage2D)

View file

@ -418,29 +418,29 @@ void TBuiltIns::initialize(int version, EProfile profile)
if (profile == EEsProfile && version >= 310 || if (profile == EEsProfile && version >= 310 ||
profile != EEsProfile && version >= 430) { profile != EEsProfile && version >= 430) {
commonBuiltins.append( commonBuiltins.append(
"uint atomicAdd(coherent volatile restrict inout uint, uint);" "uint atomicAdd(coherent volatile inout uint, uint);"
" int atomicAdd(coherent volatile restrict inout int, int);" " int atomicAdd(coherent volatile inout int, int);"
"uint atomicMin(coherent volatile restrict inout uint, uint);" "uint atomicMin(coherent volatile inout uint, uint);"
" int atomicMin(coherent volatile restrict inout int, int);" " int atomicMin(coherent volatile inout int, int);"
"uint atomicMax(coherent volatile restrict inout uint, uint);" "uint atomicMax(coherent volatile inout uint, uint);"
" int atomicMax(coherent volatile restrict inout int, int);" " int atomicMax(coherent volatile inout int, int);"
"uint atomicAnd(coherent volatile restrict inout uint, uint);" "uint atomicAnd(coherent volatile inout uint, uint);"
" int atomicAnd(coherent volatile restrict inout int, int);" " int atomicAnd(coherent volatile inout int, int);"
"uint atomicOr (coherent volatile restrict inout uint, uint);" "uint atomicOr (coherent volatile inout uint, uint);"
" int atomicOr (coherent volatile restrict inout int, int);" " int atomicOr (coherent volatile inout int, int);"
"uint atomicXor(coherent volatile restrict inout uint, uint);" "uint atomicXor(coherent volatile inout uint, uint);"
" int atomicXor(coherent volatile restrict inout int, int);" " int atomicXor(coherent volatile inout int, int);"
"uint atomicExchange(coherent volatile restrict inout uint, uint);" "uint atomicExchange(coherent volatile inout uint, uint);"
" int atomicExchange(coherent volatile restrict inout int, int);" " int atomicExchange(coherent volatile inout int, int);"
"uint atomicCompSwap(coherent volatile restrict inout uint, uint, uint);" "uint atomicCompSwap(coherent volatile inout uint, uint, uint);"
" int atomicCompSwap(coherent volatile restrict inout int, int, int);" " int atomicCompSwap(coherent volatile inout int, int, int);"
"\n"); "\n");
} }
@ -1847,7 +1847,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi
commonBuiltins.append(postfixes[dims]); commonBuiltins.append(postfixes[dims]);
} }
if (sampler.image) if (sampler.image)
commonBuiltins.append(" imageSize(readonly writeonly volatile coherent restrict "); commonBuiltins.append(" imageSize(readonly writeonly volatile coherent ");
else else
commonBuiltins.append(" textureSize("); commonBuiltins.append(" textureSize(");
commonBuiltins.append(typeName); commonBuiltins.append(typeName);
@ -1861,7 +1861,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi
if (profile != EEsProfile && version >= 430 && sampler.ms) { if (profile != EEsProfile && version >= 430 && sampler.ms) {
commonBuiltins.append("int "); commonBuiltins.append("int ");
if (sampler.image) if (sampler.image)
commonBuiltins.append("imageSamples("); commonBuiltins.append("imageSamples(readonly writeonly volatile coherent ");
else else
commonBuiltins.append("textureSamples("); commonBuiltins.append("textureSamples(");
commonBuiltins.append(typeName); commonBuiltins.append(typeName);
@ -1889,11 +1889,11 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
imageParams.append(", int"); imageParams.append(", int");
commonBuiltins.append(prefixes[sampler.type]); commonBuiltins.append(prefixes[sampler.type]);
commonBuiltins.append("vec4 imageLoad(readonly volatile coherent restrict "); commonBuiltins.append("vec4 imageLoad(readonly volatile coherent ");
commonBuiltins.append(imageParams); commonBuiltins.append(imageParams);
commonBuiltins.append(");\n"); commonBuiltins.append(");\n");
commonBuiltins.append("void imageStore(writeonly volatile coherent restrict "); commonBuiltins.append("void imageStore(writeonly volatile coherent ");
commonBuiltins.append(imageParams); commonBuiltins.append(imageParams);
commonBuiltins.append(", "); commonBuiltins.append(", ");
commonBuiltins.append(prefixes[sampler.type]); commonBuiltins.append(prefixes[sampler.type]);
@ -1906,13 +1906,13 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
const int numBuiltins = 7; const int numBuiltins = 7;
static const char* atomicFunc[numBuiltins] = { static const char* atomicFunc[numBuiltins] = {
" imageAtomicAdd(volatile coherent restrict ", " imageAtomicAdd(volatile coherent ",
" imageAtomicMin(volatile coherent restrict ", " imageAtomicMin(volatile coherent ",
" imageAtomicMax(volatile coherent restrict ", " imageAtomicMax(volatile coherent ",
" imageAtomicAnd(volatile coherent restrict ", " imageAtomicAnd(volatile coherent ",
" imageAtomicOr(volatile coherent restrict ", " imageAtomicOr(volatile coherent ",
" imageAtomicXor(volatile coherent restrict ", " imageAtomicXor(volatile coherent ",
" imageAtomicExchange(volatile coherent restrict " " imageAtomicExchange(volatile coherent "
}; };
for (size_t i = 0; i < numBuiltins; ++i) { for (size_t i = 0; i < numBuiltins; ++i) {
@ -1925,7 +1925,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
} }
commonBuiltins.append(dataType); commonBuiltins.append(dataType);
commonBuiltins.append(" imageAtomicCompSwap(volatile coherent restrict "); commonBuiltins.append(" imageAtomicCompSwap(volatile coherent ");
commonBuiltins.append(imageParams); commonBuiltins.append(imageParams);
commonBuiltins.append(", "); commonBuiltins.append(", ");
commonBuiltins.append(dataType); commonBuiltins.append(dataType);
@ -1937,7 +1937,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
// GL_ARB_ES3_1_compatibility // GL_ARB_ES3_1_compatibility
// TODO: spec issue: are there restrictions on the kind of layout() that can be used? what about dropping memory qualifiers? // TODO: spec issue: are there restrictions on the kind of layout() that can be used? what about dropping memory qualifiers?
if (version >= 450) { if (version >= 450) {
commonBuiltins.append("float imageAtomicExchange(volatile coherent restrict "); commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
commonBuiltins.append(imageParams); commonBuiltins.append(imageParams);
commonBuiltins.append(", float);\n"); commonBuiltins.append(", float);\n");
} }

View file

@ -1026,8 +1026,6 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct
error(arguments->getLoc(), message, "volatile", ""); error(arguments->getLoc(), message, "volatile", "");
if (argQualifier.coherent && ! formalQualifier.coherent) if (argQualifier.coherent && ! formalQualifier.coherent)
error(arguments->getLoc(), message, "coherent", ""); error(arguments->getLoc(), message, "coherent", "");
if (argQualifier.restrict && ! formalQualifier.restrict)
error(arguments->getLoc(), message, "restrict", "");
if (argQualifier.readonly && ! formalQualifier.readonly) if (argQualifier.readonly && ! formalQualifier.readonly)
error(arguments->getLoc(), message, "readonly", ""); error(arguments->getLoc(), message, "readonly", "");
if (argQualifier.writeonly && ! formalQualifier.writeonly) if (argQualifier.writeonly && ! formalQualifier.writeonly)