Commit 18cfc3f1 by Pankaj Mistry

For bug #2580: sparseTextureGatherOffsetsARB should only take constant offsets.

parent 2c7c84c8
...@@ -48,6 +48,31 @@ void foo() ...@@ -48,6 +48,31 @@ void foo()
float f = imageAtomicExchange(i2dmsa, ivec3(in3), 2, 4.5); float f = imageAtomicExchange(i2dmsa, ivec3(in3), 2, 4.5);
} }
#extension GL_ARB_sparse_texture2: enable
uniform sampler2D s2D;
uniform isampler2DArray is2DArray;
uniform sampler2DRectShadow s2DRectShadow;
in flat ivec2 offsets[4];
in vec2 c2;
in vec3 c3;
void testOffsets()
{
vec4 texel = vec4(0.0);
ivec4 itexel = ivec4(0);
const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));
sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel);
sparseTextureGatherOffsetsARB(is2DArray, c3, constOffsets, itexel, 2);
sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel); // Error : Non constant offsets
sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2); // Error : Non constant offsets
sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel); // Error : Non constant offsets
}
in float gl_CullDistance[6]; in float gl_CullDistance[6];
float cull(int i) float cull(int i)
......
450.frag 450.frag
ERROR: 0:63: 'location' : cannot use in a block array where new locations are needed for each block element ERROR: 0:70: 'offsets' : argument must be compile-time constant
ERROR: 0:68: 'early_fragment_tests' : can only apply to a standalone qualifier ERROR: 0:71: 'offsets' : argument must be compile-time constant
ERROR: 2 compilation errors. No code generated. ERROR: 0:72: 'offsets' : argument must be compile-time constant
ERROR: 0:88: 'location' : cannot use in a block array where new locations are needed for each block element
ERROR: 0:93: 'early_fragment_tests' : can only apply to a standalone qualifier
ERROR: 5 compilation errors. No code generated.
Shader version: 450 Shader version: 450
Requested GL_ARB_sparse_texture2
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:8 Function Definition: main( ( global void) 0:8 Function Definition: main( ( global void)
0:8 Function Parameters: 0:8 Function Parameters:
...@@ -133,26 +137,107 @@ ERROR: node is still EOpNull! ...@@ -133,26 +137,107 @@ ERROR: node is still EOpNull!
0:48 2 (const int) 0:48 2 (const int)
0:48 Constant: 0:48 Constant:
0:48 4.500000 0:48 4.500000
0:53 Function Definition: cull(i1; ( global float) 0:61 Function Definition: testOffsets( ( global void)
0:53 Function Parameters: 0:61 Function Parameters:
0:53 'i' ( in int) 0:63 Sequence
0:55 Sequence 0:63 Sequence
0:55 Branch: Return with expression 0:63 move second child to first child ( temp 4-component vector of float)
0:55 Test condition and select ( temp float) 0:63 'texel' ( temp 4-component vector of float)
0:55 Condition 0:63 Constant:
0:55 Compare Greater Than or Equal ( temp bool) 0:63 0.000000
0:55 'i' ( in int) 0:63 0.000000
0:55 Constant: 0:63 0.000000
0:55 6 (const int) 0:63 0.000000
0:55 true case 0:64 Sequence
0:55 direct index ( smooth temp float CullDistance) 0:64 move second child to first child ( temp 4-component vector of int)
0:55 'gl_CullDistance' ( smooth in 6-element array of float CullDistance) 0:64 'itexel' ( temp 4-component vector of int)
0:55 Constant: 0:64 Constant:
0:55 5 (const int) 0:64 0 (const int)
0:55 false case 0:64 0 (const int)
0:55 indirect index ( smooth temp float CullDistance) 0:64 0 (const int)
0:55 'gl_CullDistance' ( smooth in 6-element array of float CullDistance) 0:64 0 (const int)
0:55 'i' ( in int) 0:66 sparseTextureGatherOffsets ( global int)
0:66 's2D' ( uniform sampler2D)
0:66 'c2' ( smooth in 2-component vector of float)
0:66 Constant:
0:66 1 (const int)
0:66 2 (const int)
0:66 3 (const int)
0:66 4 (const int)
0:66 15 (const int)
0:66 16 (const int)
0:66 -2 (const int)
0:66 0 (const int)
0:66 'texel' ( temp 4-component vector of float)
0:67 sparseTextureGatherOffsets ( global int)
0:67 'is2DArray' ( uniform isampler2DArray)
0:67 'c3' ( smooth in 3-component vector of float)
0:67 Constant:
0:67 1 (const int)
0:67 2 (const int)
0:67 3 (const int)
0:67 4 (const int)
0:67 15 (const int)
0:67 16 (const int)
0:67 -2 (const int)
0:67 0 (const int)
0:67 'itexel' ( temp 4-component vector of int)
0:67 Constant:
0:67 2 (const int)
0:68 sparseTextureGatherOffsets ( global int)
0:68 's2DRectShadow' ( uniform sampler2DRectShadow)
0:68 'c2' ( smooth in 2-component vector of float)
0:68 Constant:
0:68 2.000000
0:68 Constant:
0:68 1 (const int)
0:68 2 (const int)
0:68 3 (const int)
0:68 4 (const int)
0:68 15 (const int)
0:68 16 (const int)
0:68 -2 (const int)
0:68 0 (const int)
0:68 'texel' ( temp 4-component vector of float)
0:70 sparseTextureGatherOffsets ( global int)
0:70 's2D' ( uniform sampler2D)
0:70 'c2' ( smooth in 2-component vector of float)
0:70 'offsets' ( flat in 4-element array of 2-component vector of int)
0:70 'texel' ( temp 4-component vector of float)
0:71 sparseTextureGatherOffsets ( global int)
0:71 'is2DArray' ( uniform isampler2DArray)
0:71 'c3' ( smooth in 3-component vector of float)
0:71 'offsets' ( flat in 4-element array of 2-component vector of int)
0:71 'itexel' ( temp 4-component vector of int)
0:71 Constant:
0:71 2 (const int)
0:72 sparseTextureGatherOffsets ( global int)
0:72 's2DRectShadow' ( uniform sampler2DRectShadow)
0:72 'c2' ( smooth in 2-component vector of float)
0:72 Constant:
0:72 2.000000
0:72 'offsets' ( flat in 4-element array of 2-component vector of int)
0:72 'texel' ( temp 4-component vector of float)
0:78 Function Definition: cull(i1; ( global float)
0:78 Function Parameters:
0:78 'i' ( in int)
0:80 Sequence
0:80 Branch: Return with expression
0:80 Test condition and select ( temp float)
0:80 Condition
0:80 Compare Greater Than or Equal ( temp bool)
0:80 'i' ( in int)
0:80 Constant:
0:80 6 (const int)
0:80 true case
0:80 direct index ( smooth temp float CullDistance)
0:80 'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
0:80 Constant:
0:80 5 (const int)
0:80 false case
0:80 indirect index ( smooth temp float CullDistance)
0:80 'gl_CullDistance' ( smooth in 6-element array of float CullDistance)
0:80 'i' ( in int)
0:? Linker Objects 0:? Linker Objects
0:? 'in1' ( smooth in float) 0:? 'in1' ( smooth in float)
0:? 'in2' ( smooth in 2-component vector of float) 0:? 'in2' ( smooth in 2-component vector of float)
...@@ -163,6 +248,12 @@ ERROR: node is still EOpNull! ...@@ -163,6 +248,12 @@ ERROR: node is still EOpNull!
0:? 'us2dmsa' ( uniform usampler2DMSArray) 0:? 'us2dmsa' ( uniform usampler2DMSArray)
0:? 'ii2dms' (layout( rgba32i) uniform iimage2DMS) 0:? 'ii2dms' (layout( rgba32i) uniform iimage2DMS)
0:? 'i2dmsa' (layout( rgba32f) uniform image2DMSArray) 0:? 'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
0:? 's2D' ( uniform sampler2D)
0:? 'is2DArray' ( uniform isampler2DArray)
0:? 's2DRectShadow' ( uniform sampler2DRectShadow)
0:? 'offsets' ( flat in 4-element array of 2-component vector of int)
0:? 'c2' ( smooth in 2-component vector of float)
0:? 'c3' ( smooth in 3-component vector of float)
0:? 'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m}) 0:? 'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
0:? 'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g}) 0:? 'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
0:? 'f' ( smooth in float) 0:? 'f' ( smooth in float)
...@@ -172,6 +263,7 @@ Linked fragment stage: ...@@ -172,6 +263,7 @@ Linked fragment stage:
Shader version: 450 Shader version: 450
Requested GL_ARB_sparse_texture2
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:8 Function Definition: main( ( global void) 0:8 Function Definition: main( ( global void)
0:8 Function Parameters: 0:8 Function Parameters:
...@@ -279,6 +371,12 @@ ERROR: node is still EOpNull! ...@@ -279,6 +371,12 @@ ERROR: node is still EOpNull!
0:? 'us2dmsa' ( uniform usampler2DMSArray) 0:? 'us2dmsa' ( uniform usampler2DMSArray)
0:? 'ii2dms' (layout( rgba32i) uniform iimage2DMS) 0:? 'ii2dms' (layout( rgba32i) uniform iimage2DMS)
0:? 'i2dmsa' (layout( rgba32f) uniform image2DMSArray) 0:? 'i2dmsa' (layout( rgba32f) uniform image2DMSArray)
0:? 's2D' ( uniform sampler2D)
0:? 'is2DArray' ( uniform isampler2DArray)
0:? 's2DRectShadow' ( uniform sampler2DRectShadow)
0:? 'offsets' ( flat in 4-element array of 2-component vector of int)
0:? 'c2' ( smooth in 2-component vector of float)
0:? 'c3' ( smooth in 3-component vector of float)
0:? 'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m}) 0:? 'bInst1' ( in block{layout( location=6) in float f, layout( location=7) in float g, layout( location=8) in 4X4 matrix of float m})
0:? 'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g}) 0:? 'bInst2' ( in 3-element array of block{layout( location=12) in float f, layout( location=13) in float g})
0:? 'f' ( smooth in float) 0:? 'f' ( smooth in float)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -889,19 +889,20 @@ f16vec4 testSparseTextureGatherOffset() ...@@ -889,19 +889,20 @@ f16vec4 testSparseTextureGatherOffset()
f16vec4 testSparseTextureGatherOffsets() f16vec4 testSparseTextureGatherOffsets()
{ {
f16vec4 texel = f16vec4(0.0hf); f16vec4 texel = f16vec4(0.0hf);
const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));
sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel, 0);
sparseTextureGatherOffsetsARB(s2D, f16c2, offsets, texel, 0, f16bias); sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, texel, 0); sparseTextureGatherOffsetsARB(s2D, f16c2, constOffsets, texel, 0, f16bias);
sparseTextureGatherOffsetsARB(s2DArray, f16c3, offsets, texel, 0, f16bias); sparseTextureGatherOffsetsARB(s2DArray, c3, constOffsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DRect, c2, offsets, texel, 0); sparseTextureGatherOffsetsARB(s2DArray, f16c3, constOffsets, texel, 0, f16bias);
sparseTextureGatherOffsetsARB(s2DRect, f16c2, offsets, texel, 0); sparseTextureGatherOffsetsARB(s2DRect, c2, constOffsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DRect, f16c2, constOffsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, offsets, texel); sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, constOffsets, texel);
sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, constOffsets, texel);
return texel; return texel;
} }
......
...@@ -27,8 +27,6 @@ in vec4 c4; ...@@ -27,8 +27,6 @@ in vec4 c4;
in flat ivec2 ic2; in flat ivec2 ic2;
in flat ivec3 ic3; in flat ivec3 ic3;
in flat ivec2 offsets[4];
out vec4 outColor; out vec4 outColor;
void main() void main()
...@@ -79,9 +77,10 @@ void main() ...@@ -79,9 +77,10 @@ void main()
resident |= sparseTextureGatherOffsetARB(is2DArray, c3, ivec2(5), itexel, 2); resident |= sparseTextureGatherOffsetARB(is2DArray, c3, ivec2(5), itexel, 2);
resident |= sparseTextureGatherOffsetARB(s2DRectShadow, c2, 2.0, ivec2(7), texel); resident |= sparseTextureGatherOffsetARB(s2DRectShadow, c2, 2.0, ivec2(7), texel);
resident |= sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel); const ivec2 constOffsets[4] = ivec2[4](ivec2(1,2), ivec2(3,4), ivec2(15,16), ivec2(-2,0));
resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, offsets, itexel, 2); resident |= sparseTextureGatherOffsetsARB(s2D, c2, constOffsets, texel);
resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, offsets, texel); resident |= sparseTextureGatherOffsetsARB(is2DArray, c3, constOffsets, itexel, 2);
resident |= sparseTextureGatherOffsetsARB(s2DRectShadow, c2, 2.0, constOffsets, texel);
resident |= sparseImageLoadARB(i2D, ic2, texel); resident |= sparseImageLoadARB(i2D, ic2, texel);
resident |= sparseImageLoadARB(ii3D, ic3, itexel); resident |= sparseImageLoadARB(ii3D, ic3, itexel);
......
...@@ -2096,7 +2096,13 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan ...@@ -2096,7 +2096,13 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
profileRequires(loc, ~EEsProfile, 450, nullptr, feature); profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature); requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
} }
// As per GL_ARB_sparse_texture2 extension "Offsets" parameter must be constant integral expression
// for sparseTextureGatherOffsetsARB just as textureGatherOffsets
if (callNode.getOp() == EOpSparseTextureGatherOffsets) {
int offsetsArg = arg0->getType().getSampler().shadow ? 3 : 2;
if (!(*argp)[offsetsArg]->getAsConstantUnion())
error(loc, "argument must be compile-time constant", "offsets", "");
}
break; break;
} }
......
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