From 4b26830fc1583c96dcbc750cefb257a6e7a07245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 1 Jul 2016 20:38:12 -0700 Subject: [PATCH] shaderc: Allow shader without color target write. --- .../15-shadowmaps-simple/fs_sms_shadow.sc | 1 - .../runtime/shaders/dx11/fs_sms_shadow.bin | Bin 228 -> 148 bytes .../runtime/shaders/gles/fs_sms_shadow.bin | Bin 165 -> 30 bytes .../runtime/shaders/glsl/fs_sms_shadow.bin | Bin 157 -> 30 bytes .../runtime/shaders/metal/fs_sms_shadow.bin | Bin 477 -> 271 bytes tools/shaderc/shaderc.cpp | 28 +++++++++++++----- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/examples/15-shadowmaps-simple/fs_sms_shadow.sc b/examples/15-shadowmaps-simple/fs_sms_shadow.sc index 3cdf1973f..cfaf3412c 100644 --- a/examples/15-shadowmaps-simple/fs_sms_shadow.sc +++ b/examples/15-shadowmaps-simple/fs_sms_shadow.sc @@ -7,5 +7,4 @@ void main() { - gl_FragColor = vec4_splat(0.0); } diff --git a/examples/runtime/shaders/dx11/fs_sms_shadow.bin b/examples/runtime/shaders/dx11/fs_sms_shadow.bin index 2477d864d9a4d3aea70f3f3593005f0e3bca80d9..2ffc6baeefc6b48e21b978e723207dd6be1fdc29 100644 GIT binary patch delta 105 zcmaFDIEB&DE!cyF0SsCgTq2yDC08WIc2wPNbYT4P(y>=)5hGBp1&En}SOh($ literal 228 zcmZ<@_F!QEgDVU!5l+sEk+;>CF5O>wSEp#9rt9)Aj6k_7K+FupIzXHN#8ZISGuYh^ z#0SZ90I>oPg8+yRQVRn7KpY$vAK)MC8RF^h$Ka1c4@fPVo)E_%ch?Yx)vJR&T!Jis j@(w`E2gIpBrJoc8fGh?EGoaNlHj@KL1QpmpoWlSB1a=(p diff --git a/examples/runtime/shaders/gles/fs_sms_shadow.bin b/examples/runtime/shaders/gles/fs_sms_shadow.bin index 3262874eaf3a193b4806348e2f0b127725fd3a02..81ccc6436e45e09f03be1ed4fe8acb1751ae5517 100644 GIT binary patch literal 30 gcmZ<@_F!QE1AZV`mYF!h07StpH2?qr diff --git a/examples/runtime/shaders/glsl/fs_sms_shadow.bin b/examples/runtime/shaders/glsl/fs_sms_shadow.bin index 946d0e83e3be19dd3d4cf1577ec0a0beecb13a92..81ccc6436e45e09f03be1ed4fe8acb1751ae5517 100644 GIT binary patch literal 30 gcmZ<@_F!QE1AZV`mYs-JLl)*7Xd|K##?jMa&a*L0DWpI8~^|S diff --git a/examples/runtime/shaders/metal/fs_sms_shadow.bin b/examples/runtime/shaders/metal/fs_sms_shadow.bin index b5140b48e9a12dca42ae2a168b56351831fea76b..42cd46cf0c3a601063d5a768ee8cd342e213c680 100644 GIT binary patch delta 30 hcmcc1+|R`A7VN>o009%Z!zMb4Pwbz}V$H?H003j}215V< delta 234 zcmeBYy35S%7VN>o00!qKa)*g2D5T}&CzhBfr02xD6(y!S=jY@XSx-z@UC&j`rJzue zlUU+gk`tVfn37uLUs_U7TA~o2Tapu>Zw-`%YAwkvC`&AgHv|d6*m@NTwh9J%1}I{c nSj4KZh?N7yY@nJUw&@`|4=4+>24s9uYDsBP9^6^ATwDwQ%5g^# diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index b5503352c..40873bc55 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -329,11 +329,12 @@ namespace bgfx uint32_t m_size; }; - void strInsert(char* _str, const char* _insert) + char* strInsert(char* _str, const char* _insert) { size_t len = strlen(_insert); memmove(&_str[len], _str, strlen(_str) ); memcpy(_str, _insert, len); + return _str + len; } void strReplace(char* _str, const char* _find, const char* _replace) @@ -1063,7 +1064,7 @@ namespace bgfx char* data; char* input; { - const size_t padding = 1024; + const size_t padding = 4096; uint32_t size = (uint32_t)bx::getSize(&reader); data = new char[size+padding+1]; size = (uint32_t)bx::read(&reader, data, size); @@ -1463,12 +1464,13 @@ namespace bgfx if ('f' == shaderType) { - const char* brace = strstr(entry, "{"); - if (NULL != brace) + const char* insert = strstr(entry, "{"); + if (NULL != insert) { - strInsert(const_cast(brace+1), "\nvec4 bgfx_VoidFrag;\n"); + insert = strInsert(const_cast(insert+1), "\nvec4 bgfx_VoidFrag = vec4_splat(0.0);\n"); } + const bool hasFragColor = NULL != strstr(input, "gl_FragColor"); const bool hasFragCoord = NULL != strstr(input, "gl_FragCoord") || hlsl > 3 || hlsl == 2; const bool hasFragDepth = NULL != strstr(input, "gl_FragDepth"); const bool hasFrontFacing = NULL != strstr(input, "gl_FrontFacing"); @@ -1489,6 +1491,18 @@ namespace bgfx // GL errors when both gl_FragColor and gl_FragData is used. // This will trigger the same error with HLSL compiler too. preprocessor.writef("#define gl_FragColor gl_FragData_0_\n"); + + // If it has gl_FragData or gl_FragColor, color target at + // index 0 exists, otherwise shader is not modifying color + // targets. + hasFragData[0] |= hasFragColor || d3d < 11; + + if (NULL != insert + && d3d < 11 + && !hasFragColor) + { + insert = strInsert(const_cast(insert+1), "\ngl_FragColor = bgfx_VoidFrag;\n"); + } } preprocessor.writef("#define void_main()"); @@ -1518,11 +1532,9 @@ namespace bgfx } } - addFragData(preprocessor, input, 0, arg++ > 0); - const uint32_t maxRT = d3d > 9 ? BX_COUNTOF(hasFragData) : 4; - for (uint32_t ii = 1; ii < BX_COUNTOF(hasFragData); ++ii) + for (uint32_t ii = 0; ii < BX_COUNTOF(hasFragData); ++ii) { if (ii < maxRT) {