From b52cc77a1485e4356935067c1845fe13fad4326c Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 5 Jan 2013 22:34:31 -0800 Subject: [PATCH] Reorganized opcode type and location bits in constant buffer opcode. --- examples/06-bump/fs_bump.sc | 19 +++-- examples/06-bump/varying.def.sc | 5 +- examples/06-bump/vs_bump.sc | 16 +++-- examples/runtime/shaders/dx11/fs_bump.bin | Bin 4272 -> 4480 bytes examples/runtime/shaders/dx11/fs_callback.bin | Bin 1026 -> 1026 bytes examples/runtime/shaders/dx11/fs_cubes.bin | Bin 494 -> 494 bytes .../runtime/shaders/dx11/fs_instancing.bin | Bin 494 -> 494 bytes examples/runtime/shaders/dx11/fs_mesh.bin | Bin 2275 -> 2275 bytes .../runtime/shaders/dx11/fs_metaballs.bin | Bin 898 -> 898 bytes .../runtime/shaders/dx11/fs_raymarching.bin | Bin 10703 -> 10703 bytes examples/runtime/shaders/dx11/vs_bump.bin | Bin 2672 -> 2724 bytes examples/runtime/shaders/dx11/vs_callback.bin | Bin 1278 -> 1278 bytes examples/runtime/shaders/dx11/vs_cubes.bin | Bin 1076 -> 1076 bytes .../runtime/shaders/dx11/vs_instancing.bin | Bin 1403 -> 1403 bytes examples/runtime/shaders/dx11/vs_mesh.bin | Bin 2047 -> 2047 bytes .../runtime/shaders/dx11/vs_metaballs.bin | Bin 1290 -> 1290 bytes .../runtime/shaders/dx11/vs_raymarching.bin | Bin 1184 -> 1184 bytes examples/runtime/shaders/dx9/fs_bump.bin | Bin 2207 -> 2207 bytes examples/runtime/shaders/dx9/fs_callback.bin | Bin 553 -> 553 bytes examples/runtime/shaders/dx9/fs_cubes.bin | Bin 137 -> 137 bytes .../runtime/shaders/dx9/fs_instancing.bin | Bin 137 -> 137 bytes examples/runtime/shaders/dx9/fs_mesh.bin | Bin 1278 -> 1278 bytes examples/runtime/shaders/dx9/fs_metaballs.bin | Bin 481 -> 481 bytes .../runtime/shaders/dx9/fs_raymarching.bin | Bin 47430 -> 47430 bytes examples/runtime/shaders/dx9/vs_bump.bin | Bin 1059 -> 1083 bytes examples/runtime/shaders/dx9/vs_callback.bin | Bin 445 -> 445 bytes examples/runtime/shaders/dx9/vs_cubes.bin | Bin 319 -> 319 bytes .../runtime/shaders/dx9/vs_instancing.bin | Bin 474 -> 474 bytes examples/runtime/shaders/dx9/vs_mesh.bin | Bin 982 -> 982 bytes examples/runtime/shaders/dx9/vs_metaballs.bin | Bin 441 -> 441 bytes .../runtime/shaders/dx9/vs_raymarching.bin | Bin 355 -> 355 bytes examples/runtime/shaders/gles/fs_bump.bin | Bin 4133 -> 4203 bytes examples/runtime/shaders/gles/fs_callback.bin | Bin 484 -> 484 bytes examples/runtime/shaders/gles/fs_cubes.bin | Bin 130 -> 130 bytes .../runtime/shaders/gles/fs_instancing.bin | Bin 130 -> 130 bytes examples/runtime/shaders/gles/fs_mesh.bin | Bin 1256 -> 1256 bytes .../runtime/shaders/gles/fs_metaballs.bin | Bin 366 -> 366 bytes .../runtime/shaders/gles/fs_raymarching.bin | Bin 9570 -> 9570 bytes examples/runtime/shaders/gles/vs_bump.bin | Bin 1613 -> 1730 bytes examples/runtime/shaders/gles/vs_callback.bin | Bin 468 -> 468 bytes examples/runtime/shaders/gles/vs_cubes.bin | Bin 320 -> 320 bytes .../runtime/shaders/gles/vs_instancing.bin | Bin 566 -> 566 bytes examples/runtime/shaders/gles/vs_mesh.bin | Bin 1352 -> 1352 bytes .../runtime/shaders/gles/vs_metaballs.bin | Bin 493 -> 493 bytes .../runtime/shaders/gles/vs_raymarching.bin | Bin 403 -> 403 bytes examples/runtime/shaders/glsl/fs_bump.bin | Bin 4094 -> 4164 bytes examples/runtime/shaders/glsl/fs_callback.bin | Bin 445 -> 445 bytes examples/runtime/shaders/glsl/fs_cubes.bin | Bin 91 -> 91 bytes .../runtime/shaders/glsl/fs_instancing.bin | Bin 91 -> 91 bytes examples/runtime/shaders/glsl/fs_mesh.bin | Bin 1217 -> 1217 bytes .../runtime/shaders/glsl/fs_metaballs.bin | Bin 327 -> 327 bytes .../runtime/shaders/glsl/fs_raymarching.bin | Bin 9531 -> 9531 bytes examples/runtime/shaders/glsl/vs_bump.bin | Bin 1574 -> 1691 bytes examples/runtime/shaders/glsl/vs_callback.bin | Bin 429 -> 429 bytes examples/runtime/shaders/glsl/vs_cubes.bin | Bin 281 -> 281 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 527 -> 527 bytes examples/runtime/shaders/glsl/vs_mesh.bin | Bin 1313 -> 1313 bytes .../runtime/shaders/glsl/vs_metaballs.bin | Bin 454 -> 454 bytes .../runtime/shaders/glsl/vs_raymarching.bin | Bin 364 -> 364 bytes src/bgfx.cpp | 68 ++++++++++-------- src/bgfx_p.h | 32 +++++++-- src/bgfx_shader.sh | 30 ++++++++ src/fs_clear_dx11.bin.h | 2 +- src/fs_debugfont_dx11.bin.h | 2 +- src/fs_debugfont_dx9.bin.h | 2 +- src/fs_debugfont_glsl.bin.h | 2 +- src/renderer_d3d11.cpp | 4 +- src/vertexdecl.cpp | 4 +- src/vs_clear_dx11.bin.h | 2 +- src/vs_debugfont_dx11.bin.h | 2 +- src/vs_debugfont_dx9.bin.h | 2 +- src/vs_debugfont_glsl.bin.h | 2 +- tools/bin/geometryc.exe | Bin 174592 -> 175616 bytes tools/bin/shaderc.exe | Bin 1084416 -> 1084416 bytes tools/shaderc/shaderc.cpp | 12 ++-- 75 files changed, 136 insertions(+), 70 deletions(-) diff --git a/examples/06-bump/fs_bump.sc b/examples/06-bump/fs_bump.sc index 6d1332dd2..4322265dd 100644 --- a/examples/06-bump/fs_bump.sc +++ b/examples/06-bump/fs_bump.sc @@ -1,4 +1,4 @@ -$input v_wpos, v_view, v_normal, v_tangent, v_texcoord0 +$input v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0 /* * Copyright 2011-2012 Branimir Karadzic. All rights reserved. @@ -64,15 +64,20 @@ vec3 calcLight(int _idx, mat3 _tbn, vec3 _wpos, vec3 _normal, vec3 _view) void main() { - mat3 tbn = mat3(v_tangent, cross(v_normal, v_tangent), v_normal); + mat3 tbn = mat3( + normalize(v_tangent), + normalize(v_bitangent), + normalize(v_normal) + ); - vec3 normal = normalize(2.0*texture2D(u_texNormal, v_texcoord0).xyz-1.0); + vec3 normal = normalize(texture2D(u_texNormal, v_texcoord0).xyz * 2.0 - 1.0); + vec3 view = -normalize(v_view); vec3 lightColor; - lightColor = calcLight(0, tbn, v_wpos, normal, v_view); - lightColor += calcLight(1, tbn, v_wpos, normal, v_view); - lightColor += calcLight(2, tbn, v_wpos, normal, v_view); - lightColor += calcLight(3, tbn, v_wpos, normal, v_view); + lightColor = calcLight(0, tbn, v_wpos, normal, view); + lightColor += calcLight(1, tbn, v_wpos, normal, view); + lightColor += calcLight(2, tbn, v_wpos, normal, view); + lightColor += calcLight(3, tbn, v_wpos, normal, view); vec4 color = toLinear(texture2D(u_texColor, v_texcoord0) ); diff --git a/examples/06-bump/varying.def.sc b/examples/06-bump/varying.def.sc index 2913d9a62..41b31c031 100644 --- a/examples/06-bump/varying.def.sc +++ b/examples/06-bump/varying.def.sc @@ -3,10 +3,11 @@ vec3 v_wpos : TEXCOORD1 = vec3(0.0, 0.0, 0.0); vec3 v_view : TEXCOORD2 = vec3(0.0, 0.0, 0.0); vec3 v_normal : NORMAL = vec3(0.0, 0.0, 1.0); vec3 v_tangent : TANGENT = vec3(1.0, 0.0, 0.0); +vec3 v_bitangent : BINORMAL = vec3(0.0, 1.0, 0.0); vec3 a_position : POSITION; -vec3 a_normal : NORMAL; -vec3 a_tangent : TANGENT; +vec4 a_normal : NORMAL; +vec4 a_tangent : TANGENT; vec2 a_texcoord0 : TEXCOORD0; vec4 i_data0 : TEXCOORD4; vec4 i_data1 : TEXCOORD5; diff --git a/examples/06-bump/vs_bump.sc b/examples/06-bump/vs_bump.sc index 48aceee5b..e0c99518b 100644 --- a/examples/06-bump/vs_bump.sc +++ b/examples/06-bump/vs_bump.sc @@ -1,5 +1,5 @@ $input a_position, a_normal, a_tangent, a_texcoord0, i_data0, i_data1, i_data2, i_data3 -$output v_wpos, v_view, v_normal, v_tangent, v_texcoord0 +$output v_wpos, v_view, v_normal, v_tangent, v_bitangent, v_texcoord0 /* * Copyright 2011-2012 Branimir Karadzic. All rights reserved. @@ -19,23 +19,25 @@ void main() vec3 wpos = instMul(model, vec4(a_position, 1.0) ).xyz; gl_Position = mul(u_viewProj, vec4(wpos, 1.0) ); - vec3 normal = a_normal * 2.0f - 1.0f; - vec3 wnormal = instMul(model, vec4(normal, 0.0) ).xyz; + vec4 normal = a_normal * 2.0f - 1.0f; + vec3 wnormal = instMul(model, vec4(normal.xyz, 0.0) ).xyz; - vec3 tangent = a_tangent * 2.0f - 1.0f; + vec4 tangent = a_tangent * 2.0f - 1.0f; vec3 wtangent = instMul(model, vec4(tangent.xyz, 0.0) ).xyz; vec3 viewNormal = normalize(mul(u_view, vec4(wnormal, 0.0) ).xyz); vec3 viewTangent = normalize(mul(u_view, vec4(wtangent, 0.0) ).xyz); - mat3 tbn = mat3(viewTangent, cross(viewNormal, viewTangent), viewNormal); + vec3 viewBitangent = cross(viewNormal, viewTangent) * a_tangent.w; + mat3 tbn = mat3(viewTangent, viewBitangent, viewNormal); v_wpos = wpos; - vec3 view = -mul(u_view, vec4(wpos, 1.0) ).xyz; - v_view = mul(tbn, view); + vec3 view = mul(u_view, vec4(wpos, 0.0) ).xyz; + v_view = instMul(view, tbn); v_normal = viewNormal; v_tangent = viewTangent; + v_bitangent = viewBitangent; v_texcoord0 = a_texcoord0; } diff --git a/examples/runtime/shaders/dx11/fs_bump.bin b/examples/runtime/shaders/dx11/fs_bump.bin index 453e9aed7ab9b42c83f229e089074b0360bbaf73..d71e5a5f4ada89625a1f84a027539db148f57064 100644 GIT binary patch delta 1125 zcma)5&ubG=5T4y^b~kB$Y*vbgXq#9?#e*7qNKwK3Y$It>lc+rig=$O%?I9=>L{f^! z9xM;^r2jxJ(R%112QPw$f|niz#jBuDM0zUD_p)1;h~R_Sc{|_CH{Z;%z2xeIS**_} zQy*S^-7t?|8`a(^8d;AP?%!)IJ*>4BOUuj6c5PH6RinvRemQ^3?5i#ThLfTnQ0fVTLiEc%a=q-?l7Cy2viYcZk6qaWraj z&)tN@H=-rhXNW!RwxVy|^1o2n{nV$G07MmSE)wUA_|-O9atz(^65$NyFl>IxY;}bWj31z$iK9p+nBU=&)7Psp3)~Zi5lK{lh3WB8L(z z2~n4$Kor>JOe~>@#fTkqLea&Z`PeU|ihd;C!7v9rYYBcMO0uO{9r^&rBIH2a0q^c2 zB(rA`3`q=AxtKeZi)B3+s}*)I$(kmEImIVdf;Yq9=Sf#H>~--eI6n9|=q%>K7h-?u z5i=tnXKfFw+?7Y^u$rO=8&X3O6TL`04E?+VQ|>^lhfcD-x1rXMzEk1<(KjwO!##1< v4CI|*bPM?-Gmu5=dfOb?Q(ZIyOynZNTJe611Q+P+L<$3Whp~B&gjw zSU#yDPEv5tq0+U3ql4n=C{9iab#e6lzPqoK3epGf-tqgr@4eseyXz0{6ytt#mP9Ih zax*@1b=~-&8RXq>-@VgWS!;9_tE;Qa-Nw2>xSg=&+UL3a*S*Ob z8WA%@CfCcHxfszm&LM;7hx`8FPknTc;Q`J#=L=2*j&YX^m!I3>Y3x+*ZG@nJ)j2JT zXcs^fz-96SIC>DkcqehY#IXSZ9O5vid96JcG^?#@P^Ws(sFkizt5lz<)LYc5%$Lm| zXiSp`jETgjB+(?F`mKviS2{FY@FxO=cV$Yw6xS_CjoG78VEyiFBJ(%t5UcbZ@=P>`A zny<@QXAhQFi0pkPaYH`Lh;4gVGsH*xftkS}vEgQ=+yOP>QGt7jikwOwR)U8FUM(eH zEhfmxY)e_@7DhwMio-crRvhF?E|e?2CyK1eNR~BS%qFip(qbmGXo`2qyd9Zly@kO` z>3{Ty)2T1DBUAsY^sozjoWn{bC;D#I0m^p}$7j&RP3HpZd*XDC==}ZAvV=UWzmpM?S#l$PO$IqPiE4{#H@lzsDYa*9k`U}W4aQ^@R diff --git a/examples/runtime/shaders/dx11/fs_callback.bin b/examples/runtime/shaders/dx11/fs_callback.bin index 44d8ee50c3848f3feafe18240d780371bf9b1ff0..a4795f16a1decd9dfbf1dbf916e85157307b6574 100644 GIT binary patch delta 13 UcmZqTXyRaT3-(~#$nuXF02m4bu>b%7 delta 13 UcmZqTXyRaT3-(~x$nuXF02l=WumAu6 diff --git a/examples/runtime/shaders/dx11/fs_cubes.bin b/examples/runtime/shaders/dx11/fs_cubes.bin index edb799f9263fc5676f7f727516c8ed0cb8da1f95..ff7b025e232f9a6d5d675b05d939783ef2c821cb 100644 GIT binary patch delta 13 UcmaFI{EnH$E!cx`Bg-pB03nhDX#fBK delta 13 UcmaFI{EnH$E!cx$Bg-pB03nS8XaE2J diff --git a/examples/runtime/shaders/dx11/fs_instancing.bin b/examples/runtime/shaders/dx11/fs_instancing.bin index edb799f9263fc5676f7f727516c8ed0cb8da1f95..ff7b025e232f9a6d5d675b05d939783ef2c821cb 100644 GIT binary patch delta 13 UcmaFI{EnH$E!cx`Bg-pB03nhDX#fBK delta 13 UcmaFI{EnH$E!cx$Bg-pB03nS8XaE2J diff --git a/examples/runtime/shaders/dx11/fs_mesh.bin b/examples/runtime/shaders/dx11/fs_mesh.bin index f4a8c6257e731d0432030a9a85d9c560f037379f..c36a5e0934cf0a757e62c20f328eff90e3deb32f 100644 GIT binary patch delta 44 ucmaDX_*hWcE!cx`>Ri{~4F7=;2>ydf21bSpjBKUxC7HRYA{&(tZ~y>Tcn)U( delta 44 ucmaDX_*hWcE!cx$>Ri{~4F7=;2>ydf21bSpjBKUxC7HRYEgO{&Z~y>VgbvmK diff --git a/examples/runtime/shaders/dx11/fs_metaballs.bin b/examples/runtime/shaders/dx11/fs_metaballs.bin index cbd93d7ad0003b5cd9e944f1410bf45e58c92d0c..d0fb3435d29b40fd37e89f00f87bd582e0425555 100644 GIT binary patch delta 13 UcmZo-Z(?V03-(~#$Wq4)02cHEF8}}l delta 13 UcmZo-Z(?V03-(~x$Wq4)02c29E&u=k diff --git a/examples/runtime/shaders/dx11/fs_raymarching.bin b/examples/runtime/shaders/dx11/fs_raymarching.bin index ee9f53def406ac7801191192804cb7906711bfa9..c90845ec2e31496c816fa7e750157d048de56612 100644 GIT binary patch delta 60 zcmX>fd_LINE!cyRvH83k8SWDw`ODZH8E-=9j5XS%j delta 60 zcmX>fd_LINE!cyBvH83k8SWDw`ODZ}UE-=ig5vBkD diff --git a/examples/runtime/shaders/dx11/vs_bump.bin b/examples/runtime/shaders/dx11/vs_bump.bin index 942b71635574e3e89a1d8cfad5bcb50630a90088..c11d3d7a0ce3922b07e39267760f25b3ba8090c5 100644 GIT binary patch delta 625 zcmYk3yGz4R6vj`|)`U<@kQNug7Yd?Kd>|B5n!XFQktUQ5f{S7YMQ8;l=^x-EcX4tM z!J$jFi-W7+An4#&P#l~b#KGC~wYks(C+G6}&bjwHz@&++Wr;8Sw26(OBlxS0_{QW6DojI54ruaysZ9-N@=a(P{C8c? a_Kx{H&xxfG_{|X_F>J(@keD=P+2B9gR7|b_ delta 543 zcmZ1?`ay&vEZBo#GLN*_L=Hn^6E2qsC+A<13=6g{(hRGz-nmo!>oYe-1_lNbE(Qix z5Dmn4fC3ko7#OB7GcfGfm~)}DF7PFzz!7OJh^~LB!vgafC>UBumTpC0w4`C6$C&UL5>4y z3=WGA@DKJ3@$~m&@beGyb@X8farAR{^$TGLagA{H_YZPm2=;IZk^wr=0cb+|Bo=+f zqR9p<`Lad|0$`(3fhHCK*&wT6Y}U;uSjw3=&43nxq!>4wu%|Ps!nhz;yDf&Mv3-(~#$il`702hb?-v9sr delta 13 UcmeC;>f&Mv3-(~x$il`702hM--T(jq diff --git a/examples/runtime/shaders/dx11/vs_raymarching.bin b/examples/runtime/shaders/dx11/vs_raymarching.bin index 0e3c8e2a5acb3a43f51c8facb494df5be786f07b..2c6721fd9ca0e3a17c004fa6f7f6d41f11bdf030 100644 GIT binary patch delta 13 UcmZ3$xqy=;EZBo_Bg-5X02-|Wo&W#< delta 13 UcmZ3$xqy=;EZBo#Bg-5X02-(Rod5s; diff --git a/examples/runtime/shaders/dx9/fs_bump.bin b/examples/runtime/shaders/dx9/fs_bump.bin index ed302f554ec6b8b0b98f58fbe03e5d6f0951eed0..90b1d78f2cb380e6054ff25cd4dc4a37a1786a28 100644 GIT binary patch delta 591 zcmZuuEl&eM5S`iGyDfr12^FXcaL5Y+ML-Y`B&4K4AR0cJ(m>jT(jd8iK*$#q1^fcubhkYO>Sp%6dGF2Kuskd$yGMJx`S$XyXtCe8ZnrLP54*kE=|#KW zs~93Pd#<(4_B);CO|9~pT=9k_N{Q^CN~APu4t0!Lg*rm5Nl!QtacbO{PuRFs^>n|6 zIq<;E2PGn{fun{_o(g7w(F{|m`GZBkzzcIGjRLj<9i|0%<^wL}ndC>Vi6%U<64f)& zj>#@fACX<9F$A-aY0tsQ zg2S+7TE@4I__Dsl9LXw~^i1=@fz!K5aI!|cb@2B@{$#~jd|#ZxXJ^0J%ulu^@8=$( jXVz{#_UhY7aekRqVHf!wzW+zt-9=UR6MsNwY(IYiI!1mK delta 585 zcmbV|yGjF55Qb;YIeQTljffzEX>7#8VxK?@QEX%-SXcxvAqFJ@V``5@Y9ptxu*lYS zK82(blE%(v-@q5}pFO!$HWtgyKbLRjKmAg_l+FfC#~cyXS|4DKpw z=-tR-s$`p3BH+mZkQOkj+^KG@DPPHed=@;D5ge-Dx;*ErZ%~oBtcg9bB6aBv&?{DE z+MhPjJl+(bU#v2%;9s#~bwWlh6V0?BJ=pYV5N1+m!X Xo`P3aZaW;alYg+?DEtBABl`LU(-3}~ diff --git a/examples/runtime/shaders/dx9/fs_callback.bin b/examples/runtime/shaders/dx9/fs_callback.bin index 3fbd98eb94f6303940f738eae824b33747aa0a5c..5836660d80a94bdb788308f645d8cdec059c20c5 100644 GIT binary patch delta 13 UcmZ3||td3-(}~$kGY`6OIEF delta 12 TcmeBV>||td3-(}`$kGY`6N&>A diff --git a/examples/runtime/shaders/dx9/fs_instancing.bin b/examples/runtime/shaders/dx9/fs_instancing.bin index d4f476822dad1ebffe91a0e61b8f34dab16c828d..12083ac90b6f0dbcca7b1f4bdaaad6a275a07d57 100644 GIT binary patch delta 12 TcmeBV>||td3-(}~$kGY`6OIEF delta 12 TcmeBV>||td3-(}`$kGY`6N&>A diff --git a/examples/runtime/shaders/dx9/fs_mesh.bin b/examples/runtime/shaders/dx9/fs_mesh.bin index f15a9d3aec774b054ed6f25e2fd722e4b89c7af0..fa850797118c0c8b7971b5189e047615c204fced 100644 GIT binary patch delta 27 jcmeyz`Hxe`E!cx`>Ri{~j0|k0@gRi{~j0|k0@gz>% diff --git a/examples/runtime/shaders/dx9/fs_raymarching.bin b/examples/runtime/shaders/dx9/fs_raymarching.bin index 277fbcf17ddc98f03a635412a5447613544ff15c..eae33f49b391306c5c0c9518ab668108b91c8acb 100644 GIT binary patch delta 45 zcmX^1iRsuUCMCCE4@So3PY;b4w~DH!7*@1ORzr B4*mcD delta 45 zcmX^1iRsuUCMCCE4+h5OPY;b4w~ZH!7*@1OS5H B58VI& diff --git a/examples/runtime/shaders/dx9/vs_bump.bin b/examples/runtime/shaders/dx9/vs_bump.bin index bef532399fca298026c94be94a1631c975330da7..c5007f67407c5d229d895b92601b0cf927808c42 100644 GIT binary patch literal 1083 zcmZ`%v5wO~5Pe?TSq_Tu0Z62v;F^fsi6R|v6juZZ2%$oX5F8K$1m)mpeShFDKrT|< zeFQDEe1V1h3Djra+qD-Hlq8#-nVos_=IuV69!BHuUw;|&KF?1UM_+cL1Tijq=izGk zb|(T7TxIm4zNmL`@Z|2jYXClQDQ39I$0_id+kGy>ikSO^OP^<4%1gM~nD2n|n3)N` zY~wzEJLBYdzCXW(2a6Z0r@_s~yMx2YbTXK}dH(WfH8@zl|G0QZV?5j&568Fn zhWn$@2IlSPCfa% zLSGo`Ji?m0V#+yVeU$^h*%xfDSVf*KPM`ivxP@w{gU$;;np6%)G2>!qF6MFirOso< zH~2I-mbIHWR$PefaWs==6Q7nZ`{WiVEM^XuT4mejG+X8rpH7|QBYmh%0Z9LK=-2X* zJ~zn6*HzgiVo>{%e1Z;*cK`6>{cYtJclvbiLHs&(|MBbAZSwPV74IGHE)9P04t|Dt zV)}+YH9eKSdS9BM&6m~&b?)agrF`9^a`~p5@6VEwcN@<1X1x!icS<|2YXE-$5s=Iy literal 1059 zcmaJ=yG|QH6g@Mu>opI_9ZitpA_X)S22r@adN!N>$?*MG1QKd^-> z_=wcBe8Cp;2`Q*>&Yjt{Hz;D|@t%8T?wND0<%7-+?&m)&XjE>xx4o0Q83hEG^~Kjg z|6)c3Bwh^6>-crNjP1S6twjKrT*7I-q{a|9)>96|I?s9#n-D%f5=iiS{2KDX!&#T@Kf>vX-)o87+HrATW zCLX^5VHLHMf*U~m+X?gQBW)NGKrInWDponJ5bGR=#AbqnIGErt4kx%0S0*@$qa2GS z^|RtGg~(yA@3Gf6jt`-!U+{|hQN~%&TSRX*;aNisYVLE-CY&KZbF9I>QKB&7TR1uM zKuMkk_& zsg7ilY~rWzCYq+C!ShKKNUPX)_h|Z8rQC|SsY9QmMCZ9>HY(4pm|Of6eN%rjuTd(! zA?h08TZ*|hkhJn%P6@uo??S% v&O?5;i1>-zGxOM?%$s>!2A@Y~GH=P_>mcLoT`gzX?`pyPPYO=PV*q~vnk&b2 diff --git a/examples/runtime/shaders/dx9/vs_callback.bin b/examples/runtime/shaders/dx9/vs_callback.bin index 35c5a9ce05f954bb01c1cfbe0809ab82a50b0994..f88255362f6e7fce98e87d2fd56ca047c0c152de 100644 GIT binary patch delta 13 UcmdnXyqB3JEZBo_Bg;-k038?u<^TWy delta 13 UcmdnXyqB3JEZBo#Bg;-k038zpTcQ+i%lS{0c`^dj0^v%WdPJ_46;qwkQ{a=Vkel{88F;e5vz84OiB0x z1Lpoy_{i>=@|eA*K^=AISn;-19n7^8Z9C;z8p+D&xWe)-oCJaZ1*wi@it-0m{cr42 z4M*pfSN4{PQ8;9`jN{^kh^!D1Lfi)SD(O-9b7E^wj5$a^lGJb#KFZLy`Vq^hl1Y}X zHfflQ$%DRy1CK<^2LeoS%&KG}BPJ8r?v`g3?C6={bNIWgf>lwmKvyijG0!X>4%waY z>|}PLV(8#x6QD5G$nZv1>V}1=7sa)o$W$hx2$|B-4IwCVQ#g~1DxF%m9-CPXW^iC9 zFY4r{Ca^HenOpPbqcdi9IGm4Oj7yW)6e|k?5P$^DjA3&xhFGp1k4(_mjBu!}5kWXQ zpWq(l5L7Z%Cf9(%%Ljzo)qZEvuMWb)(JPDsSrkyLN;zXc-^+SaYMuiu%ZHFV0_Eh> z!;oLWkV}Cn6gUaY0}&n^5V_Jz!bvOrC~{s`fb(t`$$JAM7aolm>cx@UQsh#Lrp{eJ zQXcfc93r_CqnS3wy1JR3W^`U?N+OOg{d8G;JmF=`}Q`G69b) z1hfI3cCpFFy>N1@t%FWm=bVJ@(9I>oq~PV(N+DJCAB80y_Sg)LDbCE7Aw5AIpL?dVx-L2GY@K&eq62 zTO*vUn5^Rq+bez|IHX^5Tq0YaPU!PH>5Ob$M*Iq$FzBXpZqo^?E;{GEbkf@Dy|eB* zB3tqiNxt3d%9jbZ)ul&+^2V%8565klL{j|q7uk;9vwd-@Tee8hAiUsJ1Pv0JFY`~O z)Xb%>M?V@&l1y*5$-8p7k%?&Efkaw*L-zxKoB!aDx>X~x=8a4D$#&24w8eW>og~_& z7wJiLTadzA)2{|-i|L!bM6!uBon8X?>BD|PWKWs8FX{=4^YU_7G(R$~y0!xINJYL7 zS|56sL(^t>IW$f-8CqRip#|P=>nJ=LM*wHCl$N^wdBn~cw y6Z&V5Sb1icxi~ZM?xu-#rZ>=rqj*ezlym#eWjG#DP{)mjF%0V9i^12y;D>MAm+LS9 literal 4133 zcma)5S5Qg_`<(x|{E$sz16NYZ^m#oPp$!;P=Q8as8jgT|OUL+eFj6b9Niu~cc z)gREfF&>XJ#!y{VUH!b>#mCRTzWeW+@4kJXEf?vMefmB54NCoO%A>p8>;l6|riwg?++jxM8lpgfHyL z_Gmrg^vLrLiE zJWm86T%#h@zD!Yn&su;7yHnZ87e zrHfS>CNX)?mvGUBG(hmbb~;E+!jhUC4$kaLGa-0B69+alyrg}ThV z3q{IU30{Q3;mN4k# z65(uyMqOm`xED>1nRT#f>zk9nT{gu%Hl@}zo0Bd!;i1i@l4`=I_t_lR;^gCQHp#oi z=EP-l($A)_1uCRK4P>2cA`gd6VIQ!96xz+EsQ2iaP0>06h0SK$t8m#wwho&D>U`6N zDQr!O=nk7O=wuV&EH+`)v1_6recPtM%v?5wEq6h3ciD{YuqmYO6`O*NV`txlhZdVc z2{sXQT=wsqBCgpKaW|Xfyth(5o^s|YX)oj+iMr6x9 zBDr68sq#Ib-K5gOptvzB)7^euC6N?<{X@2(Pi$Kp>ozUobQ50i7J+UU4VU?+QfkIh zx1$#ZgCx_DKi#4A zd3QTB?Sws{r#iI!z79R@4XwAc+o1{c+o7>%$yuxKtI%SkL(>8^;LwW`f!U&kXhPfU v04om+GZqI1-kCJ8t>F!`VGs}Lk8-}gY9ky46tv~Wp%?~r@Y&$s!QkEh?S;|K diff --git a/examples/runtime/shaders/gles/fs_callback.bin b/examples/runtime/shaders/gles/fs_callback.bin index 396f76fcc7cc04b7a5d1a8e1dd68eebeda4b21bc..3a8d06cffdc8c715283a7b5a5663e2423b1eab10 100644 GIT binary patch delta 13 UcmaFD{DhgsE!cx`Bg+Fu03eP8O8@`> delta 13 UcmaFD{DhgsE!cx$Bg+Fu03eA3N&o-= diff --git a/examples/runtime/shaders/gles/fs_cubes.bin b/examples/runtime/shaders/gles/fs_cubes.bin index 55250fc553c08deb3f287627ab1aed2b0f3e2ea7..26f66eb3825ad75c2de747be5469d68517a368fe 100644 GIT binary patch delta 12 TcmZo-Y+___3-(}~$WjLY672&3 delta 12 TcmZo-Y+___3-(}`$WjLY66pf} diff --git a/examples/runtime/shaders/gles/fs_instancing.bin b/examples/runtime/shaders/gles/fs_instancing.bin index 55250fc553c08deb3f287627ab1aed2b0f3e2ea7..26f66eb3825ad75c2de747be5469d68517a368fe 100644 GIT binary patch delta 12 TcmZo-Y+___3-(}~$WjLY672&3 delta 12 TcmZo-Y+___3-(}`$WjLY66pf} diff --git a/examples/runtime/shaders/gles/fs_mesh.bin b/examples/runtime/shaders/gles/fs_mesh.bin index 9b50e8857493d2531a00f6502d70a924d9bda165..54b76c868bdbaacc347a5f0be1b1d05eee980abf 100644 GIT binary patch delta 13 UcmaFC`GS+hE!cx`Bg+#O03m$@W&i*H delta 13 UcmaFC`GS+hE!cx$Bg+#O03mn;WdHyG diff --git a/examples/runtime/shaders/gles/fs_metaballs.bin b/examples/runtime/shaders/gles/fs_metaballs.bin index 03a036aeb469e325a819aabb9371d7f8c419dda2..011c0c763cbebae7dc6ae8188d3c923ce799e903 100644 GIT binary patch delta 13 UcmaFI^p1(eE!cx`BTE(|03dt==Kufz delta 13 UcmaFI^p1(eE!cx$BTE(|03de*<^TWy diff --git a/examples/runtime/shaders/gles/fs_raymarching.bin b/examples/runtime/shaders/gles/fs_raymarching.bin index 6add4db1f3a9c92f87a1b5022dcf4f34e703af2c..974c89e5488e0e85986a712e6c19444466d50eb3 100644 GIT binary patch delta 13 UcmaFl^~j6GE!cx`BTJkr0410NcK`qY delta 13 UcmaFl^~j6GE!cx$BTJkr040+Ib^rhX diff --git a/examples/runtime/shaders/gles/vs_bump.bin b/examples/runtime/shaders/gles/vs_bump.bin index 7c05a1329be2ee70d62228e05aad09907ab07454..b1f67c2928fcd8936472d4c9cac8d8523923e6c1 100644 GIT binary patch delta 328 zcmX@hbBLECEZBq5^2EGH6FII)lqD8bX6B_Ul%*ycE0o12WtJr7rKjeVOuW<0Xfip2 z(S*@t^IXQ=j4XN;l~t1?m;=F#%`2I;80EowN^%Q;X2csBT5~BVz&Q%G3L29ISRM5g zv=kEKp=RopYl0NzCYBh(RT?2{Gn)L4MOxM<+AtQVA8r<^ia1u26k}u|W4&^qY6Cq3 zR6(F~5r%*@l*N~2rh?RJXp};jT5wB@H9`IZIu>TD(d3`3=A!W6Kp16cI9ZEL82~KT BX_Wu~ delta 272 zcmX@adzObIEZBo#GLN*_M2>5d1sFvq^D>sO7%L>kPkb*nc{Zaoqw(hLjJp{pmoW!! zKFzGfXq%f@VysY-TTqr*6mMu~&82|gL>t5^*uuF6sB(rNxyd4|j=U)1lXtV4)EglS z8R?Y+RT}D{=r_`DHZ!{ zU9A4DA6B3L*lzRc;Zyo}*J<%rxqDbFi~Y{C*ey2C>%5}h;i%3}f5Pu#-8wk?`L}Xi zR(FHLqIxN|D-IwLhwS)V?t+JhB0qW$36@ZJD$8mad%v)cda+&Q+d6o@H36MTelFSp zWw8{SMX?ppaPVy)a9<~)-aKPSChzdT-hYZ8#l6rTi`P7AREM6GJhy7Zd^Dvz@U8xbR4tn04GR0X05 znex;vAxLwZI2(*kotcClG;3f}oU?SRpOga8>G~G&+(`#r>RR9555Oe{acCjhPy>Lp*t%FXtEF~9uNGDyRQ`Nko zbKXTKJa}}HuGfs>>vYaqI%nNW#SsWK&L(f`RKG~YvP`*3C>mwHu~gx#ZL@}@@tPvL>tnH`ussU6SpoC zd4*0GbkjL^>4a4mo%3Egd2Y?#*>oL=Tk;8){CTgdUMBojmzM_VO+}UO_Uk%JRPi@o zR6BYvp37s?vL(b1;RUZEXpqo+*?&5ub}V;2W@#`;F}+%6@2ka11!81BYQKjIyf zgUU30QI9On%geH8ew41ho(aoDD_@W{hu&pr-V85G<789P`g$f!c)wAf?pd21?XonJ z-XlFV(&~CHJvGw2KrJ}{OcjZT3*&_TIUrV@8Fnnr47|G;V!h!lwDBk%^B>22e&;is Uj#$)l6JQL3M*ME@eK7dxe>PCwZvX%Q literal 4094 zcma)YWtv+mwat*GPsFF-3-dpI zBzB#q(~+iWVxO0PfBWRqAHRI~@2hXV{`OE*yH&Xrl9It-zg>MPtBp7mubJ5A>(%nF z`g!^1uiI@=J%7$#9y>?;Uhbafi`9PTjo8gMZ|kC>pJAvjPQStKeBBzjdi+zlF004E zVP2hA+a(8(ibH;UD|f-o!>TxXHwh!*;k7KQMdCeS8})pP_+QrLycWe`StNPJ7R)6K1VCXvR#FH(r_M*pV?M&z z&HN;y4KE5lyT7YCT9mbjY-kU5QPSa1{9rA6ksUcP;w$>oT*?W{%5Qd^*B3NY1o2SBOxt09mQCISRu!9!4LVdauV)eoU; z3m_q%E)3avi=mVOhq%=XqI5+ll?qLnWfzJZ2UpEwQ7ReQX&LhBrctJrjRr@l6{#VT zBNs^D>L^4K(FRP)?43|bSAlYT2TKg-&hQ?iF%B&YnB;CcPD@Vx!580%9Y$~lA zHm6-|!h+AHmTE3%_t~5@;*^taHrcwv<}_q;+RrAr0wpC-3t1%cgIYLN*a?z$QVR@7gfQ)g+~N*u;QNHsQ`;6QeqIO%$YW+azQb?wjPw zomlQ6o9P`kN$Fm*Nqig!`z9=SY?2miPJCSU@0*l0Y*NOI_I6^kv!AFO1=pzc#A+cjE2kp(;>BUx!W-dgGq|$?nnD{E+bMyh8t|3M*l zs8(X_%aZAh-EQY~jaQ;3NEApJ(oGh0@X@xY5jtW1Wxi6?x7w~g2l@OF-@$PpOVbeD z_R2@)ZMW!plwbXQq;*E8c;GM|;>rHQ&P2z0Ce;o7mm5*>5vs2GZ QKrse1&L0Q=4hA3o2L@in4FCWD diff --git a/examples/runtime/shaders/glsl/fs_callback.bin b/examples/runtime/shaders/glsl/fs_callback.bin index bdd1bd4e6a0c79321013913e3c09093d7e3c57e3..3fc0567614762beba9275f10736e510dc1d43822 100644 GIT binary patch delta 13 UcmdnXyqB59E!cx`Bg;-k034VD)&Kwi delta 13 UcmdnXyqB59E!cx$Bg;-k034G8)c^nh diff --git a/examples/runtime/shaders/glsl/fs_cubes.bin b/examples/runtime/shaders/glsl/fs_cubes.bin index 5453e14515f617b5ce8b38530511592bf3a1b9ef..f05e6f27e21d51cbedf51e26f259f4e5ac30b454 100644 GIT binary patch delta 10 Rcma!!W^oJlV4TPj4gd~C0*L?s delta 10 Rcma!!W^oJlV3^1f4gd~80*C+r diff --git a/examples/runtime/shaders/glsl/fs_instancing.bin b/examples/runtime/shaders/glsl/fs_instancing.bin index 5453e14515f617b5ce8b38530511592bf3a1b9ef..f05e6f27e21d51cbedf51e26f259f4e5ac30b454 100644 GIT binary patch delta 10 Rcma!!W^oJlV4TPj4gd~C0*L?s delta 10 Rcma!!W^oJlV3^1f4gd~80*C+r diff --git a/examples/runtime/shaders/glsl/fs_mesh.bin b/examples/runtime/shaders/glsl/fs_mesh.bin index 3d29b1cc21385b30e1ddd1726babc8b86fe5787e..9ff6afbba9e1687d266172a7b650e215a6f43ae7 100644 GIT binary patch delta 13 UcmX@ed61LEE!cx`BgaR2}S diff --git a/examples/runtime/shaders/glsl/fs_raymarching.bin b/examples/runtime/shaders/glsl/fs_raymarching.bin index 907a2b86026b9feb0f7b216c81c9b1520d336739..80d504382d35e1d47d354a53031856179319ddae 100644 GIT binary patch delta 13 Ucmdn(wcCruE!cx`Ba68z03o6T0ssI2 delta 13 Ucmdn(wcCruE!cx$Ba68z03n?O0RR91 diff --git a/examples/runtime/shaders/glsl/vs_bump.bin b/examples/runtime/shaders/glsl/vs_bump.bin index 72324e94a535111b102f89145dcbcb485380b17b..47024201d74e77814bef9a6007646f2a9dcbec0d 100644 GIT binary patch delta 279 zcmZ3+Gn4`(5iStBajH36KxO+)CuDnpvoBnideS* delta 171 zcmbQuyNrh;EZBo#GLN*_M2__nFLp8-PmX3ZVKm-6fpItEWPj$s%}bcI7@2buOD11r zk(eCAD$Q;fZ5XRyt1$U3izBZ!mx4k`Zb4aMQM{qyyq1|IEZBo_Bg;xg02_D%wg3PC delta 13 UcmZ3>yq1|IEZBo#Bg;xg02^}ywEzGB diff --git a/examples/runtime/shaders/glsl/vs_cubes.bin b/examples/runtime/shaders/glsl/vs_cubes.bin index 05467fda84375be9c5ff80b383513be08ed4ced8..d8aa23f142306b7fede3b21c431dd70755e71df8 100644 GIT binary patch delta 13 UcmbQqG?R%XEZBo_Ba0{_02o>V_y7O^ delta 13 UcmbQqG?R%XEZBo#Ba0{_02oyQ_W%F@ diff --git a/examples/runtime/shaders/glsl/vs_instancing.bin b/examples/runtime/shaders/glsl/vs_instancing.bin index 9bdd64066c15cfae3aa965d2dbb218e748ea69e1..8014254404f11042e263d6d54b67f6ef2b2b8c8f 100644 GIT binary patch delta 13 UcmeBY>1SaH3-(~#$imG802hM--v9sr delta 13 UcmeBY>1SaH3-(~x$imG802h7&-T(jq diff --git a/examples/runtime/shaders/glsl/vs_mesh.bin b/examples/runtime/shaders/glsl/vs_mesh.bin index 2fa0af63d133f33da8d426f812a12247509095a6..d11bbb6d33d9f5756abadfa5940cff7dcce52661 100644 GIT binary patch delta 13 UcmZ3;wUCP?EZBo_Ba19602$r`Bme*a delta 13 UcmZ3;wUCP?EZBo#Ba19602$c>BLDyZ diff --git a/examples/runtime/shaders/glsl/vs_metaballs.bin b/examples/runtime/shaders/glsl/vs_metaballs.bin index 6e1bb69332b3a08620766c1c094f97c5f7a61864..ec503e9e89b89d1f1c9c5bcd4d9c4f2670b09aeb 100644 GIT binary patch delta 13 UcmX@ce2keTEZBo_Bg-L103HGa0RR91 delta 13 UcmX@ce2keTEZBo#Bg-L103H1V00000 diff --git a/examples/runtime/shaders/glsl/vs_raymarching.bin b/examples/runtime/shaders/glsl/vs_raymarching.bin index 063bf2ef8f100b2ef455922cf082e3b93c1930b3..bc9dda430c3f31a61917eea64b7e6bbf52fa1924 100644 GIT binary patch delta 13 UcmaFE^oEHgEZBo_BTEJ&03gT%@c;k- delta 13 UcmaFE^oEHgEZBo#BTEJ&03gEy@Bjb+ diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 1555059ee..0ddac8482 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -478,19 +478,24 @@ namespace bgfx return; } - m_key.m_depth = _depth; - m_key.m_view = _id; - m_key.m_seq = s_ctx.m_seq[_id] & s_ctx.m_seqMask[_id]; - s_ctx.m_seq[_id]++; - uint64_t key = m_key.encode(); - m_sortKeys[m_num] = key; - m_sortValues[m_num] = m_numRenderStates; - ++m_num; + BX_WARN(invalidHandle != m_key.m_program, "Program with invalid handle"); + if (invalidHandle != m_key.m_program) + { + m_key.m_depth = _depth; + m_key.m_view = _id; + m_key.m_seq = s_ctx.m_seq[_id] & s_ctx.m_seqMask[_id]; + s_ctx.m_seq[_id]++; + uint64_t key = m_key.encode(); + m_sortKeys[m_num] = key; + m_sortValues[m_num] = m_numRenderStates; + ++m_num; + + m_state.m_constEnd = m_constantBuffer->getPos(); + m_state.m_flags |= m_flags; + m_renderState[m_numRenderStates] = m_state; + ++m_numRenderStates; + } - m_state.m_constEnd = m_constantBuffer->getPos(); - m_state.m_flags |= m_flags; - m_renderState[m_numRenderStates] = m_state; - ++m_numRenderStates; m_state.clear(); m_flags = BGFX_STATE_NONE; } @@ -510,26 +515,31 @@ namespace bgfx return; } - m_key.m_depth = _depth; - - for (uint32_t id = 0, viewMask = _viewMask, ntz = uint32_cnttz(_viewMask); 0 != viewMask; viewMask >>= 1, id += 1, ntz = uint32_cnttz(viewMask) ) + BX_WARN(invalidHandle != m_key.m_program, "Program with invalid handle"); + if (invalidHandle != m_key.m_program) { - viewMask >>= ntz; - id += ntz; + m_key.m_depth = _depth; - m_key.m_view = id; - m_key.m_seq = s_ctx.m_seq[id] & s_ctx.m_seqMask[id]; - s_ctx.m_seq[id]++; - uint64_t key = m_key.encode(); - m_sortKeys[m_num] = key; - m_sortValues[m_num] = m_numRenderStates; - ++m_num; + for (uint32_t id = 0, viewMask = _viewMask, ntz = uint32_cnttz(_viewMask); 0 != viewMask; viewMask >>= 1, id += 1, ntz = uint32_cnttz(viewMask) ) + { + viewMask >>= ntz; + id += ntz; + + m_key.m_view = id; + m_key.m_seq = s_ctx.m_seq[id] & s_ctx.m_seqMask[id]; + s_ctx.m_seq[id]++; + uint64_t key = m_key.encode(); + m_sortKeys[m_num] = key; + m_sortValues[m_num] = m_numRenderStates; + ++m_num; + } + + m_state.m_constEnd = m_constantBuffer->getPos(); + m_state.m_flags |= m_flags; + m_renderState[m_numRenderStates] = m_state; + ++m_numRenderStates; } - - m_state.m_constEnd = m_constantBuffer->getPos(); - m_state.m_flags |= m_flags; - m_renderState[m_numRenderStates] = m_state; - ++m_numRenderStates; + m_state.clear(); m_flags = BGFX_STATE_NONE; } diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 78dbfe4ce..62785b97f 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -76,9 +76,9 @@ extern HWND g_bgfxHwnd; #include "dds.h" -#define BGFX_CHUNK_MAGIC_FSH BX_MAKEFOURCC('F', 'S', 'H', 0x0) +#define BGFX_CHUNK_MAGIC_FSH BX_MAKEFOURCC('F', 'S', 'H', 0x1) #define BGFX_CHUNK_MAGIC_TEX BX_MAKEFOURCC('T', 'E', 'X', 0x0) -#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', 0x0) +#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', 0x1) #if BGFX_CONFIG_USE_TINYSTL @@ -595,18 +595,16 @@ namespace bgfx #define CONSTANT_OPCODE_MASK(_bits) ( (1<<_bits)-1) -#define CONSTANT_OPCODE_TYPE_BITS 8 +#define CONSTANT_OPCODE_TYPE_BITS 5 #define CONSTANT_OPCODE_TYPE_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_TYPE_BITS) -#define CONSTANT_OPCODE_LOC_BITS 10 +#define CONSTANT_OPCODE_LOC_BITS 16 #define CONSTANT_OPCODE_LOC_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_LOC_BITS) #define CONSTANT_OPCODE_NUM_BITS 10 #define CONSTANT_OPCODE_NUM_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_NUM_BITS) #define CONSTANT_OPCODE_COPY_BITS 1 #define CONSTANT_OPCODE_COPY_MASK CONSTANT_OPCODE_MASK(CONSTANT_OPCODE_COPY_BITS) -#define BGFX_UNIFORM_FUNCTIONBIT UINT8_C(0x40) -#define BGFX_UNIFORM_FRAGMENTBIT UINT8_C(0x80) -#define BGFX_UNIFORM_TYPEMASK UINT8_C(0x3f) +#define BGFX_UNIFORM_FRAGMENTBIT UINT8_C(0x10) class ConstantBuffer { @@ -1837,6 +1835,12 @@ namespace bgfx void destroyVertexShader(VertexShaderHandle _handle) { + if (invalidHandle == _handle.idx) + { + BX_WARN(false, "Passing invalid vertex shader handle to bgfx::destroyVertexShader"); + return; + } + vertexShaderDecRef(_handle); } @@ -1886,6 +1890,12 @@ namespace bgfx void destroyFragmentShader(FragmentShaderHandle _handle) { + if (invalidHandle == _handle.idx) + { + BX_WARN(false, "Passing invalid fragment shader handle to bgfx::destroyFragmentShader"); + return; + } + fragmentShaderDecRef(_handle); } @@ -1909,6 +1919,14 @@ namespace bgfx ProgramHandle createProgram(VertexShaderHandle _vsh, FragmentShaderHandle _fsh) { + if (invalidHandle == _vsh.idx + || invalidHandle == _fsh.idx) + { + BX_WARN(false, "Vertex/fragment shader is invalid (vsh %d, fsh %d).", _vsh.idx, _fsh.idx); + ProgramHandle invalid = BGFX_INVALID_HANDLE; + return invalid; + } + const VertexShaderRef& vsr = m_vertexShaderRef[_vsh.idx]; const FragmentShaderRef& fsr = m_fragmentShaderRef[_fsh.idx]; if (vsr.m_outputHash != fsr.m_inputHash) diff --git a/src/bgfx_shader.sh b/src/bgfx_shader.sh index bdb731da2..164758621 100644 --- a/src/bgfx_shader.sh +++ b/src/bgfx_shader.sh @@ -79,6 +79,21 @@ vec4 bgfxTextureCube(BgfxSamplerCube _sampler, vec3 _coord) # define vec3_splat(_x) float3(_x, _x, _x) # define vec4_splat(_x) float4(_x, _x, _x, _x) +vec3 instMul(vec3 _vec, mat3 _mtx) +{ + return mul(_mtx, _vec); +} + +vec3 instMul(mat3 _mtx, vec3 _vec) +{ + return mul(_vec, _mtx); +} + +vec4 instMul(vec4 _vec, mat4 _mtx) +{ + return mul(_mtx, _vec); +} + vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_vec, _mtx); @@ -96,6 +111,21 @@ vec4 instMul(mat4 _mtx, vec4 _vec) # define vec3_splat(_x) vec3(_x) # define vec4_splat(_x) vec4(_x) +vec3 instMul(vec3 _vec, mat3 _mtx) +{ + return mul(_vec, _mtx); +} + +vec3 instMul(mat3 _mtx, vec3 _vec) +{ + return mul(_mtx, _vec); +} + +vec4 instMul(vec4 _vec, mat4 _mtx) +{ + return mul(_vec, _mtx); +} + vec4 instMul(mat4 _mtx, vec4 _vec) { return mul(_mtx, _vec); diff --git a/src/fs_clear_dx11.bin.h b/src/fs_clear_dx11.bin.h index 4423a3c83..271978f2d 100644 --- a/src/fs_clear_dx11.bin.h +++ b/src/fs_clear_dx11.bin.h @@ -1,6 +1,6 @@ static const uint8_t fs_clear_dx11[562] = { - 0x46, 0x53, 0x48, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // FSH....I........ + 0x46, 0x53, 0x48, 0x01, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // FSH....I........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x44, 0x58, 0x42, // .............DXB 0x43, 0xda, 0x0f, 0xc3, 0x91, 0x70, 0x6f, 0xd4, 0x7b, 0xeb, 0xe0, 0x21, 0x07, 0x79, 0xd8, 0x54, // C....po.{..!.y.T 0xd4, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // .............4.. diff --git a/src/fs_debugfont_dx11.bin.h b/src/fs_debugfont_dx11.bin.h index fcc54a453..38786a925 100644 --- a/src/fs_debugfont_dx11.bin.h +++ b/src/fs_debugfont_dx11.bin.h @@ -1,6 +1,6 @@ static const uint8_t fs_debugfont_dx11[930] = { - 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // FSH..."f........ + 0x46, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // FSH..."f........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x03, 0x44, 0x58, 0x42, // .............DXB 0x43, 0x7f, 0x04, 0x32, 0xab, 0xf6, 0xa8, 0x90, 0xe5, 0x2c, 0xd4, 0x3b, 0xd7, 0xa9, 0x89, 0x79, // C..2.....,.;...y 0xfd, 0x01, 0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // .............4.. diff --git a/src/fs_debugfont_dx9.bin.h b/src/fs_debugfont_dx9.bin.h index 1da618f13..d2a8b9ba9 100644 --- a/src/fs_debugfont_dx9.bin.h +++ b/src/fs_debugfont_dx9.bin.h @@ -1,6 +1,6 @@ static const uint8_t fs_debugfont_dx9[353] = { - 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x54, 0x01, 0x01, 0x02, 0xff, 0xff, // FSH..."f..T..... + 0x46, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x54, 0x01, 0x01, 0x02, 0xff, 0xff, // FSH..."f..T..... 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, // ..".CTAB....S... 0x01, 0x02, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, // ................ 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, // L...0........... diff --git a/src/fs_debugfont_glsl.bin.h b/src/fs_debugfont_glsl.bin.h index 32c6cb1bf..459666a59 100644 --- a/src/fs_debugfont_glsl.bin.h +++ b/src/fs_debugfont_glsl.bin.h @@ -1,6 +1,6 @@ static const uint8_t fs_debugfont_glsl[360] = { - 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // FSH..."f#ifdef G + 0x46, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // FSH..."f#ifdef G 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, // L_ES.precision h 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, // ighp float;.#end 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, // if // GL_ES..uni diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index d21e2c1bf..97309507c 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -492,12 +492,12 @@ namespace bgfx if (_flags&BGFX_UNIFORM_FRAGMENTBIT) { memcpy(&m_fsScratch[_regIndex], _val, _numRegs*16); - ++m_fsChanges; + m_fsChanges += _numRegs; } else { memcpy(&m_vsScratch[_regIndex], _val, _numRegs*16); - ++m_vsChanges; + m_vsChanges += _numRegs; } } diff --git a/src/vertexdecl.cpp b/src/vertexdecl.cpp index 7fc06782b..e227d34f1 100644 --- a/src/vertexdecl.cpp +++ b/src/vertexdecl.cpp @@ -117,7 +117,7 @@ namespace bgfx void dump(const VertexDecl& _decl) { #if BGFX_CONFIG_DEBUG - dbgPrintf("vertexdecl %08x (%08x), stride %d" + dbgPrintf("vertexdecl %08x (%08x), stride %d\n" , _decl.m_hash , bx::hashMurmur2A(_decl.m_attributes, sizeof(_decl.m_attributes) ) , _decl.m_stride @@ -133,7 +133,7 @@ namespace bgfx bool asInt; _decl.decode(Attrib::Enum(attr), num, type, normalized, asInt); - dbgPrintf("\tattr %d - %s, num %d, type %d, norm %d, asint %d, offset %d" + dbgPrintf("\tattr %d - %s, num %d, type %d, norm %d, asint %d, offset %d\n" , attr , getAttribName(Attrib::Enum(attr) ) , num diff --git a/src/vs_clear_dx11.bin.h b/src/vs_clear_dx11.bin.h index 53cb6aaf4..6c1e2b9e5 100644 --- a/src/vs_clear_dx11.bin.h +++ b/src/vs_clear_dx11.bin.h @@ -1,6 +1,6 @@ static const uint8_t vs_clear_dx11[658] = { - 0x56, 0x53, 0x48, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // VSH....I........ + 0x56, 0x53, 0x48, 0x01, 0xa4, 0x8b, 0xef, 0x49, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // VSH....I........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0x44, 0x58, 0x42, // ...........t.DXB 0x43, 0xda, 0x52, 0xa4, 0x82, 0x31, 0xef, 0x9d, 0x65, 0xc3, 0x64, 0xcc, 0x10, 0x3d, 0x4f, 0x86, // C.R..1..e.d..=O. 0x53, 0x01, 0x00, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // S....t.......4.. diff --git a/src/vs_debugfont_dx11.bin.h b/src/vs_debugfont_dx11.bin.h index d75ce2230..c557bad2f 100644 --- a/src/vs_debugfont_dx11.bin.h +++ b/src/vs_debugfont_dx11.bin.h @@ -1,6 +1,6 @@ static const uint8_t vs_debugfont_dx11[1484] = { - 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // VSH..."f........ + 0x56, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // VSH..."f........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x01, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, // ............u_mo 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x09, 0x00, 0x00, 0x01, 0x04, // delViewProj..... 0x00, 0x98, 0x05, 0x44, 0x58, 0x42, 0x43, 0x4e, 0x14, 0xcf, 0x18, 0xca, 0x5f, 0xd6, 0x83, 0xb0, // ...DXBCN...._... diff --git a/src/vs_debugfont_dx9.bin.h b/src/vs_debugfont_dx9.bin.h index 3626ce809..c59983613 100644 --- a/src/vs_debugfont_dx9.bin.h +++ b/src/vs_debugfont_dx9.bin.h @@ -1,6 +1,6 @@ static const uint8_t vs_debugfont_dx9[343] = { - 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH..."f...u_mod + 0x56, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH..."f...u_mod 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x09, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj...... 0x34, 0x01, 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // 4.......#.CTAB.. 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W............. diff --git a/src/vs_debugfont_glsl.bin.h b/src/vs_debugfont_glsl.bin.h index 6ca4a20f5..90d652b4b 100644 --- a/src/vs_debugfont_glsl.bin.h +++ b/src/vs_debugfont_glsl.bin.h @@ -1,6 +1,6 @@ static const uint8_t vs_debugfont_glsl[474] = { - 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // VSH..."f#ifdef G + 0x56, 0x53, 0x48, 0x01, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // VSH..."f#ifdef G 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, // L_ES.precision h 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, // ighp float;.#end 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, // if // GL_ES..uni diff --git a/tools/bin/geometryc.exe b/tools/bin/geometryc.exe index 56279363d0724ee472df9ebeba3d58115589840b..c7e83e5e1223925fca252aa30dba17f790228ec3 100644 GIT binary patch delta 28568 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 delta 28181 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 delta 322 zcmZpe;nXn0X~GBQg%)=we)eT5Gi-KZY+L$%?lP9n(j&boD% @@ -145,11 +145,11 @@ struct ConstantType Uniform4x4fv, Count, - TypeMask = 0x7f, - FragmentBit = 0x80 }; }; +#define BGFX_UNIFORM_FRAGMENTBIT UINT8_C(0x10) + static const char* s_constantTypeName[ConstantType::Count] = { "int", @@ -653,7 +653,7 @@ bool compileHLSLShaderDx9(bx::CommandLine& _cmdLine, const std::string& _code, b uint16_t count = (uint16_t)uniforms.size(); bx::write(_writer, count); - uint32_t fragmentBit = profile[0] == 'p' ? ConstantType::FragmentBit : 0; + uint32_t fragmentBit = profile[0] == 'p' ? BGFX_UNIFORM_FRAGMENTBIT : 0; for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it) { const Uniform& un = *it; @@ -930,7 +930,7 @@ bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code, bx::write(_writer, size); - uint32_t fragmentBit = profile[0] == 'p' ? ConstantType::FragmentBit : 0; + uint32_t fragmentBit = profile[0] == 'p' ? BGFX_UNIFORM_FRAGMENTBIT : 0; for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it) { const Uniform& un = *it;