mirror of
https://github.com/azahar-emu/azahar.git
synced 2026-06-06 02:33:44 -04:00
renderer_vulkan: Fix dangling surface reference during msaa resolve
These individual parameters need to be copied as the reference to the surface-object only lasts within the scope of this function.
This commit is contained in:
parent
9d6527b3ae
commit
177edd228e
1 changed files with 25 additions and 23 deletions
|
|
@ -615,81 +615,83 @@ bool TextureRuntime::BlitTextures(Surface& source, Surface& dest,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Todo(wunk): Add a "dirty" flag for msaa resolves to avoid redundant image resolves
|
// Todo(wunk): Add a "dirty" flag for msaa resolves to avoid redundant image resolves
|
||||||
const auto resolve_image = [&](Surface& msaa_surface) {
|
const auto resolve_image = [&](const Surface& msaa_surface) {
|
||||||
scheduler.Record([&msaa_surface](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([width = msaa_surface.GetScaledWidth(),
|
||||||
|
height = msaa_surface.GetScaledHeight(), aspect = msaa_surface.Aspect(),
|
||||||
|
access_flags = msaa_surface.AccessFlags(),
|
||||||
|
pipeline_state_flags = msaa_surface.PipelineStageFlags(),
|
||||||
|
msaa_image = msaa_surface.Image(Type::MultiSampled),
|
||||||
|
dest_image = msaa_surface.Image()](vk::CommandBuffer cmdbuf) {
|
||||||
const vk::ImageResolve resolve_area = {
|
const vk::ImageResolve resolve_area = {
|
||||||
.srcSubresource{
|
.srcSubresource{
|
||||||
.aspectMask = msaa_surface.Aspect(),
|
.aspectMask = aspect,
|
||||||
.mipLevel = 0,
|
.mipLevel = 0,
|
||||||
.baseArrayLayer = 0,
|
.baseArrayLayer = 0,
|
||||||
.layerCount = 1,
|
.layerCount = 1,
|
||||||
},
|
},
|
||||||
.srcOffset = {},
|
.srcOffset = {},
|
||||||
.dstSubresource{
|
.dstSubresource{
|
||||||
.aspectMask = msaa_surface.Aspect(),
|
.aspectMask = aspect,
|
||||||
.mipLevel = 0,
|
.mipLevel = 0,
|
||||||
.baseArrayLayer = 0,
|
.baseArrayLayer = 0,
|
||||||
.layerCount = 1,
|
.layerCount = 1,
|
||||||
},
|
},
|
||||||
.dstOffset = {},
|
.dstOffset = {},
|
||||||
.extent{msaa_surface.GetScaledWidth(), msaa_surface.GetScaledHeight(), 1},
|
.extent{width, height, 1},
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::array read_barriers = {
|
const std::array read_barriers = {
|
||||||
vk::ImageMemoryBarrier{
|
vk::ImageMemoryBarrier{
|
||||||
.srcAccessMask = msaa_surface.AccessFlags(),
|
.srcAccessMask = access_flags,
|
||||||
.dstAccessMask = vk::AccessFlagBits::eTransferRead,
|
.dstAccessMask = vk::AccessFlagBits::eTransferRead,
|
||||||
.oldLayout = vk::ImageLayout::eGeneral,
|
.oldLayout = vk::ImageLayout::eGeneral,
|
||||||
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = msaa_surface.Image(Type::MultiSampled),
|
.image = msaa_image,
|
||||||
.subresourceRange = MakeSubresourceRange(msaa_surface.Aspect(), 0),
|
.subresourceRange = MakeSubresourceRange(aspect, 0),
|
||||||
},
|
},
|
||||||
vk::ImageMemoryBarrier{
|
vk::ImageMemoryBarrier{
|
||||||
.srcAccessMask = msaa_surface.AccessFlags(),
|
.srcAccessMask = access_flags,
|
||||||
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
|
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
|
||||||
.oldLayout = vk::ImageLayout::eGeneral,
|
.oldLayout = vk::ImageLayout::eGeneral,
|
||||||
.newLayout = vk::ImageLayout::eTransferDstOptimal,
|
.newLayout = vk::ImageLayout::eTransferDstOptimal,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = msaa_surface.Image(),
|
.image = dest_image,
|
||||||
.subresourceRange = MakeSubresourceRange(msaa_surface.Aspect(), 0),
|
.subresourceRange = MakeSubresourceRange(aspect, 0),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const std::array write_barriers = {
|
const std::array write_barriers = {
|
||||||
vk::ImageMemoryBarrier{
|
vk::ImageMemoryBarrier{
|
||||||
.srcAccessMask = vk::AccessFlagBits::eTransferRead,
|
.srcAccessMask = vk::AccessFlagBits::eTransferRead,
|
||||||
.dstAccessMask = msaa_surface.AccessFlags(),
|
.dstAccessMask = access_flags,
|
||||||
.oldLayout = vk::ImageLayout::eTransferSrcOptimal,
|
.oldLayout = vk::ImageLayout::eTransferSrcOptimal,
|
||||||
.newLayout = vk::ImageLayout::eGeneral,
|
.newLayout = vk::ImageLayout::eGeneral,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = msaa_surface.Image(Type::MultiSampled),
|
.image = msaa_image,
|
||||||
.subresourceRange = MakeSubresourceRange(msaa_surface.Aspect(), 0),
|
.subresourceRange = MakeSubresourceRange(aspect, 0),
|
||||||
},
|
},
|
||||||
vk::ImageMemoryBarrier{
|
vk::ImageMemoryBarrier{
|
||||||
.srcAccessMask = vk::AccessFlagBits::eTransferWrite,
|
.srcAccessMask = vk::AccessFlagBits::eTransferWrite,
|
||||||
.dstAccessMask = msaa_surface.AccessFlags(),
|
.dstAccessMask = access_flags,
|
||||||
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
||||||
.newLayout = vk::ImageLayout::eGeneral,
|
.newLayout = vk::ImageLayout::eGeneral,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = msaa_surface.Image(),
|
.image = dest_image,
|
||||||
.subresourceRange = MakeSubresourceRange(msaa_surface.Aspect(), 0),
|
.subresourceRange = MakeSubresourceRange(aspect, 0),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
cmdbuf.pipelineBarrier(msaa_surface.PipelineStageFlags(),
|
cmdbuf.pipelineBarrier(pipeline_state_flags, vk::PipelineStageFlagBits::eTransfer,
|
||||||
vk::PipelineStageFlagBits::eTransfer,
|
|
||||||
vk::DependencyFlagBits::eByRegion, {}, {}, read_barriers);
|
vk::DependencyFlagBits::eByRegion, {}, {}, read_barriers);
|
||||||
|
|
||||||
cmdbuf.resolveImage(msaa_surface.Image(Type::MultiSampled),
|
cmdbuf.resolveImage(msaa_image, vk::ImageLayout::eTransferSrcOptimal, dest_image,
|
||||||
vk::ImageLayout::eTransferSrcOptimal, msaa_surface.Image(),
|
|
||||||
vk::ImageLayout::eTransferDstOptimal, resolve_area);
|
vk::ImageLayout::eTransferDstOptimal, resolve_area);
|
||||||
|
|
||||||
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer,
|
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, pipeline_state_flags,
|
||||||
msaa_surface.PipelineStageFlags(),
|
|
||||||
vk::DependencyFlagBits::eByRegion, {}, {}, write_barriers);
|
vk::DependencyFlagBits::eByRegion, {}, {}, write_barriers);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue