mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-21 22:54:16 +01:00
[dxvk] Move image initialization to init command buffer
This commit is contained in:
parent
0f6f543583
commit
ac1dfbacb6
@ -546,28 +546,30 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void cmdClearColorImage(
|
void cmdClearColorImage(
|
||||||
|
DxvkCmdBuffer cmdBuffer,
|
||||||
VkImage image,
|
VkImage image,
|
||||||
VkImageLayout imageLayout,
|
VkImageLayout imageLayout,
|
||||||
const VkClearColorValue* pColor,
|
const VkClearColorValue* pColor,
|
||||||
uint32_t rangeCount,
|
uint32_t rangeCount,
|
||||||
const VkImageSubresourceRange* pRanges) {
|
const VkImageSubresourceRange* pRanges) {
|
||||||
m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
|
m_cmd.usedFlags.set(cmdBuffer);
|
||||||
|
|
||||||
m_vkd->vkCmdClearColorImage(m_cmd.execBuffer,
|
m_vkd->vkCmdClearColorImage(getCmdBuffer(cmdBuffer),
|
||||||
image, imageLayout, pColor,
|
image, imageLayout, pColor,
|
||||||
rangeCount, pRanges);
|
rangeCount, pRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cmdClearDepthStencilImage(
|
void cmdClearDepthStencilImage(
|
||||||
|
DxvkCmdBuffer cmdBuffer,
|
||||||
VkImage image,
|
VkImage image,
|
||||||
VkImageLayout imageLayout,
|
VkImageLayout imageLayout,
|
||||||
const VkClearDepthStencilValue* pDepthStencil,
|
const VkClearDepthStencilValue* pDepthStencil,
|
||||||
uint32_t rangeCount,
|
uint32_t rangeCount,
|
||||||
const VkImageSubresourceRange* pRanges) {
|
const VkImageSubresourceRange* pRanges) {
|
||||||
m_cmd.usedFlags.set(DxvkCmdBuffer::ExecBuffer);
|
m_cmd.usedFlags.set(cmdBuffer);
|
||||||
|
|
||||||
m_vkd->vkCmdClearDepthStencilImage(m_cmd.execBuffer,
|
m_vkd->vkCmdClearDepthStencilImage(getCmdBuffer(cmdBuffer),
|
||||||
image, imageLayout, pDepthStencil,
|
image, imageLayout, pDepthStencil,
|
||||||
rangeCount, pRanges);
|
rangeCount, pRanges);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ namespace dxvk {
|
|||||||
m_common (&device->m_objects),
|
m_common (&device->m_objects),
|
||||||
m_sdmaAcquires(DxvkCmdBuffer::SdmaBuffer),
|
m_sdmaAcquires(DxvkCmdBuffer::SdmaBuffer),
|
||||||
m_sdmaBarriers(DxvkCmdBuffer::SdmaBuffer),
|
m_sdmaBarriers(DxvkCmdBuffer::SdmaBuffer),
|
||||||
|
m_initAcquires(DxvkCmdBuffer::InitBuffer),
|
||||||
m_initBarriers(DxvkCmdBuffer::InitBuffer),
|
m_initBarriers(DxvkCmdBuffer::InitBuffer),
|
||||||
m_execAcquires(DxvkCmdBuffer::ExecBuffer),
|
m_execAcquires(DxvkCmdBuffer::ExecBuffer),
|
||||||
m_execBarriers(DxvkCmdBuffer::ExecBuffer),
|
m_execBarriers(DxvkCmdBuffer::ExecBuffer),
|
||||||
@ -1059,13 +1060,15 @@ namespace dxvk {
|
|||||||
} else {
|
} else {
|
||||||
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||||
|
|
||||||
m_initBarriers.accessImage(image, subresources,
|
m_initAcquires.accessImage(image, subresources,
|
||||||
initialLayout,
|
initialLayout,
|
||||||
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0,
|
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0,
|
||||||
clearLayout,
|
clearLayout,
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
|
|
||||||
|
m_initAcquires.recordCommands(m_cmd);
|
||||||
|
|
||||||
auto formatInfo = image->formatInfo();
|
auto formatInfo = image->formatInfo();
|
||||||
|
|
||||||
if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) {
|
if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) {
|
||||||
@ -1115,7 +1118,7 @@ namespace dxvk {
|
|||||||
copyInfo.regionCount = 1;
|
copyInfo.regionCount = 1;
|
||||||
copyInfo.pRegions = ©Region;
|
copyInfo.pRegions = ©Region;
|
||||||
|
|
||||||
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, ©Info);
|
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, ©Info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1125,17 +1128,17 @@ namespace dxvk {
|
|||||||
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||||
VkClearDepthStencilValue value = { };
|
VkClearDepthStencilValue value = { };
|
||||||
|
|
||||||
m_cmd->cmdClearDepthStencilImage(image->handle(),
|
m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer,
|
||||||
clearLayout, &value, 1, &subresources);
|
image->handle(), clearLayout, &value, 1, &subresources);
|
||||||
} else {
|
} else {
|
||||||
VkClearColorValue value = { };
|
VkClearColorValue value = { };
|
||||||
|
|
||||||
m_cmd->cmdClearColorImage(image->handle(),
|
m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer,
|
||||||
clearLayout, &value, 1, &subresources);
|
image->handle(), clearLayout, &value, 1, &subresources);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_execBarriers.accessImage(image, subresources,
|
m_initBarriers.accessImage(image, subresources,
|
||||||
clearLayout,
|
clearLayout,
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
@ -6892,7 +6895,24 @@ namespace dxvk {
|
|||||||
m_zeroBuffer = m_device->createBuffer(bufInfo,
|
m_zeroBuffer = m_device->createBuffer(bufInfo,
|
||||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||||
|
|
||||||
this->initBuffer(m_zeroBuffer);
|
DxvkBufferSliceHandle slice = m_zeroBuffer->getSliceHandle();
|
||||||
|
|
||||||
|
m_cmd->cmdFillBuffer(DxvkCmdBuffer::InitBuffer,
|
||||||
|
slice.handle, slice.offset, slice.length, 0);
|
||||||
|
|
||||||
|
VkMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 };
|
||||||
|
barrier.srcStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||||
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
barrier.dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||||
|
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
|
||||||
|
|
||||||
|
VkDependencyInfo depInfo = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO };
|
||||||
|
depInfo.memoryBarrierCount = 1;
|
||||||
|
depInfo.pMemoryBarriers = &barrier;
|
||||||
|
|
||||||
|
m_cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo);
|
||||||
|
m_cmd->addStatCtr(DxvkStatCounter::CmdBarrierCount, 1);
|
||||||
|
|
||||||
return m_zeroBuffer;
|
return m_zeroBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1408,6 +1408,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkBarrierSet m_sdmaAcquires;
|
DxvkBarrierSet m_sdmaAcquires;
|
||||||
DxvkBarrierSet m_sdmaBarriers;
|
DxvkBarrierSet m_sdmaBarriers;
|
||||||
|
DxvkBarrierSet m_initAcquires;
|
||||||
DxvkBarrierSet m_initBarriers;
|
DxvkBarrierSet m_initBarriers;
|
||||||
DxvkBarrierSet m_execAcquires;
|
DxvkBarrierSet m_execAcquires;
|
||||||
DxvkBarrierSet m_execBarriers;
|
DxvkBarrierSet m_execBarriers;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user