mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-16 16:57:00 +02:00
[vk] Image Remaining Layers 3D
This commit is contained in:
parent
f851eeb9a8
commit
3dee74854a
1 changed files with 48 additions and 19 deletions
|
|
@ -478,6 +478,15 @@ TransformBufferCopies(std::span<const VideoCommon::BufferCopy> copies, size_t bu
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] VkImageSubresourceRange Expand3DSubresourceRange(VkImageSubresourceRange range,
|
||||||
|
bool is_3d_image) {
|
||||||
|
if (is_3d_image) {
|
||||||
|
range.baseArrayLayer = 0;
|
||||||
|
range.layerCount = VK_REMAINING_ARRAY_LAYERS;
|
||||||
|
}
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] VkImageSubresourceRange MakeSubresourceRange(const ImageView* image_view) {
|
[[nodiscard]] VkImageSubresourceRange MakeSubresourceRange(const ImageView* image_view) {
|
||||||
SubresourceRange range = image_view->range;
|
SubresourceRange range = image_view->range;
|
||||||
if (True(image_view->flags & VideoCommon::ImageViewFlagBits::Slice)) {
|
if (True(image_view->flags & VideoCommon::ImageViewFlagBits::Slice)) {
|
||||||
|
|
@ -486,7 +495,8 @@ TransformBufferCopies(std::span<const VideoCommon::BufferCopy> copies, size_t bu
|
||||||
range.base.layer = 0;
|
range.base.layer = 0;
|
||||||
range.extent.layers = 1;
|
range.extent.layers = 1;
|
||||||
}
|
}
|
||||||
return MakeSubresourceRange(ImageAspectMask(image_view->format), range);
|
return Expand3DSubresourceRange(MakeSubresourceRange(ImageAspectMask(image_view->format), range),
|
||||||
|
image_view->Is3DImage());
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] VkImageSubresourceLayers MakeSubresourceLayers(const ImageView* image_view) {
|
[[nodiscard]] VkImageSubresourceLayers MakeSubresourceLayers(const ImageView* image_view) {
|
||||||
|
|
@ -567,7 +577,7 @@ struct RangedBarrierRange {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
|
void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image,
|
||||||
VkImageAspectFlags aspect_mask, bool is_initialized,
|
VkImageAspectFlags aspect_mask, bool is_initialized, bool is_3d_image,
|
||||||
std::span<const VkBufferImageCopy> copies) {
|
std::span<const VkBufferImageCopy> copies) {
|
||||||
static constexpr VkAccessFlags WRITE_ACCESS_FLAGS =
|
static constexpr VkAccessFlags WRITE_ACCESS_FLAGS =
|
||||||
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
||||||
|
|
@ -581,7 +591,8 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im
|
||||||
for (const auto& region : copies) {
|
for (const auto& region : copies) {
|
||||||
range.AddLayers(region.imageSubresource);
|
range.AddLayers(region.imageSubresource);
|
||||||
}
|
}
|
||||||
const VkImageSubresourceRange subresource_range = range.SubresourceRange(aspect_mask);
|
VkImageSubresourceRange subresource_range = range.SubresourceRange(aspect_mask);
|
||||||
|
subresource_range = Expand3DSubresourceRange(subresource_range, is_3d_image);
|
||||||
|
|
||||||
const VkImageMemoryBarrier read_barrier{
|
const VkImageMemoryBarrier read_barrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1530,14 +1541,21 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
|
||||||
});
|
});
|
||||||
const VkImage dst_image = dst.Handle();
|
const VkImage dst_image = dst.Handle();
|
||||||
const VkImage src_image = src.Handle();
|
const VkImage src_image = src.Handle();
|
||||||
|
const bool dst_is_3d = dst.info.type == ImageType::e3D;
|
||||||
|
const bool src_is_3d = src.info.type == ImageType::e3D;
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
scheduler.Record([dst_image, src_image, aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([dst_image, src_image, aspect_mask, vk_copies, dst_is_3d,
|
||||||
|
src_is_3d](vk::CommandBuffer cmdbuf) {
|
||||||
RangedBarrierRange dst_range;
|
RangedBarrierRange dst_range;
|
||||||
RangedBarrierRange src_range;
|
RangedBarrierRange src_range;
|
||||||
for (const VkImageCopy& copy : vk_copies) {
|
for (const VkImageCopy& copy : vk_copies) {
|
||||||
dst_range.AddLayers(copy.dstSubresource);
|
dst_range.AddLayers(copy.dstSubresource);
|
||||||
src_range.AddLayers(copy.srcSubresource);
|
src_range.AddLayers(copy.srcSubresource);
|
||||||
}
|
}
|
||||||
|
const VkImageSubresourceRange dst_subresource =
|
||||||
|
Expand3DSubresourceRange(dst_range.SubresourceRange(aspect_mask), dst_is_3d);
|
||||||
|
const VkImageSubresourceRange src_subresource =
|
||||||
|
Expand3DSubresourceRange(src_range.SubresourceRange(aspect_mask), src_is_3d);
|
||||||
const std::array pre_barriers{
|
const std::array pre_barriers{
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1551,7 +1569,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = src_image,
|
.image = src_image,
|
||||||
.subresourceRange = src_range.SubresourceRange(aspect_mask),
|
.subresourceRange = src_subresource,
|
||||||
},
|
},
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1565,7 +1583,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = dst_image,
|
.image = dst_image,
|
||||||
.subresourceRange = dst_range.SubresourceRange(aspect_mask),
|
.subresourceRange = dst_subresource,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const std::array post_barriers{
|
const std::array post_barriers{
|
||||||
|
|
@ -1579,7 +1597,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = src_image,
|
.image = src_image,
|
||||||
.subresourceRange = src_range.SubresourceRange(aspect_mask),
|
.subresourceRange = src_subresource,
|
||||||
},
|
},
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1596,7 +1614,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = dst_image,
|
.image = dst_image,
|
||||||
.subresourceRange = dst_range.SubresourceRange(aspect_mask),
|
.subresourceRange = dst_subresource,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
cmdbuf.PipelineBarrier(
|
cmdbuf.PipelineBarrier(
|
||||||
|
|
@ -1626,14 +1644,21 @@ void TextureCacheRuntime::CopyImageMSAA(Image& dst, Image& src,
|
||||||
});
|
});
|
||||||
const VkImage dst_image = dst.Handle();
|
const VkImage dst_image = dst.Handle();
|
||||||
const VkImage src_image = src.Handle();
|
const VkImage src_image = src.Handle();
|
||||||
|
const bool dst_is_3d = dst.info.type == ImageType::e3D;
|
||||||
|
const bool src_is_3d = src.info.type == ImageType::e3D;
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
scheduler.Record([dst_image, src_image, aspect_mask, vk_resolves](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([dst_image, src_image, aspect_mask, vk_resolves, dst_is_3d,
|
||||||
|
src_is_3d](vk::CommandBuffer cmdbuf) {
|
||||||
RangedBarrierRange dst_range;
|
RangedBarrierRange dst_range;
|
||||||
RangedBarrierRange src_range;
|
RangedBarrierRange src_range;
|
||||||
for (const VkImageResolve& region : vk_resolves) {
|
for (const VkImageResolve& region : vk_resolves) {
|
||||||
dst_range.AddLayers(region.dstSubresource);
|
dst_range.AddLayers(region.dstSubresource);
|
||||||
src_range.AddLayers(region.srcSubresource);
|
src_range.AddLayers(region.srcSubresource);
|
||||||
}
|
}
|
||||||
|
const VkImageSubresourceRange dst_subresource =
|
||||||
|
Expand3DSubresourceRange(dst_range.SubresourceRange(aspect_mask), dst_is_3d);
|
||||||
|
const VkImageSubresourceRange src_subresource =
|
||||||
|
Expand3DSubresourceRange(src_range.SubresourceRange(aspect_mask), src_is_3d);
|
||||||
const std::array pre_barriers{
|
const std::array pre_barriers{
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1648,7 +1673,7 @@ void TextureCacheRuntime::CopyImageMSAA(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = src_image,
|
.image = src_image,
|
||||||
.subresourceRange = src_range.SubresourceRange(aspect_mask),
|
.subresourceRange = src_subresource,
|
||||||
},
|
},
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1663,7 +1688,7 @@ void TextureCacheRuntime::CopyImageMSAA(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = dst_image,
|
.image = dst_image,
|
||||||
.subresourceRange = dst_range.SubresourceRange(aspect_mask),
|
.subresourceRange = dst_subresource,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const std::array post_barriers{
|
const std::array post_barriers{
|
||||||
|
|
@ -1677,7 +1702,7 @@ void TextureCacheRuntime::CopyImageMSAA(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = src_image,
|
.image = src_image,
|
||||||
.subresourceRange = src_range.SubresourceRange(aspect_mask),
|
.subresourceRange = src_subresource,
|
||||||
},
|
},
|
||||||
VkImageMemoryBarrier{
|
VkImageMemoryBarrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
|
|
@ -1695,7 +1720,7 @@ void TextureCacheRuntime::CopyImageMSAA(Image& dst, Image& src,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = dst_image,
|
.image = dst_image,
|
||||||
.subresourceRange = dst_range.SubresourceRange(aspect_mask),
|
.subresourceRange = dst_subresource,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
cmdbuf.PipelineBarrier(
|
cmdbuf.PipelineBarrier(
|
||||||
|
|
@ -1880,9 +1905,10 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset,
|
||||||
const VkImage temp_vk_image = *temp_wrapper->original_image;
|
const VkImage temp_vk_image = *temp_wrapper->original_image;
|
||||||
const VkImageAspectFlags vk_aspect_mask = temp_wrapper->aspect_mask;
|
const VkImageAspectFlags vk_aspect_mask = temp_wrapper->aspect_mask;
|
||||||
|
|
||||||
scheduler->Record([src_buffer, temp_vk_image, vk_aspect_mask, vk_copies,
|
const bool temp_is_3d = temp_info.type == ImageType::e3D;
|
||||||
|
scheduler->Record([src_buffer, temp_vk_image, vk_aspect_mask, vk_copies, temp_is_3d,
|
||||||
keep = temp_wrapper](vk::CommandBuffer cmdbuf) {
|
keep = temp_wrapper](vk::CommandBuffer cmdbuf) {
|
||||||
CopyBufferToImage(cmdbuf, src_buffer, temp_vk_image, vk_aspect_mask, false, VideoCommon::FixSmallVectorADL(vk_copies));
|
CopyBufferToImage(cmdbuf, src_buffer, temp_vk_image, vk_aspect_mask, false, temp_is_3d, VideoCommon::FixSmallVectorADL(vk_copies));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Use MSAACopyPass to convert from non-MSAA to MSAA
|
// Use MSAACopyPass to convert from non-MSAA to MSAA
|
||||||
|
|
@ -1919,9 +1945,10 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset,
|
||||||
const VkImageAspectFlags vk_aspect_mask = aspect_mask;
|
const VkImageAspectFlags vk_aspect_mask = aspect_mask;
|
||||||
const bool was_initialized = std::exchange(initialized, true);
|
const bool was_initialized = std::exchange(initialized, true);
|
||||||
|
|
||||||
scheduler->Record([src_buffer, vk_image, vk_aspect_mask, was_initialized,
|
const bool is_3d_image = info.type == ImageType::e3D;
|
||||||
|
scheduler->Record([src_buffer, vk_image, vk_aspect_mask, was_initialized, is_3d_image,
|
||||||
vk_copies](vk::CommandBuffer cmdbuf) {
|
vk_copies](vk::CommandBuffer cmdbuf) {
|
||||||
CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, was_initialized, VideoCommon::FixSmallVectorADL(vk_copies));
|
CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, was_initialized, is_3d_image, VideoCommon::FixSmallVectorADL(vk_copies));
|
||||||
});
|
});
|
||||||
|
|
||||||
if (is_rescaled) {
|
if (is_rescaled) {
|
||||||
|
|
@ -2296,7 +2323,8 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
|
||||||
ImageId image_id_, Image& image)
|
ImageId image_id_, Image& image)
|
||||||
: VideoCommon::ImageViewBase{info, image.info, image_id_, image.gpu_addr},
|
: VideoCommon::ImageViewBase{info, image.info, image_id_, image.gpu_addr},
|
||||||
device{&runtime.device}, image_handle{image.Handle()},
|
device{&runtime.device}, image_handle{image.Handle()},
|
||||||
samples(ConvertSampleCount(image.info.num_samples)) {
|
samples(ConvertSampleCount(image.info.num_samples)),
|
||||||
|
is_3d_image(image.info.type == ImageType::e3D) {
|
||||||
using Shader::TextureType;
|
using Shader::TextureType;
|
||||||
|
|
||||||
const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info);
|
const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info);
|
||||||
|
|
@ -2394,7 +2422,8 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
|
||||||
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageInfo& info,
|
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageInfo& info,
|
||||||
const VideoCommon::ImageViewInfo& view_info, GPUVAddr gpu_addr_)
|
const VideoCommon::ImageViewInfo& view_info, GPUVAddr gpu_addr_)
|
||||||
: VideoCommon::ImageViewBase{info, view_info, gpu_addr_},
|
: VideoCommon::ImageViewBase{info, view_info, gpu_addr_},
|
||||||
buffer_size{VideoCommon::CalculateGuestSizeInBytes(info)} {}
|
buffer_size{VideoCommon::CalculateGuestSizeInBytes(info)},
|
||||||
|
is_3d_image(info.type == ImageType::e3D) {}
|
||||||
|
|
||||||
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::NullImageViewParams& params)
|
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::NullImageViewParams& params)
|
||||||
: VideoCommon::ImageViewBase{params}, device{&runtime.device} {
|
: VideoCommon::ImageViewBase{params}, device{&runtime.device} {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue