From ba431ee7ae880151c58806e119a135eefec7df76 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 26 Nov 2025 10:23:16 -0400 Subject: [PATCH] Revert "[surface, vk, pipeline, texture_cache] Refactor image view handling and add normalized compatible format utility" This reverts commit 6a230bec1a8954e4b565d056f62a1019c07b24ef. --- .../renderer_vulkan/pipeline_helper.h | 2 +- .../renderer_vulkan/vk_texture_cache.cpp | 85 ++----------------- .../renderer_vulkan/vk_texture_cache.h | 19 ----- src/video_core/surface.cpp | 68 --------------- src/video_core/surface.h | 4 - 5 files changed, 9 insertions(+), 169 deletions(-) diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index 2f08aa38fc..910e07a606 100644 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h @@ -189,7 +189,7 @@ inline void PushImageDescriptors(TextureCache& texture_cache, const VideoCommon::ImageViewId image_view_id{(views++)->id}; const VideoCommon::SamplerId sampler_id{*(samplers++)}; ImageView& image_view{texture_cache.GetImageView(image_view_id)}; - const VkImageView vk_image_view{image_view.SampledHandle(desc.type, desc.is_integer)}; + const VkImageView vk_image_view{image_view.Handle(desc.type)}; const Sampler& sampler{texture_cache.GetSampler(sampler_id)}; const bool use_fallback_sampler{sampler.HasAddedAnisotropy() && !image_view.SupportsAnisotropy()}; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index e701e311db..8a924d9046 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -45,8 +45,6 @@ using VideoCore::Surface::BytesPerBlock; using VideoCore::Surface::HasAlpha; using VideoCore::Surface::IsPixelFormatASTC; using VideoCore::Surface::IsPixelFormatInteger; -using VideoCore::Surface::IntegerCompatibleFormat; -using VideoCore::Surface::NormalizedCompatibleFormat; using VideoCore::Surface::SurfaceType; namespace { @@ -2042,8 +2040,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI samples(ConvertSampleCount(image.info.num_samples)) { using Shader::TextureType; - const VkImageAspectFlags aspect_mask_local = ImageViewAspectMask(info); - aspect_mask = aspect_mask_local; + const VkImageAspectFlags aspect_mask = ImageViewAspectMask(info); std::array swizzle{ SwizzleSource::R, SwizzleSource::G, @@ -2075,14 +2072,6 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI .pNext = nullptr, .usage = view_usage, }; - view_usage_flags = view_usage; - const VkComponentMapping components{ - .r = ComponentSwizzle(swizzle[0]), - .g = ComponentSwizzle(swizzle[1]), - .b = ComponentSwizzle(swizzle[2]), - .a = ComponentSwizzle(swizzle[3]), - }; - component_mapping = components; const VkImageViewCreateInfo create_info{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = &image_view_usage, @@ -2090,8 +2079,13 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI .image = image.Handle(), .viewType = VkImageViewType{}, .format = format_info.format, - .components = components, - .subresourceRange = MakeSubresourceRange(aspect_mask_local, info.range), + .components{ + .r = ComponentSwizzle(swizzle[0]), + .g = ComponentSwizzle(swizzle[1]), + .b = ComponentSwizzle(swizzle[2]), + .a = ComponentSwizzle(swizzle[3]), + }, + .subresourceRange = MakeSubresourceRange(aspect_mask, info.range), }; const auto create = [&](TextureType tex_type, std::optional num_layers) { VkImageViewCreateInfo ci{create_info}; @@ -2104,7 +2098,6 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI handle.SetObjectNameEXT(VideoCommon::Name(*this, gpu_addr).c_str()); } image_views[static_cast(tex_type)] = std::move(handle); - view_layer_counts[static_cast(tex_type)] = num_layers; }; switch (info.type) { case VideoCommon::ImageViewType::e1D: @@ -2158,8 +2151,6 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::NullImageV null_image = MakeImage(*device, runtime.memory_allocator, info, {}); image_handle = *null_image; - aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT; - view_usage_flags = VK_IMAGE_USAGE_SAMPLED_BIT; for (u32 i = 0; i < Shader::NUM_TEXTURE_TYPES; i++) { image_views[i] = MakeView(VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_IMAGE_ASPECT_COLOR_BIT); } @@ -2224,42 +2215,6 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type, return *view; } -VkImageView ImageView::SampledHandle(Shader::TextureType texture_type, bool use_integer_view) { - const auto type_index = static_cast(texture_type); - - if (use_integer_view || !IsPixelFormatInteger(format)) { - if (!use_integer_view || IsPixelFormatInteger(format)) { - return Handle(texture_type); - } - - const auto compatible_integer = IntegerCompatibleFormat(format); - if (!compatible_integer) { - return Handle(texture_type); - } - auto& int_view = sampled_integer_views[type_index]; - if (int_view) { - return *int_view; - } - const auto format_info = - MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, *compatible_integer); - int_view = CreateSampledView(texture_type, format_info.format); - return *int_view; - } - - const auto compatible_format = NormalizedCompatibleFormat(format); - if (!compatible_format) { - return Handle(texture_type); - } - auto& float_view = sampled_float_views[type_index]; - if (float_view) { - return *float_view; - } - const auto format_info = - MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, *compatible_format); - float_view = CreateSampledView(texture_type, format_info.format); - return *float_view; -} - bool ImageView::IsRescaled() const noexcept { if (!slot_images) { return false; @@ -2287,30 +2242,6 @@ vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_ }); } -vk::ImageView ImageView::CreateSampledView(Shader::TextureType texture_type, - VkFormat vk_format) const { - const VkImageViewUsageCreateInfo usage_info{ - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, - .pNext = nullptr, - .usage = view_usage_flags, - }; - VkImageViewCreateInfo create_info{ - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .pNext = &usage_info, - .flags = 0, - .image = image_handle, - .viewType = ImageViewType(texture_type), - .format = vk_format, - .components = component_mapping, - .subresourceRange = MakeSubresourceRange(aspect_mask, range), - }; - const auto idx = static_cast(texture_type); - if (view_layer_counts[idx]) { - create_info.subresourceRange.layerCount = *view_layer_counts[idx]; - } - return device->GetLogical().CreateImageView(create_info); -} - Sampler::Sampler(TextureCacheRuntime& runtime, const Tegra::Texture::TSCEntry& tsc) { const auto& device = runtime.device; // Check if custom border colors are supported diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index c657a955bf..8788186c43 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -3,8 +3,6 @@ #pragma once -#include -#include #include #include "video_core/texture_cache/texture_cache_base.h" @@ -243,10 +241,6 @@ public: [[nodiscard]] VkImageView Handle(Shader::TextureType texture_type) const noexcept { return *image_views[static_cast(texture_type)]; } - - [[nodiscard]] VkImageView SampledHandle(Shader::TextureType texture_type, - bool use_integer_view); - [[nodiscard]] VkImage ImageHandle() const noexcept { return image_handle; } @@ -274,16 +268,11 @@ private: }; [[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask); - [[nodiscard]] vk::ImageView CreateSampledView(Shader::TextureType texture_type, - VkFormat vk_format) const; const Device* device = nullptr; const SlotVector* slot_images = nullptr; std::array image_views; - std::array sampled_float_views; - std::array sampled_integer_views; - std::array, Shader::NUM_TEXTURE_TYPES> view_layer_counts{}; std::unique_ptr storage_views; vk::ImageView depth_view; vk::ImageView stencil_view; @@ -292,14 +281,6 @@ private: VkImage image_handle = VK_NULL_HANDLE; VkImageView render_target = VK_NULL_HANDLE; VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT; - VkComponentMapping component_mapping{ - VK_COMPONENT_SWIZZLE_IDENTITY, - VK_COMPONENT_SWIZZLE_IDENTITY, - VK_COMPONENT_SWIZZLE_IDENTITY, - VK_COMPONENT_SWIZZLE_IDENTITY, - }; - VkImageAspectFlags aspect_mask = 0; - VkImageUsageFlags view_usage_flags = 0; u32 buffer_size = 0; }; diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp index 63c9980391..1998849e84 100644 --- a/src/video_core/surface.cpp +++ b/src/video_core/surface.cpp @@ -4,8 +4,6 @@ // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include - #include "common/common_types.h" #include "common/math_util.h" #include "common/settings.h" @@ -410,72 +408,6 @@ bool IsPixelFormatSignedInteger(PixelFormat format) { } } -std::optional NormalizedCompatibleFormat(PixelFormat format) { - switch (format) { - case PixelFormat::A8B8G8R8_UINT: - return PixelFormat::A8B8G8R8_UNORM; - case PixelFormat::A8B8G8R8_SINT: - return PixelFormat::A8B8G8R8_SNORM; - case PixelFormat::A2B10G10R10_UINT: - return PixelFormat::A2B10G10R10_UNORM; - case PixelFormat::R8_UINT: - return PixelFormat::R8_UNORM; - case PixelFormat::R8_SINT: - return PixelFormat::R8_SNORM; - case PixelFormat::R8G8_UINT: - return PixelFormat::R8G8_UNORM; - case PixelFormat::R8G8_SINT: - return PixelFormat::R8G8_SNORM; - case PixelFormat::R16_UINT: - return PixelFormat::R16_UNORM; - case PixelFormat::R16_SINT: - return PixelFormat::R16_SNORM; - case PixelFormat::R16G16_UINT: - return PixelFormat::R16G16_UNORM; - case PixelFormat::R16G16_SINT: - return PixelFormat::R16G16_SNORM; - case PixelFormat::R16G16B16A16_UINT: - return PixelFormat::R16G16B16A16_UNORM; - case PixelFormat::R16G16B16A16_SINT: - return PixelFormat::R16G16B16A16_SNORM; - default: - return std::nullopt; - } -} - -std::optional IntegerCompatibleFormat(PixelFormat format) { - switch (format) { - case PixelFormat::A8B8G8R8_UNORM: - return PixelFormat::A8B8G8R8_UINT; - case PixelFormat::A8B8G8R8_SNORM: - return PixelFormat::A8B8G8R8_SINT; - case PixelFormat::A2B10G10R10_UNORM: - return PixelFormat::A2B10G10R10_UINT; - case PixelFormat::R8_UNORM: - return PixelFormat::R8_UINT; - case PixelFormat::R8_SNORM: - return PixelFormat::R8_SINT; - case PixelFormat::R8G8_UNORM: - return PixelFormat::R8G8_UINT; - case PixelFormat::R8G8_SNORM: - return PixelFormat::R8G8_SINT; - case PixelFormat::R16_UNORM: - return PixelFormat::R16_UINT; - case PixelFormat::R16_SNORM: - return PixelFormat::R16_SINT; - case PixelFormat::R16G16_UNORM: - return PixelFormat::R16G16_UINT; - case PixelFormat::R16G16_SNORM: - return PixelFormat::R16G16_SINT; - case PixelFormat::R16G16B16A16_UNORM: - return PixelFormat::R16G16B16A16_UINT; - case PixelFormat::R16G16B16A16_SNORM: - return PixelFormat::R16G16B16A16_SINT; - default: - return std::nullopt; - } -} - size_t PixelComponentSizeBitsInteger(PixelFormat format) { switch (format) { case PixelFormat::A8B8G8R8_SINT: diff --git a/src/video_core/surface.h b/src/video_core/surface.h index a5ce3f7d56..4ccb24f27d 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h @@ -4,7 +4,6 @@ #pragma once #include -#include #include #include "common/assert.h" #include "common/common_types.h" @@ -516,9 +515,6 @@ bool IsPixelFormatInteger(PixelFormat format); bool IsPixelFormatSignedInteger(PixelFormat format); -std::optional NormalizedCompatibleFormat(PixelFormat format); -std::optional IntegerCompatibleFormat(PixelFormat format); - size_t PixelComponentSizeBitsInteger(PixelFormat format); std::pair GetASTCBlockSize(PixelFormat format);