From 6e68f76456dd2800292aadc3b9f70bc618b41751 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 31 Dec 2022 16:01:11 +0100 Subject: [PATCH] Fill stats and draw count buffer with zeroes Fixes #748 --- data/shaders/glsl/computecullandlod/cull.comp | 10 --------- .../glsl/computecullandlod/cull.comp.spv | Bin 5540 -> 5060 bytes .../computecullandlod/computecullandlod.cpp | 21 ++++++++++++++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/data/shaders/glsl/computecullandlod/cull.comp b/data/shaders/glsl/computecullandlod/cull.comp index 95668391..a804c822 100644 --- a/data/shaders/glsl/computecullandlod/cull.comp +++ b/data/shaders/glsl/computecullandlod/cull.comp @@ -78,16 +78,6 @@ void main() { uint idx = gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x; - // Clear stats on first invocation - if (idx == 0) - { - atomicExchange(uboOut.drawCount, 0); - for (uint i = 0; i < MAX_LOD_LEVEL + 1; i++) - { - atomicExchange(uboOut.lodCount[i], 0); - } - } - vec4 pos = vec4(instances[idx].pos.xyz, 1.0); // Check if object is within current viewing frustum diff --git a/data/shaders/glsl/computecullandlod/cull.comp.spv b/data/shaders/glsl/computecullandlod/cull.comp.spv index 2191acc7e0ae28a521807fd0812a741311647f60..a90380f98bd809212ba6143eb3c67117899925ed 100644 GIT binary patch literal 5060 zcmZ9P>w8qy6^BnqW{7|&f{KbU5w%_@r2?&%f<%HLH5x4S(u)m;nF)?eGI1so>D8!+ z*0$=?+SXeyw)VUI=4bz${sFD_dD^G%d(K|w!1h_JwSMcm*WUYN9Nw^dW0nnNo3hdD z?^(IFWg9@UY;#sG`1I_l*}eUh=H3Gb_vx`U8!jC6xhmV3)!-x0V%}cT@J(n6x|(?L zZG~)=l7@-jfcz;y4UcMUjXt(wTj&k?D}%*j&$Jrn?p$3saA@JHhk)@P&bGjpyZs{e zO5|SNY!CXS?HcrU@|%D^{@@&4)H7w*ahQV_marddelbw92rOm!}!v|-&g?vA9yLldYw3x@)&ir(zdnWJ9EUk7Mxed%X zqZ&Eo*dHA%KH2S^o9=Z7%cd;yJPa@QTF)Lqo>}Uz5#Ruk6lG23I^ z#l?K7SoLxLwbff`ou6A+=(otW zZu1_cm~u$yH8M8f(cDxof4~Nsb1(nS(6&o{pjajJKbi$#cX{n+?OKWGkUJ{nQg7M3;`L=>^1K51!Q_C zW~A)8bVl_|yqs%w-X-o#o9!<~L!MgU?@Z^H^QMp6GrtI@j-?A9br<~?n0>ugLfJI_ ze4 zuiBToeYvcWm*N-kfkoYsieJoRw1Qd3+V&T*#)x@-_HYJn&pRN`vjKPA02vdyF)sHY zHeARf#oMXw!MEfd?9u$*XJwcAIk@$r_u}%SM}BLHRrhF3v8d@=s@7Durgq~mz+Kgx zV%41Cclq4(Gmo*(&7NO@ub*rAW`MG|9~V_vQO|zG%wxRor`oT&{W=5fAHltU&U`z! z)}AJaHeUHUBSdP&a;@e?4>$8Ilo8S}7#Tv@`>vJu>-h**ysNf^T z-|u*D_aysvY_8C6L^k(M>^H;pw-@t`!N(z&{_3|t`tL#?hwCpk208&ZN8}ktb`Q?0 zoI{o!O1kqEi#~2cc1HT&k!u$W<_dY0M_ahHMcO~0FWb@nyH-~*Y>u)4E z>iEONIC1+@_xm9h`#p^8GT#xnHuHsjGGP%vmGrQmK=)j%KMQv+)*nOnTNK#Mpnh}2 z#*qECs9X0W+*yfPN8Rs>nD$diHkWm+@dT7*YY&VufgH)6FDGlB0Wa<4w?N&TO}P0R zkTuo)9z@NvNjB%b*xh6K_b$s0(1H51&|1PhBkzpg3}du8gHF=Lt?TaGfn1*dXCO7WIlZU;?)0vz`=%ehO!xO(*nRI$S9Ih3 z4H9GS$h+;l4pYN99)-li=RstB>^pppA&ZC4apbAOzV7o7y7&cZnRgm8 zPCT%gggckDvZaAjb^OB0mGQAos3qKV(hu^1jtF{ko9vM!$d3t>>}~ ziI?YFa$~(azA5EC+&l6)eemtnaxqJT!B<9<6 zuj&KHT*fL#>`#$nucwfI2E}=6b1(XO-am)5doS;RuR*(^7a)B+pBJGuXpR?U%uA4% z#LDn`29ZuZYokn){9~OA|UHvPv z`-ooth8(?UGq=5no2#1VH2QzJnfF2d-S7=%1G5`Po literal 5540 zcmZ9O`FoUC702IfLs}?>(giAwiB#-@hy}EWrKAalXxdP_x~4;B0#hcLIFm_1Z9A!z z*1fH`i`MN?tF5hT^+*2~fAJ4+dmerKeBSpSc;WIK&N<(+-gEDLCjg2Ik zA-AiwMz>Sgu0d}kzcKhj_sr5oB~x}Sw_A_b=T{mnIt|>u7F)G?bG1=_0y%JdoUbm{ z+tp)K6JM9-arddeW6kPPU7LOFfOn6#a`^yqqjnm3IG@Lf=G;`Xb-db~URrI{+|3p-2n) zi{5g~zRwp>HiiEvas}E19Yr65yZlBR<^RxqE3Puehv_s|C!AMYjN1Jf=Rd(f{xVX+4>>*yCV{x0&x85eH`D8C=(jyDta>{rY@_Urp8 z_p5Hd#l0BJ{*3H>+Xii+BYPSn+IZ#bk*q%o-9VJ@LEZRK{7c=h9u0$WB zPirXaug`V(dM2Y#U(N^f-|~2Gw^H&nw-@t`z(*mM{_1aq^xuv? z3fEt31au5;j>t2L>>iv~F^4QWm~`hW7Jb}|?2Po^nQZ3PZoOTQ>o&aH_Z}!>_agT} zw-Qx&>KsHjPTaoK{eFnWe(yqdnePx>oB6^%p0J3YOnTUlqI)iP z5HI)p<9Bi&yHY;}^&oNg;avSDSwq_hy5Aagar<}x?(D>^tL`^PO#4GgHYV!KA@`uD zBd+~1s0V3xug>Wt+?hKk>-((=>?TmZQ(_~?evj0x+l1SLn0=}HO^Uu+Nj8`Bu|^xp zvfkYzoYa#@_H;Q}^C|GcUVJ~)t=WT{|7pmY>T8f#?D09|9^~HLW8hyy?m>aulV@@c zGTuAwHzfM8U&(&_juf`y`=D+=--jFPH^Y9^&nHa#50h-3U1am_`OWa2j3;^zH^dx+ zkjr!U7l`-9oZjmLkas(D|0WE582Q9yx__sI-S5Sjl5W1Um+8+ZeVnR?kne_k8_w@8 zdT=I(A@T6J2U#EY5k3>h;^A`yc`~tkhVii z$(e{n?GGV~y@LOh@EJ(VJ^T~@`{1tsupe#rLSoKZ*`9q%4@17MEzsYXqCGwWi5Gh< za@vFEVE%uT<0Ei$$^Su(kHJ3By_B{{Tx8D_Q(R&S9Te)}pu{U$dBWE4ioH6qSWHEEbe#OfBwKw&cr9AR2A$um{ z%+c?`GUPYH*=m#PdlLRBNc;WFq5|(E40ZuqNmySA>n5xpevCTa`&Gzz{k8kuv47u* zHf!p48WPjyn^9Lj12^UXop_f%4Q+(<(dK>nEZpTeY5xrLN648f#|)l9jv07PpM%yQ z_pWU(WKD6;DDL62$Z-$VrJ@4S0KJzMZfMxcT*u-hP1WzPyWmmtTg?L-wRC>YC?A z(96)9^yc~h7&5oGXa7^U%Xw(~2_)t`l%wX)kgXYKr0(2fcE+fCCdSGm_UFjP##{Ua zve;h8eA>i}k8?I}#Qzf6vk3haWbcXl_a6QViv4SI4&nRjWDnn0(btlXd7YI#i0d11 zuOXLf{sz5V^L6y7sm;Aa>>J41qvmgsqo#T7&zj=;M%?d^iyFmu@b~BsLgv;MZ|4ul z+QuQ@huqouj-9=4H*)?7IqtEudJ~FXw3*vp#LZRCW4`}#Gw+1_ZTJ3cgk0;P_YyY@ z-;m@h;8#KRa5dcD_|5QZAm4y>l(#_ExfZUk+&6ta{07LSeJfnM-2H5VZ-dP7M(XD+ z3A+*Q9ag^%GMBN+##(mzm> zUNWG`IHk diff --git a/examples/computecullandlod/computecullandlod.cpp b/examples/computecullandlod/computecullandlod.cpp index 5b5296d5..c9ce4c3f 100644 --- a/examples/computecullandlod/computecullandlod.cpp +++ b/examples/computecullandlod/computecullandlod.cpp @@ -1,7 +1,7 @@ /* * Vulkan Example - Compute shader culling and LOD using indirect rendering * -* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de +* Copyright (C) 2016-2022 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) * @@ -282,6 +282,23 @@ public: vkCmdBindPipeline(compute.commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipeline); vkCmdBindDescriptorSets(compute.commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipelineLayout, 0, 1, &compute.descriptorSet, 0, 0); + // Clear the buffer that the compute shader pass will write statistics and draw calls to + vkCmdFillBuffer(compute.commandBuffer, indirectDrawCountBuffer.buffer, 0, indirectCommandsBuffer.descriptor.range, 0); + + // This barrier ensures that the fill command is finished before the compute shader can start writing to the buffer + VkMemoryBarrier memoryBarrier = vks::initializers::memoryBarrier(); + memoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + memoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier( + compute.commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + VK_FLAGS_NONE, + 1, &memoryBarrier, + 0, nullptr, + 0, nullptr); + // Dispatch the compute job // The compute shader will do the frustum culling and adjust the indirect draw calls depending on object visibility. // It also determines the lod to use depending on distance to the viewer. @@ -460,7 +477,7 @@ public: stagingBuffer.destroy(); VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &indirectDrawCountBuffer, sizeof(indirectStats)));