From 2384c8f8112f6595eacacfeb52973b92d9ac30f6 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Fri, 3 Mar 2023 16:28:01 +0200 Subject: [PATCH] vk_texture_runtime: Bring back FramebufferView * Also move the usage hint flags to the allocation. If an allocation is used as framebuffer there's a high chance it will be used again as such. In addition is helps keeping pipeline barriers correct even when the surface is destoyed and recreated (happens often with framebuffers) --- src/video_core/renderer_vulkan/vk_texture_runtime.cpp | 11 ++++++----- src/video_core/renderer_vulkan/vk_texture_runtime.h | 9 +++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index 10b909079..6b007d416 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -1060,8 +1060,8 @@ vk::AccessFlags Surface::AccessFlags() const noexcept { return vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eTransferRead | vk::AccessFlagBits::eTransferWrite | - (is_framebuffer ? attachment_flags : vk::AccessFlagBits::eNone) | - (is_storage ? vk::AccessFlagBits::eShaderWrite : vk::AccessFlagBits::eNone); + (alloc.is_framebuffer ? attachment_flags : vk::AccessFlagBits::eNone) | + (alloc.is_storage ? vk::AccessFlagBits::eShaderWrite : vk::AccessFlagBits::eNone); } vk::PipelineStageFlags Surface::PipelineStageFlags() const noexcept { @@ -1072,8 +1072,8 @@ vk::PipelineStageFlags Surface::PipelineStageFlags() const noexcept { vk::PipelineStageFlagBits::eLateFragmentTests; return vk::PipelineStageFlagBits::eTransfer | vk::PipelineStageFlagBits::eFragmentShader | - (is_framebuffer ? attachment_flags : vk::PipelineStageFlagBits::eNone) | - (is_storage ? vk::PipelineStageFlagBits::eComputeShader + (alloc.is_framebuffer ? attachment_flags : vk::PipelineStageFlagBits::eNone) | + (alloc.is_storage ? vk::PipelineStageFlagBits::eComputeShader : vk::PipelineStageFlagBits::eNone); } @@ -1129,6 +1129,7 @@ vk::ImageView Surface::StorageView() noexcept { return storage_view.get(); } + alloc.is_storage = true; ASSERT_MSG(pixel_format == VideoCore::PixelFormat::RGBA8, "Attempted to retrieve storage view from unsupported surface with format {}", VideoCore::PixelFormatAsString(pixel_format)); @@ -1306,7 +1307,7 @@ void Framebuffer::PrepareImages(Surface* const color, Surface* const depth_stenc height = std::min(height, surface->GetScaledHeight()); formats[cursor] = surface->pixel_format; images[cursor] = surface->Image(); - image_views[cursor++] = surface->ImageView(); + image_views[cursor++] = surface->FramebufferView(); }; // Setup image handles diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.h b/src/video_core/renderer_vulkan/vk_texture_runtime.h index 49526a345..9626c5877 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.h +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.h @@ -32,6 +32,8 @@ struct Allocation { vk::ImageAspectFlags aspect; vk::Format format; bool is_mutable; + bool is_framebuffer{}; + bool is_storage{}; u32 width; u32 height; u32 levels; @@ -188,6 +190,11 @@ public: return alloc.image_view.get(); } + vk::ImageView FramebufferView() noexcept { + alloc.is_framebuffer = true; + return ImageView(); + } + /// Uploads pixel data in staging to a rectangle region of the surface texture void Upload(const VideoCore::BufferTextureCopy& upload, const VideoCore::StagingData& staging); @@ -234,8 +241,6 @@ private: const Instance* instance; Scheduler* scheduler; Allocation alloc{}; - bool is_framebuffer{}; - bool is_storage{}; }; class Framebuffer : public VideoCore::FramebufferBase {