From a62a6f008be6f59e887355f6a0cdf252131fd57f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Mon, 6 Jul 2026 14:45:53 -0700 Subject: [PATCH] Fixed indexed draw indirect with dynamic/transient index buffers. (#3813) --- examples/48-drawindirect/drawindirect.cpp | 74 +++++++++++++++++- .../runtime/shaders/dxbc/cs_drawindirect.bin | Bin 2589 -> 2672 bytes .../shaders/dxbc/cs_drawindirect_count.bin | Bin 2637 -> 2720 bytes .../runtime/shaders/dxil/cs_drawindirect.bin | Bin 2897 -> 2948 bytes .../shaders/dxil/cs_drawindirect_count.bin | Bin 3033 -> 3084 bytes .../runtime/shaders/essl/cs_drawindirect.bin | Bin 3491 -> 5665 bytes .../shaders/essl/cs_drawindirect_count.bin | Bin 3646 -> 5820 bytes .../runtime/shaders/glsl/cs_drawindirect.bin | Bin 3768 -> 5942 bytes .../shaders/glsl/cs_drawindirect_count.bin | Bin 3923 -> 6097 bytes .../runtime/shaders/metal/cs_drawindirect.bin | Bin 2912 -> 3023 bytes .../shaders/metal/cs_drawindirect_count.bin | Bin 3131 -> 3242 bytes .../runtime/shaders/spirv/cs_drawindirect.bin | Bin 4095 -> 4262 bytes .../shaders/spirv/cs_drawindirect_count.bin | Bin 4461 -> 4628 bytes .../runtime/shaders/wgsl/cs_drawindirect.bin | Bin 3011 -> 3121 bytes .../shaders/wgsl/cs_drawindirect_count.bin | Bin 3254 -> 3364 bytes src/bgfx.cpp | 2 + src/bgfx_compute.sh | 4 +- src/bgfx_p.h | 4 + src/renderer.h | 11 +++ src/renderer_webgpu.cpp | 1 + src/renderer_webgpu.h | 4 +- 21 files changed, 93 insertions(+), 7 deletions(-) diff --git a/examples/48-drawindirect/drawindirect.cpp b/examples/48-drawindirect/drawindirect.cpp index 92151f94e..47a4a504e 100644 --- a/examples/48-drawindirect/drawindirect.cpp +++ b/examples/48-drawindirect/drawindirect.cpp @@ -181,6 +181,21 @@ public: bgfx::makeRef(s_multiMeshIndices, sizeof(s_multiMeshIndices) ) ); + // Dynamic index buffer (with padding) + m_dibhPad = bgfx::createDynamicIndexBuffer(64); + m_dibh = bgfx::createDynamicIndexBuffer( + bgfx::makeRef(s_multiMeshIndices, sizeof(s_multiMeshIndices) ) + ); + m_indexBufferType = 0; + + // Dynamic vertex buffer (with padding) + m_dvbhPad = bgfx::createDynamicVertexBuffer(32, PosColorVertex::ms_layout); + m_dvbh = bgfx::createDynamicVertexBuffer( + bgfx::makeRef(s_multiMeshVertices, sizeof(s_multiMeshVertices) ) + , PosColorVertex::ms_layout + ); + m_vertexBufferType = 0; + // Create program from shaders. m_program = loadProgram("vs_instancing", "fs_instancing"); // These are reused from 05-instancing @@ -261,6 +276,10 @@ public: // Cleanup. bgfx::destroy(m_ibh); + bgfx::destroy(m_dibh); + bgfx::destroy(m_dibhPad); + bgfx::destroy(m_dvbh); + bgfx::destroy(m_dvbhPad); bgfx::destroy(m_vbh); bgfx::destroy(m_program); @@ -347,6 +366,14 @@ public: ImGui::Text("Grid Side Size:"); ImGui::SliderInt("##size", (int32_t*)&m_sideSize, 1, kMaxSideSize); + ImGui::Text("Vertex Buffer:"); + const char* vbItems[] = { "Static", "Dynamic (non-zero base)", "Transient" }; + ImGui::Combo("##vbtype", &m_vertexBufferType, vbItems, BX_COUNTOF(vbItems) ); + + ImGui::Text("Index Buffer:"); + const char* ibItems[] = { "Static", "Dynamic (non-zero base)", "Transient" }; + ImGui::Combo("##ibtype", &m_indexBufferType, ibItems, BX_COUNTOF(ibItems) ); + ImGui::BeginDisabled(!indirectCountSupported); ImGui::Checkbox("Indirect Count", &m_useIndirectCount); ImGui::EndDisabled(); @@ -398,6 +425,21 @@ public: bgfx::setUniform(u_drawParams, ud); + bgfx::TransientIndexBuffer tib; + if (2 == m_indexBufferType) + { + bgfx::allocTransientIndexBuffer(&tib, BX_COUNTOF(s_multiMeshIndices) ); + bx::memCopy(tib.data, s_multiMeshIndices, sizeof(s_multiMeshIndices) ); + } + + switch (m_indexBufferType) + { + default: + case 0: bgfx::setIndexBuffer(m_ibh); break; // Static - base 0. + case 1: bgfx::setIndexBuffer(m_dibh); break; // Dynamic - non-zero pool base. + case 2: bgfx::setIndexBuffer(&tib); break; // Transient - non-zero per-frame base. + } + bgfx::setBuffer(0, m_objectListBuffer, bgfx::Access::Read); bgfx::setBuffer(1, m_indirectBuffer, bgfx::Access::Write); bgfx::setBuffer(2, m_instanceBuffer, bgfx::Access::Write); @@ -414,10 +456,28 @@ public: bgfx::dispatch(0, m_indirectProgram, uint32_t(numToDraw/64 + 1), 1, 1); } - // Submit our 1 draw call - // Set vertex and index buffer. - bgfx::setIndexBuffer(m_ibh); - bgfx::setVertexBuffer(0, m_vbh); + // Submit our 1 draw call. Re-bind the same index buffer for the draw. + switch (m_indexBufferType) + { + default: + case 0: bgfx::setIndexBuffer(m_ibh); break; + case 1: bgfx::setIndexBuffer(m_dibh); break; + case 2: bgfx::setIndexBuffer(&tib); break; + } + + bgfx::TransientVertexBuffer tvb; + switch (m_vertexBufferType) + { + default: + case 0: bgfx::setVertexBuffer(0, m_vbh); break; // Static - base 0. + case 1: bgfx::setVertexBuffer(0, m_dvbh); break; // Dynamic - non-zero pool base. + case 2: // Transient - non-zero per-frame base. + bgfx::allocTransientVertexBuffer(&tvb, BX_COUNTOF(s_multiMeshVertices), PosColorVertex::ms_layout); + bx::memCopy(tvb.data, s_multiMeshVertices, sizeof(s_multiMeshVertices) ); + bgfx::setVertexBuffer(0, &tvb); + break; + } + bgfx::setInstanceDataBuffer(m_instanceBuffer, 0, numToDraw); // Set render states. @@ -463,6 +523,12 @@ public: bgfx::VertexBufferHandle m_vbh; bgfx::IndexBufferHandle m_ibh; + bgfx::DynamicIndexBufferHandle m_dibhPad; + bgfx::DynamicIndexBufferHandle m_dibh; + bgfx::DynamicVertexBufferHandle m_dvbhPad; + bgfx::DynamicVertexBufferHandle m_dvbh; + int32_t m_indexBufferType; + int32_t m_vertexBufferType; bgfx::ProgramHandle m_program; bgfx::ProgramHandle m_indirectProgram; bgfx::ProgramHandle m_indirectCountProgram; diff --git a/examples/runtime/shaders/dxbc/cs_drawindirect.bin b/examples/runtime/shaders/dxbc/cs_drawindirect.bin index 5df326d7050d0590248d0ec3b0fc79a2966fa449..d3f62e55f77a54f505f93c1028fd8c101932f560 100755 GIT binary patch delta 270 zcmbO$@?n(w!2EQ<;F$j9?`^rSU06iRA%_ zMTxn^Obh~0VHGY02A2pY=be&vJJbx1hu16$p7C+=&&eQ7AUS3rtpmh1KrC5*^G>v z+nAj}oKvjsK#mYwKC@jB&?O){rm;Y1IR*v}C#dVVpmJOd5CcJ`nlUi2PJ+sZaZc{$ JoWP{O001j9FDd{4 delta 144 zcmew$GFQaeIoN}n0SXuycuM0_iW18M5{nXZifz{-$5aiK6H diff --git a/examples/runtime/shaders/dxbc/cs_drawindirect_count.bin b/examples/runtime/shaders/dxbc/cs_drawindirect_count.bin index 33deac00875318bd5b776098ddbe467e2d5a1131..d5650ad5290d4fe29b76487f7378d1322d7f50ef 100644 GIT binary patch delta 271 zcmX>rvOu)nIoN}n0ScHHM3U0eD&jNqQZkEDlS>?n(w!2EQ<;F$j9?`^rSU06iRA%_ zMTxn^Obh~0;Seqc2A2pY=T}qzE?7{ndwS2A)C)~du4jQXf#jHhvraD*+9-T zW@ixR7OOExhAp4jt_bK9kR{VtAha9<1BVmTd0bFAt_FySAY;uK7+5Dk<-<59w{sq0 HQeXf8W{faY delta 143 zcmZ1=dRD~AIoN}n0SXuycuM0_iW18M5{nXZiZ z5GwdpU9ch&B&#qn(VX)PCj&zO11m%E#D&6)j1#w(Gcs(}Wt3)OWSH#9oDJk`Wp)N} cezF>aWZ3eVxh^pXfK6YRYy8r+H diff --git a/examples/runtime/shaders/dxil/cs_drawindirect.bin b/examples/runtime/shaders/dxil/cs_drawindirect.bin index e3eb53132c1ac984adc5f8def33bbc20f862bcd3..6c182aa49d008f7a75fce8d3f3bbea4685f8cc3c 100644 GIT binary patch delta 489 zcmca8)*@c-9PGi(00m48B1!3K74eyQDVas7$t8|O=}w8osZ2m=Mz9i|()g63#PWc| zqQu-{CI$hhum#Wrmk1|kjc$QkZIc?a!awExlN30*6r>3x#}1@zfY=9!V}LjZh*f}+ z5sVBI6MohknVDHym?oK^^1O`@ye4v9te30t|fNGZj#hsiF+*9OX zU`PYXaW^S2fczv3#O#gAn{P0FV`Nh}`1!;frp;HF4H+3%Y-VFMW>z=>Qp4h@12RJf zh)vEgOi6M$In^z3O0413Jcr4V9EC@l}PwU#oG*M*GlPEJeD4-{? ztc}4CnAz_E21FOM|REwU3X$+1)7c(%hFfb@E003EOeOLeh delta 432 zcmZn>zbNM99PGi(00oQ;Jf-m|MTzABiA9OI#Y{k9MzE9$P>D-~lQYM|&Um$DnVIjs zmuCH&ze5QmtFkdsoUz_8$h&`VY<~N!qaC3Cj&zQ11m!o&~gwTGP-f!=S{cyG pVspVsfd7>JpTqVY&6)~~O%K}|L=GfOduY%U$;1MQ0HDhS7yy-Ibh`im diff --git a/examples/runtime/shaders/dxil/cs_drawindirect_count.bin b/examples/runtime/shaders/dxil/cs_drawindirect_count.bin index dadaf624bf06cb8fe7a3a59e7ee8db618f9f7754..97a1fb96102947cf6e8612e26331ebe2acde39df 100644 GIT binary patch delta 494 zcmca9-Xl@(9PGi(00m48B1!3K74eyQDVas7$t8|O=}w8osZ2m=Mz9i|()g63#PWc| zqQu-{CI$hh@ByF+E)h=7uZ7aAXK$~_D4o+L9rB1j5~K+v#}1@zfY=9!V}LjZ#0N?i zFfwdR5Mq=!Gc>nMHcC!2F*is|OExmJG)cBJHnm7LGD}HLGO(OHkx|6*oA?}^F9qul zN%~BVIFx&u(wM~91nA%TIFp&RHz5Fg|m0if9;KyfGM1NRhp7#Ny1-(%EbVw>=w zvc->aGari?BjbwAuB<-H3Ri$Cg;~6HKsuy>*yIeulq83fQ{57$#2QY`bC|r5V;$dw zg9kefGBzkkB$OQBESj9lDZ_YVau=s89SaN`kRU^%Gpi9J4`l|j}` zxanb2q8kq%P>kU-dvQW*t%NT}19zLOuR#lU+e*cTi!CfW5+ss69+nxUmdnyH1cVOp}WWtvfPa$<^sxrIq;s>$RHj3SmF zOp-s&_}VOgc)rf53l)A(Tp~PuB)AwD5*Sz++JKgU_#g`fKz0JfotzKcQ{-V_sNMXR zQHzN!;DMkOE5l}87Bfc1C7V-NeV7@~Pu|EO$tDu~l5I-t|@_!b;I*m01tK|vy+ zWC3U4_DZ+I*aI4rBcao*E4|9svfHg9@M6;{#e5WZi_D9yTSq3A2Go zt_MwtJdB;fJrX7i98Hd{LhlW@8EqsK9XTEaIC{M4aAXFW9iqy}zeV6kvyhOYpwQ!l zE{}$U9f}I91~XDEdJ?8FNaoFGoygD}+2+FO#v=u^YJpQ{&q@X_H> zAYJiA6j4+#P1PP~rJBmh7iqQmv&hq%{JC@pESQXF>mr!y!AuW4ckpGP z8lx&?RzBus!RwP!Ffm-RVqC zN!3;cU|OfyUXqZOt$6~r-D@Q3fQBm^!2?{O%-_yc?ZoR)*9jZyJ2`FCRoWfud{qG( z;QmJvrBPP($Y2$o_Mrh;c`RNJs)gb4sAZHyVdX6HJQ0vNTaJXfZ>yq?%w#2#GHP8G z0eXpFL_iMaLbjknf6UmO&Ml0O!t{h46WW-GQvV%?>GxoQum%&xNAa8)Ox`d{ z`ugVanwvQ!t1E^~z!j&0*R#CRHnK7$^DNQQum&dOE7~A5oO5*FOX)cWQ#Q&021sO5 zz9Jo6<~=F>11a&6(wl5`D&1XNDjI%!rDBxZ3P}c4fA%_}0WiSYscdM$LT!#?+eqFP zfaO;b@Z>nyMg-nCS5j@f!L=M$hn#H1WJ7-gu^76ZB$?_Uwj7p;@>=_rq7QWu3DnAK zIu|2N>#9jtN6HJA{{DHPfCG8y?MJ6=Rgd3_SY#e|b5b(vHA`=6wgzT{l2A>KgS9p= zBANR{O^$=LHZUR?;nn0gSbGB_lzH5!Nf+0lbz4E%(BHslZ&YGs_~5XmrM~5yQ(kKW zQ}m%mBDHiU(L@~_jC@T;%4=<4iawM#i&uG(@*8*^JjK!T4ZJnX2lc+;Hrhl6-OEa5VRR`gd6m86#V=f?UEAF~yesrVPhIg`#8tG5&9oTRU~`{o&b)jW zd}ak_;vD~XT^W4RMRPZ1m7&vZ%R)Y1%R;85-kETcJd{aL#xGH@5pTsCe02s$@}t18jZ>V4X)vQ%8(&0hIzTOSRxL4HYE#jkv(ydnpnaT4jd6~ zM*sRe~1`cbu@Al;~`FF`lf%nJ|5EHicqL z$FmhwnD*ps;1{2v@W2n!_4)ga|90E>L!q4sMYa>bf;&V&cZ5I7tqk`($&2{_zMS)7 ztmRb&Xt$8d;w+QFfHp&7*aYMhKCwUL}9#J+yx?c65v6?{McNbE9q`M zyf~fQgM;j|PSLvPv(C^O_E|l&F8i!L#j=9%{eQ&CY2Vs+&e|Q$coY1H*Sq8=#@+gU z{0vpA)o1>@xGHb+fAGSyJ(}Pi1Nrbp6^?QH$%8mAQ2zZ@{JpdDuwYIk9dlX_;9LL& M{tNB%75+Q(^b diff --git a/examples/runtime/shaders/essl/cs_drawindirect_count.bin b/examples/runtime/shaders/essl/cs_drawindirect_count.bin index 93f66172b9a7eb26d9fe4b1042b17112f1808d57..2840c90e8f56d7377bca3bb106e9c16e8a47d989 100644 GIT binary patch literal 5820 zcmb7I+iu%N5cRYA-sc610;DX<5=o~(RikL)HuXc$AaVO*7{rRA99Fy-yx5Whe^CFj zbJ<-|(o&8BBw6mvoH=`DcDdBM&wqY*V*dR1{mID>k8xQgMK1j5M8wr#nHI7ZW%S_i zD3q@FD$2NS%3Msxlk-r{#LM6@jy&?B!Il%wIN<5FuD*8l#jdNr;~Hq!V9zz!arFeI z3af`y)|&0Q!yZf8uHx)th<`A|cQ~XQ7GPL#Ff8bVna~C)2>MqAH%VS2pH@?{ zs$imt6FvoLqV}LYq8J!Zpr&dMv{KDv9f+)6|4|m%r{bw{2rQh8Xz3!H>Vc;RzB~9j zP>oTSGOr$rDs~XZ!7z*n!8!C@;m!sxgKma*MS5fg8?Hk2cX>mXF>e?!Zy0!ebU{Z$ zx20-8HPu%^f#DVuvZGRhs_)|(L`87`2A)TP`k*YHI;_yyLF?`0?luJ59jJ$o)9pu3 zJ(8-O48XL>^1UPxOwp8b`G=FN#z^=6o>{>b$MXCN>XCnO1S< zupn3Qs|e9c{47FpFbA>)75c+tciOiwJ_^$pc1&nvCQAKx9A?mi3Bnpo7$3#cGnl+! zmh|<-<1yzsB&#ciOu!YVg6H$1);6*-CG#%P(y#_5O-&5gl&V8_Dv|$hcEI| zybSiZQyko$TLXp6@0aT^$rnipV*Xa%zm-)y8>DhmG__OJi@=BPfjK(l_m>kFK7Qq* z$kUCOH_K&Q!qvU1Wgf*>vXb2fM^l7+}*k~{bvgiPw|1(;#v+^6CD zw3y5EI)8)=HT)QIeKm%k49G8UvMbO>ImL5lajLVxZ*r^zu5)K5NPF+hJuC6GBgR-t5P$!zf(=Yf0crZRag%26hbc3~8iF2Ws z#+lccbtQi6Osj7q;zQb<3h)|=$=I7NwWy&)JY@!KH2XgpbA_-KEGCp#RECUjGAgRA z$qI4Uvn^SKlkAC;v{NKZ;lL5mW+dRWsPI2+of~Vl9-<|J@BK3vle6}UwAWe0UKM!3 zaLWm+Nr}#;7vsrNoC(txXHzJ~bnGpm!n7u54L>Ulg%5s^uFpSc{WqJ|9}4YED6*RX zCfp$cx+DDUZ)vy}X;IDw@OfU8V=b>LK+EM^Oeu&8a)Eg#;|nMYhiO^2!jRJ8Fx=Ew zA`0Wx;wlh%Cjo9G%#Y2rbMD=)h8L%kJ8+PF)+t)&eO3>xQJ>XE>!QyZP%JA5KQbJ# zbGomFTW94CJzfOgBlIfywRF3>8$UtS8ueSk+oY~;iofx|v%UY|90U3AHVoUi`+7s1 zXDI*vEdHpf&vQQH6(^F8Ijsh;FMtC7h4y(FBuhF<#N{RI7&?r3S>0CxmBySs81*tZ F`5){Ldh-AP delta 63 zcmdm^yH7^IIoN}n0S>hJHVPE8ZeGXh#W?vgzxZY&{=;m-nR&$}iFwJXE{P?Ho_W#P Lv3gaLEyP*?@P-lk diff --git a/examples/runtime/shaders/glsl/cs_drawindirect.bin b/examples/runtime/shaders/glsl/cs_drawindirect.bin index be4db3aa6caec139eebb8416238a228c4dd5092f..7c75743cb6583a15278aa202f6108fd3321cdaeb 100755 GIT binary patch literal 5942 zcmcIo+iu%N5cRYA0exK{C_u`xEQxdqR1JzIX;VK0H4?WkhC!?-%3;Ne!HZ2f@V|F1 zyGu%1$`Oh>u(P`}bLQ-s;qvnC^B>=xn4eeQpPamUh>9}KGvRxa!79mRC5rIg;ZY!6 z@l_O2RTr6qj~zI4cF=k=xxER% zb_->}>2!NKQ&TEeCj&@Or`cYTke01^0=C_1Bx2V8)ivg-aH=vGlyh##gGZO;#BZ@mRH(FR;Fa`v056| zz@&UZ8-#{q3f=codd|U=t#W_?5}A}QNJlrho|OK9lz7JKO?En!j$SSm4ZpooG0JU) zB!j9ydmYgL7+~#GHgsU2Hpj7TCGQHr@+%2=avW?c0&kovsW#r?S}s?IoNUEpLw^IY z7`mP$nd%_69F~dlTKkrw4|Nd<)X8f)7b8vUs>!a7lot;D{p*DS4&vInd0-?K=#bsLnYi##KrZtv*@#8GT15rCd6bpR!sxxM2W4GDpiVT0+0QrwJQ$yz!aD|Oy1`nl z#ktU1gv|0=$M|GM-IWTGT)yo-zYAn!O*5xkT6!HWNrJDno|2 z80O{HVu?8H*_JHCMfSu+YGMgXIB-O`840+MOZ-n;7sgsPL$rkOCE*Ols)r1l(eKH6g6ObcW36z*)zlC<;|zxzd12K|9pFL^4&v}7jc#f-p$wk%Kr6hG9ei&VlC&cRqL?v@^WPk|Q(Na22Yz&l|dodBcEt!(i4$7j!gq z8>$9WQ+*K>816vnJ=X@RU)N54bz4xyka`5l^)4y_6;%g*FdqqOusnNg!J)H*)|<)g zO#rrAC<{)fyVIGPQn^|gK!R$M9wZ5A*_tO{+pR{T)@r!=ph+KF*zni0ReSMXB)^yS zKhXc*$!onD<>5GN%4?&pG}}?0k8p?s>3>b4O_Y`$RkZdE6+r`X<6u*FpjsFnk6J`Y z6qe2+%Mt;Z)8$C0`%sxzk(sPyQbesolw8HnB0w+kqX@{s+^8(5(B3n4r}GTPM`3!x zjtPCuMCtN54%6?z1Yr#(jE~|uGnl+#mh|P#Qp*;M+o~Qv zEwacw-p@(Ntj8=p#o8K}4N5{aIS$s^z=&kd6E!&w*4n^`WQ13f<6!L#j8NuwqbB>f z4z1e?%7*R+Mth?YE5jEKTUzQ{u5-$3ZD5M-Ya~)jcM?t1g@chV=}3944NTE}dDD26 zDXt<8*C}}M862c(|i*fq!7eF1X-{;xi2aDkR!M2WMtOkW{ zwQaIxlvr~^)ca1O3EKrF?W;g0_n+m*XyqSpr#N`{ZwwT&xLeghoG#-W#QY_{do7D- zK1k#?t4gORm+*ODBo^q9-d#>y_$VNkS(Ba#co~ zLIqSo!_N2>@iO`Z)NDRmz~ZO-GTxxa4#E>B+Q|Ak!&G4308tG%)Ps>|b7|;t)Q2d) z{*0Z9;Tr1vl@HIdQ%(>s>rbW3OK^bA4*_g1(zv~ss4tQ*NF(7u(CO5*#NqC;TsSD} z8Ul5qIm~{-8Q{VA^b}rXNYgFWYAw!%-Wq4FG3#1<-&$7hM8t=*I~CwH6qE66y3(Qs z67iH7u+i-OV9W)=7OVo@0~#KkZxb`}f7Vb7*yAuh5fF4C1EVF?G02)82vr$vGP zv~^*uMLk4I2%js?U`)>1E7V?RA$t|z1;ZUDtR^Kon_i43D{&@FUz|;$7}N1=1r??} zIW>H48wwBnAYGTg-}rC0jXxCHnNVaq0W7#f1awFEO>||rXGxaN2k?5Hu~?8g87mJDl+*_&GxFl5a~l>)Y`oRIO6q z5?;q;ah?5%2cGTz2j>{bhfl+B8Mkk5i1P&HKU~F+&H6m&Ltb$r>6p`c0M`Xj;9qE; f=Rv%pqeNU@!WBb@F>kAVOQ6!2vj?M|2Pgjm>$une delta 59 zcmcbpe_2kzIoN}n0S+AaHwtvHZ9dHB#kko(;1-*3W?pegVqS8pOJYf)XI^x6tX|b* HU-1?Iy-g7c diff --git a/examples/runtime/shaders/metal/cs_drawindirect.bin b/examples/runtime/shaders/metal/cs_drawindirect.bin index 43ea8d1aa2e02835903c1f59bf10ab91828a7ac9..a66390b63ab8850cf0da91af26843308386b4ac1 100755 GIT binary patch delta 990 zcmZ`&&1%~~5SC=Swv-lnXcBN!XG5DH$+9f1wTpzE(4R{o6bd;OBb3+H-T?ka$#@Kbop(#eH&E-x=)Ha~xp zf6I!;#YN6oW(~4U2K}L~hYgPtli*AI&6%5w0|KYOs1xoPq)ObTMqu@aQ=qW`aB-Ti ztfPqWd5p8n73Jb%zFKA6Fj7WuG$DFo!I%p)bZU|iH!aw3CVu404IiQ2(I}eg@%Y`| zt5HWsiUkbs+6t3NIB@DWM5Rzsd{^ugXw}E$Q+eWCPjzVqw`6`Q!D0oT_;tskAc6MXCOJvB123Ubi|93=J4SlSZ)9{%mT+jsNtJ0BIww=O zFTNHZDbx{vijN;cD^1d{9Rot>HJ8B`+)EGPvSPFJMDe-UEp6aH4ofZ6o|o#_M_YBo zJ#`&%TOBFP6=!O7g<%V>XNF$Q%%!@jF$c>Jg`q;$wsNo)rWR~7+BV)aW^IV?&MXqe z;q=3}+nPZ!cl2;DJql;`q94URhM5;{HAhVxC^(3*<|<(SQ!~pLEvqS7c{)CENU7LZ QDkJMmT`Qhwnj{hFAB(Q?vj6}9 delta 891 zcmZ{i&ui3B5XX~rmrb%Fda#wXZl9<%zqUzUUh)!JLGdDJLFiGoVX+ok+KudX^`!m* zUWEBKL=cZ2{1ZHS?EV2>JbQ5_N!JwWBP4k<-_N{xGxK9*zU)2PdE8a%r7D+Z`QBvo z=Gka6I-Y8(qTqw;0e)3w@a4%T_3L%*r>aF9elOYAqKw^V#|LA}%A<%ghtUW8mUCBd z^pG`UK1+nnTo!Jc4A;T<1Z5&dKYVZX*9a24>5IcUD&g?0<+_5~cBR-aCd?{B#5_eA zMcQOJZMJX|hj6vsixP>h{i9-ZVohJY-q|kpERuMrh!&wJnNow+B!k^{UrQvsYjamp z@)cf2_A9Q+povLQVv@t3w*Ouxh)uB?6tB+roSG7TQB42mPlE+7#RYsyX;u7%ei2Xt zb>7sE0Sm)MoU&{p7APvO<**p$o%PjN49_@$xux7=!A3yEN(1P3JdOyq@06OSpwYGrP>Qq5V9X4e|VN=E2+y%+kckL|YAkr(LH5sde>4Wj^W;p2*@Fnj1u;!E(GwV}sWggl1 z_A~dK5Rc2Xyt(2tx-lxSFhqj}Xf)CA8`O;Bzlpz?skb)@F_);x zu&`Y8>lPRuH|4LwG7(IkS-3{P_q9;FAh6t+H{y`hm`p&CfLvA=DsP$X06BppLtK{D zmPy8J7yO;ku$fLbvqKS| z_-H7^sY8*Bkb}1X{Sh+K?hwb5A2hMyi?+G#Ms3rgPGr$=5=;+Xb(;}L?i#^hx)(&1 zdH+OZAI4i=*KGpvR`ohAExqhPlC-NBf*JV5@e+{0h6Kr*xx2WanSOB2XUWhXYKNMp HC{+0ewVCgf delta 845 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 T_C5C5efg8O@XGv6Y|j1xVu-hv diff --git a/examples/runtime/shaders/spirv/cs_drawindirect_count.bin b/examples/runtime/shaders/spirv/cs_drawindirect_count.bin index e225be9da2f37616e815d076d3df3e98c6e652c4..90f0cf67b3ee91fa20d258405b2c5ab772e69fe8 100644 GIT binary patch literal 4628 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 diff --git a/examples/runtime/shaders/wgsl/cs_drawindirect.bin b/examples/runtime/shaders/wgsl/cs_drawindirect.bin index 4d08559fb14b9dcc0a86fe35378656bfd501cf38..1d331343df23f472669abe293c1d7733ffdca023 100644 GIT binary patch delta 167 zcmX>szEQ%;IoN}n0SZ_dcuM0_iW18M5{nXZi XdKH=q+LPyVD@{JY{fR|^L4g4PFRU{2 delta 60 zcmZ1?wM|mmIoN}n0SZ_dcuM0_iW18M5{nXZizix@F-lL|n6=rSaS7LCLmqj?s>ymh KpI8JK1Q-CtBM*Q8 diff --git a/src/bgfx.cpp b/src/bgfx.cpp index a46d25ab1..92201b990 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -1257,6 +1257,7 @@ namespace bgfx "u_invModelView", "u_modelViewProj", "u_alphaRef4", + "bgfx_indirectArgBase", }; const char* getPredefinedUniformName(PredefinedUniform::Enum _enum) @@ -1626,6 +1627,7 @@ namespace bgfx m_compute.m_startMatrix = m_draw.m_startMatrix; m_compute.m_numMatrices = m_draw.m_numMatrices; + m_compute.m_startIndex = m_draw.m_startIndex; m_compute.m_numX = bx::max(_numX, 1u); m_compute.m_numY = bx::max(_numY, 1u); m_compute.m_numZ = bx::max(_numZ, 1u); diff --git a/src/bgfx_compute.sh b/src/bgfx_compute.sh index 99d1ac422..e9c8fab4e 100644 --- a/src/bgfx_compute.sh +++ b/src/bgfx_compute.sh @@ -316,6 +316,8 @@ __IMAGE_IMPL_ATOMIC(uint, x, uvec4, xxxx) ) \ _buffer[(_offset)*2+0] = uvec4(_numVertices, _numInstances, _startVertex, _startInstance) +uniform vec4 bgfx_indirectArgBase; + #define drawIndexedIndirect( \ _buffer \ , _offset \ @@ -325,7 +327,7 @@ __IMAGE_IMPL_ATOMIC(uint, x, uvec4, xxxx) , _startVertex \ , _startInstance \ ) \ - _buffer[(_offset)*2+0] = uvec4(_numIndices, _numInstances, _startIndex, _startVertex); \ + _buffer[(_offset)*2+0] = uvec4(_numIndices, _numInstances, floatBitsToUint(bgfx_indirectArgBase.x) + uint(_startIndex), _startVertex); \ _buffer[(_offset)*2+1] = uvec4(_startInstance, 0u, 0u, 0u) #endif // __cplusplus diff --git a/src/bgfx_p.h b/src/bgfx_p.h index ec46641f0..86e2539c1 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -978,6 +978,8 @@ namespace bgfx InvModelView, ModelViewProj, AlphaRef, + IndirectArgBase, + Count }; @@ -2161,11 +2163,13 @@ namespace bgfx m_startIndirect = 0; m_numIndirect = UINT32_MAX; m_bindIdx = 0; + m_startIndex = 0; } uint32_t m_uniformBegin; uint32_t m_uniformEnd; uint32_t m_startMatrix; + uint32_t m_startIndex; IndirectBufferHandle m_indirectBuffer; uint32_t m_numX; diff --git a/src/renderer.h b/src/renderer.h index 784b13569..81cbcfbfb 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -316,6 +316,17 @@ namespace bgfx } break; + case PredefinedUniform::IndirectArgBase: + { + const float base[4] = { bx::bitsToFloat(_draw.m_startIndex), 0.0f, 0.0f, 0.0f }; + _renderer->setShaderUniform4f(flags + , predefined.m_loc + , base + , 1 + ); + } + break; + default: BX_ASSERT(false, "predefined %d not handled", predefined.m_type); break; diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index 9eaae3500..70b70155d 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -357,6 +357,7 @@ namespace bgfx { namespace wgpu static const char* s_adapterType[] = { + /* WGPUAdapterType starts from 1 */ NULL, "DiscreteGPU", "IntegratedGPU", "CPU", diff --git a/src/renderer_webgpu.h b/src/renderer_webgpu.h index dabb0eff9..5683d733b 100644 --- a/src/renderer_webgpu.h +++ b/src/renderer_webgpu.h @@ -224,8 +224,8 @@ WGPU_IMPORT_FUNC(false, RenderPassEncoderEndOcclusionQuery); \ WGPU_IGNORE_____(false, RenderPassEncoderExecuteBundles); \ WGPU_IMPORT_FUNC(false, RenderPassEncoderInsertDebugMarker); \ - WGPU_IMPORT_FUNC(false, RenderPassEncoderMultiDrawIndexedIndirect); \ - WGPU_IMPORT_FUNC(false, RenderPassEncoderMultiDrawIndirect); \ + WGPU_IGNORE_____(false, RenderPassEncoderMultiDrawIndexedIndirect); \ + WGPU_IGNORE_____(false, RenderPassEncoderMultiDrawIndirect); \ WGPU_IGNORE_____(false, RenderPassEncoderPixelLocalStorageBarrier); \ WGPU_IMPORT_FUNC(false, RenderPassEncoderPopDebugGroup); \ WGPU_IMPORT_FUNC(false, RenderPassEncoderPushDebugGroup); \