From c69dbc4490b178000bad86f07999046a448a6c66 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 21 Feb 2025 23:02:12 +0100 Subject: [PATCH] [dxvk] Move draw and dispatch stat counters back to the context Otherwise we'll count the HUD by accident. Only keep the barrier counter since there are so many different places where we issue pipeline barriers, and they are interesting anyway. --- src/dxvk/dxvk_cmdlist.h | 25 ------------------------- src/dxvk/dxvk_context.cpp | 25 ++++++++++++++++++++++--- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index cdf7fe9a8..6d99b816e 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -485,7 +485,6 @@ namespace dxvk { void cmdBeginRendering( const VkRenderingInfo* pRenderingInfo) { m_cmd.execCommands = true; - m_statCounters.addCtr(DxvkStatCounter::CmdRenderPassCount, 1); m_vkd->vkCmdBeginRendering(getCmdBuffer(), pRenderingInfo); } @@ -694,7 +693,6 @@ namespace dxvk { uint32_t y, uint32_t z) { m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer; - m_statCounters.addCtr(DxvkStatCounter::CmdDispatchCalls, 1); m_vkd->vkCmdDispatch(getCmdBuffer(cmdBuffer), x, y, z); } @@ -705,7 +703,6 @@ namespace dxvk { VkBuffer buffer, VkDeviceSize offset) { m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer; - m_statCounters.addCtr(DxvkStatCounter::CmdDispatchCalls, 1); m_vkd->vkCmdDispatchIndirect(getCmdBuffer(cmdBuffer), buffer, offset); } @@ -716,8 +713,6 @@ namespace dxvk { uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_vkd->vkCmdDraw(getCmdBuffer(), vertexCount, instanceCount, firstVertex, firstInstance); @@ -729,9 +724,6 @@ namespace dxvk { const VkMultiDrawInfoEXT* drawInfos, uint32_t instanceCount, uint32_t firstInstance) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1u); - m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u); - m_vkd->vkCmdDrawMultiEXT(getCmdBuffer(), drawCount, drawInfos, instanceCount, firstInstance, sizeof(*drawInfos)); } @@ -742,9 +734,6 @@ namespace dxvk { VkDeviceSize offset, uint32_t drawCount, uint32_t stride) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u); - m_vkd->vkCmdDrawIndirect(getCmdBuffer(), buffer, offset, drawCount, stride); } @@ -757,8 +746,6 @@ namespace dxvk { VkDeviceSize countOffset, uint32_t maxDrawCount, uint32_t stride) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), buffer, offset, countBuffer, countOffset, maxDrawCount, stride); } @@ -770,8 +757,6 @@ namespace dxvk { uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_vkd->vkCmdDrawIndexed(getCmdBuffer(), indexCount, instanceCount, firstIndex, vertexOffset, @@ -784,9 +769,6 @@ namespace dxvk { const VkMultiDrawIndexedInfoEXT* drawInfos, uint32_t instanceCount, uint32_t firstInstance) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u); - m_vkd->vkCmdDrawMultiIndexedEXT(getCmdBuffer(), drawCount, drawInfos, instanceCount, firstInstance, sizeof(*drawInfos), nullptr); } @@ -797,9 +779,6 @@ namespace dxvk { VkDeviceSize offset, uint32_t drawCount, uint32_t stride) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u); - m_vkd->vkCmdDrawIndexedIndirect(getCmdBuffer(), buffer, offset, drawCount, stride); } @@ -812,8 +791,6 @@ namespace dxvk { VkDeviceSize countOffset, uint32_t maxDrawCount, uint32_t stride) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_vkd->vkCmdDrawIndexedIndirectCount(getCmdBuffer(), buffer, offset, countBuffer, countOffset, maxDrawCount, stride); } @@ -826,8 +803,6 @@ namespace dxvk { VkDeviceSize counterBufferOffset, uint32_t counterOffset, uint32_t vertexStride) { - m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1); - m_vkd->vkCmdDrawIndirectByteCountEXT(getCmdBuffer(), instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride); diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index d4ad98b09..7a7b78243 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -892,7 +892,8 @@ namespace dxvk { VK_QUERY_TYPE_PIPELINE_STATISTICS); m_cmd->cmdDispatch(DxvkCmdBuffer::ExecBuffer, x, y, z); - + m_cmd->addStatCtr(DxvkStatCounter::CmdDispatchCalls, 1u); + m_queryManager.endQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS); } @@ -912,10 +913,11 @@ namespace dxvk { if (this->commitComputeState()) { m_queryManager.beginQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS); - + m_cmd->cmdDispatchIndirect(DxvkCmdBuffer::ExecBuffer, bufferSlice.handle, bufferSlice.offset); - + m_cmd->addStatCtr(DxvkStatCounter::CmdDispatchCalls, 1u); + m_queryManager.endQueries(m_cmd, VK_QUERY_TYPE_PIPELINE_STATISTICS); @@ -986,6 +988,7 @@ namespace dxvk { m_cmd->cmdDrawIndirectVertexCount(1, 0, physSlice.handle, physSlice.offset + counterOffset, counterBias, counterDivisor); + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u); // The count will generally be written from streamout if (likely(m_state.id.cntBuffer.buffer()->hasGfxStores())) @@ -1694,6 +1697,8 @@ namespace dxvk { m_cmd->cmdDraw(draws->vertexCount, draws->instanceCount, draws->firstVertex, draws->firstInstance); } + + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u); } else if (unlikely(needsDrawBarriers())) { // If the current pipeline has storage resource hazards, // unroll draws and insert a barrier after each one. @@ -1709,6 +1714,8 @@ namespace dxvk { draws[i].firstVertex, draws[i].firstInstance); } } + + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, count); } else { using MultiDrawInfo = std::conditional_t; @@ -1782,6 +1789,9 @@ namespace dxvk { m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); } + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u); + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawsMerged, batchSize - 1u); + batchSize = 0u; } } @@ -1821,6 +1831,9 @@ namespace dxvk { descriptor.buffer.offset + offset, step, stride); } + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u); + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawsMerged, step - 1u); + if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) { accessDrawBuffer(offset, step, stride, Indexed ? sizeof(VkDrawIndexedIndirectCommand) @@ -1859,6 +1872,10 @@ namespace dxvk { maxCount, stride); } + // Can't meaningfully estimate the draw count here since the + // maximum draw count may be based on the draw buffer size + m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u); + if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) { accessDrawBuffer(offset, maxCount, stride, Indexed ? sizeof(VkDrawIndexedIndirectCommand) @@ -5639,6 +5656,8 @@ namespace dxvk { for (uint32_t i = 0; i < framebufferInfo.numAttachments(); i++) m_cmd->track(framebufferInfo.getAttachment(i).view->image(), DxvkAccess::Write); + + m_cmd->addStatCtr(DxvkStatCounter::CmdRenderPassCount, 1u); }