diff --git a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp index 9a69ea4e06..5d4e124078 100644 --- a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp @@ -205,7 +205,8 @@ void ComputePipeline::Configure() { for (const auto& desc : info.texture_descriptors) { for (u32 index = 0; index < desc.count; ++index) { ImageView& image_view{texture_cache.GetImageView((views_it++)->id)}; - textures[texture_binding] = image_view.Handle(desc.type); + textures[texture_binding] = + image_view.SampledView(desc.type, desc.component_type); if (texture_cache.IsRescaling(image_view)) { texture_scaling_mask |= 1u << texture_binding; } diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index a5815b76d4..e3bb419aec 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp @@ -483,7 +483,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { for (const auto& desc : info.texture_descriptors) { for (u32 index = 0; index < desc.count; ++index) { ImageView& image_view{texture_cache.GetImageView((views_it++)->id)}; - textures[texture_binding] = image_view.Handle(desc.type); + textures[texture_binding] = + image_view.SampledView(desc.type, desc.component_type); if (texture_cache.IsRescaling(image_view)) { texture_scaling_mask |= 1u << stage_texture_binding; } diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index a3957e4d9f..72251f00f2 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -1229,6 +1229,13 @@ GLuint ImageView::StorageView(Shader::TextureType texture_type, Shader::ImageFor return view; } +GLuint ImageView::SampledView(Shader::TextureType view_type, + Shader::SamplerComponentType /*component_type*/) { + // OpenGL swizzles already configure depth/stencil selection per TIC entry, + // so fall back to the default view handle. + return Handle(view_type); +} + void ImageView::SetupView(Shader::TextureType view_type) { views[static_cast(view_type)] = MakeView(view_type, internal_format); } diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index d4165d8e4d..ba405ae30d 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -264,6 +267,9 @@ public: [[nodiscard]] GLuint StorageView(Shader::TextureType texture_type, Shader::ImageFormat image_format); + [[nodiscard]] GLuint SampledView(Shader::TextureType view_type, + Shader::SamplerComponentType component_type); + [[nodiscard]] GLuint Handle(Shader::TextureType handle_type) const noexcept { return views[static_cast(handle_type)]; } diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index 910e07a606..126787909d 100644 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h @@ -189,7 +189,8 @@ 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.Handle(desc.type)}; + const VkImageView vk_image_view{ + image_view.SampledView(desc.type, desc.component_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 e76d3d76c2..f544990067 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -24,6 +24,7 @@ #include "video_core/renderer_vulkan/vk_render_pass_cache.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" +#include "video_core/surface.h" #include "video_core/texture_cache/formatter.h" #include "video_core/texture_cache/samples_helper.h" #include "video_core/texture_cache/util.h" @@ -2211,6 +2212,29 @@ VkImageView ImageView::ColorView() { return *color_view; } +VkImageView ImageView::SampledView(Shader::TextureType texture_type, + Shader::SamplerComponentType component_type) { + using VideoCore::Surface::GetFormatType; + using VideoCore::Surface::SurfaceType; + + const SurfaceType surface_type = GetFormatType(format); + switch (component_type) { + case Shader::SamplerComponentType::Depth: + if (surface_type == SurfaceType::Depth || surface_type == SurfaceType::DepthStencil) { + return DepthView(); + } + break; + case Shader::SamplerComponentType::Stencil: + if (surface_type == SurfaceType::Stencil || surface_type == SurfaceType::DepthStencil) { + return StencilView(); + } + break; + default: + break; + } + return Handle(texture_type); +} + VkImageView ImageView::StorageView(Shader::TextureType texture_type, Shader::ImageFormat image_format) { if (!image_handle) { diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index f2adc11471..002408f1f7 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -239,6 +239,9 @@ public: [[nodiscard]] VkImageView ColorView(); + [[nodiscard]] VkImageView SampledView(Shader::TextureType texture_type, + Shader::SamplerComponentType component_type); + [[nodiscard]] VkImageView StorageView(Shader::TextureType texture_type, Shader::ImageFormat image_format);