1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 13:54:16 +01:00

[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.
This commit is contained in:
Philip Rebohle 2025-02-21 23:02:12 +01:00 committed by Philip Rebohle
parent a0ea29a2fa
commit c69dbc4490
2 changed files with 22 additions and 28 deletions

View File

@ -485,7 +485,6 @@ namespace dxvk {
void cmdBeginRendering( void cmdBeginRendering(
const VkRenderingInfo* pRenderingInfo) { const VkRenderingInfo* pRenderingInfo) {
m_cmd.execCommands = true; m_cmd.execCommands = true;
m_statCounters.addCtr(DxvkStatCounter::CmdRenderPassCount, 1);
m_vkd->vkCmdBeginRendering(getCmdBuffer(), pRenderingInfo); m_vkd->vkCmdBeginRendering(getCmdBuffer(), pRenderingInfo);
} }
@ -694,7 +693,6 @@ namespace dxvk {
uint32_t y, uint32_t y,
uint32_t z) { uint32_t z) {
m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer; m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer;
m_statCounters.addCtr(DxvkStatCounter::CmdDispatchCalls, 1);
m_vkd->vkCmdDispatch(getCmdBuffer(cmdBuffer), x, y, z); m_vkd->vkCmdDispatch(getCmdBuffer(cmdBuffer), x, y, z);
} }
@ -705,7 +703,6 @@ namespace dxvk {
VkBuffer buffer, VkBuffer buffer,
VkDeviceSize offset) { VkDeviceSize offset) {
m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer; m_cmd.execCommands |= cmdBuffer == DxvkCmdBuffer::ExecBuffer;
m_statCounters.addCtr(DxvkStatCounter::CmdDispatchCalls, 1);
m_vkd->vkCmdDispatchIndirect(getCmdBuffer(cmdBuffer), buffer, offset); m_vkd->vkCmdDispatchIndirect(getCmdBuffer(cmdBuffer), buffer, offset);
} }
@ -716,8 +713,6 @@ namespace dxvk {
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstVertex, uint32_t firstVertex,
uint32_t firstInstance) { uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDraw(getCmdBuffer(), m_vkd->vkCmdDraw(getCmdBuffer(),
vertexCount, instanceCount, vertexCount, instanceCount,
firstVertex, firstInstance); firstVertex, firstInstance);
@ -729,9 +724,6 @@ namespace dxvk {
const VkMultiDrawInfoEXT* drawInfos, const VkMultiDrawInfoEXT* drawInfos,
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstInstance) { uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1u);
m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u);
m_vkd->vkCmdDrawMultiEXT(getCmdBuffer(), m_vkd->vkCmdDrawMultiEXT(getCmdBuffer(),
drawCount, drawInfos, instanceCount, firstInstance, sizeof(*drawInfos)); drawCount, drawInfos, instanceCount, firstInstance, sizeof(*drawInfos));
} }
@ -742,9 +734,6 @@ namespace dxvk {
VkDeviceSize offset, VkDeviceSize offset,
uint32_t drawCount, uint32_t drawCount,
uint32_t stride) { uint32_t stride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u);
m_vkd->vkCmdDrawIndirect(getCmdBuffer(), m_vkd->vkCmdDrawIndirect(getCmdBuffer(),
buffer, offset, drawCount, stride); buffer, offset, drawCount, stride);
} }
@ -757,8 +746,6 @@ namespace dxvk {
VkDeviceSize countOffset, VkDeviceSize countOffset,
uint32_t maxDrawCount, uint32_t maxDrawCount,
uint32_t stride) { uint32_t stride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), buffer, m_vkd->vkCmdDrawIndirectCount(getCmdBuffer(), buffer,
offset, countBuffer, countOffset, maxDrawCount, stride); offset, countBuffer, countOffset, maxDrawCount, stride);
} }
@ -770,8 +757,6 @@ namespace dxvk {
uint32_t firstIndex, uint32_t firstIndex,
int32_t vertexOffset, int32_t vertexOffset,
uint32_t firstInstance) { uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawIndexed(getCmdBuffer(), m_vkd->vkCmdDrawIndexed(getCmdBuffer(),
indexCount, instanceCount, indexCount, instanceCount,
firstIndex, vertexOffset, firstIndex, vertexOffset,
@ -784,9 +769,6 @@ namespace dxvk {
const VkMultiDrawIndexedInfoEXT* drawInfos, const VkMultiDrawIndexedInfoEXT* drawInfos,
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstInstance) { uint32_t firstInstance) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u);
m_vkd->vkCmdDrawMultiIndexedEXT(getCmdBuffer(), drawCount, m_vkd->vkCmdDrawMultiIndexedEXT(getCmdBuffer(), drawCount,
drawInfos, instanceCount, firstInstance, sizeof(*drawInfos), nullptr); drawInfos, instanceCount, firstInstance, sizeof(*drawInfos), nullptr);
} }
@ -797,9 +779,6 @@ namespace dxvk {
VkDeviceSize offset, VkDeviceSize offset,
uint32_t drawCount, uint32_t drawCount,
uint32_t stride) { uint32_t stride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_statCounters.addCtr(DxvkStatCounter::CmdDrawsMerged, drawCount - 1u);
m_vkd->vkCmdDrawIndexedIndirect(getCmdBuffer(), m_vkd->vkCmdDrawIndexedIndirect(getCmdBuffer(),
buffer, offset, drawCount, stride); buffer, offset, drawCount, stride);
} }
@ -812,8 +791,6 @@ namespace dxvk {
VkDeviceSize countOffset, VkDeviceSize countOffset,
uint32_t maxDrawCount, uint32_t maxDrawCount,
uint32_t stride) { uint32_t stride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawIndexedIndirectCount(getCmdBuffer(), m_vkd->vkCmdDrawIndexedIndirectCount(getCmdBuffer(),
buffer, offset, countBuffer, countOffset, maxDrawCount, stride); buffer, offset, countBuffer, countOffset, maxDrawCount, stride);
} }
@ -826,8 +803,6 @@ namespace dxvk {
VkDeviceSize counterBufferOffset, VkDeviceSize counterBufferOffset,
uint32_t counterOffset, uint32_t counterOffset,
uint32_t vertexStride) { uint32_t vertexStride) {
m_statCounters.addCtr(DxvkStatCounter::CmdDrawCalls, 1);
m_vkd->vkCmdDrawIndirectByteCountEXT(getCmdBuffer(), m_vkd->vkCmdDrawIndirectByteCountEXT(getCmdBuffer(),
instanceCount, firstInstance, counterBuffer, instanceCount, firstInstance, counterBuffer,
counterBufferOffset, counterOffset, vertexStride); counterBufferOffset, counterOffset, vertexStride);

View File

@ -892,6 +892,7 @@ namespace dxvk {
VK_QUERY_TYPE_PIPELINE_STATISTICS); VK_QUERY_TYPE_PIPELINE_STATISTICS);
m_cmd->cmdDispatch(DxvkCmdBuffer::ExecBuffer, x, y, z); m_cmd->cmdDispatch(DxvkCmdBuffer::ExecBuffer, x, y, z);
m_cmd->addStatCtr(DxvkStatCounter::CmdDispatchCalls, 1u);
m_queryManager.endQueries(m_cmd, m_queryManager.endQueries(m_cmd,
VK_QUERY_TYPE_PIPELINE_STATISTICS); VK_QUERY_TYPE_PIPELINE_STATISTICS);
@ -915,6 +916,7 @@ namespace dxvk {
m_cmd->cmdDispatchIndirect(DxvkCmdBuffer::ExecBuffer, m_cmd->cmdDispatchIndirect(DxvkCmdBuffer::ExecBuffer,
bufferSlice.handle, bufferSlice.offset); bufferSlice.handle, bufferSlice.offset);
m_cmd->addStatCtr(DxvkStatCounter::CmdDispatchCalls, 1u);
m_queryManager.endQueries(m_cmd, m_queryManager.endQueries(m_cmd,
VK_QUERY_TYPE_PIPELINE_STATISTICS); VK_QUERY_TYPE_PIPELINE_STATISTICS);
@ -986,6 +988,7 @@ namespace dxvk {
m_cmd->cmdDrawIndirectVertexCount(1, 0, m_cmd->cmdDrawIndirectVertexCount(1, 0,
physSlice.handle, physSlice.offset + counterOffset, physSlice.handle, physSlice.offset + counterOffset,
counterBias, counterDivisor); counterBias, counterDivisor);
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u);
// The count will generally be written from streamout // The count will generally be written from streamout
if (likely(m_state.id.cntBuffer.buffer()->hasGfxStores())) if (likely(m_state.id.cntBuffer.buffer()->hasGfxStores()))
@ -1694,6 +1697,8 @@ namespace dxvk {
m_cmd->cmdDraw(draws->vertexCount, draws->instanceCount, m_cmd->cmdDraw(draws->vertexCount, draws->instanceCount,
draws->firstVertex, draws->firstInstance); draws->firstVertex, draws->firstInstance);
} }
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u);
} else if (unlikely(needsDrawBarriers())) { } else if (unlikely(needsDrawBarriers())) {
// If the current pipeline has storage resource hazards, // If the current pipeline has storage resource hazards,
// unroll draws and insert a barrier after each one. // unroll draws and insert a barrier after each one.
@ -1709,6 +1714,8 @@ namespace dxvk {
draws[i].firstVertex, draws[i].firstInstance); draws[i].firstVertex, draws[i].firstInstance);
} }
} }
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, count);
} else { } else {
using MultiDrawInfo = std::conditional_t<Indexed, using MultiDrawInfo = std::conditional_t<Indexed,
VkMultiDrawIndexedInfoEXT, VkMultiDrawInfoEXT>; VkMultiDrawIndexedInfoEXT, VkMultiDrawInfoEXT>;
@ -1782,6 +1789,9 @@ namespace dxvk {
m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer);
} }
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawCalls, 1u);
m_cmd->addStatCtr(DxvkStatCounter::CmdDrawsMerged, batchSize - 1u);
batchSize = 0u; batchSize = 0u;
} }
} }
@ -1821,6 +1831,9 @@ namespace dxvk {
descriptor.buffer.offset + offset, step, stride); 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())) { if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) {
accessDrawBuffer(offset, step, stride, Indexed accessDrawBuffer(offset, step, stride, Indexed
? sizeof(VkDrawIndexedIndirectCommand) ? sizeof(VkDrawIndexedIndirectCommand)
@ -1859,6 +1872,10 @@ namespace dxvk {
maxCount, stride); 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())) { if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) {
accessDrawBuffer(offset, maxCount, stride, Indexed accessDrawBuffer(offset, maxCount, stride, Indexed
? sizeof(VkDrawIndexedIndirectCommand) ? sizeof(VkDrawIndexedIndirectCommand)
@ -5639,6 +5656,8 @@ namespace dxvk {
for (uint32_t i = 0; i < framebufferInfo.numAttachments(); i++) for (uint32_t i = 0; i < framebufferInfo.numAttachments(); i++)
m_cmd->track(framebufferInfo.getAttachment(i).view->image(), DxvkAccess::Write); m_cmd->track(framebufferInfo.getAttachment(i).view->image(), DxvkAccess::Write);
m_cmd->addStatCtr(DxvkStatCounter::CmdRenderPassCount, 1u);
} }