From 6cce6599b6e4b57d835eec70f037e98cf751edb0 Mon Sep 17 00:00:00 2001 From: psucien Date: Sat, 14 Sep 2024 00:09:05 +0200 Subject: [PATCH] don't use pointers; slight `FindTexture` refactoring --- .../renderer_vulkan/vk_pipeline_common.cpp | 29 ++++++++++--------- .../texture_cache/texture_cache.cpp | 3 +- src/video_core/texture_cache/texture_cache.h | 5 ++-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp index 6a3de7b61..e161c0c44 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_common.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_common.cpp @@ -21,20 +21,19 @@ void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader static boost::container::static_vector image_infos; image_infos.clear(); - using ImageBindingInfo = std::tuple; + using ImageBindingInfo = std::tuple; boost::container::static_vector image_bindings; for (const auto& image_desc : stage.images) { const auto tsharp = image_desc.GetSharp(stage); if (tsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid) { VideoCore::ImageInfo image_info{tsharp, image_desc.is_depth}; - VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage}; - auto& image_view = texture_cache.FindTexture(image_info, view_info); - auto& image = texture_cache.GetImage(image_view.image_id); + const auto image_id = texture_cache.FindImage(image_info); + auto& image = texture_cache.GetImage(image_id); image.flags |= VideoCore::ImageFlagBits::Bound; - image_bindings.emplace_back(&image, &image_view, image_desc.is_storage); + image_bindings.emplace_back(image_id, tsharp, image_desc.is_storage); } else { - image_bindings.emplace_back(nullptr, nullptr, image_desc.is_storage); + image_bindings.emplace_back(VideoCore::ImageId{}, tsharp, image_desc.is_storage); } if (texture_cache.IsMeta(tsharp.Address())) { @@ -43,8 +42,8 @@ void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader } // Second pass to re-bind images that were updated after binding - for (auto& [image, image_view, is_storage] : image_bindings) { - if (!image || !image_view) { + for (auto [image_id, tsharp, is_storage] : image_bindings) { + if (!image_id) { if (instance.IsNullDescriptorSupported()) { image_infos.emplace_back(VK_NULL_HANDLE, VK_NULL_HANDLE, vk::ImageLayout::eGeneral); } else { @@ -53,13 +52,15 @@ void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader vk::ImageLayout::eGeneral); } } else { - vk::ImageLayout layout = image->last_state.layout; - if (True(image->flags & VideoCore::ImageFlagBits::NeedsRebind)) { - image_view = &texture_cache.FindTexture(image->info, image_view->info); - layout = texture_cache.GetImage(image_view->image_id).last_state.layout; + auto& image = texture_cache.GetImage(image_id); + if (True(image.flags & VideoCore::ImageFlagBits::NeedsRebind)) { + image_id = texture_cache.FindImage(image.info); } - image_infos.emplace_back(VK_NULL_HANDLE, *image_view->image_view, layout); - image->flags &= + VideoCore::ImageViewInfo view_info{tsharp, is_storage}; + auto& image_view = texture_cache.FindTexture(image_id, view_info); + image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, + texture_cache.GetImage(image_id).last_state.layout); + image.flags &= ~(VideoCore::ImageFlagBits::NeedsRebind | VideoCore::ImageFlagBits::Bound); } diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 449157353..ef402ecc4 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -259,8 +259,7 @@ ImageView& TextureCache::RegisterImageView(ImageId image_id, const ImageViewInfo return slot_image_views[view_id]; } -ImageView& TextureCache::FindTexture(const ImageInfo& info, const ImageViewInfo& view_info) { - const ImageId image_id = FindImage(info); +ImageView& TextureCache::FindTexture(ImageId image_id, const ImageViewInfo& view_info) { Image& image = slot_images[image_id]; UpdateImage(image_id); auto& usage = image.info.usage; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 329128a3c..b2a8f13f4 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -59,9 +59,8 @@ public: /// Retrieves the image handle of the image with the provided attributes. [[nodiscard]] ImageId FindImage(const ImageInfo& info, FindFlags flags = {}); - /// Retrieves an image view with the properties of the specified image descriptor. - [[nodiscard]] ImageView& FindTexture(const ImageInfo& image_info, - const ImageViewInfo& view_info); + /// Retrieves an image view with the properties of the specified image id. + [[nodiscard]] ImageView& FindTexture(ImageId image_id, const ImageViewInfo& view_info); /// Retrieves the render target with specified properties [[nodiscard]] ImageView& FindRenderTarget(const ImageInfo& image_info,