diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 071dad30..3bed6783 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1439,7 +1439,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, // Add the source extensions const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions(); for (auto it = sourceExtensions.begin(); it != sourceExtensions.end(); ++it) - builder.addSourceExtension(it->c_str()); + builder.addSourceExtension(it->first.c_str()); // Add the top-level modes for this shader. diff --git a/Test/310.frag b/Test/310.frag index 8a11f67a..5cdcca7c 100755 --- a/Test/310.frag +++ b/Test/310.frag @@ -448,4 +448,40 @@ void devie() { gl_DeviceIndex; gl_ViewIndex; -} +} + +#extension GL_EXT_shader_implicit_conversions : enable + +// Test function overloading +void func(uint a, uvec4 b) +{ + +} + +int func(uint a, uvec4 b) // Error function overloading because of same signature and different return type +{ + return 0; +} + +int b; + +void testimplicit() { + + uint a = b; // int->uint + mediump vec4 col = vec4(1, 2, 3, 4); // ivec4 -> vec4 + int b = a + 2; // ERROR: cannot convert from ' temp uint' to ' temp int' + + // Test binary ops + uint c = b * 3; + uint d = b * 3u; + uint e = b%3; + uint f = (b > 3)? b : c; + func(b, ivec4(1,2,3,4)); +} + +#extension GL_EXT_shader_implicit_conversions : disable + +void testimplicitFail() { + uint a = b; // Error GL_EXT_shader_implicit_conversions is disabled +} + diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out index fab3d461..9fe93e95 100644 --- a/Test/baseResults/310.frag.out +++ b/Test/baseResults/310.frag.out @@ -134,12 +134,18 @@ ERROR: 0:429: 'blend_support' : unknown blend equation ERROR: 0:431: 'fragment-shader array-of-array output' : not supported with this profile: es ERROR: 0:435: 'gl_DeviceIndex' : required extension not requested: GL_EXT_device_group ERROR: 0:436: 'gl_ViewIndex' : required extension not requested: GL_EXT_multiview -ERROR: 127 compilation errors. No code generated. +ERROR: 0:461: 'func' : overloaded functions must have the same return type +ERROR: 0:461: 'func' : function already has a body +ERROR: 0:463: 'return' : void function cannot return a value +ERROR: 0:472: '=' : cannot convert from ' temp mediump uint' to ' temp mediump int' +ERROR: 0:485: '=' : cannot convert from ' global mediump int' to ' temp mediump uint' +ERROR: 132 compilation errors. No code generated. Shader version: 310 Requested GL_EXT_device_group Requested GL_EXT_multiview +Requested GL_EXT_shader_implicit_conversions Requested GL_EXT_shader_io_blocks Requested GL_EXT_texture_cube_map_array Requested GL_KHR_blend_equation_advanced @@ -939,6 +945,80 @@ ERROR: node is still EOpNull! 0:449 Sequence 0:449 'gl_DeviceIndex' ( flat in highp int DeviceIndex) 0:450 'gl_ViewIndex' ( flat in highp int ViewIndex) +0:456 Function Definition: func(u1;vu4; ( global void) +0:456 Function Parameters: +0:456 'a' ( in mediump uint) +0:456 'b' ( in mediump 4-component vector of uint) +0:461 Function Definition: func(u1;vu4; ( global mediump int) +0:461 Function Parameters: +0:461 'a' ( in mediump uint) +0:461 'b' ( in mediump 4-component vector of uint) +0:463 Sequence +0:463 Branch: Return +0:468 Function Definition: testimplicit( ( global void) +0:468 Function Parameters: +0:470 Sequence +0:470 Sequence +0:470 move second child to first child ( temp mediump uint) +0:470 'a' ( temp mediump uint) +0:470 Convert int to uint ( temp mediump uint) +0:470 'b' ( global mediump int) +0:471 Sequence +0:471 move second child to first child ( temp mediump 4-component vector of float) +0:471 'col' ( temp mediump 4-component vector of float) +0:471 Constant: +0:471 1.000000 +0:471 2.000000 +0:471 3.000000 +0:471 4.000000 +0:475 Sequence +0:475 move second child to first child ( temp mediump uint) +0:475 'c' ( temp mediump uint) +0:475 Convert int to uint ( temp mediump uint) +0:475 component-wise multiply ( temp mediump int) +0:475 'b' ( temp mediump int) +0:475 Constant: +0:475 3 (const int) +0:476 Sequence +0:476 move second child to first child ( temp mediump uint) +0:476 'd' ( temp mediump uint) +0:476 component-wise multiply ( temp mediump uint) +0:476 Convert int to uint ( temp mediump uint) +0:476 'b' ( temp mediump int) +0:476 Constant: +0:476 3 (const uint) +0:477 Sequence +0:477 move second child to first child ( temp mediump uint) +0:477 'e' ( temp mediump uint) +0:477 Convert int to uint ( temp mediump uint) +0:477 mod ( temp mediump int) +0:477 'b' ( temp mediump int) +0:477 Constant: +0:477 3 (const int) +0:478 Sequence +0:478 move second child to first child ( temp mediump uint) +0:478 'f' ( temp mediump uint) +0:478 Test condition and select ( temp mediump uint) +0:478 Condition +0:478 Compare Greater Than ( temp bool) +0:478 'b' ( temp mediump int) +0:478 Constant: +0:478 3 (const int) +0:478 true case +0:478 Convert int to uint ( temp uint) +0:478 'b' ( temp mediump int) +0:478 false case +0:478 'c' ( temp mediump uint) +0:479 Function Call: func(u1;vu4; ( global void) +0:479 Convert int to uint ( temp uint) +0:479 'b' ( temp mediump int) +0:479 Constant: +0:479 1 (const uint) +0:479 2 (const uint) +0:479 3 (const uint) +0:479 4 (const uint) +0:484 Function Definition: testimplicitFail( ( global void) +0:484 Function Parameters: 0:? Linker Objects 0:? 'gl_FragCoord' ( smooth in mediump 4-component vector of float) 0:? 'v3' (layout( location=2) smooth in mediump 3-component vector of float) @@ -1033,6 +1113,7 @@ ERROR: node is still EOpNull! 0:? 'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float) 0:? 'badout' ( out mediump 4-component vector of float) 0:? 'outAA' ( out 2-element array of 2-element array of mediump 4-component vector of float) +0:? 'b' ( global mediump int) Linked fragment stage: @@ -1042,6 +1123,7 @@ ERROR: Linking fragment stage: when more than one fragment shader output, all mu Shader version: 310 Requested GL_EXT_device_group Requested GL_EXT_multiview +Requested GL_EXT_shader_implicit_conversions Requested GL_EXT_shader_io_blocks Requested GL_EXT_texture_cube_map_array Requested GL_KHR_blend_equation_advanced @@ -1244,4 +1326,5 @@ ERROR: node is still EOpNull! 0:? 'sampInArray' ( smooth sample in 4-element array of mediump 3-component vector of float) 0:? 'badout' ( out mediump 4-component vector of float) 0:? 'outAA' ( out 2-element array of 2-element array of mediump 4-component vector of float) +0:? 'b' ( global mediump int) diff --git a/Test/baseResults/versionsErrors.frag.out b/Test/baseResults/versionsErrors.frag.out index dbeb941a..b0726695 100644 --- a/Test/baseResults/versionsErrors.frag.out +++ b/Test/baseResults/versionsErrors.frag.out @@ -7,6 +7,7 @@ ERROR: 4 compilation errors. No code generated. Shader version: 110 +Requested GL_ARB_texture_rectangle ERROR: node is still EOpNull! 0:42 Function Definition: main( ( global void) 0:42 Function Parameters: @@ -27,6 +28,7 @@ Linked fragment stage: Shader version: 110 +Requested GL_ARB_texture_rectangle ERROR: node is still EOpNull! 0:42 Function Definition: main( ( global void) 0:42 Function Parameters: diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index f6a5e7f2..d7049d8d 100755 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -1620,7 +1620,7 @@ bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const // bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperator op) const { - if (isEsProfile() || version == 110) + if ((isEsProfile() && version < 310 ) || version == 110) return false; if (from == to) @@ -1667,7 +1667,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16) || extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float32) || extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float64); - + if (explicitTypesEnabled) { // integral promotions if (isIntegralPromotion(from, to)) { @@ -1699,6 +1699,30 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat if (from == EbtBool && (to == EbtInt || to == EbtUint || to == EbtFloat)) return true; } + } else if (isEsProfile()) { + switch (to) { + case EbtFloat: + switch (from) { + case EbtInt: + case EbtUint: + return extensionRequested(E_GL_EXT_shader_implicit_conversions); + case EbtFloat: + return true; + default: + return false; + } + case EbtUint: + switch (from) { + case EbtInt: + return extensionRequested(E_GL_EXT_shader_implicit_conversions); + case EbtUint: + return true; + default: + return false; + } + default: + return false; + } } else { switch (to) { case EbtDouble: @@ -1731,15 +1755,14 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat return extensionRequested(E_GL_AMD_gpu_shader_int16); case EbtFloat16: return - extensionRequested(E_GL_AMD_gpu_shader_half_float) || - getSource() == EShSourceHlsl; + extensionRequested(E_GL_AMD_gpu_shader_half_float) || getSource() == EShSourceHlsl; default: return false; } case EbtUint: switch (from) { case EbtInt: - return version >= 400 || getSource() == EShSourceHlsl; + return version >= 400 || getSource() == EShSourceHlsl; case EbtUint: return true; case EbtBool: @@ -1931,7 +1954,9 @@ std::tuple TIntermediate::getConversionDestinatonType(TB TBasicType res0 = EbtNumTypes; TBasicType res1 = EbtNumTypes; - if (isEsProfile() || version == 110) + if ((isEsProfile() && + (version < 310 || !extensionRequested(E_GL_EXT_shader_implicit_conversions))) || + version == 110) return std::make_tuple(res0, res1); if (getSource() == EShSourceHlsl) { diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 8bc78148..ddb3e3a5 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -6162,7 +6162,10 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float32) || extensionTurnedOn(E_GL_EXT_shader_explicit_arithmetic_types_float64); - if (isEsProfile() || version < 120) + if (isEsProfile()) + function = (extensionTurnedOn(E_GL_EXT_shader_implicit_conversions) && version >= 310) ? + findFunction120(loc, call, builtIn) : findFunctionExact(loc, call, builtIn); + else if (version < 120) function = findFunctionExact(loc, call, builtIn); else if (version < 400) function = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn); diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index 30313b24..143f2516 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -307,6 +307,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_ray_query] = EBhDisable; extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable; extensionBehavior[E_GL_EXT_blend_func_extended] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable; // OVR extensions extensionBehavior[E_GL_OVR_multiview] = EBhDisable; @@ -365,6 +366,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_implicit_conversions 1\n" "#define GL_EXT_shader_integer_mix 1\n" "#define GL_EXT_blend_func_extended 1\n" @@ -923,8 +925,8 @@ void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBe } else { if (iter->second == EBhDisablePartial) warn(getCurrentLoc(), "extension is only partially supported:", "#extension", extension); - if (behavior == EBhEnable || behavior == EBhRequire) - intermediate.addRequestedExtension(extension); + if (behavior == EBhEnable || behavior == EBhRequire || behavior == EBhDisable) + intermediate.updateRequestedExtension(extension, behavior); iter->second = behavior; } } diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index cde6c23c..8667411e 100644 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -197,6 +197,7 @@ const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracin const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query"; const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling"; const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended"; +const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions"; // Arrays of extensions for the above viewportEXTs duplications diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp index 593ed6f9..86edcfe4 100644 --- a/glslang/MachineIndependent/intermOut.cpp +++ b/glslang/MachineIndependent/intermOut.cpp @@ -1466,7 +1466,7 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) infoSink.debug << "Shader version: " << version << "\n"; if (requestedExtensions.size() > 0) { for (auto extIt = requestedExtensions.begin(); extIt != requestedExtensions.end(); ++extIt) - infoSink.debug << "Requested " << *extIt << "\n"; + infoSink.debug << "Requested " << extIt->first << "\n"; } if (xfbMode) diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 66f5a88a..996e347f 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -356,8 +356,15 @@ public: } const SpvVersion& getSpv() const { return spvVersion; } EShLanguage getStage() const { return language; } - void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); } - const std::set& getRequestedExtensions() const { return requestedExtensions; } + void updateRequestedExtension(const char* extension, TExtensionBehavior behavior) { + if(requestedExtensions.find(extension) != requestedExtensions.end()) { + requestedExtensions[extension] = behavior; + } else { + requestedExtensions.insert(std::make_pair(extension, behavior)); + } + } + + const std::map& getRequestedExtensions() const { return requestedExtensions; } void setTreeRoot(TIntermNode* r) { treeRoot = r; } TIntermNode* getTreeRoot() const { return treeRoot; } @@ -902,7 +909,13 @@ protected: #ifdef GLSLANG_WEB bool extensionRequested(const char *extension) const { return false; } #else - bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();} + bool extensionRequested(const char *extension) const { + auto it = requestedExtensions.find(extension); + if (it != requestedExtensions.end()) { + return (it->second == EBhDisable) ? false : true; + } + return false; + } #endif static const char* getResourceName(TResourceType); @@ -917,7 +930,7 @@ protected: int version; // source version SpvVersion spvVersion; TIntermNode* treeRoot; - std::set requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them + std::map requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them TBuiltInResource resources; int numEntryPoints; int numErrors;