diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 3ccf3835c..e14720e2f 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -948,23 +948,7 @@ namespace dxvk { VkDeviceSize countOffset, uint32_t maxCount, uint32_t stride) { - if (this->commitGraphicsState()) { - auto argDescriptor = m_state.id.argBuffer.getDescriptor(); - auto cntDescriptor = m_state.id.cntBuffer.getDescriptor(); - - m_cmd->cmdDrawIndirectCount( - argDescriptor.buffer.buffer, - argDescriptor.buffer.offset + offset, - cntDescriptor.buffer.buffer, - cntDescriptor.buffer.offset + countOffset, - maxCount, stride); - - if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) - accessDrawBuffer(offset, maxCount, stride, sizeof(VkDrawIndirectCommand)); - - if (unlikely(m_state.id.cntBuffer.buffer()->hasGfxStores())) - accessDrawCountBuffer(countOffset); - } + drawIndirectCountGeneric(offset, countOffset, maxCount, stride); } @@ -997,26 +981,10 @@ namespace dxvk { VkDeviceSize countOffset, uint32_t maxCount, uint32_t stride) { - if (this->commitGraphicsState()) { - auto argDescriptor = m_state.id.argBuffer.getDescriptor(); - auto cntDescriptor = m_state.id.cntBuffer.getDescriptor(); - - m_cmd->cmdDrawIndexedIndirectCount( - argDescriptor.buffer.buffer, - argDescriptor.buffer.offset + offset, - cntDescriptor.buffer.buffer, - cntDescriptor.buffer.offset + countOffset, - maxCount, stride); - - if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) - accessDrawBuffer(offset, maxCount, stride, sizeof(VkDrawIndexedIndirectCommand)); - - if (unlikely(m_state.id.cntBuffer.buffer()->hasGfxStores())) - accessDrawCountBuffer(countOffset); - } + drawIndirectCountGeneric(offset, countOffset, maxCount, stride); } - - + + void DxvkContext::drawIndirectXfb( VkDeviceSize counterOffset, uint32_t counterDivisor, @@ -1767,6 +1735,44 @@ namespace dxvk { } + template + void DxvkContext::drawIndirectCountGeneric( + VkDeviceSize offset, + VkDeviceSize countOffset, + uint32_t maxCount, + uint32_t stride) { + if (this->commitGraphicsState()) { + auto argDescriptor = m_state.id.argBuffer.getDescriptor(); + auto cntDescriptor = m_state.id.cntBuffer.getDescriptor(); + + if (Indexed) { + m_cmd->cmdDrawIndexedIndirectCount( + argDescriptor.buffer.buffer, + argDescriptor.buffer.offset + offset, + cntDescriptor.buffer.buffer, + cntDescriptor.buffer.offset + countOffset, + maxCount, stride); + } else { + m_cmd->cmdDrawIndirectCount( + argDescriptor.buffer.buffer, + argDescriptor.buffer.offset + offset, + cntDescriptor.buffer.buffer, + cntDescriptor.buffer.offset + countOffset, + maxCount, stride); + } + + if (unlikely(m_state.id.argBuffer.buffer()->hasGfxStores())) { + accessDrawBuffer(offset, maxCount, stride, Indexed + ? sizeof(VkDrawIndexedIndirectCommand) + : sizeof(VkDrawIndirectCommand)); + } + + if (unlikely(m_state.id.cntBuffer.buffer()->hasGfxStores())) + accessDrawCountBuffer(countOffset); + } + } + + void DxvkContext::resolveImage( const Rc& dstImage, const Rc& srcImage, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index b27af8405..921405472 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1602,6 +1602,13 @@ namespace dxvk { uint32_t stride, bool unroll); + template + void drawIndirectCountGeneric( + VkDeviceSize offset, + VkDeviceSize countOffset, + uint32_t maxCount, + uint32_t stride); + void resolveImageHw( const Rc& dstImage, const Rc& srcImage,