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); }