From 3d73d0904b8b3fbc3730effb220c3592799acd27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sun, 23 Apr 2017 15:53:15 -0700 Subject: [PATCH] shaderc: Added support for gl_VertexID/InstanceID. Issue #1062. --- .../runtime/shaders/dx11/vs_instancing.bin | Bin 847 -> 1031 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 536 -> 614 bytes src/renderer_gl.cpp | 15 +++- tools/shaderc/shaderc.cpp | 72 +++++++++++++++++- tools/shaderc/shaderc_spirv.cpp | 11 ++- 5 files changed, 89 insertions(+), 9 deletions(-) diff --git a/examples/runtime/shaders/dx11/vs_instancing.bin b/examples/runtime/shaders/dx11/vs_instancing.bin index 72fbf2b22b96e23499586ad85c0052cd7518578e..6f913145aa4f4269bbf317de41d63dc413f74cdb 100644 GIT binary patch literal 1031 zcmZ`%JuCxZ7=Ej*s~fbbmc$@pGMGffAT(OlOT=&OtmQD|DFR!A#*LM-b?xP}jqz|hE;0()hCZ;mjTYx379|uWHj~g`Pt+O0 zqET0CVl4%Np%G`CIJCbK2Kj3>r&K5pKrjc^F*tK5xp>kIkKazD0_kchF@_A(4j9@4>m~nYD8*BVO-L!3%2isE;%2T|t}7gC32#1ROUT#EM-hzu$iR zCK_uFYh;Y~imkz&M$Sd&_kGr?9JpUO6r&D%K>h@CuqHPiXzF~3LEqH4;(*a_$VDCh z@mS}D`3Da(ps5~b{FeO5bMZ^2!yINfW6mm#yUb^Xu}BUFk&)m0@c%J-{@}ONGsA=E d`zDMvWJVmX4r!OHWTZ`U@(Fn-WZwV) delta 334 zcmZqYIL|ggx?X|VCBn&B`)0VA)a9tI94^~mCxtX8GcqtRC@?cH01<-@5dQ(<0HB~} zu)E(0Ae$YCIe>Tr5W@gSEeP=QGcas}Fu^299Aq9lP}6=84Hku%&6En{fHZ(4*pMVZ znqcCrNa8F=;vhB%fYgH2z|_MW0-`}?^7BvDXOx_ diff --git a/examples/runtime/shaders/glsl/vs_instancing.bin b/examples/runtime/shaders/glsl/vs_instancing.bin index a625ee1cf961603c2a072f821f33ea74e1346407..197655cd9cdf10552b5bab24d961ae6138b12b6e 100644 GIT binary patch delta 183 zcmbQi@{DDIG>aP(1H(j%>W!y08S7J%O%zIU3(69U;*G7j6yR*Vs&WNeg|gISBMk#R z104lJJp)Y?`3j)4Mp{mOVu?n2PJCEuQAuirr;Db7zJdk1(n=Jio_WP3iFwJXV8tp5 bhK4}%!A6(GC+Fwn7a0ImBV1I=#l-*svqUwZ delta 85 zcmaFHGJ|D;wCoQ?28P6vlA_F{(vnn#veaY~g~a&e{G9wE18c5{^3@ZAL>Wys&d_F5 efr={FDrmq|C}=5U#-}8fB${YibJcQjF#rI&`5JTp diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 2e070a999..b26b8c4aa 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -940,6 +940,13 @@ namespace bgfx { namespace gl NULL }; + static const char* s_EXT_gpu_shader4[] = + { + "gl_VertexID", + "gl_InstanceID", + NULL + }; + static const char* s_ARB_gpu_shader5[] = { "bitfieldReverse", @@ -5602,6 +5609,7 @@ namespace bgfx { namespace gl && s_extension[Extension::ARB_shader_texture_lod].m_supported && bx::findIdentifierMatch(code, s_ARB_shader_texture_lod) ; + const bool usesGpuShader4 = !!bx::findIdentifierMatch(code, s_EXT_gpu_shader4); const bool usesGpuShader5 = !!bx::findIdentifierMatch(code, s_ARB_gpu_shader5); const bool usesIUsamplers = !!bx::findIdentifierMatch(code, s_uisamplers); const bool usesTexelFetch = !!bx::findIdentifierMatch(code, s_texelFetch); @@ -5610,7 +5618,7 @@ namespace bgfx { namespace gl const bool usesPacking = !!bx::findIdentifierMatch(code, s_ARB_shading_language_packing); uint32_t version = - usesIUsamplers || usesTexelFetch || usesGpuShader5 ? 130 + usesIUsamplers|| usesTexelFetch || usesGpuShader5 ? 130 : usesTextureLod ? 120 : 120 ; @@ -5633,6 +5641,11 @@ namespace bgfx { namespace gl } } + if (usesGpuShader4) + { + writeString(&writer, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + if (usesGpuShader5) { writeString(&writer, "#extension GL_ARB_gpu_shader5 : enable\n"); diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index 97c0b1638..ac8b3bfb5 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -78,6 +78,13 @@ namespace bgfx NULL }; + static const char* s_EXT_gpu_shader4[] = + { + "gl_VertexID", + "gl_InstanceID", + NULL + }; + static const char* s_ARB_gpu_shader5[] = { "bitfieldReverse", @@ -1671,7 +1678,7 @@ namespace bgfx } else { - fprintf(stderr, "PrimitiveID builtin is not supported by this D3D9 HLSL.\n"); + fprintf(stderr, "gl_PrimitiveID builtin is not supported by this D3D9 HLSL.\n"); return EXIT_FAILURE; } } @@ -1698,6 +1705,9 @@ namespace bgfx } else if ('v' == shaderType) { + const bool hasVertexId = NULL != bx::strFind(input, "gl_VertexID"); + const bool hasInstanceId = NULL != bx::strFind(input, "gl_InstanceID"); + const char* brace = bx::strFind(entry, "{"); if (NULL != brace) { @@ -1730,17 +1740,55 @@ namespace bgfx preprocessor.writef("#define void_main() \\\n"); preprocessor.writef("Output main("); - bool first = true; + uint32_t arg = 0; for (InOut::const_iterator it = shaderInputs.begin(), itEnd = shaderInputs.end(); it != itEnd; ++it) { VaryingMap::const_iterator varyingIt = varyingMap.find(*it); if (varyingIt != varyingMap.end() ) { const Varying& var = varyingIt->second; - preprocessor.writef("%s%s %s : %s\\\n", first ? "" : "\t, ", var.m_type.c_str(), var.m_name.c_str(), var.m_semantics.c_str() ); - first = false; + preprocessor.writef( + " \\\n\t%s%s %s : %s" + , arg++ > 0 ? ", " : "" + , var.m_type.c_str() + , var.m_name.c_str() + , var.m_semantics.c_str() + ); } } + + if (hasVertexId) + { + if (d3d > 9) + { + preprocessor.writef( + " \\\n\t%suint gl_VertexID : SV_VertexID" + , arg++ > 0 ? ", " : " " + ); + } + else + { + fprintf(stderr, "gl_VertexID builtin is not supported by this D3D9 HLSL.\n"); + return EXIT_FAILURE; + } + } + + if (hasInstanceId) + { + if (d3d > 9) + { + preprocessor.writef( + " \\\n\t%suint gl_InstanceID : SV_InstanceID" + , arg++ > 0 ? ", " : " " + ); + } + else + { + fprintf(stderr, "gl_InstanceID builtin is not supported by this D3D9 HLSL.\n"); + return EXIT_FAILURE; + } + } + preprocessor.writef( ") \\\n" "{ \\\n" @@ -1857,6 +1905,8 @@ namespace bgfx || !!bx::findIdentifierMatch(input, s_ARB_shader_texture_lod) || !!bx::findIdentifierMatch(input, s_EXT_shader_texture_lod) ; + const bool usesInstanceID = !!bx::strFind(input, "gl_InstanceID"); + const bool usesGpuShader4 = !!bx::findIdentifierMatch(input, s_EXT_gpu_shader4); const bool usesGpuShader5 = !!bx::findIdentifierMatch(input, s_ARB_gpu_shader5); const bool usesTexelFetch = !!bx::findIdentifierMatch(input, s_texelFetch); const bool usesTextureMS = !!bx::findIdentifierMatch(input, s_ARB_texture_multisample); @@ -1880,6 +1930,20 @@ namespace bgfx glsl = 130; } + if (usesInstanceID) + { + bx::stringPrintf(code + , "#extension GL_ARB_draw_instanced : enable\n" + ); + } + + if (usesGpuShader4) + { + bx::stringPrintf(code + , "#extension GL_EXT_gpu_shader4 : enable\n" + ); + } + if (usesGpuShader5) { bx::stringPrintf(code diff --git a/tools/shaderc/shaderc_spirv.cpp b/tools/shaderc/shaderc_spirv.cpp index 7636608ac..e79e64008 100644 --- a/tools/shaderc/shaderc_spirv.cpp +++ b/tools/shaderc/shaderc_spirv.cpp @@ -475,6 +475,8 @@ namespace bgfx { namespace spirv return true; } +#define DBG(...) + void disassemble(bx::WriterI* _writer, bx::ReaderSeekerI* _reader, bx::Error* _err) { BX_UNUSED(_writer); @@ -497,24 +499,25 @@ namespace bgfx { namespace spirv if (0 < num && 0 != bx::strCmp(id.var.name.c_str(), "gl_PerVertex") ) { - printf("%3d: %s %d %s\n" + DBG("%3d: %s %d %s\n" , it->first , id.var.name.c_str() , id.var.location , getName(id.var.storageClass) ); - printf("{\n"); + DBG("{\n"); for (uint32_t ii = 0; ii < num; ++ii) { const SpvReflection::Id::Variable& var = id.members[ii]; - printf("\t\t%s %s %d %s\n" + DBG("\t\t%s %s %d %s\n" , spvx.getTypeName(var.type).c_str() , var.name.c_str() , var.offset , getName(var.storageClass) ); + BX_UNUSED(var); } - printf("}\n"); + DBG("}\n"); } }