From 6df2904391f3484e17d97e1e17f05088a585f0f0 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Thu, 11 Dec 2014 00:17:42 +0000 Subject: [PATCH] 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 --- Test/420.vert | 4 +-- Test/baseResults/310.comp.out | 3 +- Test/baseResults/420.vert.out | 10 +++--- glslang/MachineIndependent/Initialize.cpp | 58 +++++++++++++++--------------- glslang/MachineIndependent/ParseHelper.cpp | 2 -- 5 files changed, 37 insertions(+), 40 deletions(-) diff --git a/Test/420.vert b/Test/420.vert index 7e61207..5007e20 100644 --- a/Test/420.vert +++ b/Test/420.vert @@ -127,12 +127,12 @@ void passr(coherent readonly iimage2D image) } 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() { passr(qualim1); - passr(qualim2); // ERROR, drops restrict + passr(qualim2); // ERROR, drops volatile passr(iimg2D); } diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out index 30df51b..0f759c5 100644 --- a/Test/baseResults/310.comp.out +++ b/Test/baseResults/310.comp.out @@ -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:97: '' : 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: 'rg8i' : does not apply to unsigned integer 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:221: 'assign' : 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 diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out index fd58f68..12e0673 100644 --- a/Test/baseResults/420.vert.out +++ b/Test/baseResults/420.vert.out @@ -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:122: '' : 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:140: 'rgba32i' : does not apply to floating point 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 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 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 'iimg2D' (layout(r32i ) uniform iimage2D) 0:? Linker Objects @@ -282,7 +282,7 @@ ERROR: node is still EOpNull! 0:? 'vol' (volatile float) 0:? 'vol2' (readonly int) 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:? 'i2bad' (layout(rgba32i ) uniform image2D) 0:? 'i3bad' (layout(rgba32f ) uniform uimage2D) @@ -481,7 +481,7 @@ ERROR: node is still EOpNull! 0:134 Function Call: passr(iI21; (void) 0:134 'qualim1' (layout(r32i ) coherent readonly uniform iimage2D) 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 'iimg2D' (layout(r32i ) uniform iimage2D) 0:? Linker Objects @@ -527,7 +527,7 @@ ERROR: node is still EOpNull! 0:? 'vol' (volatile float) 0:? 'vol2' (readonly int) 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:? 'i2bad' (layout(rgba32i ) uniform image2D) 0:? 'i3bad' (layout(rgba32f ) uniform uimage2D) diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index eb7de1b..2cab878 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -418,29 +418,29 @@ void TBuiltIns::initialize(int version, EProfile profile) if (profile == EEsProfile && version >= 310 || profile != EEsProfile && version >= 430) { commonBuiltins.append( - "uint atomicAdd(coherent volatile restrict inout uint, uint);" - " int atomicAdd(coherent volatile restrict inout int, int);" + "uint atomicAdd(coherent volatile inout uint, uint);" + " int atomicAdd(coherent volatile inout int, int);" - "uint atomicMin(coherent volatile restrict inout uint, uint);" - " int atomicMin(coherent volatile restrict inout int, int);" + "uint atomicMin(coherent volatile inout uint, uint);" + " int atomicMin(coherent volatile inout int, int);" - "uint atomicMax(coherent volatile restrict inout uint, uint);" - " int atomicMax(coherent volatile restrict inout int, int);" + "uint atomicMax(coherent volatile inout uint, uint);" + " int atomicMax(coherent volatile inout int, int);" - "uint atomicAnd(coherent volatile restrict inout uint, uint);" - " int atomicAnd(coherent volatile restrict inout int, int);" + "uint atomicAnd(coherent volatile inout uint, uint);" + " int atomicAnd(coherent volatile inout int, int);" - "uint atomicOr (coherent volatile restrict inout uint, uint);" - " int atomicOr (coherent volatile restrict inout int, int);" + "uint atomicOr (coherent volatile inout uint, uint);" + " int atomicOr (coherent volatile inout int, int);" - "uint atomicXor(coherent volatile restrict inout uint, uint);" - " int atomicXor(coherent volatile restrict inout int, int);" + "uint atomicXor(coherent volatile inout uint, uint);" + " int atomicXor(coherent volatile inout int, int);" - "uint atomicExchange(coherent volatile restrict inout uint, uint);" - " int atomicExchange(coherent volatile restrict inout int, int);" + "uint atomicExchange(coherent volatile inout uint, uint);" + " int atomicExchange(coherent volatile inout int, int);" - "uint atomicCompSwap(coherent volatile restrict inout uint, uint, uint);" - " int atomicCompSwap(coherent volatile restrict inout int, int, int);" + "uint atomicCompSwap(coherent volatile inout uint, uint, uint);" + " int atomicCompSwap(coherent volatile inout int, int, int);" "\n"); } @@ -1847,7 +1847,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi commonBuiltins.append(postfixes[dims]); } if (sampler.image) - commonBuiltins.append(" imageSize(readonly writeonly volatile coherent restrict "); + commonBuiltins.append(" imageSize(readonly writeonly volatile coherent "); else commonBuiltins.append(" textureSize("); commonBuiltins.append(typeName); @@ -1861,7 +1861,7 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi if (profile != EEsProfile && version >= 430 && sampler.ms) { commonBuiltins.append("int "); if (sampler.image) - commonBuiltins.append("imageSamples("); + commonBuiltins.append("imageSamples(readonly writeonly volatile coherent "); else commonBuiltins.append("textureSamples("); commonBuiltins.append(typeName); @@ -1889,11 +1889,11 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi imageParams.append(", int"); 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(");\n"); - commonBuiltins.append("void imageStore(writeonly volatile coherent restrict "); + commonBuiltins.append("void imageStore(writeonly volatile coherent "); commonBuiltins.append(imageParams); commonBuiltins.append(", "); commonBuiltins.append(prefixes[sampler.type]); @@ -1906,13 +1906,13 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi const int numBuiltins = 7; static const char* atomicFunc[numBuiltins] = { - " imageAtomicAdd(volatile coherent restrict ", - " imageAtomicMin(volatile coherent restrict ", - " imageAtomicMax(volatile coherent restrict ", - " imageAtomicAnd(volatile coherent restrict ", - " imageAtomicOr(volatile coherent restrict ", - " imageAtomicXor(volatile coherent restrict ", - " imageAtomicExchange(volatile coherent restrict " + " imageAtomicAdd(volatile coherent ", + " imageAtomicMin(volatile coherent ", + " imageAtomicMax(volatile coherent ", + " imageAtomicAnd(volatile coherent ", + " imageAtomicOr(volatile coherent ", + " imageAtomicXor(volatile coherent ", + " imageAtomicExchange(volatile coherent " }; 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(" imageAtomicCompSwap(volatile coherent restrict "); + commonBuiltins.append(" imageAtomicCompSwap(volatile coherent "); commonBuiltins.append(imageParams); commonBuiltins.append(", "); commonBuiltins.append(dataType); @@ -1937,7 +1937,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi // 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? if (version >= 450) { - commonBuiltins.append("float imageAtomicExchange(volatile coherent restrict "); + commonBuiltins.append("float imageAtomicExchange(volatile coherent "); commonBuiltins.append(imageParams); commonBuiltins.append(", float);\n"); } diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 944bf1f..176d295 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -1026,8 +1026,6 @@ TIntermTyped* TParseContext::handleFunctionCall(TSourceLoc loc, TFunction* funct error(arguments->getLoc(), message, "volatile", ""); if (argQualifier.coherent && ! formalQualifier.coherent) error(arguments->getLoc(), message, "coherent", ""); - if (argQualifier.restrict && ! formalQualifier.restrict) - error(arguments->getLoc(), message, "restrict", ""); if (argQualifier.readonly && ! formalQualifier.readonly) error(arguments->getLoc(), message, "readonly", ""); if (argQualifier.writeonly && ! formalQualifier.writeonly) -- 2.7.4