From ea50f6d77ef5930da6c35a91d1ce9c1d9aa35e97 Mon Sep 17 00:00:00 2001 From: pmistryNV <63069047+pmistryNV@users.noreply.github.com> Date: Mon, 27 Apr 2020 01:46:32 -0700 Subject: [PATCH] Add support for extension GL_ARB_shading_language_packing (#2192) --- Test/150.frag | 20 +++++++++ Test/baseResults/150.frag.out | 50 +++++++++++++++++++++- Test/baseResults/spv.specConstant.vert.out | 6 +-- glslang/MachineIndependent/Initialize.cpp | 26 ++++++++--- glslang/MachineIndependent/Versions.cpp | 2 + glslang/MachineIndependent/Versions.h | 1 + 6 files changed, 96 insertions(+), 9 deletions(-) diff --git a/Test/150.frag b/Test/150.frag index e24dba05f7..f27b8eb190 100644 --- a/Test/150.frag +++ b/Test/150.frag @@ -79,3 +79,23 @@ void bitEncodingFail() { int i = floatBitsToInt(f); // Error, extention GL_ARB_bit_encoding is diabled } + +#extension GL_ARB_shading_language_packing : enable +vec2 v2a; +uint uy; + +void packingPass() +{ + uint u19 = packSnorm2x16(v2a); + vec2 v20 = unpackSnorm2x16(uy); + uint u15 = packUnorm2x16(v2a); + vec2 v16 = unpackUnorm2x16(uy); + uint u17 = packHalf2x16(v2a); + vec2 v18 = unpackHalf2x16(uy); +} + +#extension GL_ARB_shading_language_packing : disable +void packingFail() +{ + uint u19 = packSnorm2x16(v2a); // Error, extension GL_ARB_shading_language_packing is disabled +} diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out index 4a55ea40e0..900b3a93f4 100644 --- a/Test/baseResults/150.frag.out +++ b/Test/baseResults/150.frag.out @@ -10,12 +10,14 @@ ERROR: 0:53: 'double' : not supported for this version or the enabled extensions ERROR: 0:53: 'double' : must be qualified as flat in ERROR: 0:57: '=' : cannot convert from ' global double' to ' global int' ERROR: 0:80: 'floatBitsToInt' : required extension not requested: GL_ARB_shader_bit_encoding -ERROR: 11 compilation errors. No code generated. +ERROR: 0:100: 'packSnorm2x16' : required extension not requested: GL_ARB_shading_language_packing +ERROR: 12 compilation errors. No code generated. Shader version: 150 Requested GL_ARB_gpu_shader_fp64 Requested GL_ARB_shader_bit_encoding +Requested GL_ARB_shading_language_packing gl_FragCoord pixel center is integer gl_FragCoord origin is upper left ERROR: node is still EOpNull! @@ -167,6 +169,47 @@ ERROR: node is still EOpNull! 0:80 'i' ( temp int) 0:80 floatBitsToInt ( global int) 0:80 'f' ( global float) +0:87 Function Definition: packingPass( ( global void) +0:87 Function Parameters: +0:89 Sequence +0:89 Sequence +0:89 move second child to first child ( temp uint) +0:89 'u19' ( temp uint) +0:89 packSnorm2x16 ( global uint) +0:89 'v2a' ( global 2-component vector of float) +0:90 Sequence +0:90 move second child to first child ( temp 2-component vector of float) +0:90 'v20' ( temp 2-component vector of float) +0:90 unpackSnorm2x16 ( global 2-component vector of float) +0:90 'uy' ( global uint) +0:91 Sequence +0:91 move second child to first child ( temp uint) +0:91 'u15' ( temp uint) +0:91 packUnorm2x16 ( global uint) +0:91 'v2a' ( global 2-component vector of float) +0:92 Sequence +0:92 move second child to first child ( temp 2-component vector of float) +0:92 'v16' ( temp 2-component vector of float) +0:92 unpackUnorm2x16 ( global 2-component vector of float) +0:92 'uy' ( global uint) +0:93 Sequence +0:93 move second child to first child ( temp uint) +0:93 'u17' ( temp uint) +0:93 packHalf2x16 ( global uint) +0:93 'v2a' ( global 2-component vector of float) +0:94 Sequence +0:94 move second child to first child ( temp 2-component vector of float) +0:94 'v18' ( temp 2-component vector of float) +0:94 unpackHalf2x16 ( global 2-component vector of float) +0:94 'uy' ( global uint) +0:98 Function Definition: packingFail( ( global void) +0:98 Function Parameters: +0:100 Sequence +0:100 Sequence +0:100 move second child to first child ( temp uint) +0:100 'u19' ( temp uint) +0:100 packSnorm2x16 ( global uint) +0:100 'v2a' ( global 2-component vector of float) 0:? Linker Objects 0:? 'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord) 0:? 'foo' ( smooth in 4-component vector of float) @@ -192,6 +235,8 @@ ERROR: node is still EOpNull! 0:? 'v4' ( global 4-component vector of float) 0:? 'iv4a' ( global 4-component vector of int) 0:? 'uv2c' ( global 2-component vector of uint) +0:? 'v2a' ( global 2-component vector of float) +0:? 'uy' ( global uint) Linked fragment stage: @@ -200,6 +245,7 @@ Linked fragment stage: Shader version: 150 Requested GL_ARB_gpu_shader_fp64 Requested GL_ARB_shader_bit_encoding +Requested GL_ARB_shading_language_packing gl_FragCoord pixel center is integer gl_FragCoord origin is upper left ERROR: node is still EOpNull! @@ -260,4 +306,6 @@ ERROR: node is still EOpNull! 0:? 'v4' ( global 4-component vector of float) 0:? 'iv4a' ( global 4-component vector of int) 0:? 'uv2c' ( global 2-component vector of uint) +0:? 'v2a' ( global 2-component vector of float) +0:? 'uy' ( global uint) diff --git a/Test/baseResults/spv.specConstant.vert.out b/Test/baseResults/spv.specConstant.vert.out index 77317ae66e..ea24507869 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[s4530];" + Name 14 "foo(vf4[s4534];" 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[s4530];) 47(param) + 49: 2 FunctionCall 14(foo(vf4[s4534];) 47(param) Return FunctionEnd -14(foo(vf4[s4530];): 2 Function None 12 +14(foo(vf4[s4534];): 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 04486cd1d4..68899b3d6c 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -1349,7 +1349,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV #endif if ((profile == EEsProfile && version >= 300) || - (profile != EEsProfile && version >= 400)) { + (profile != EEsProfile && version >= 150)) { commonBuiltins.append( "highp uint packUnorm2x16(vec2);" "vec2 unpackUnorm2x16(highp uint);" @@ -1357,7 +1357,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV } if ((profile == EEsProfile && version >= 300) || - (profile != EEsProfile && version >= 420)) { + (profile != EEsProfile && version >= 150)) { commonBuiltins.append( "highp uint packSnorm2x16(vec2);" " vec2 unpackSnorm2x16(highp uint);" @@ -1369,7 +1369,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV commonBuiltins.append( "mediump vec2 unpackHalf2x16(highp uint);" "\n"); - } else if (profile != EEsProfile && version >= 420) { + } else if (profile != EEsProfile && version >= 150) { commonBuiltins.append( " vec2 unpackHalf2x16(highp uint);" "\n"); @@ -1377,7 +1377,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV #ifndef GLSLANG_WEB if ((profile == EEsProfile && version >= 310) || - (profile != EEsProfile && version >= 400)) { + (profile != EEsProfile && version >= 150)) { commonBuiltins.append( "highp uint packSnorm4x8(vec4);" "highp uint packUnorm4x8(vec4);" @@ -1389,7 +1389,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "mediump vec4 unpackSnorm4x8(highp uint);" "mediump vec4 unpackUnorm4x8(highp uint);" "\n"); - } else if (profile != EEsProfile && version >= 400) { + } else if (profile != EEsProfile && version >= 150) { commonBuiltins.append( "vec4 unpackSnorm4x8(highp uint);" "vec4 unpackUnorm4x8(highp uint);" @@ -7844,6 +7844,22 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("atomicCompSwap", 1, &E_GL_ARB_shader_storage_buffer_object); } + // GL_ARB_shading_language_packing + if (profile != EEsProfile && version < 400 ) { + symbolTable.setFunctionExtensions("packUnorm2x16", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("unpackUnorm2x16", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("packSnorm4x8", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("packUnorm4x8", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("unpackSnorm4x8", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("unpackUnorm4x8", 1, &E_GL_ARB_shading_language_packing); + } + if (profile != EEsProfile && version < 420 ) { + symbolTable.setFunctionExtensions("packSnorm2x16", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("unpackSnorm2x16", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("unpackHalf2x16", 1, &E_GL_ARB_shading_language_packing); + symbolTable.setFunctionExtensions("packHalf2x16", 1, &E_GL_ARB_shading_language_packing); + } + symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview); diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index 5a8f813cea..f9ff2f1d6d 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -200,6 +200,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_ARB_shader_bit_encoding] = EBhDisable; extensionBehavior[E_GL_ARB_shader_image_size] = EBhDisable; extensionBehavior[E_GL_ARB_shader_storage_buffer_object] = EBhDisable; + extensionBehavior[E_GL_ARB_shading_language_packing] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_basic] = EBhDisable; extensionBehavior[E_GL_KHR_shader_subgroup_vote] = EBhDisable; @@ -409,6 +410,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_ARB_shader_stencil_export 1\n" "#define GL_ARB_sample_shading 1\n" "#define GL_ARB_shader_image_size 1\n" + "#define GL_ARB_shading_language_packing 1\n" // "#define GL_ARB_cull_distance 1\n" // present for 4.5, but need extension control over block members "#define GL_ARB_post_depth_coverage 1\n" "#define GL_ARB_fragment_shader_interlock 1\n" diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index 4e93592ebb..2a4962983e 100644 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -155,6 +155,7 @@ const char* const E_GL_ARB_sample_shading = "GL_ARB_sample_shading const char* const E_GL_ARB_shader_bit_encoding = "GL_ARB_shader_bit_encoding"; const char* const E_GL_ARB_shader_image_size = "GL_ARB_shader_image_size"; const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object"; +const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing"; const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";