mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxvk] Fix image layouts for images using VK_IMAGE_TILING_LINEAR
We have to use VK_IMAGE_LAYOUT_GENERAL for those. On top of that, we should avoid image transitions when the image is in GENERAL layout anyway in order to save some time on the GPU.
This commit is contained in:
parent
d5041337f5
commit
1bcae90dd0
@ -337,17 +337,17 @@ namespace dxvk {
|
|||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
image->info().stages,
|
image->info().stages,
|
||||||
image->info().access,
|
image->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
|
|
||||||
m_cmd->cmdClearColorImage(image->handle(),
|
m_cmd->cmdClearColorImage(image->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
&value, 1, &subresources);
|
&value, 1, &subresources);
|
||||||
|
|
||||||
m_barriers.accessImage(image, subresources,
|
m_barriers.accessImage(image, subresources,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
image->info().layout,
|
image->info().layout,
|
||||||
@ -370,18 +370,18 @@ namespace dxvk {
|
|||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
image->info().stages,
|
image->info().stages,
|
||||||
image->info().access,
|
image->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
|
|
||||||
m_cmd->cmdClearDepthStencilImage(image->handle(),
|
m_cmd->cmdClearDepthStencilImage(image->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
&value, 1, &subresources);
|
&value, 1, &subresources);
|
||||||
|
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
image, subresources,
|
image, subresources,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
image->info().layout,
|
image->info().layout,
|
||||||
@ -416,10 +416,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (clearAspects & VK_IMAGE_ASPECT_COLOR_BIT) {
|
if (clearAspects & VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||||
attachments.setColorTarget(0, imageView,
|
attachments.setColorTarget(0, imageView,
|
||||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
|
||||||
} else {
|
} else {
|
||||||
attachments.setDepthTarget(imageView,
|
attachments.setDepthTarget(imageView,
|
||||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
this->renderPassBindFramebuffer(
|
this->renderPassBindFramebuffer(
|
||||||
@ -596,7 +596,7 @@ namespace dxvk {
|
|||||||
: dstImage->info().layout,
|
: dstImage->info().layout,
|
||||||
dstImage->info().stages,
|
dstImage->info().stages,
|
||||||
dstImage->info().access,
|
dstImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -612,12 +612,12 @@ namespace dxvk {
|
|||||||
m_cmd->cmdCopyBufferToImage(
|
m_cmd->cmdCopyBufferToImage(
|
||||||
srcSlice.handle(),
|
srcSlice.handle(),
|
||||||
dstImage->handle(),
|
dstImage->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
1, ©Region);
|
1, ©Region);
|
||||||
|
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
dstImage, dstSubresourceRange,
|
dstImage, dstSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
dstImage->info().layout,
|
dstImage->info().layout,
|
||||||
@ -664,7 +664,7 @@ namespace dxvk {
|
|||||||
: dstImage->info().layout,
|
: dstImage->info().layout,
|
||||||
dstImage->info().stages,
|
dstImage->info().stages,
|
||||||
dstImage->info().access,
|
dstImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
@ -672,7 +672,7 @@ namespace dxvk {
|
|||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
srcImage->info().stages,
|
srcImage->info().stages,
|
||||||
srcImage->info().access,
|
srcImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT);
|
VK_ACCESS_TRANSFER_READ_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -686,8 +686,8 @@ namespace dxvk {
|
|||||||
imageRegion.extent = extent;
|
imageRegion.extent = extent;
|
||||||
|
|
||||||
m_cmd->cmdCopyImage(
|
m_cmd->cmdCopyImage(
|
||||||
srcImage->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->handle(), srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
dstImage->handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->handle(), dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
1, &imageRegion);
|
1, &imageRegion);
|
||||||
} else {
|
} else {
|
||||||
const VkDeviceSize transferBufferSize = std::max(
|
const VkDeviceSize transferBufferSize = std::max(
|
||||||
@ -717,7 +717,8 @@ namespace dxvk {
|
|||||||
bufferImageCopy.imageExtent = extent;
|
bufferImageCopy.imageExtent = extent;
|
||||||
|
|
||||||
m_cmd->cmdCopyImageToBuffer(
|
m_cmd->cmdCopyImageToBuffer(
|
||||||
srcImage->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->handle(),
|
||||||
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
tmpSlice.handle(), 1, &bufferImageCopy);
|
tmpSlice.handle(), 1, &bufferImageCopy);
|
||||||
|
|
||||||
m_barriers.accessBuffer(tmpSlice,
|
m_barriers.accessBuffer(tmpSlice,
|
||||||
@ -730,9 +731,9 @@ namespace dxvk {
|
|||||||
bufferImageCopy.imageSubresource = dstSubresource;
|
bufferImageCopy.imageSubresource = dstSubresource;
|
||||||
bufferImageCopy.imageOffset = dstOffset;
|
bufferImageCopy.imageOffset = dstOffset;
|
||||||
|
|
||||||
m_cmd->cmdCopyBufferToImage(
|
m_cmd->cmdCopyBufferToImage(tmpSlice.handle(),
|
||||||
tmpSlice.handle(), dstImage->handle(),
|
dstImage->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
1, &bufferImageCopy);
|
1, &bufferImageCopy);
|
||||||
|
|
||||||
m_barriers.accessBuffer(tmpSlice,
|
m_barriers.accessBuffer(tmpSlice,
|
||||||
@ -746,7 +747,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
dstImage, dstSubresourceRange,
|
dstImage, dstSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
dstImage->info().layout,
|
dstImage->info().layout,
|
||||||
@ -754,7 +755,7 @@ namespace dxvk {
|
|||||||
dstImage->info().access);
|
dstImage->info().access);
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
srcImage, srcSubresourceRange,
|
srcImage, srcSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT,
|
VK_ACCESS_TRANSFER_READ_BIT,
|
||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
@ -790,7 +791,7 @@ namespace dxvk {
|
|||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
srcImage->info().stages,
|
srcImage->info().stages,
|
||||||
srcImage->info().access,
|
srcImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT);
|
VK_ACCESS_TRANSFER_READ_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -805,13 +806,13 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_cmd->cmdCopyImageToBuffer(
|
m_cmd->cmdCopyImageToBuffer(
|
||||||
srcImage->handle(),
|
srcImage->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
dstSlice.handle(),
|
dstSlice.handle(),
|
||||||
1, ©Region);
|
1, ©Region);
|
||||||
|
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
srcImage, srcSubresourceRange,
|
srcImage, srcSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT,
|
VK_ACCESS_TRANSFER_READ_BIT,
|
||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
@ -972,7 +973,7 @@ namespace dxvk {
|
|||||||
image->info().layout,
|
image->info().layout,
|
||||||
image->info().stages,
|
image->info().stages,
|
||||||
image->info().access,
|
image->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT);
|
VK_ACCESS_TRANSFER_READ_BIT);
|
||||||
|
|
||||||
@ -986,7 +987,7 @@ namespace dxvk {
|
|||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
image->info().stages,
|
image->info().stages,
|
||||||
image->info().access,
|
image->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
|
|
||||||
@ -1019,8 +1020,8 @@ namespace dxvk {
|
|||||||
region.dstOffsets[1].z = dstExtent.depth;
|
region.dstOffsets[1].z = dstExtent.depth;
|
||||||
|
|
||||||
m_cmd->cmdBlitImage(
|
m_cmd->cmdBlitImage(
|
||||||
image->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
image->handle(), image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
image->handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->handle(), image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
1, ®ion, VK_FILTER_LINEAR);
|
1, ®ion, VK_FILTER_LINEAR);
|
||||||
|
|
||||||
if (i + 1 < subresources.levelCount) {
|
if (i + 1 < subresources.levelCount) {
|
||||||
@ -1029,10 +1030,10 @@ namespace dxvk {
|
|||||||
subresources.aspectMask, mip, 1,
|
subresources.aspectMask, mip, 1,
|
||||||
subresources.baseArrayLayer,
|
subresources.baseArrayLayer,
|
||||||
subresources.layerCount },
|
subresources.layerCount },
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT);
|
VK_ACCESS_TRANSFER_READ_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -1048,7 +1049,7 @@ namespace dxvk {
|
|||||||
subresources.levelCount - 1,
|
subresources.levelCount - 1,
|
||||||
subresources.baseArrayLayer,
|
subresources.baseArrayLayer,
|
||||||
subresources.layerCount },
|
subresources.layerCount },
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT,
|
VK_ACCESS_TRANSFER_READ_BIT,
|
||||||
image->info().layout,
|
image->info().layout,
|
||||||
@ -1062,7 +1063,7 @@ namespace dxvk {
|
|||||||
+ subresources.levelCount - 1, 1,
|
+ subresources.levelCount - 1, 1,
|
||||||
subresources.baseArrayLayer,
|
subresources.baseArrayLayer,
|
||||||
subresources.layerCount },
|
subresources.layerCount },
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
image->info().layout,
|
image->info().layout,
|
||||||
@ -1133,7 +1134,7 @@ namespace dxvk {
|
|||||||
VK_IMAGE_LAYOUT_UNDEFINED,
|
VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
dstImage->info().stages,
|
dstImage->info().stages,
|
||||||
dstImage->info().access,
|
dstImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
@ -1141,7 +1142,7 @@ namespace dxvk {
|
|||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
srcImage->info().stages,
|
srcImage->info().stages,
|
||||||
srcImage->info().access,
|
srcImage->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT);
|
VK_ACCESS_TRANSFER_READ_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -1154,15 +1155,13 @@ namespace dxvk {
|
|||||||
imageRegion.extent = srcImage->mipLevelExtent(srcSubresources.mipLevel);
|
imageRegion.extent = srcImage->mipLevelExtent(srcSubresources.mipLevel);
|
||||||
|
|
||||||
m_cmd->cmdResolveImage(
|
m_cmd->cmdResolveImage(
|
||||||
srcImage->handle(),
|
srcImage->handle(), srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
dstImage->handle(), dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
dstImage->handle(),
|
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
|
||||||
1, &imageRegion);
|
1, &imageRegion);
|
||||||
|
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
dstImage, dstSubresourceRange,
|
dstImage, dstSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
dstImage->info().layout,
|
dstImage->info().layout,
|
||||||
@ -1170,7 +1169,7 @@ namespace dxvk {
|
|||||||
dstImage->info().access);
|
dstImage->info().access);
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
srcImage, srcSubresourceRange,
|
srcImage, srcSubresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
srcImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_READ_BIT,
|
VK_ACCESS_TRANSFER_READ_BIT,
|
||||||
srcImage->info().layout,
|
srcImage->info().layout,
|
||||||
@ -1318,7 +1317,7 @@ namespace dxvk {
|
|||||||
: image->info().layout,
|
: image->info().layout,
|
||||||
image->info().stages,
|
image->info().stages,
|
||||||
image->info().access,
|
image->info().access,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||||
m_barriers.recordCommands(m_cmd);
|
m_barriers.recordCommands(m_cmd);
|
||||||
@ -1335,13 +1334,13 @@ namespace dxvk {
|
|||||||
region.imageExtent = imageExtent;
|
region.imageExtent = imageExtent;
|
||||||
|
|
||||||
m_cmd->stagedBufferImageCopy(image->handle(),
|
m_cmd->stagedBufferImageCopy(image->handle(),
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
region, slice);
|
region, slice);
|
||||||
|
|
||||||
// Transition image back into its optimal layout
|
// Transition image back into its optimal layout
|
||||||
m_barriers.accessImage(
|
m_barriers.accessImage(
|
||||||
image, subresourceRange,
|
image, subresourceRange,
|
||||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||||
image->info().layout,
|
image->info().layout,
|
||||||
|
@ -204,6 +204,19 @@ namespace dxvk {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Picks a compatible layout
|
||||||
|
*
|
||||||
|
* Under some circumstances, we have to return
|
||||||
|
* a different layout than the one requested.
|
||||||
|
* \param [in] layout The image layout
|
||||||
|
* \returns A compatible image layout
|
||||||
|
*/
|
||||||
|
VkImageLayout pickLayout(VkImageLayout layout) const {
|
||||||
|
return m_info.layout == VK_IMAGE_LAYOUT_GENERAL
|
||||||
|
? VK_IMAGE_LAYOUT_GENERAL : layout;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Rc<vk::DeviceFn> m_vkd;
|
Rc<vk::DeviceFn> m_vkd;
|
||||||
@ -309,6 +322,14 @@ namespace dxvk {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Picks an image layout
|
||||||
|
* \see DxvkImage::pickLayout
|
||||||
|
*/
|
||||||
|
VkImageLayout pickLayout(VkImageLayout layout) const {
|
||||||
|
return m_image->pickLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Rc<vk::DeviceFn> m_vkd;
|
Rc<vk::DeviceFn> m_vkd;
|
||||||
|
@ -47,8 +47,8 @@ namespace dxvk {
|
|||||||
srcImage->info().access | dstImage->info().access, 0 },
|
srcImage->info().access | dstImage->info().access, 0 },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
VkAttachmentReference dstAttachmentRef = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
|
VkAttachmentReference dstAttachmentRef = { 0, dstImage->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) };
|
||||||
VkAttachmentReference srcAttachmentRef = { 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
|
VkAttachmentReference srcAttachmentRef = { 1, srcImage->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) };
|
||||||
|
|
||||||
VkSubpassDescription spInfo;
|
VkSubpassDescription spInfo;
|
||||||
spInfo.flags = 0;
|
spInfo.flags = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user