mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Support multi-plane formats in copyImage
This commit is contained in:
parent
41e28cb280
commit
ed57019e13
@ -3051,7 +3051,9 @@ namespace dxvk {
|
|||||||
VkExtent3D extent) {
|
VkExtent3D extent) {
|
||||||
auto dstSubresourceRange = vk::makeSubresourceRange(dstSubresource);
|
auto dstSubresourceRange = vk::makeSubresourceRange(dstSubresource);
|
||||||
auto srcSubresourceRange = vk::makeSubresourceRange(srcSubresource);
|
auto srcSubresourceRange = vk::makeSubresourceRange(srcSubresource);
|
||||||
|
|
||||||
|
auto dstFormatInfo = dstImage->formatInfo();
|
||||||
|
|
||||||
if (m_execBarriers.isImageDirty(dstImage, dstSubresourceRange, DxvkAccess::Write)
|
if (m_execBarriers.isImageDirty(dstImage, dstSubresourceRange, DxvkAccess::Write)
|
||||||
|| m_execBarriers.isImageDirty(srcImage, srcSubresourceRange, DxvkAccess::Write))
|
|| m_execBarriers.isImageDirty(srcImage, srcSubresourceRange, DxvkAccess::Write))
|
||||||
m_execBarriers.recordCommands(m_cmd);
|
m_execBarriers.recordCommands(m_cmd);
|
||||||
@ -3086,17 +3088,33 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_execAcquires.recordCommands(m_cmd);
|
m_execAcquires.recordCommands(m_cmd);
|
||||||
|
|
||||||
VkImageCopy imageRegion;
|
for (auto aspects = dstSubresource.aspectMask; aspects; ) {
|
||||||
imageRegion.srcSubresource = srcSubresource;
|
auto aspect = vk::getNextAspect(aspects);
|
||||||
imageRegion.srcOffset = srcOffset;
|
|
||||||
imageRegion.dstSubresource = dstSubresource;
|
VkImageCopy imageRegion;
|
||||||
imageRegion.dstOffset = dstOffset;
|
imageRegion.srcSubresource = srcSubresource;
|
||||||
imageRegion.extent = extent;
|
imageRegion.srcSubresource.aspectMask = aspect;
|
||||||
|
imageRegion.srcOffset = srcOffset;
|
||||||
m_cmd->cmdCopyImage(DxvkCmdBuffer::ExecBuffer,
|
imageRegion.dstSubresource = dstSubresource;
|
||||||
srcImage->handle(), srcImageLayout,
|
imageRegion.dstSubresource.aspectMask = aspect;
|
||||||
dstImage->handle(), dstImageLayout,
|
imageRegion.dstOffset = dstOffset;
|
||||||
1, &imageRegion);
|
imageRegion.extent = extent;
|
||||||
|
|
||||||
|
if (dstFormatInfo->flags.test(DxvkFormatFlag::MultiPlane)) {
|
||||||
|
auto plane = &dstFormatInfo->planes[vk::getPlaneIndex(aspect)];
|
||||||
|
imageRegion.srcOffset.x /= plane->blockSize.width;
|
||||||
|
imageRegion.srcOffset.y /= plane->blockSize.height;
|
||||||
|
imageRegion.dstOffset.x /= plane->blockSize.width;
|
||||||
|
imageRegion.dstOffset.y /= plane->blockSize.height;
|
||||||
|
imageRegion.extent.width /= plane->blockSize.width;
|
||||||
|
imageRegion.extent.height /= plane->blockSize.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cmd->cmdCopyImage(DxvkCmdBuffer::ExecBuffer,
|
||||||
|
srcImage->handle(), srcImageLayout,
|
||||||
|
dstImage->handle(), dstImageLayout,
|
||||||
|
1, &imageRegion);
|
||||||
|
}
|
||||||
|
|
||||||
m_execBarriers.accessImage(
|
m_execBarriers.accessImage(
|
||||||
dstImage, dstSubresourceRange,
|
dstImage, dstSubresourceRange,
|
||||||
|
@ -115,9 +115,14 @@ namespace dxvk::vk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline VkImageAspectFlags getNextAspect(VkImageAspectFlags& mask) {
|
inline VkImageAspectFlags getNextAspect(VkImageAspectFlags& mask) {
|
||||||
VkImageAspectFlags result = mask & -mask;
|
if (likely(mask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
|
||||||
mask &= ~result;
|
// Depth-stencil isn't considered multi-planar
|
||||||
return result;
|
return std::exchange(mask, VkImageAspectFlags(0));
|
||||||
|
} else {
|
||||||
|
VkImageAspectFlags result = mask & -mask;
|
||||||
|
mask &= ~result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user