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

[dxvk] Add various helpers to emit image layout transitions

This commit is contained in:
Philip Rebohle 2024-10-10 17:27:17 +02:00 committed by Philip Rebohle
parent 756ff73c8a
commit 8955d2a285
2 changed files with 105 additions and 0 deletions

View File

@ -6994,6 +6994,81 @@ namespace dxvk {
}
void DxvkContext::flushImageLayoutTransitions(
DxvkCmdBuffer cmdBuffer) {
if (m_imageLayoutTransitions.empty())
return;
VkDependencyInfo depInfo = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO };
depInfo.imageMemoryBarrierCount = m_imageLayoutTransitions.size();
depInfo.pImageMemoryBarriers = m_imageLayoutTransitions.data();
m_cmd->cmdPipelineBarrier(cmdBuffer, &depInfo);
m_imageLayoutTransitions.clear();
}
void DxvkContext::addImageLayoutTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout srcLayout,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess) {
if (srcLayout == dstLayout && srcStages == dstStages)
return;
auto& barrier = m_imageLayoutTransitions.emplace_back();
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
barrier.srcStageMask = srcStages;
barrier.srcAccessMask = srcAccess;
barrier.dstStageMask = dstStages;
barrier.dstAccessMask = dstAccess;
barrier.oldLayout = srcLayout;
barrier.newLayout = dstLayout;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = image.handle();
barrier.subresourceRange = subresources;
}
void DxvkContext::addImageLayoutTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess,
bool discard) {
// If discard is false, this assumes that the image is
// in its default layout and ready to be accessed via
// its standard access patterns.
VkImageLayout srcLayout = image.info().layout;
if (discard)
srcLayout = VK_IMAGE_LAYOUT_UNDEFINED;
addImageLayoutTransition(image, subresources,
srcLayout, dstStages, 0,
dstLayout, dstStages, dstAccess);
}
void DxvkContext::addImageInitTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess) {
addImageLayoutTransition(image, subresources,
VK_IMAGE_LAYOUT_UNDEFINED, 0, 0,
dstLayout, dstStages, dstAccess);
}
bool DxvkContext::formatsAreCopyCompatible(
VkFormat imageFormat,
VkFormat bufferFormat) {

View File

@ -1433,6 +1433,8 @@ namespace dxvk {
std::array<DxvkGraphicsPipeline*, 4096> m_gpLookupCache = { };
std::array<DxvkComputePipeline*, 256> m_cpLookupCache = { };
std::vector<VkImageMemoryBarrier2> m_imageLayoutTransitions;
void blitImageFb(
Rc<DxvkImageView> dstView,
const VkOffset3D* dstOffsets,
@ -1779,6 +1781,34 @@ namespace dxvk {
void splitCommands();
void flushImageLayoutTransitions(
DxvkCmdBuffer cmdBuffer);
void addImageLayoutTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout srcLayout,
VkPipelineStageFlags2 srcStages,
VkAccessFlags2 srcAccess,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess);
void addImageLayoutTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess,
bool discard);
void addImageInitTransition(
const DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
VkAccessFlags2 dstAccess);
static bool formatsAreCopyCompatible(
VkFormat imageFormat,
VkFormat bufferFormat);