From 812f7712f18928d508bed4eb2d9c468b4f26e9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 12 Dec 2020 12:45:15 -0800 Subject: [PATCH] shaderc: Added gl_ViewportIndex and gl_Layer. --- tools/shaderc/shaderc.cpp | 96 ++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 21 deletions(-) diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index 2eff8fab7..55f1a18ff 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -19,7 +19,7 @@ extern "C" #define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', BGFX_SHADER_BIN_VERSION) #define BGFX_SHADERC_VERSION_MAJOR 1 -#define BGFX_SHADERC_VERSION_MINOR 17 +#define BGFX_SHADERC_VERSION_MINOR 18 namespace bgfx { @@ -90,6 +90,16 @@ namespace bgfx NULL }; + // To be use from vertex program require: + // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_viewport_layer_array.txt + // DX11 11_1 feature level + static const char* s_ARB_shader_viewport_layer_array[] = + { + "gl_ViewportIndex", + "gl_Layer", + NULL + }; + static const char* s_ARB_gpu_shader5[] = { "bitfieldReverse", @@ -896,18 +906,18 @@ namespace bgfx " orbis\n" " osx\n" " windows\n" - " -p, --profile Shader model (default GLSL).\n" - " s_3\n" - " s_4\n" - " s_4_0_level\n" - " s_5\n" - " metal\n" - " pssl\n" - " spirv Alias for spirv10-10. \n" - " spirv10-10\n" - " spirv13-11\n" - " spirv14-11\n" - " spirv15-12\n" + " -p, --profile Shader model (default GLSL).\n" + " s_3\n" + " s_4\n" + " s_4_0_level\n" + " s_5\n" + " metal\n" + " pssl\n" + " spirv Alias for spirv10-10.\n" + " spirv10-10\n" + " spirv13-11\n" + " spirv14-11\n" + " spirv15-12\n" " --preprocess Preprocess only.\n" " --define Add defines to preprocessor (semicolon separated).\n" " --raw Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).\n" @@ -1822,8 +1832,10 @@ namespace bgfx } else if ('v' == _options.shaderType) { - const bool hasVertexId = !bx::strFind(input, "gl_VertexID").isEmpty(); - const bool hasInstanceId = !bx::strFind(input, "gl_InstanceID").isEmpty(); + const bool hasVertexId = !bx::strFind(input, "gl_VertexID").isEmpty(); + const bool hasInstanceId = !bx::strFind(input, "gl_InstanceID").isEmpty(); + const bool hasViewportId = !bx::strFind(input, "gl_ViewportIndex").isEmpty(); + const bool hasLayerId = !bx::strFind(input, "gl_Layer").isEmpty(); bx::StringView brace = bx::strFind(bx::StringView(entry.getPtr(), shader.getTerm() ), "{"); if (!brace.isEmpty() ) @@ -1841,6 +1853,7 @@ namespace bgfx "\tvec4 gl_Position : SV_POSITION;\n" "#define gl_Position _varying_.gl_Position\n" ); + for (InOut::const_iterator it = shaderOutputs.begin(), itEnd = shaderOutputs.end(); it != itEnd; ++it) { VaryingMap::const_iterator varyingIt = varyingMap.find(*it); @@ -1861,6 +1874,39 @@ namespace bgfx ); } } + + if (hasViewportId) + { + if (d3d > 9) + { + preprocessor.writef( + "\tuint gl_ViewportIndex : SV_ViewportArrayIndex;\n" + "#define gl_ViewportIndex _varying_.gl_ViewportIndex\n" + ); + } + else + { + bx::printf("gl_ViewportIndex builtin is not supported by this D3D9 HLSL.\n"); + return false; + } + } + + if (hasLayerId) + { + if (d3d > 9) + { + preprocessor.writef( + "\tuint gl_Layer : SV_RenderTargetArrayIndex;\n" + "#define gl_Layer _varying_.gl_Layer\n" + ); + } + else + { + bx::printf("gl_Layer builtin is not supported by this D3D9 HLSL.\n"); + return false; + } + } + preprocessor.writef( "};\n" ); @@ -2023,12 +2069,13 @@ namespace bgfx && !bx::findIdentifierMatch(input, s_ARB_gpu_shader5).isEmpty() ; - const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty(); - const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty(); - const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty(); - const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty(); - const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty(); - const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty(); + const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty(); + const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty(); + const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty(); + const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty(); + const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty(); + const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty(); + const bool usesViewportLayerArray = !bx::findIdentifierMatch(input, s_ARB_shader_viewport_layer_array).isEmpty(); if (0 == essl) { @@ -2055,6 +2102,13 @@ namespace bgfx ); } + if (usesViewportLayerArray) + { + bx::stringPrintf(code + , "#extension GL_ARB_shader_viewport_layer_array : enable\n" + ); + } + if (usesGpuShader4) { bx::stringPrintf(code