From daae414c35986cc1de7662468684d1ae53fbe447 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 5 Jan 2024 22:38:56 +0100 Subject: [PATCH] Fix some bugs in meshlet viewer. --- tests/assets/shaders/meshlet_cull.comp | 2 + tests/assets/shaders/meshlet_debug.mesh | 2 + tests/assets/shaders/meshlet_debug.task | 2 + tests/assets/shaders/meshlet_debug_plain.mesh | 2 + tests/meshlet_viewer.cpp | 37 +++++++++++++------ 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/tests/assets/shaders/meshlet_cull.comp b/tests/assets/shaders/meshlet_cull.comp index 7aa3da6c..ce7b7e89 100644 --- a/tests/assets/shaders/meshlet_cull.comp +++ b/tests/assets/shaders/meshlet_cull.comp @@ -12,7 +12,9 @@ layout(local_size_x = 32) in; #if MESHLET_RENDER_PHASE == 2 #define MESHLET_RENDER_HIZ_BINDING 8 #endif +#if MESHLET_RENDER_PHASE >= 1 #define MESHLET_RENDER_OCCLUDER_BINDING 9 +#endif #define MESHLET_RENDER_TASKS_BINDING 2 #include "meshlet_render.h" diff --git a/tests/assets/shaders/meshlet_debug.mesh b/tests/assets/shaders/meshlet_debug.mesh index 7006a172..f88c754d 100644 --- a/tests/assets/shaders/meshlet_debug.mesh +++ b/tests/assets/shaders/meshlet_debug.mesh @@ -147,10 +147,12 @@ void main() vTangent[out_vert_index] = vec4(mat3(M) * NT[1].xyz, NT[1].w); } +#if 0 if (gl_LocalInvocationIndex == 0) { atomicAdd(stats.invocations, gl_WorkGroupSize.x * gl_WorkGroupSize.y); atomicAdd(stats.prim, shared_active_prim_count_total); atomicAdd(stats.vert, shared_active_vert_count_total); } +#endif } diff --git a/tests/assets/shaders/meshlet_debug.task b/tests/assets/shaders/meshlet_debug.task index 0fc09a8a..54741e97 100644 --- a/tests/assets/shaders/meshlet_debug.task +++ b/tests/assets/shaders/meshlet_debug.task @@ -15,7 +15,9 @@ layout(local_size_x = 32) in; #if MESHLET_RENDER_PHASE == 2 #define MESHLET_RENDER_HIZ_BINDING 11 #endif +#if MESHLET_RENDER_PHASE >= 1 #define MESHLET_RENDER_OCCLUDER_BINDING 12 +#endif #include "meshlet_render.h" diff --git a/tests/assets/shaders/meshlet_debug_plain.mesh b/tests/assets/shaders/meshlet_debug_plain.mesh index 1fce6442..f20e3895 100644 --- a/tests/assets/shaders/meshlet_debug_plain.mesh +++ b/tests/assets/shaders/meshlet_debug_plain.mesh @@ -173,10 +173,12 @@ void main() vDrawID[gl_LocalInvocationIndex] = task.meshlet_index; } +#if 0 if (gl_LocalInvocationIndex == 0) { atomicAdd(stats.invocations, gl_WorkGroupSize.x * gl_WorkGroupSize.y); atomicAdd(stats.prim, shared_active_prim_count_total); atomicAdd(stats.vert, shared_active_vert_count_total); } +#endif } diff --git a/tests/meshlet_viewer.cpp b/tests/meshlet_viewer.cpp index 84236202..6ad09370 100644 --- a/tests/meshlet_viewer.cpp +++ b/tests/meshlet_viewer.cpp @@ -1016,30 +1016,43 @@ struct MeshletViewerApplication : Granite::Application, Granite::EventHandler // auto encoding = device.get_resource_manager().get_mesh_encoding(); if (encoding != ResourceManager::MeshEncoding::Classic) { - if (readback_fence[readback_index] && - readback_ring_phase1[readback_index] && - readback_ring_phase2[readback_index]) + if (readback_fence[readback_index]) { readback_fence[readback_index]->wait(); - auto *mapped1 = static_cast( - device.map_host_buffer(*readback_ring_phase1[readback_index], - MEMORY_ACCESS_READ_BIT)); - auto *mapped2 = static_cast( - device.map_host_buffer(*readback_ring_phase2[readback_index], - MEMORY_ACCESS_READ_BIT)); + auto &ring1 = readback_ring_phase1[readback_index]; + auto &ring2 = readback_ring_phase2[readback_index]; + + auto *mapped1 = ring1 ? static_cast( + device.map_host_buffer(*ring1, MEMORY_ACCESS_READ_BIT)) : nullptr; + auto *mapped2 = ring2 ? static_cast( + device.map_host_buffer(*ring2, MEMORY_ACCESS_READ_BIT)) : nullptr; if (encoding != ResourceManager::MeshEncoding::VBOAndIBOMDI) { - last_mesh_invocations = mapped1[0] + mapped2[0]; - last_prim = mapped1[1] + mapped2[1]; - last_vert = mapped1[2] + mapped2[2]; + last_mesh_invocations = 0; + last_prim = 0; + last_vert = 0; + + const auto accum_draws = [&](const uint32_t *mapped) { + if (mapped) + { + last_mesh_invocations += mapped[0]; + last_prim += mapped[1]; + last_vert += mapped[2]; + } + }; + + accum_draws(mapped1); + accum_draws(mapped2); } else { last_mesh_invocations = 0; const auto accum_draws = [&](const uint32_t *mapped) { + if (!mapped) + return; uint32_t draws = mapped[0]; mapped += 256 / sizeof(uint32_t);