From 8982f8f2ec4a28e5b76a90bd6f21d02b56d8e80e Mon Sep 17 00:00:00 2001 From: Jakub Kuderski Date: Thu, 13 Feb 2020 00:58:44 -0500 Subject: [PATCH] Perform sampling before branching to discard This two fragment shaders that exhibit undefined behavior. In GLSL, it is undefined to use implicit or explicit derivatives in non-uniform control flow [1]. The SPIR-V produced by glslang contained similar undefined behavior, which results in incorrect codegen with the amdvlk's LLPC shader compiler, and produces visually incorrect image. This PR fixes this issue by hoisting the sampling so that it's executed before discarding. It's a simple fix and may not be the optimial way to resolve this issue. [1] https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf p. 137. --- data/shaders/parallaxmapping/parallax.frag | 8 ++++++-- .../shaders/parallaxmapping/parallax.frag.spv | Bin 8392 -> 8464 bytes data/shaders/subpasses/transparent.frag | 6 +++++- data/shaders/subpasses/transparent.frag.spv | Bin 1948 -> 2032 bytes 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/data/shaders/parallaxmapping/parallax.frag b/data/shaders/parallaxmapping/parallax.frag index 8460331c..566114c4 100644 --- a/data/shaders/parallaxmapping/parallax.frag +++ b/data/shaders/parallaxmapping/parallax.frag @@ -123,17 +123,21 @@ void main(void) break; } + // Perform sampling before (potentially) discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + vec3 normalHeightMapLod = textureLod(sNormalHeightMap, uv, 0.0).rgb; + vec3 color = texture(sColorMap, uv).rgb; + // Discard fragments at texture border if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { discard; } - vec3 N = normalize(textureLod(sNormalHeightMap, uv, 0.0).rgb * 2.0 - 1.0); + vec3 N = normalize(normalHeightMapLod * 2.0 - 1.0); vec3 L = normalize(inTangentLightPos - inTangentFragPos); vec3 R = reflect(-L, N); vec3 H = normalize(L + V); - vec3 color = texture(sColorMap, uv).rgb; vec3 ambient = 0.2 * color; vec3 diffuse = max(dot(L, N), 0.0) * color; vec3 specular = vec3(0.15) * pow(max(dot(N, H), 0.0), 32.0); diff --git a/data/shaders/parallaxmapping/parallax.frag.spv b/data/shaders/parallaxmapping/parallax.frag.spv index 2bfa7b1f620362c4926de6a7a92690c5ad95bace..f591ae65cabf39fcf8635b2d619b4490a92e1a7d 100644 GIT binary patch delta 2025 zcmZXV%WqXx6vp@M!&1{y3Mg;zmRA+<5fp?grA4q6dP|GeqT-{_+tQ>^f-pWI&W+@f z7)clsnUYQn2?Iwkkby%<7~DTVXNE@@@cUiPA~$$?cGvfPYn`>fz0c#`9r*b`XLHlW zwv-BK5r3yIcTN;aH!Ihg2isCdA*HkP=g&;e4OM1mPG2Zbo*SN@N~txqq;7Jj=I7?m zCwX()2_MPvUhr@ox1~~bUCWw1{V2!s>>=<_9k-;z;K?&5XDeqf)Vq$rr)H<8FaA)0 zx2ExhOD$c6LTTZ0>n}~&>tsE)G5;pwCb*LP72*fa^Zh0GeR%1m{1N!QKZpCG{tNik zUsv^Q=jwLqC*W!^qV5D5NAZzFfjjofuNa@XC+ z#}{t5-)SoEW0JK@(n)$fQEu5{c#U`*)t!%%y~>clbExqB1J>NEZoR-sH1ZzNLn9Ww%TUvZ_-QKCv6?&MGx|Q*C-Wz6nS2*m%@=w!e>rzo zcXX}DK14CQo6(VH_JBFlA%^)rT=+Rsj~PA!`#A`{5Bz}oAM+Xe;MS-|-~C|DdSCPO z&601riD)zcR?G6G9003D{$sFaI(X7t+Cea98e~{&Uc>!Fb8+1#VEYCi1pmz}=~C`^ z2*Dx~;rLT9XWg-R8~f=|k4D2_-`UvfGFa^h!+JkWYEgd_{K5$Hr%?n~bOj^6++$#i z)Lo_8F)(N9&GSWKH2jQ2qk+%iYF?v(5u#eu9|t?1JaY@bgt)3O@DT v>SOsXPJz`uLaXGO@^fuxO4GUMcYZYg{?DMBG)vi?6AV delta 1967 zcmZ9M&2Lpj7{=$^wv?Jykg8CMzy%brh#y?}5V%mjD-~KQ7Er(fw}u2H5m>M=C&oR& zToWS+OAJ{94oVR@Sy^C zroG_vS1w)os^o{@QFZY;@UAp5bEk7bmepo{?)ssU_mZ^@ zQMrb=6s{znN8C7<-@P6F2fX%NegyvT_tARPe+<9<<3N1_qkE`74p)mFb*Ip1&HMB3 zX6u_bdRC0PKh7n&(hEfQ*v{Q&J9nS$+stMB7tx>MzmNW>clWu~t7?i#pcI|6lB7L=*SQ#a;oc zEv4{ZCWwiQ|F9Dme--TFvta98FpMn*o7dO?(WWu=C3LmflvfH8&IS=%6nf2Z3d_Li zaSE@2)vDBKY;K~t7{->9cX7>H?}A}$1=zgCsyV=>GZQQ6Rk}we4r8mpE$Z5htwvLi z6I%mTixZ1^jA86`u#0Qj`i6_>WG&IA5sTiSt7%01EM)~&^JJD$`zClfQSMJ`2;L%| zfUP2KfLk-vZ1wi%Z-G?oHbaGelMDB+@HT=q{-wsszsEaZw-f!_vi4nc>&^F;weNxX z(tf)6I=k}8P{(0jEb>02HYXH(Gx#wBV&W}uYt&=ntzf=lV)IVy`=jpGHU9xvEid_Y zuv+AIWO*vw^l~;1*h!Kv9i&^lgYLxJh~{G8F0c~^-wl4mm~YCH7=~M;9)|aT`3l44 zowx2U&4d$qdHcYB6Xjmset3&G$;4jX0k}2lM|p}heGsf}w;8-b7x4WtA4Wd}tHt%^ zharkSi4O3AQi}l}f!lX_1n&KPk0GDhqhM>)Jw>%KFkf0%=Bvb*Z=6J%fjk{UP;`(6 zMu}=M;1jS52A>4`%7%dxU~AOFz)3J)VZeM99Jx=+oIl=^*%v9DLWtw|41An!k!B`{ zYO(lfuqPD!3|PZ)?`Of*s7KA`;ECqfixy9fmuGekWr}VK?R=>zhjyXVyv(uk-`hZQ Ty!GbYhED$?Hf9F;pY;6)nhBk< diff --git a/data/shaders/subpasses/transparent.frag b/data/shaders/subpasses/transparent.frag index c59cc995..ca860f55 100644 --- a/data/shaders/subpasses/transparent.frag +++ b/data/shaders/subpasses/transparent.frag @@ -21,10 +21,14 @@ void main () { // Sample depth from deferred depth buffer and discard if obscured float depth = subpassLoad(samplerPositionDepth).a; + + // Save the sampled texture color before discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + vec4 sampledColor = texture(samplerTexture, inUV); if ((depth != 0.0) && (linearDepth(gl_FragCoord.z) > depth)) { discard; }; - outColor = texture(samplerTexture, inUV); + outColor = sampledColor; } diff --git a/data/shaders/subpasses/transparent.frag.spv b/data/shaders/subpasses/transparent.frag.spv index c74278902180c7c247cab4bb79cbae67d4a29a3b..42fd097a2ae368a75eeb435100b7b2083feff75c 100644 GIT binary patch literal 2032 zcmYk6+fP$L5XKj1p$Kx3n@FN9D56{xcK6XA=6`G2!Yo^s%F zOO;|iSS=pZ-i*AST(oh`;tMd6aph>0d}sBzxgfc@mf6|e%4Ig!@W)NJxb-v2=C~~G zEJwnmWFO}D56Z=0t9n?fm8un6RJ7t7&G@Omkgb-hf#)Yr`QTacZS5#1hG*g2rONXc zK8_jem3P;J{9d+N4GJM2GifOY`5?b9Nw3VQdQ^+lh}pT7Dj~I@DRD;bhK0@fumLt_ z85CIFhKu?~tvB>@hG;xC@!SpjIScdh`#DRC&@SMoXZ$Q|?%CU2%0ix$z3nh(uk=Q7 zNsE|$3%m!ol=df_4mT|dd%MG$$M>h4pP76+Ia%^HGco2k+pjlyMH)FkbkP?p zsT@hG85_Ik?3CkrWDnW6a0c{%ebxE=rGhZ(cj^HWS*l33=++eBhB=R)_-cik%Re93Ctdw`OXT=_NB`?C!H90_R|v_@#J3+$oX0E+{2>dxQ8E# zUy@|~Ry@9Y0vu;Y&uHI@WLDsAGJ?;&>Uip=rDHF+bFE3|JDe7L{JL~{`Qm!nkWL)@ zFV*vPk>53G`h6hK7xzFsJ<<0gNfvz*^H6}JZ}dO9RdhJ&GyhG2`Oq)#1pBYz<^}Gb zdC@Z~AIKQV$I`Mpy zJl7)~p6}9om#5d+#QFMt(#hv*U5v!|T>avR!{_5JNhcq^PcHv}bn4>!r*mU7qyIyo Bi7x;E delta 823 zcmYL{IZFdk6ov03nZ$(<1VL=XXd&Vf_dUTFO-+{uYh!IGSZHP8 z|FIDlEIi+21|J;mJ?EWw-+g!HJ$08#MkB)sGshCvVU^otB{^$md0|H=-=4i>5l+u* z#YX+K;CYP`QFAS3bBb5>M*YI)u7Ak8xh{C;UZd@a+g2;<^z~5c?DFuat;Vd}x_4?- z>UIk$p`?0TIv}v%TZ%(I`{!x#NU%>;{7%5jkJU)QY4*x6E@@09;);_3YfyYf5&MX+ z8gSY`!#}DxFK`9^1x5C#17BB+3gLNpKG6ED(>Ban57Bh9AWgY{W>b-c#+`7U#_AI< zDN;YYb6YugqT`42R5bkiiumb+o(>e*L&q;3(S+Y(i*7>FT&u^eG&wLKFs~%HUXz1U%Fua)fp`Vk6*901K1^hHc<2gkZjpNA*Xf#g#YbD1gh%~^bC<=TA bIHTSb81u2pk0|a5c+h!O9_{fpo^k#FndL{}