diff --git a/Test/150.frag b/Test/150.frag index c8c4cf0402..228e4f0d38 100644 --- a/Test/150.frag +++ b/Test/150.frag @@ -154,3 +154,31 @@ void qlodPass() lod = textureQueryLod(sampBuf, pf); // ERROR lod = textureQueryLod(sampRect, pf2); // ERROR } + +// Test extension GL_EXT_shader_integer_mix +#extension GL_EXT_shader_integer_mix : enable +bool b1, b2, b; +int x,y; +uint z,w; + +void testmix() +{ + int ival = mix(x, y, b); + ivec2 iv2 = mix(ivec2(x), ivec2(y), bvec2(b)); + ivec3 iv3 = mix(ivec3(x), ivec3(y), bvec3(b)); + ivec4 iv4 = mix(ivec4(x), ivec4(x), bvec4(b)); + uint uiv = mix(z, w, b); + uvec2 uv2 = mix(uvec2(z), uvec2(z), bvec2(b)); + uvec3 uv3 = mix(uvec3(z), uvec3(z), bvec3(b)); + uvec4 uv4 = mix(uvec4(z), uvec4(z), bvec4(b)); + bool bv = mix(b1, b2, b); + bvec2 bv2 = mix(bvec2(b1), bvec2(b2), bvec2(b)); + bvec3 bv3 = mix(bvec3(b1), bvec3(b2), bvec3(b)); + bvec4 bv4 = mix(bvec4(b1), bvec4(b2), bvec4(b)); +} + +#extension GL_EXT_shader_integer_mix : disable +void testmixFail() +{ + int ival = mix(x, y, b); // Error since extenson GL_EXT_shader_integer_mix is disabled +} diff --git a/Test/300.frag b/Test/300.frag index ca2e2cb3e5..ab45c6dba6 100644 --- a/Test/300.frag +++ b/Test/300.frag @@ -149,6 +149,34 @@ uniform mediump; // ERROR layout(early_fragment_tests) in; // ERROR +// Test extension GL_EXT_shader_integer_mix +#extension GL_EXT_shader_integer_mix : enable +bool b1, b2, b; +int x,y; +uint z,w; + +void testmix() +{ + int ival = mix(x, y, b); + ivec2 iv2 = mix(ivec2(x), ivec2(y), bvec2(b)); + ivec3 iv3 = mix(ivec3(x), ivec3(y), bvec3(b)); + ivec4 iv4 = mix(ivec4(x), ivec4(x), bvec4(b)); + uint uiv = mix(z, w, b); + uvec2 uv2 = mix(uvec2(z), uvec2(z), bvec2(b)); + uvec3 uv3 = mix(uvec3(z), uvec3(z), bvec3(b)); + uvec4 uv4 = mix(uvec4(z), uvec4(z), bvec4(b)); + bool bv = mix(b1, b2, b); + bvec2 bv2 = mix(bvec2(b1), bvec2(b2), bvec2(b)); + bvec3 bv3 = mix(bvec3(b1), bvec3(b2), bvec3(b)); + bvec4 bv4 = mix(bvec4(b1), bvec4(b2), bvec4(b)); +} + +#extension GL_EXT_shader_integer_mix : disable +void testmixFail() +{ + int ival = mix(x, y, b); // Error since extenson GL_EXT_shader_integer_mix is disabled +} + #ifndef GL_FRAGMENT_PRECISION_HIGH #error missing GL_FRAGMENT_PRECISION_HIGH #endif diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out index 52e7c328f2..7672b5817b 100644 --- a/Test/baseResults/150.frag.out +++ b/Test/baseResults/150.frag.out @@ -17,7 +17,8 @@ ERROR: 0:154: 'textureQueryLod' : no matching overloaded function found ERROR: 0:154: 'assign' : cannot convert from ' const float' to ' temp 2-component vector of float' ERROR: 0:155: 'textureQueryLod' : no matching overloaded function found ERROR: 0:155: 'assign' : cannot convert from ' const float' to ' temp 2-component vector of float' -ERROR: 18 compilation errors. No code generated. +ERROR: 0:183: 'mix' : required extension not requested: GL_EXT_shader_integer_mix +ERROR: 19 compilation errors. No code generated. Shader version: 150 @@ -25,6 +26,7 @@ Requested GL_ARB_gpu_shader_fp64 Requested GL_ARB_shader_bit_encoding Requested GL_ARB_shading_language_packing Requested GL_ARB_texture_query_lod +Requested GL_EXT_shader_integer_mix gl_FragCoord pixel center is integer gl_FragCoord origin is upper left ERROR: node is still EOpNull! @@ -290,6 +292,130 @@ ERROR: node is still EOpNull! 0:152 'pf2' ( temp 2-component vector of float) 0:154 'lod' ( temp 2-component vector of float) 0:155 'lod' ( temp 2-component vector of float) +0:164 Function Definition: testmix( ( global void) +0:164 Function Parameters: +0:166 Sequence +0:166 Sequence +0:166 move second child to first child ( temp int) +0:166 'ival' ( temp int) +0:166 mix ( global int) +0:166 'x' ( global int) +0:166 'y' ( global int) +0:166 'b' ( global bool) +0:167 Sequence +0:167 move second child to first child ( temp 2-component vector of int) +0:167 'iv2' ( temp 2-component vector of int) +0:167 mix ( global 2-component vector of int) +0:167 Construct ivec2 ( temp 2-component vector of int) +0:167 'x' ( global int) +0:167 Construct ivec2 ( temp 2-component vector of int) +0:167 'y' ( global int) +0:167 Construct bvec2 ( temp 2-component vector of bool) +0:167 'b' ( global bool) +0:168 Sequence +0:168 move second child to first child ( temp 3-component vector of int) +0:168 'iv3' ( temp 3-component vector of int) +0:168 mix ( global 3-component vector of int) +0:168 Construct ivec3 ( temp 3-component vector of int) +0:168 'x' ( global int) +0:168 Construct ivec3 ( temp 3-component vector of int) +0:168 'y' ( global int) +0:168 Construct bvec3 ( temp 3-component vector of bool) +0:168 'b' ( global bool) +0:169 Sequence +0:169 move second child to first child ( temp 4-component vector of int) +0:169 'iv4' ( temp 4-component vector of int) +0:169 mix ( global 4-component vector of int) +0:169 Construct ivec4 ( temp 4-component vector of int) +0:169 'x' ( global int) +0:169 Construct ivec4 ( temp 4-component vector of int) +0:169 'x' ( global int) +0:169 Construct bvec4 ( temp 4-component vector of bool) +0:169 'b' ( global bool) +0:170 Sequence +0:170 move second child to first child ( temp uint) +0:170 'uiv' ( temp uint) +0:170 mix ( global uint) +0:170 'z' ( global uint) +0:170 'w' ( global uint) +0:170 'b' ( global bool) +0:171 Sequence +0:171 move second child to first child ( temp 2-component vector of uint) +0:171 'uv2' ( temp 2-component vector of uint) +0:171 mix ( global 2-component vector of uint) +0:171 Construct uvec2 ( temp 2-component vector of uint) +0:171 'z' ( global uint) +0:171 Construct uvec2 ( temp 2-component vector of uint) +0:171 'z' ( global uint) +0:171 Construct bvec2 ( temp 2-component vector of bool) +0:171 'b' ( global bool) +0:172 Sequence +0:172 move second child to first child ( temp 3-component vector of uint) +0:172 'uv3' ( temp 3-component vector of uint) +0:172 mix ( global 3-component vector of uint) +0:172 Construct uvec3 ( temp 3-component vector of uint) +0:172 'z' ( global uint) +0:172 Construct uvec3 ( temp 3-component vector of uint) +0:172 'z' ( global uint) +0:172 Construct bvec3 ( temp 3-component vector of bool) +0:172 'b' ( global bool) +0:173 Sequence +0:173 move second child to first child ( temp 4-component vector of uint) +0:173 'uv4' ( temp 4-component vector of uint) +0:173 mix ( global 4-component vector of uint) +0:173 Construct uvec4 ( temp 4-component vector of uint) +0:173 'z' ( global uint) +0:173 Construct uvec4 ( temp 4-component vector of uint) +0:173 'z' ( global uint) +0:173 Construct bvec4 ( temp 4-component vector of bool) +0:173 'b' ( global bool) +0:174 Sequence +0:174 move second child to first child ( temp bool) +0:174 'bv' ( temp bool) +0:174 mix ( global bool) +0:174 'b1' ( global bool) +0:174 'b2' ( global bool) +0:174 'b' ( global bool) +0:175 Sequence +0:175 move second child to first child ( temp 2-component vector of bool) +0:175 'bv2' ( temp 2-component vector of bool) +0:175 mix ( global 2-component vector of bool) +0:175 Construct bvec2 ( temp 2-component vector of bool) +0:175 'b1' ( global bool) +0:175 Construct bvec2 ( temp 2-component vector of bool) +0:175 'b2' ( global bool) +0:175 Construct bvec2 ( temp 2-component vector of bool) +0:175 'b' ( global bool) +0:176 Sequence +0:176 move second child to first child ( temp 3-component vector of bool) +0:176 'bv3' ( temp 3-component vector of bool) +0:176 mix ( global 3-component vector of bool) +0:176 Construct bvec3 ( temp 3-component vector of bool) +0:176 'b1' ( global bool) +0:176 Construct bvec3 ( temp 3-component vector of bool) +0:176 'b2' ( global bool) +0:176 Construct bvec3 ( temp 3-component vector of bool) +0:176 'b' ( global bool) +0:177 Sequence +0:177 move second child to first child ( temp 4-component vector of bool) +0:177 'bv4' ( temp 4-component vector of bool) +0:177 mix ( global 4-component vector of bool) +0:177 Construct bvec4 ( temp 4-component vector of bool) +0:177 'b1' ( global bool) +0:177 Construct bvec4 ( temp 4-component vector of bool) +0:177 'b2' ( global bool) +0:177 Construct bvec4 ( temp 4-component vector of bool) +0:177 'b' ( global bool) +0:181 Function Definition: testmixFail( ( global void) +0:181 Function Parameters: +0:183 Sequence +0:183 Sequence +0:183 move second child to first child ( temp int) +0:183 'ival' ( temp int) +0:183 mix ( global int) +0:183 'x' ( global int) +0:183 'y' ( global int) +0:183 'b' ( global bool) 0:? Linker Objects 0:? 'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord) 0:? 'foo' ( smooth in 4-component vector of float) @@ -330,6 +456,13 @@ ERROR: node is still EOpNull! 0:? 'samp2DAs' ( uniform sampler2DArrayShadow) 0:? 'sampBuf' ( uniform samplerBuffer) 0:? 'sampRect' ( uniform sampler2DRect) +0:? 'b1' ( global bool) +0:? 'b2' ( global bool) +0:? 'b' ( global bool) +0:? 'x' ( global int) +0:? 'y' ( global int) +0:? 'z' ( global uint) +0:? 'w' ( global uint) Linked fragment stage: @@ -340,6 +473,7 @@ Requested GL_ARB_gpu_shader_fp64 Requested GL_ARB_shader_bit_encoding Requested GL_ARB_shading_language_packing Requested GL_ARB_texture_query_lod +Requested GL_EXT_shader_integer_mix gl_FragCoord pixel center is integer gl_FragCoord origin is upper left ERROR: node is still EOpNull! @@ -415,4 +549,11 @@ ERROR: node is still EOpNull! 0:? 'samp2DAs' ( uniform sampler2DArrayShadow) 0:? 'sampBuf' ( uniform samplerBuffer) 0:? 'sampRect' ( uniform sampler2DRect) +0:? 'b1' ( global bool) +0:? 'b2' ( global bool) +0:? 'b' ( global bool) +0:? 'x' ( global int) +0:? 'y' ( global int) +0:? 'z' ( global uint) +0:? 'w' ( global uint) diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out index ee1b8a55a9..0b88aa33b4 100644 --- a/Test/baseResults/300.frag.out +++ b/Test/baseResults/300.frag.out @@ -40,15 +40,17 @@ ERROR: 0:129: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, ERROR: 0:129: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset] ERROR: 0:148: 'qualifier' : cannot use auxiliary, memory, interpolation, or precision qualifier in a default qualifier declaration (declaration with no type) ERROR: 0:150: 'early_fragment_tests' : not supported for this version or the enabled extensions -ERROR: 0:156: 'invariant' : can only apply to an output -ERROR: 0:157: 'invariant' : can only apply to an output -ERROR: 0:158: 'invariant' : can only apply to an output -ERROR: 0:160: 'imageBuffer' : Reserved word. -ERROR: 0:160: '' : syntax error, unexpected IMAGEBUFFER, expecting COMMA or SEMICOLON -ERROR: 46 compilation errors. No code generated. +ERROR: 0:177: 'specific signature of builtin mix' : required extension not requested: GL_EXT_shader_integer_mix +ERROR: 0:184: 'invariant' : can only apply to an output +ERROR: 0:185: 'invariant' : can only apply to an output +ERROR: 0:186: 'invariant' : can only apply to an output +ERROR: 0:188: 'imageBuffer' : Reserved word. +ERROR: 0:188: '' : syntax error, unexpected IMAGEBUFFER, expecting COMMA or SEMICOLON +ERROR: 47 compilation errors. No code generated. Shader version: 300 +Requested GL_EXT_shader_integer_mix using early_fragment_tests ERROR: node is still EOpNull! 0:53 Function Definition: main( ( global void) @@ -362,6 +364,130 @@ ERROR: node is still EOpNull! 0:145 21.000000 0:145 22.000000 0:145 33.000000 +0:158 Function Definition: testmix( ( global void) +0:158 Function Parameters: +0:160 Sequence +0:160 Sequence +0:160 move second child to first child ( temp mediump int) +0:160 'ival' ( temp mediump int) +0:160 mix ( global mediump int) +0:160 'x' ( global mediump int) +0:160 'y' ( global mediump int) +0:160 'b' ( global bool) +0:161 Sequence +0:161 move second child to first child ( temp mediump 2-component vector of int) +0:161 'iv2' ( temp mediump 2-component vector of int) +0:161 mix ( global mediump 2-component vector of int) +0:161 Construct ivec2 ( temp mediump 2-component vector of int) +0:161 'x' ( global mediump int) +0:161 Construct ivec2 ( temp mediump 2-component vector of int) +0:161 'y' ( global mediump int) +0:161 Construct bvec2 ( temp 2-component vector of bool) +0:161 'b' ( global bool) +0:162 Sequence +0:162 move second child to first child ( temp mediump 3-component vector of int) +0:162 'iv3' ( temp mediump 3-component vector of int) +0:162 mix ( global mediump 3-component vector of int) +0:162 Construct ivec3 ( temp mediump 3-component vector of int) +0:162 'x' ( global mediump int) +0:162 Construct ivec3 ( temp mediump 3-component vector of int) +0:162 'y' ( global mediump int) +0:162 Construct bvec3 ( temp 3-component vector of bool) +0:162 'b' ( global bool) +0:163 Sequence +0:163 move second child to first child ( temp mediump 4-component vector of int) +0:163 'iv4' ( temp mediump 4-component vector of int) +0:163 mix ( global mediump 4-component vector of int) +0:163 Construct ivec4 ( temp mediump 4-component vector of int) +0:163 'x' ( global mediump int) +0:163 Construct ivec4 ( temp mediump 4-component vector of int) +0:163 'x' ( global mediump int) +0:163 Construct bvec4 ( temp 4-component vector of bool) +0:163 'b' ( global bool) +0:164 Sequence +0:164 move second child to first child ( temp mediump uint) +0:164 'uiv' ( temp mediump uint) +0:164 mix ( global mediump uint) +0:164 'z' ( global mediump uint) +0:164 'w' ( global mediump uint) +0:164 'b' ( global bool) +0:165 Sequence +0:165 move second child to first child ( temp mediump 2-component vector of uint) +0:165 'uv2' ( temp mediump 2-component vector of uint) +0:165 mix ( global mediump 2-component vector of uint) +0:165 Construct uvec2 ( temp mediump 2-component vector of uint) +0:165 'z' ( global mediump uint) +0:165 Construct uvec2 ( temp mediump 2-component vector of uint) +0:165 'z' ( global mediump uint) +0:165 Construct bvec2 ( temp 2-component vector of bool) +0:165 'b' ( global bool) +0:166 Sequence +0:166 move second child to first child ( temp mediump 3-component vector of uint) +0:166 'uv3' ( temp mediump 3-component vector of uint) +0:166 mix ( global mediump 3-component vector of uint) +0:166 Construct uvec3 ( temp mediump 3-component vector of uint) +0:166 'z' ( global mediump uint) +0:166 Construct uvec3 ( temp mediump 3-component vector of uint) +0:166 'z' ( global mediump uint) +0:166 Construct bvec3 ( temp 3-component vector of bool) +0:166 'b' ( global bool) +0:167 Sequence +0:167 move second child to first child ( temp mediump 4-component vector of uint) +0:167 'uv4' ( temp mediump 4-component vector of uint) +0:167 mix ( global mediump 4-component vector of uint) +0:167 Construct uvec4 ( temp mediump 4-component vector of uint) +0:167 'z' ( global mediump uint) +0:167 Construct uvec4 ( temp mediump 4-component vector of uint) +0:167 'z' ( global mediump uint) +0:167 Construct bvec4 ( temp 4-component vector of bool) +0:167 'b' ( global bool) +0:168 Sequence +0:168 move second child to first child ( temp bool) +0:168 'bv' ( temp bool) +0:168 mix ( global bool) +0:168 'b1' ( global bool) +0:168 'b2' ( global bool) +0:168 'b' ( global bool) +0:169 Sequence +0:169 move second child to first child ( temp 2-component vector of bool) +0:169 'bv2' ( temp 2-component vector of bool) +0:169 mix ( global 2-component vector of bool) +0:169 Construct bvec2 ( temp 2-component vector of bool) +0:169 'b1' ( global bool) +0:169 Construct bvec2 ( temp 2-component vector of bool) +0:169 'b2' ( global bool) +0:169 Construct bvec2 ( temp 2-component vector of bool) +0:169 'b' ( global bool) +0:170 Sequence +0:170 move second child to first child ( temp 3-component vector of bool) +0:170 'bv3' ( temp 3-component vector of bool) +0:170 mix ( global 3-component vector of bool) +0:170 Construct bvec3 ( temp 3-component vector of bool) +0:170 'b1' ( global bool) +0:170 Construct bvec3 ( temp 3-component vector of bool) +0:170 'b2' ( global bool) +0:170 Construct bvec3 ( temp 3-component vector of bool) +0:170 'b' ( global bool) +0:171 Sequence +0:171 move second child to first child ( temp 4-component vector of bool) +0:171 'bv4' ( temp 4-component vector of bool) +0:171 mix ( global 4-component vector of bool) +0:171 Construct bvec4 ( temp 4-component vector of bool) +0:171 'b1' ( global bool) +0:171 Construct bvec4 ( temp 4-component vector of bool) +0:171 'b2' ( global bool) +0:171 Construct bvec4 ( temp 4-component vector of bool) +0:171 'b' ( global bool) +0:175 Function Definition: testmixFail( ( global void) +0:175 Function Parameters: +0:177 Sequence +0:177 Sequence +0:177 move second child to first child ( temp mediump int) +0:177 'ival' ( temp mediump int) +0:177 mix ( global mediump int) +0:177 'x' ( global mediump int) +0:177 'y' ( global mediump int) +0:177 'b' ( global bool) 0:? Linker Objects 0:? 's2D' ( uniform lowp sampler2D) 0:? 's3D' ( uniform lowp sampler3D) @@ -397,6 +523,13 @@ ERROR: node is still EOpNull! 0:? 'colors' ( out 4-element array of lowp 4-component vector of float) 0:? 'st1' ( uniform structure{ global mediump int i, global lowp sampler2D s}) 0:? 'st2' ( uniform structure{ global mediump int i, global lowp sampler2D s}) +0:? 'b1' ( global bool) +0:? 'b2' ( global bool) +0:? 'b' ( global bool) +0:? 'x' ( global mediump int) +0:? 'y' ( global mediump int) +0:? 'z' ( global mediump uint) +0:? 'w' ( global mediump uint) 0:? 'fooinv' ( invariant smooth in lowp 4-component vector of float) @@ -405,6 +538,7 @@ Linked fragment stage: ERROR: Linking fragment stage: when more than one fragment shader output, all must have location qualifiers Shader version: 300 +Requested GL_EXT_shader_integer_mix using early_fragment_tests ERROR: node is still EOpNull! 0:53 Function Definition: main( ( global void) @@ -628,5 +762,12 @@ ERROR: node is still EOpNull! 0:? 'colors' ( out 4-element array of lowp 4-component vector of float) 0:? 'st1' ( uniform structure{ global mediump int i, global lowp sampler2D s}) 0:? 'st2' ( uniform structure{ global mediump int i, global lowp sampler2D s}) +0:? 'b1' ( global bool) +0:? 'b2' ( global bool) +0:? 'b' ( global bool) +0:? 'x' ( global mediump int) +0:? 'y' ( global mediump int) +0:? 'z' ( global mediump uint) +0:? 'w' ( global mediump uint) 0:? 'fooinv' ( invariant smooth in lowp 4-component vector of float) diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out index ea24507869..206e30a385 100644 --- a/Test/baseResults/spv.specConstant.vert.out +++ b/Test/baseResults/spv.specConstant.vert.out @@ -11,7 +11,7 @@ spv.specConstant.vert Source GLSL 400 Name 4 "main" Name 9 "arraySize" - Name 14 "foo(vf4[s4534];" + Name 14 "foo(vf4[s4546];" Name 13 "p" Name 17 "builtin_spec_constant(" Name 20 "color" @@ -102,10 +102,10 @@ spv.specConstant.vert Store 20(color) 46 48: 10 Load 22(ucol) Store 47(param) 48 - 49: 2 FunctionCall 14(foo(vf4[s4534];) 47(param) + 49: 2 FunctionCall 14(foo(vf4[s4546];) 47(param) Return FunctionEnd -14(foo(vf4[s4534];): 2 Function None 12 +14(foo(vf4[s4546];): 2 Function None 12 13(p): 11(ptr) FunctionParameter 15: Label 54: 24(ptr) AccessChain 53(dupUcol) 23 diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index c76c287f58..5410f82ac4 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -3060,6 +3060,24 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } + if ((profile == EEsProfile && version >= 300 && version < 310) || + (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix + commonBuiltins.append("int mix(int, int, bool);" + "ivec2 mix(ivec2, ivec2, bvec2);" + "ivec3 mix(ivec3, ivec3, bvec3);" + "ivec4 mix(ivec4, ivec4, bvec4);" + "uint mix(uint, uint, bool );" + "uvec2 mix(uvec2, uvec2, bvec2);" + "uvec3 mix(uvec3, uvec3, bvec3);" + "uvec4 mix(uvec4, uvec4, bvec4);" + "bool mix(bool, bool, bool );" + "bvec2 mix(bvec2, bvec2, bvec2);" + "bvec3 mix(bvec3, bvec3, bvec3);" + "bvec4 mix(bvec4, bvec4, bvec4);" + + "\n"); + } + // GL_AMD_gpu_shader_half_float/Explicit types if (profile != EEsProfile && version >= 450) { commonBuiltins.append( diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 31b09f07cf..137cb5e380 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -2198,6 +2198,28 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan memorySemanticsCheck(loc, fnCandidate, callNode); } break; + + case EOpMix: + if (profile == EEsProfile && version < 310) { + // Look for specific signatures + if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat && + (*argp)[1]->getAsTyped()->getBasicType() != EbtFloat && + (*argp)[2]->getAsTyped()->getBasicType() == EbtBool) { + requireExtensions(loc, 1, &E_GL_EXT_shader_integer_mix, "specific signature of builtin mix"); + } + } + + if (profile != EEsProfile && version < 450) { + if ((*argp)[0]->getAsTyped()->getBasicType() != EbtFloat && + (*argp)[0]->getAsTyped()->getBasicType() != EbtDouble && + (*argp)[1]->getAsTyped()->getBasicType() != EbtFloat && + (*argp)[1]->getAsTyped()->getBasicType() != EbtDouble && + (*argp)[2]->getAsTyped()->getBasicType() == EbtBool) { + requireExtensions(loc, 1, &E_GL_EXT_shader_integer_mix, fnCandidate.getName().c_str()); + } + } + + break; #endif default: diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index cdcba3b199..82ccabc6e5 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -297,6 +297,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_OES_tessellation_point_size] = EBhDisable; extensionBehavior[E_GL_OES_texture_buffer] = EBhDisable; extensionBehavior[E_GL_OES_texture_cube_map_array] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_integer_mix] = EBhDisable; // EXT extensions extensionBehavior[E_GL_EXT_device_group] = EBhDisable; @@ -363,6 +364,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_EXT_tessellation_point_size 1\n" "#define GL_EXT_texture_buffer 1\n" "#define GL_EXT_texture_cube_map_array 1\n" + "#define GL_EXT_shader_integer_mix 1\n" // OES matching AEP "#define GL_OES_geometry_shader 1\n" diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index f5ea06fb16..7a9e67319b 100644 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -267,6 +267,7 @@ const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessel const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size"; const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer"; const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array"; +const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix"; // OES matching AEP const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";