From 29c629737baa4f2f058d2f281f5fd9382972e49f Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 27 Nov 2025 20:34:14 -0400 Subject: [PATCH] [vk] Added support for Stencil component type in texture handling --- .../backend/spirv/emit_spirv_image.cpp | 6 ++++-- .../backend/spirv/spirv_emit_context.cpp | 3 ++- .../renderer_vulkan/vk_texture_cache.cpp | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index aafbad8fa4..832c28accc 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -204,8 +204,9 @@ Id TextureColorResultType(EmitContext& ctx, const TextureDefinition& def) { case SamplerComponentType::Depth: return ctx.F32[4]; case SamplerComponentType::Sint: - case SamplerComponentType::Stencil: return ctx.S32[4]; + case SamplerComponentType::Stencil: + return ctx.U32[4]; case SamplerComponentType::Uint: return ctx.U32[4]; } @@ -218,8 +219,9 @@ Id TextureSampleResultToFloat(EmitContext& ctx, const TextureDefinition& def, Id case SamplerComponentType::Depth: return color; case SamplerComponentType::Sint: - case SamplerComponentType::Stencil: return ctx.OpConvertSToF(ctx.F32[4], color); + case SamplerComponentType::Stencil: + return ctx.OpConvertUToF(ctx.F32[4], color); case SamplerComponentType::Uint: return ctx.OpConvertUToF(ctx.F32[4], color); } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index d1a741a34f..8d4aff315a 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -34,8 +34,9 @@ Id ComponentScalarType(EmitContext& ctx, SamplerComponentType component_type) { case SamplerComponentType::Depth: return ctx.F32[1]; case SamplerComponentType::Sint: - case SamplerComponentType::Stencil: return ctx.S32[1]; + case SamplerComponentType::Stencil: + return ctx.U32[1]; case SamplerComponentType::Uint: return ctx.U32[1]; } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index ca9c0d41e5..741825154c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -886,6 +886,15 @@ TextureCacheRuntime::TextureCacheRuntime(const Device& device_, Scheduler& sched view_formats[index_a].push_back(view_info.format); } } + if (VideoCore::Surface::GetFormatType(image_format) == + VideoCore::Surface::SurfaceType::DepthStencil) { + const auto stencil_info = MaxwellToVK::SurfaceFormat( + device, FormatType::Optimal, true, PixelFormat::S8_UINT); + auto& formats = view_formats[index_a]; + if (std::ranges::find(formats, stencil_info.format) == formats.end()) { + formats.push_back(stencil_info.format); + } + } } } @@ -2203,7 +2212,12 @@ VkImageView ImageView::StencilView() { if (stencil_view) { return *stencil_view; } - const auto& info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, format); + PixelFormat view_format = format; + if (VideoCore::Surface::GetFormatType(format) == + VideoCore::Surface::SurfaceType::DepthStencil) { + view_format = PixelFormat::S8_UINT; + } + const auto& info = MaxwellToVK::SurfaceFormat(*device, FormatType::Optimal, true, view_format); stencil_view = MakeView(info.format, VK_IMAGE_ASPECT_STENCIL_BIT); return *stencil_view; }