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

[dxvk] Track image initialization

This commit is contained in:
Philip Rebohle 2024-10-12 15:37:02 +02:00 committed by Philip Rebohle
parent 255e7b7d7a
commit 8ab6b8616b
2 changed files with 25 additions and 11 deletions

View File

@ -6573,7 +6573,7 @@ namespace dxvk {
void DxvkContext::addImageLayoutTransition(
const DxvkImage& image,
DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout srcLayout,
VkPipelineStageFlags2 srcStages,
@ -6584,6 +6584,9 @@ namespace dxvk {
if (srcLayout == dstLayout && srcStages == dstStages)
return;
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED)
image.trackInitialization(subresources);
auto& barrier = m_imageLayoutTransitions.emplace_back();
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2;
barrier.srcStageMask = srcStages;
@ -6600,19 +6603,27 @@ namespace dxvk {
void DxvkContext::addImageLayoutTransition(
const DxvkImage& image,
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.
// 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;
if (discard) {
// Only discard if the image is either uninitialized or if it is
// GPU-writable. Discarding is most likely not useful otherwise.
constexpr VkImageUsageFlags WritableFlags =
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
VK_IMAGE_USAGE_STORAGE_BIT;
if ((image.info().usage & WritableFlags) || !image.isInitialized(subresources))
srcLayout = VK_IMAGE_LAYOUT_UNDEFINED;
}
addImageLayoutTransition(image, subresources,
srcLayout, dstStages, 0,
@ -6621,7 +6632,7 @@ namespace dxvk {
void DxvkContext::addImageInitTransition(
const DxvkImage& image,
DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
@ -6677,6 +6688,9 @@ namespace dxvk {
VkAccessFlags2 dstAccess) {
auto& batch = getBarrierBatch(cmdBuffer);
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED)
image.trackInitialization(subresources);
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
barrier.srcStageMask = srcStages;
barrier.srcAccessMask = srcAccess;

View File

@ -1790,7 +1790,7 @@ namespace dxvk {
DxvkCmdBuffer cmdBuffer);
void addImageLayoutTransition(
const DxvkImage& image,
DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout srcLayout,
VkPipelineStageFlags2 srcStages,
@ -1800,7 +1800,7 @@ namespace dxvk {
VkAccessFlags2 dstAccess);
void addImageLayoutTransition(
const DxvkImage& image,
DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,
@ -1808,7 +1808,7 @@ namespace dxvk {
bool discard);
void addImageInitTransition(
const DxvkImage& image,
DxvkImage& image,
const VkImageSubresourceRange& subresources,
VkImageLayout dstLayout,
VkPipelineStageFlags2 dstStages,