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

[dxvk] Introduce DxvkCommandSubmissionInfo

This commit is contained in:
Philip Rebohle 2022-08-22 13:50:10 +02:00
parent d367fac64e
commit def93fd18b
2 changed files with 133 additions and 126 deletions

View File

@ -90,8 +90,7 @@ namespace dxvk {
DxvkCommandList::DxvkCommandList(DxvkDevice* device) DxvkCommandList::DxvkCommandList(DxvkDevice* device)
: m_device (device), : m_device (device),
m_vkd (device->vkd()), m_vkd (device->vkd()),
m_vki (device->instance()->vki()), m_vki (device->instance()->vki()) {
m_cmdBuffersUsed(0) {
const auto& graphicsQueue = m_device->queues().graphics; const auto& graphicsQueue = m_device->queues().graphics;
const auto& transferQueue = m_device->queues().transfer; const auto& transferQueue = m_device->queues().transfer;
@ -130,9 +129,9 @@ namespace dxvk {
cmdInfoDma.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; cmdInfoDma.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmdInfoDma.commandBufferCount = 1; cmdInfoDma.commandBufferCount = 1;
if (m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoGfx, &m_execBuffer) != VK_SUCCESS if (m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoGfx, &m_cmd.execBuffer) != VK_SUCCESS
|| m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoGfx, &m_initBuffer) != VK_SUCCESS || m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoGfx, &m_cmd.initBuffer) != VK_SUCCESS
|| m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoDma, &m_sdmaBuffer) != VK_SUCCESS) || m_vkd->vkAllocateCommandBuffers(m_vkd->device(), &cmdInfoDma, &m_cmd.sdmaBuffer) != VK_SUCCESS)
throw DxvkError("DxvkCommandList: Failed to allocate command buffer"); throw DxvkError("DxvkCommandList: Failed to allocate command buffer");
} }
@ -157,8 +156,8 @@ namespace dxvk {
m_commandSubmission.reset(); m_commandSubmission.reset();
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::SdmaBuffer)) { if (m_cmd.usedFlags.test(DxvkCmdBuffer::SdmaBuffer)) {
m_commandSubmission.executeCommandBuffer(m_sdmaBuffer); m_commandSubmission.executeCommandBuffer(m_cmd.sdmaBuffer);
if (m_device->hasDedicatedTransferQueue()) { if (m_device->hasDedicatedTransferQueue()) {
m_commandSubmission.signalSemaphore(m_sdmaSemaphore, 0, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT); m_commandSubmission.signalSemaphore(m_sdmaSemaphore, 0, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT);
@ -170,11 +169,11 @@ namespace dxvk {
} }
} }
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::InitBuffer)) if (m_cmd.usedFlags.test(DxvkCmdBuffer::InitBuffer))
m_commandSubmission.executeCommandBuffer(m_initBuffer); m_commandSubmission.executeCommandBuffer(m_cmd.initBuffer);
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::ExecBuffer)) if (m_cmd.usedFlags.test(DxvkCmdBuffer::ExecBuffer))
m_commandSubmission.executeCommandBuffer(m_execBuffer); m_commandSubmission.executeCommandBuffer(m_cmd.execBuffer);
if (m_wsiSemaphores.acquire) { if (m_wsiSemaphores.acquire) {
m_commandSubmission.waitSemaphore(m_wsiSemaphores.acquire, m_commandSubmission.waitSemaphore(m_wsiSemaphores.acquire,
@ -216,21 +215,17 @@ namespace dxvk {
|| (m_transferPool && m_vkd->vkResetCommandPool(m_vkd->device(), m_transferPool, 0) != VK_SUCCESS)) || (m_transferPool && m_vkd->vkResetCommandPool(m_vkd->device(), m_transferPool, 0) != VK_SUCCESS))
Logger::err("DxvkCommandList: Failed to reset command buffer"); Logger::err("DxvkCommandList: Failed to reset command buffer");
if (m_vkd->vkBeginCommandBuffer(m_execBuffer, &info) != VK_SUCCESS if (m_vkd->vkBeginCommandBuffer(m_cmd.execBuffer, &info) != VK_SUCCESS
|| m_vkd->vkBeginCommandBuffer(m_initBuffer, &info) != VK_SUCCESS || m_vkd->vkBeginCommandBuffer(m_cmd.initBuffer, &info) != VK_SUCCESS
|| m_vkd->vkBeginCommandBuffer(m_sdmaBuffer, &info) != VK_SUCCESS) || m_vkd->vkBeginCommandBuffer(m_cmd.sdmaBuffer, &info) != VK_SUCCESS)
Logger::err("DxvkCommandList: Failed to begin command buffer"); Logger::err("DxvkCommandList: Failed to begin command buffer");
// Unconditionally mark the exec buffer as used. There
// is virtually no use case where this isn't correct.
m_cmdBuffersUsed = DxvkCmdBuffer::ExecBuffer;
} }
void DxvkCommandList::endRecording() { void DxvkCommandList::endRecording() {
if (m_vkd->vkEndCommandBuffer(m_execBuffer) != VK_SUCCESS if (m_vkd->vkEndCommandBuffer(m_cmd.execBuffer) != VK_SUCCESS
|| m_vkd->vkEndCommandBuffer(m_initBuffer) != VK_SUCCESS || m_vkd->vkEndCommandBuffer(m_cmd.initBuffer) != VK_SUCCESS
|| m_vkd->vkEndCommandBuffer(m_sdmaBuffer) != VK_SUCCESS) || m_vkd->vkEndCommandBuffer(m_cmd.sdmaBuffer) != VK_SUCCESS)
Logger::err("DxvkCommandList::endRecording: Failed to record command buffer"); Logger::err("DxvkCommandList::endRecording: Failed to record command buffer");
} }

View File

@ -102,6 +102,21 @@ namespace dxvk {
}; };
/**
* \brief Command submission info
*
* Stores a set of command buffers, as well as a
* mask of command buffers that were actually used.
*/
struct DxvkCommandSubmissionInfo {
DxvkCmdBufferFlags usedFlags = 0;
VkCommandBuffer execBuffer = VK_NULL_HANDLE;
VkCommandBuffer initBuffer = VK_NULL_HANDLE;
VkCommandBuffer sdmaBuffer = VK_NULL_HANDLE;
};
/** /**
* \brief DXVK command list * \brief DXVK command list
* *
@ -313,9 +328,9 @@ namespace dxvk {
VkQueryPool queryPool, VkQueryPool queryPool,
uint32_t query, uint32_t query,
VkQueryControlFlags flags) { VkQueryControlFlags flags) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdBeginQuery(m_execBuffer, m_vkd->vkCmdBeginQuery(m_cmd.execBuffer,
queryPool, query, flags); queryPool, query, flags);
} }
@ -325,18 +340,18 @@ namespace dxvk {
uint32_t query, uint32_t query,
VkQueryControlFlags flags, VkQueryControlFlags flags,
uint32_t index) { uint32_t index) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdBeginQueryIndexedEXT( m_vkd->vkCmdBeginQueryIndexedEXT(
m_execBuffer, queryPool, query, flags, index); m_cmd.execBuffer, queryPool, query, flags, index);
} }
void cmdBeginRendering( void cmdBeginRendering(
const VkRenderingInfo* pRenderingInfo) { const VkRenderingInfo* pRenderingInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdBeginRendering(m_execBuffer, pRenderingInfo); m_vkd->vkCmdBeginRendering(m_cmd.execBuffer, pRenderingInfo);
} }
@ -345,7 +360,7 @@ namespace dxvk {
uint32_t bufferCount, uint32_t bufferCount,
const VkBuffer* counterBuffers, const VkBuffer* counterBuffers,
const VkDeviceSize* counterOffsets) { const VkDeviceSize* counterOffsets) {
m_vkd->vkCmdBeginTransformFeedbackEXT(m_execBuffer, m_vkd->vkCmdBeginTransformFeedbackEXT(m_cmd.execBuffer,
firstBuffer, bufferCount, counterBuffers, counterOffsets); firstBuffer, bufferCount, counterBuffers, counterOffsets);
} }
@ -356,7 +371,7 @@ namespace dxvk {
VkDescriptorSet descriptorSet, VkDescriptorSet descriptorSet,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
const uint32_t* pDynamicOffsets) { const uint32_t* pDynamicOffsets) {
m_vkd->vkCmdBindDescriptorSets(m_execBuffer, m_vkd->vkCmdBindDescriptorSets(m_cmd.execBuffer,
pipeline, pipelineLayout, 0, 1, pipeline, pipelineLayout, 0, 1,
&descriptorSet, dynamicOffsetCount, pDynamicOffsets); &descriptorSet, dynamicOffsetCount, pDynamicOffsets);
} }
@ -370,7 +385,7 @@ namespace dxvk {
const VkDescriptorSet* descriptorSets, const VkDescriptorSet* descriptorSets,
uint32_t dynamicOffsetCount, uint32_t dynamicOffsetCount,
const uint32_t* pDynamicOffsets) { const uint32_t* pDynamicOffsets) {
m_vkd->vkCmdBindDescriptorSets(m_execBuffer, m_vkd->vkCmdBindDescriptorSets(m_cmd.execBuffer,
pipeline, pipelineLayout, firstSet, descriptorSetCount, pipeline, pipelineLayout, firstSet, descriptorSetCount,
descriptorSets, dynamicOffsetCount, pDynamicOffsets); descriptorSets, dynamicOffsetCount, pDynamicOffsets);
} }
@ -380,7 +395,7 @@ namespace dxvk {
VkBuffer buffer, VkBuffer buffer,
VkDeviceSize offset, VkDeviceSize offset,
VkIndexType indexType) { VkIndexType indexType) {
m_vkd->vkCmdBindIndexBuffer(m_execBuffer, m_vkd->vkCmdBindIndexBuffer(m_cmd.execBuffer,
buffer, offset, indexType); buffer, offset, indexType);
} }
@ -388,7 +403,7 @@ namespace dxvk {
void cmdBindPipeline( void cmdBindPipeline(
VkPipelineBindPoint pipelineBindPoint, VkPipelineBindPoint pipelineBindPoint,
VkPipeline pipeline) { VkPipeline pipeline) {
m_vkd->vkCmdBindPipeline(m_execBuffer, m_vkd->vkCmdBindPipeline(m_cmd.execBuffer,
pipelineBindPoint, pipeline); pipelineBindPoint, pipeline);
} }
@ -399,7 +414,7 @@ namespace dxvk {
const VkBuffer* pBuffers, const VkBuffer* pBuffers,
const VkDeviceSize* pOffsets, const VkDeviceSize* pOffsets,
const VkDeviceSize* pSizes) { const VkDeviceSize* pSizes) {
m_vkd->vkCmdBindTransformFeedbackBuffersEXT(m_execBuffer, m_vkd->vkCmdBindTransformFeedbackBuffersEXT(m_cmd.execBuffer,
firstBinding, bindingCount, pBuffers, pOffsets, pSizes); firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
} }
@ -411,23 +426,23 @@ namespace dxvk {
const VkDeviceSize* pOffsets, const VkDeviceSize* pOffsets,
const VkDeviceSize* pSizes, const VkDeviceSize* pSizes,
const VkDeviceSize* pStrides) { const VkDeviceSize* pStrides) {
m_vkd->vkCmdBindVertexBuffers2(m_execBuffer, m_vkd->vkCmdBindVertexBuffers2(m_cmd.execBuffer,
firstBinding, bindingCount, pBuffers, pOffsets, firstBinding, bindingCount, pBuffers, pOffsets,
pSizes, pStrides); pSizes, pStrides);
} }
void cmdLaunchCuKernel(VkCuLaunchInfoNVX launchInfo) { void cmdLaunchCuKernel(VkCuLaunchInfoNVX launchInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdCuLaunchKernelNVX(m_execBuffer, &launchInfo); m_vkd->vkCmdCuLaunchKernelNVX(m_cmd.execBuffer, &launchInfo);
} }
void cmdBlitImage( void cmdBlitImage(
const VkBlitImageInfo2* pBlitInfo) { const VkBlitImageInfo2* pBlitInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdBlitImage2(m_execBuffer, pBlitInfo); m_vkd->vkCmdBlitImage2(m_cmd.execBuffer, pBlitInfo);
} }
@ -436,7 +451,7 @@ namespace dxvk {
const VkClearAttachment* pAttachments, const VkClearAttachment* pAttachments,
uint32_t rectCount, uint32_t rectCount,
const VkClearRect* pRects) { const VkClearRect* pRects) {
m_vkd->vkCmdClearAttachments(m_execBuffer, m_vkd->vkCmdClearAttachments(m_cmd.execBuffer,
attachmentCount, pAttachments, attachmentCount, pAttachments,
rectCount, pRects); rectCount, pRects);
} }
@ -448,9 +463,9 @@ namespace dxvk {
const VkClearColorValue* pColor, const VkClearColorValue* pColor,
uint32_t rangeCount, uint32_t rangeCount,
const VkImageSubresourceRange* pRanges) { const VkImageSubresourceRange* pRanges) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdClearColorImage(m_execBuffer, m_vkd->vkCmdClearColorImage(m_cmd.execBuffer,
image, imageLayout, pColor, image, imageLayout, pColor,
rangeCount, pRanges); rangeCount, pRanges);
} }
@ -462,9 +477,9 @@ namespace dxvk {
const VkClearDepthStencilValue* pDepthStencil, const VkClearDepthStencilValue* pDepthStencil,
uint32_t rangeCount, uint32_t rangeCount,
const VkImageSubresourceRange* pRanges) { const VkImageSubresourceRange* pRanges) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdClearDepthStencilImage(m_execBuffer, m_vkd->vkCmdClearDepthStencilImage(m_cmd.execBuffer,
image, imageLayout, pDepthStencil, image, imageLayout, pDepthStencil,
rangeCount, pRanges); rangeCount, pRanges);
} }
@ -473,7 +488,7 @@ namespace dxvk {
void cmdCopyBuffer( void cmdCopyBuffer(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
const VkCopyBufferInfo2* copyInfo) { const VkCopyBufferInfo2* copyInfo) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdCopyBuffer2(getCmdBuffer(cmdBuffer), copyInfo); m_vkd->vkCmdCopyBuffer2(getCmdBuffer(cmdBuffer), copyInfo);
} }
@ -482,7 +497,7 @@ namespace dxvk {
void cmdCopyBufferToImage( void cmdCopyBufferToImage(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
const VkCopyBufferToImageInfo2* copyInfo) { const VkCopyBufferToImageInfo2* copyInfo) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdCopyBufferToImage2(getCmdBuffer(cmdBuffer), copyInfo); m_vkd->vkCmdCopyBufferToImage2(getCmdBuffer(cmdBuffer), copyInfo);
} }
@ -491,7 +506,7 @@ namespace dxvk {
void cmdCopyImage( void cmdCopyImage(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
const VkCopyImageInfo2* copyInfo) { const VkCopyImageInfo2* copyInfo) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdCopyImage2(getCmdBuffer(cmdBuffer), copyInfo); m_vkd->vkCmdCopyImage2(getCmdBuffer(cmdBuffer), copyInfo);
} }
@ -500,7 +515,7 @@ namespace dxvk {
void cmdCopyImageToBuffer( void cmdCopyImageToBuffer(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
const VkCopyImageToBufferInfo2* copyInfo) { const VkCopyImageToBufferInfo2* copyInfo) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdCopyImageToBuffer2(getCmdBuffer(cmdBuffer), copyInfo); m_vkd->vkCmdCopyImageToBuffer2(getCmdBuffer(cmdBuffer), copyInfo);
} }
@ -514,9 +529,9 @@ namespace dxvk {
VkDeviceSize dstOffset, VkDeviceSize dstOffset,
VkDeviceSize stride, VkDeviceSize stride,
VkQueryResultFlags flags) { VkQueryResultFlags flags) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdCopyQueryPoolResults(m_execBuffer, m_vkd->vkCmdCopyQueryPoolResults(m_cmd.execBuffer,
queryPool, firstQuery, queryCount, queryPool, firstQuery, queryCount,
dstBuffer, dstOffset, stride, flags); dstBuffer, dstOffset, stride, flags);
} }
@ -526,19 +541,19 @@ namespace dxvk {
uint32_t x, uint32_t x,
uint32_t y, uint32_t y,
uint32_t z) { uint32_t z) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdDispatch(m_execBuffer, x, y, z); m_vkd->vkCmdDispatch(m_cmd.execBuffer, x, y, z);
} }
void cmdDispatchIndirect( void cmdDispatchIndirect(
VkBuffer buffer, VkBuffer buffer,
VkDeviceSize offset) { VkDeviceSize offset) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdDispatchIndirect( m_vkd->vkCmdDispatchIndirect(
m_execBuffer, buffer, offset); m_cmd.execBuffer, buffer, offset);
} }
@ -547,7 +562,7 @@ namespace dxvk {
uint32_t instanceCount, uint32_t instanceCount,
uint32_t firstVertex, uint32_t firstVertex,
uint32_t firstInstance) { uint32_t firstInstance) {
m_vkd->vkCmdDraw(m_execBuffer, m_vkd->vkCmdDraw(m_cmd.execBuffer,
vertexCount, instanceCount, vertexCount, instanceCount,
firstVertex, firstInstance); firstVertex, firstInstance);
} }
@ -558,7 +573,7 @@ namespace dxvk {
VkDeviceSize offset, VkDeviceSize offset,
uint32_t drawCount, uint32_t drawCount,
uint32_t stride) { uint32_t stride) {
m_vkd->vkCmdDrawIndirect(m_execBuffer, m_vkd->vkCmdDrawIndirect(m_cmd.execBuffer,
buffer, offset, drawCount, stride); buffer, offset, drawCount, stride);
} }
@ -570,7 +585,7 @@ namespace dxvk {
VkDeviceSize countOffset, VkDeviceSize countOffset,
uint32_t maxDrawCount, uint32_t maxDrawCount,
uint32_t stride) { uint32_t stride) {
m_vkd->vkCmdDrawIndirectCount(m_execBuffer, m_vkd->vkCmdDrawIndirectCount(m_cmd.execBuffer,
buffer, offset, countBuffer, countOffset, maxDrawCount, stride); buffer, offset, countBuffer, countOffset, maxDrawCount, stride);
} }
@ -581,7 +596,7 @@ namespace dxvk {
uint32_t firstIndex, uint32_t firstIndex,
uint32_t vertexOffset, uint32_t vertexOffset,
uint32_t firstInstance) { uint32_t firstInstance) {
m_vkd->vkCmdDrawIndexed(m_execBuffer, m_vkd->vkCmdDrawIndexed(m_cmd.execBuffer,
indexCount, instanceCount, indexCount, instanceCount,
firstIndex, vertexOffset, firstIndex, vertexOffset,
firstInstance); firstInstance);
@ -593,7 +608,7 @@ namespace dxvk {
VkDeviceSize offset, VkDeviceSize offset,
uint32_t drawCount, uint32_t drawCount,
uint32_t stride) { uint32_t stride) {
m_vkd->vkCmdDrawIndexedIndirect(m_execBuffer, m_vkd->vkCmdDrawIndexedIndirect(m_cmd.execBuffer,
buffer, offset, drawCount, stride); buffer, offset, drawCount, stride);
} }
@ -605,7 +620,7 @@ namespace dxvk {
VkDeviceSize countOffset, VkDeviceSize countOffset,
uint32_t maxDrawCount, uint32_t maxDrawCount,
uint32_t stride) { uint32_t stride) {
m_vkd->vkCmdDrawIndexedIndirectCount(m_execBuffer, m_vkd->vkCmdDrawIndexedIndirectCount(m_cmd.execBuffer,
buffer, offset, countBuffer, countOffset, maxDrawCount, stride); buffer, offset, countBuffer, countOffset, maxDrawCount, stride);
} }
@ -617,7 +632,7 @@ namespace dxvk {
VkDeviceSize counterBufferOffset, VkDeviceSize counterBufferOffset,
uint32_t counterOffset, uint32_t counterOffset,
uint32_t vertexStride) { uint32_t vertexStride) {
m_vkd->vkCmdDrawIndirectByteCountEXT(m_execBuffer, m_vkd->vkCmdDrawIndirectByteCountEXT(m_cmd.execBuffer,
instanceCount, firstInstance, counterBuffer, instanceCount, firstInstance, counterBuffer,
counterBufferOffset, counterOffset, vertexStride); counterBufferOffset, counterOffset, vertexStride);
} }
@ -626,7 +641,7 @@ namespace dxvk {
void cmdEndQuery( void cmdEndQuery(
VkQueryPool queryPool, VkQueryPool queryPool,
uint32_t query) { uint32_t query) {
m_vkd->vkCmdEndQuery(m_execBuffer, queryPool, query); m_vkd->vkCmdEndQuery(m_cmd.execBuffer, queryPool, query);
} }
@ -635,12 +650,12 @@ namespace dxvk {
uint32_t query, uint32_t query,
uint32_t index) { uint32_t index) {
m_vkd->vkCmdEndQueryIndexedEXT( m_vkd->vkCmdEndQueryIndexedEXT(
m_execBuffer, queryPool, query, index); m_cmd.execBuffer, queryPool, query, index);
} }
void cmdEndRendering() { void cmdEndRendering() {
m_vkd->vkCmdEndRendering(m_execBuffer); m_vkd->vkCmdEndRendering(m_cmd.execBuffer);
} }
@ -649,7 +664,7 @@ namespace dxvk {
uint32_t bufferCount, uint32_t bufferCount,
const VkBuffer* counterBuffers, const VkBuffer* counterBuffers,
const VkDeviceSize* counterOffsets) { const VkDeviceSize* counterOffsets) {
m_vkd->vkCmdEndTransformFeedbackEXT(m_execBuffer, m_vkd->vkCmdEndTransformFeedbackEXT(m_cmd.execBuffer,
firstBuffer, bufferCount, counterBuffers, counterOffsets); firstBuffer, bufferCount, counterBuffers, counterOffsets);
} }
@ -660,7 +675,7 @@ namespace dxvk {
VkDeviceSize dstOffset, VkDeviceSize dstOffset,
VkDeviceSize size, VkDeviceSize size,
uint32_t data) { uint32_t data) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdFillBuffer(getCmdBuffer(cmdBuffer), m_vkd->vkCmdFillBuffer(getCmdBuffer(cmdBuffer),
dstBuffer, dstOffset, size, data); dstBuffer, dstOffset, size, data);
@ -670,7 +685,7 @@ namespace dxvk {
void cmdPipelineBarrier( void cmdPipelineBarrier(
DxvkCmdBuffer cmdBuffer, DxvkCmdBuffer cmdBuffer,
const VkDependencyInfo* dependencyInfo) { const VkDependencyInfo* dependencyInfo) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdPipelineBarrier2(getCmdBuffer(cmdBuffer), dependencyInfo); m_vkd->vkCmdPipelineBarrier2(getCmdBuffer(cmdBuffer), dependencyInfo);
} }
@ -682,16 +697,16 @@ namespace dxvk {
uint32_t offset, uint32_t offset,
uint32_t size, uint32_t size,
const void* pValues) { const void* pValues) {
m_vkd->vkCmdPushConstants(m_execBuffer, m_vkd->vkCmdPushConstants(m_cmd.execBuffer,
layout, stageFlags, offset, size, pValues); layout, stageFlags, offset, size, pValues);
} }
void cmdResolveImage( void cmdResolveImage(
const VkResolveImageInfo2* resolveInfo) { const VkResolveImageInfo2* resolveInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdResolveImage2(m_execBuffer, resolveInfo); m_vkd->vkCmdResolveImage2(m_cmd.execBuffer, resolveInfo);
} }
@ -701,7 +716,7 @@ namespace dxvk {
VkDeviceSize dstOffset, VkDeviceSize dstOffset,
VkDeviceSize dataSize, VkDeviceSize dataSize,
const void* pData) { const void* pData) {
m_cmdBuffersUsed.set(cmdBuffer); m_cmd.usedFlags.set(cmdBuffer);
m_vkd->vkCmdUpdateBuffer(getCmdBuffer(cmdBuffer), m_vkd->vkCmdUpdateBuffer(getCmdBuffer(cmdBuffer),
dstBuffer, dstOffset, dataSize, pData); dstBuffer, dstOffset, dataSize, pData);
@ -709,13 +724,13 @@ namespace dxvk {
void cmdSetBlendConstants(const float blendConstants[4]) { void cmdSetBlendConstants(const float blendConstants[4]) {
m_vkd->vkCmdSetBlendConstants(m_execBuffer, blendConstants); m_vkd->vkCmdSetBlendConstants(m_cmd.execBuffer, blendConstants);
} }
void cmdSetDepthBiasState( void cmdSetDepthBiasState(
VkBool32 depthBiasEnable) { VkBool32 depthBiasEnable) {
m_vkd->vkCmdSetDepthBiasEnable(m_execBuffer, depthBiasEnable); m_vkd->vkCmdSetDepthBiasEnable(m_cmd.execBuffer, depthBiasEnable);
} }
@ -723,7 +738,7 @@ namespace dxvk {
float depthBiasConstantFactor, float depthBiasConstantFactor,
float depthBiasClamp, float depthBiasClamp,
float depthBiasSlopeFactor) { float depthBiasSlopeFactor) {
m_vkd->vkCmdSetDepthBias(m_execBuffer, m_vkd->vkCmdSetDepthBias(m_cmd.execBuffer,
depthBiasConstantFactor, depthBiasConstantFactor,
depthBiasClamp, depthBiasClamp,
depthBiasSlopeFactor); depthBiasSlopeFactor);
@ -733,7 +748,7 @@ namespace dxvk {
void cmdSetDepthBounds( void cmdSetDepthBounds(
float minDepthBounds, float minDepthBounds,
float maxDepthBounds) { float maxDepthBounds) {
m_vkd->vkCmdSetDepthBounds(m_execBuffer, m_vkd->vkCmdSetDepthBounds(m_cmd.execBuffer,
minDepthBounds, minDepthBounds,
maxDepthBounds); maxDepthBounds);
} }
@ -741,7 +756,7 @@ namespace dxvk {
void cmdSetDepthBoundsState( void cmdSetDepthBoundsState(
VkBool32 depthBoundsTestEnable) { VkBool32 depthBoundsTestEnable) {
m_vkd->vkCmdSetDepthBoundsTestEnable(m_execBuffer, depthBoundsTestEnable); m_vkd->vkCmdSetDepthBoundsTestEnable(m_cmd.execBuffer, depthBoundsTestEnable);
} }
@ -749,14 +764,14 @@ namespace dxvk {
VkBool32 depthTestEnable, VkBool32 depthTestEnable,
VkBool32 depthWriteEnable, VkBool32 depthWriteEnable,
VkCompareOp depthCompareOp) { VkCompareOp depthCompareOp) {
m_vkd->vkCmdSetDepthTestEnable(m_execBuffer, depthTestEnable); m_vkd->vkCmdSetDepthTestEnable(m_cmd.execBuffer, depthTestEnable);
if (depthTestEnable) { if (depthTestEnable) {
m_vkd->vkCmdSetDepthWriteEnable(m_execBuffer, depthWriteEnable); m_vkd->vkCmdSetDepthWriteEnable(m_cmd.execBuffer, depthWriteEnable);
m_vkd->vkCmdSetDepthCompareOp(m_execBuffer, depthCompareOp); m_vkd->vkCmdSetDepthCompareOp(m_cmd.execBuffer, depthCompareOp);
} else { } else {
m_vkd->vkCmdSetDepthWriteEnable(m_execBuffer, VK_FALSE); m_vkd->vkCmdSetDepthWriteEnable(m_cmd.execBuffer, VK_FALSE);
m_vkd->vkCmdSetDepthCompareOp(m_execBuffer, VK_COMPARE_OP_ALWAYS); m_vkd->vkCmdSetDepthCompareOp(m_cmd.execBuffer, VK_COMPARE_OP_ALWAYS);
} }
} }
@ -764,17 +779,17 @@ namespace dxvk {
void cmdSetEvent( void cmdSetEvent(
VkEvent event, VkEvent event,
const VkDependencyInfo* dependencyInfo) { const VkDependencyInfo* dependencyInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdSetEvent2(m_execBuffer, event, dependencyInfo); m_vkd->vkCmdSetEvent2(m_cmd.execBuffer, event, dependencyInfo);
} }
void cmdSetRasterizerState( void cmdSetRasterizerState(
VkCullModeFlags cullMode, VkCullModeFlags cullMode,
VkFrontFace frontFace) { VkFrontFace frontFace) {
m_vkd->vkCmdSetCullMode(m_execBuffer, cullMode); m_vkd->vkCmdSetCullMode(m_cmd.execBuffer, cullMode);
m_vkd->vkCmdSetFrontFace(m_execBuffer, frontFace); m_vkd->vkCmdSetFrontFace(m_cmd.execBuffer, frontFace);
} }
@ -782,7 +797,7 @@ namespace dxvk {
uint32_t scissorCount, uint32_t scissorCount,
const VkRect2D* scissors) { const VkRect2D* scissors) {
m_vkd->vkCmdSetScissorWithCount( m_vkd->vkCmdSetScissorWithCount(
m_execBuffer, scissorCount, scissors); m_cmd.execBuffer, scissorCount, scissors);
} }
@ -791,32 +806,32 @@ namespace dxvk {
const VkStencilOpState& front, const VkStencilOpState& front,
const VkStencilOpState& back) { const VkStencilOpState& back) {
m_vkd->vkCmdSetStencilTestEnable( m_vkd->vkCmdSetStencilTestEnable(
m_execBuffer, enableStencilTest); m_cmd.execBuffer, enableStencilTest);
if (enableStencilTest) { if (enableStencilTest) {
m_vkd->vkCmdSetStencilOp(m_execBuffer, m_vkd->vkCmdSetStencilOp(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_BIT, front.failOp, VK_STENCIL_FACE_FRONT_BIT, front.failOp,
front.passOp, front.depthFailOp, front.compareOp); front.passOp, front.depthFailOp, front.compareOp);
m_vkd->vkCmdSetStencilCompareMask(m_execBuffer, m_vkd->vkCmdSetStencilCompareMask(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_BIT, front.compareMask); VK_STENCIL_FACE_FRONT_BIT, front.compareMask);
m_vkd->vkCmdSetStencilWriteMask(m_execBuffer, m_vkd->vkCmdSetStencilWriteMask(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_BIT, front.writeMask); VK_STENCIL_FACE_FRONT_BIT, front.writeMask);
m_vkd->vkCmdSetStencilOp(m_execBuffer, m_vkd->vkCmdSetStencilOp(m_cmd.execBuffer,
VK_STENCIL_FACE_BACK_BIT, back.failOp, VK_STENCIL_FACE_BACK_BIT, back.failOp,
back.passOp, back.depthFailOp, back.compareOp); back.passOp, back.depthFailOp, back.compareOp);
m_vkd->vkCmdSetStencilCompareMask(m_execBuffer, m_vkd->vkCmdSetStencilCompareMask(m_cmd.execBuffer,
VK_STENCIL_FACE_BACK_BIT, back.compareMask); VK_STENCIL_FACE_BACK_BIT, back.compareMask);
m_vkd->vkCmdSetStencilWriteMask(m_execBuffer, m_vkd->vkCmdSetStencilWriteMask(m_cmd.execBuffer,
VK_STENCIL_FACE_BACK_BIT, back.writeMask); VK_STENCIL_FACE_BACK_BIT, back.writeMask);
} else { } else {
m_vkd->vkCmdSetStencilOp(m_execBuffer, m_vkd->vkCmdSetStencilOp(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_AND_BACK, VK_STENCIL_FACE_FRONT_AND_BACK,
VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP, VK_STENCIL_OP_KEEP,
VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS); VK_STENCIL_OP_KEEP, VK_COMPARE_OP_ALWAYS);
m_vkd->vkCmdSetStencilCompareMask(m_execBuffer, m_vkd->vkCmdSetStencilCompareMask(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_AND_BACK, 0x0); VK_STENCIL_FACE_FRONT_AND_BACK, 0x0);
m_vkd->vkCmdSetStencilWriteMask(m_execBuffer, m_vkd->vkCmdSetStencilWriteMask(m_cmd.execBuffer,
VK_STENCIL_FACE_FRONT_AND_BACK, 0x0); VK_STENCIL_FACE_FRONT_AND_BACK, 0x0);
} }
} }
@ -825,7 +840,7 @@ namespace dxvk {
void cmdSetStencilReference( void cmdSetStencilReference(
VkStencilFaceFlags faceMask, VkStencilFaceFlags faceMask,
uint32_t reference) { uint32_t reference) {
m_vkd->vkCmdSetStencilReference(m_execBuffer, m_vkd->vkCmdSetStencilReference(m_cmd.execBuffer,
faceMask, reference); faceMask, reference);
} }
@ -834,7 +849,7 @@ namespace dxvk {
uint32_t viewportCount, uint32_t viewportCount,
const VkViewport* viewports) { const VkViewport* viewports) {
m_vkd->vkCmdSetViewportWithCount( m_vkd->vkCmdSetViewportWithCount(
m_execBuffer, viewportCount, viewports); m_cmd.execBuffer, viewportCount, viewports);
} }
@ -842,33 +857,33 @@ namespace dxvk {
VkPipelineStageFlagBits2 pipelineStage, VkPipelineStageFlagBits2 pipelineStage,
VkQueryPool queryPool, VkQueryPool queryPool,
uint32_t query) { uint32_t query) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vkd->vkCmdWriteTimestamp2(m_execBuffer, m_vkd->vkCmdWriteTimestamp2(m_cmd.execBuffer,
pipelineStage, queryPool, query); pipelineStage, queryPool, query);
} }
void cmdBeginDebugUtilsLabel( void cmdBeginDebugUtilsLabel(
VkDebugUtilsLabelEXT* pLabelInfo) { VkDebugUtilsLabelEXT* pLabelInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vki->vkCmdBeginDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); m_vki->vkCmdBeginDebugUtilsLabelEXT(m_cmd.execBuffer, pLabelInfo);
} }
void cmdEndDebugUtilsLabel() { void cmdEndDebugUtilsLabel() {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vki->vkCmdEndDebugUtilsLabelEXT(m_execBuffer); m_vki->vkCmdEndDebugUtilsLabelEXT(m_cmd.execBuffer);
} }
void cmdInsertDebugUtilsLabel( void cmdInsertDebugUtilsLabel(
VkDebugUtilsLabelEXT* pLabelInfo) { VkDebugUtilsLabelEXT* pLabelInfo) {
m_cmdBuffersUsed.set(DxvkCmdBuffer::ExecBuffer); m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
m_vki->vkCmdInsertDebugUtilsLabelEXT(m_execBuffer, pLabelInfo); m_vki->vkCmdInsertDebugUtilsLabelEXT(m_cmd.execBuffer, pLabelInfo);
} }
@ -896,15 +911,12 @@ namespace dxvk {
VkCommandPool m_graphicsPool = VK_NULL_HANDLE; VkCommandPool m_graphicsPool = VK_NULL_HANDLE;
VkCommandPool m_transferPool = VK_NULL_HANDLE; VkCommandPool m_transferPool = VK_NULL_HANDLE;
VkCommandBuffer m_execBuffer = VK_NULL_HANDLE;
VkCommandBuffer m_initBuffer = VK_NULL_HANDLE;
VkCommandBuffer m_sdmaBuffer = VK_NULL_HANDLE;
VkSemaphore m_sdmaSemaphore = VK_NULL_HANDLE; VkSemaphore m_sdmaSemaphore = VK_NULL_HANDLE;
DxvkCommandSubmissionInfo m_cmd;
vk::PresenterSync m_wsiSemaphores = { }; vk::PresenterSync m_wsiSemaphores = { };
DxvkCmdBufferFlags m_cmdBuffersUsed;
DxvkLifetimeTracker m_resources; DxvkLifetimeTracker m_resources;
DxvkSignalTracker m_signalTracker; DxvkSignalTracker m_signalTracker;
DxvkGpuEventTracker m_gpuEventTracker; DxvkGpuEventTracker m_gpuEventTracker;
@ -924,9 +936,9 @@ namespace dxvk {
std::vector<DxvkGraphicsPipeline*> m_pipelines; std::vector<DxvkGraphicsPipeline*> m_pipelines;
VkCommandBuffer getCmdBuffer(DxvkCmdBuffer cmdBuffer) const { VkCommandBuffer getCmdBuffer(DxvkCmdBuffer cmdBuffer) const {
if (cmdBuffer == DxvkCmdBuffer::ExecBuffer) return m_execBuffer; if (cmdBuffer == DxvkCmdBuffer::ExecBuffer) return m_cmd.execBuffer;
if (cmdBuffer == DxvkCmdBuffer::InitBuffer) return m_initBuffer; if (cmdBuffer == DxvkCmdBuffer::InitBuffer) return m_cmd.initBuffer;
if (cmdBuffer == DxvkCmdBuffer::SdmaBuffer) return m_sdmaBuffer; if (cmdBuffer == DxvkCmdBuffer::SdmaBuffer) return m_cmd.sdmaBuffer;
return VK_NULL_HANDLE; return VK_NULL_HANDLE;
} }