From b06b9cc7a2990803063666e39effe3f29543d216 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sat, 4 Jul 2026 00:16:01 -0400 Subject: [PATCH] [vulkan] Pixel format handling for formats --- .../renderer_vulkan/pipeline_helper.h | 24 +++++++++++++++++++ .../renderer_vulkan/vk_compute_pipeline.cpp | 8 ++++++- .../renderer_vulkan/vk_graphics_pipeline.cpp | 8 ++++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/video_core/renderer_vulkan/pipeline_helper.h b/src/video_core/renderer_vulkan/pipeline_helper.h index fce1f2e252..e9adaee1d2 100644 --- a/src/video_core/renderer_vulkan/pipeline_helper.h +++ b/src/video_core/renderer_vulkan/pipeline_helper.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include @@ -22,6 +23,29 @@ namespace Vulkan { using Shader::Backend::SPIRV::NUM_TEXTURE_AND_IMAGE_SCALING_WORDS; +[[nodiscard]] inline std::optional PixelFormatFromImageFormat( + Shader::ImageFormat format) { + switch (format) { + case Shader::ImageFormat::Typeless: + return std::nullopt; + case Shader::ImageFormat::R8_UINT: + return PixelFormat::R8_UINT; + case Shader::ImageFormat::R8_SINT: + return PixelFormat::R8_SINT; + case Shader::ImageFormat::R16_UINT: + return PixelFormat::R16_UINT; + case Shader::ImageFormat::R16_SINT: + return PixelFormat::R16_SINT; + case Shader::ImageFormat::R32_UINT: + return PixelFormat::R32_UINT; + case Shader::ImageFormat::R32G32_UINT: + return PixelFormat::R32G32_UINT; + case Shader::ImageFormat::R32G32B32A32_UINT: + return PixelFormat::R32G32B32A32_UINT; + } + return std::nullopt; +} + [[nodiscard]] inline u32 NumDescriptorEntries(const Shader::Info& info) { return Shader::NumDescriptors(info.constant_buffer_descriptors) + Shader::NumDescriptors(info.storage_buffers_descriptors) + diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 13bd654a80..5525ce0e95 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp @@ -193,8 +193,14 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute, is_written = desc.is_written; } ImageView& image_view = texture_cache.GetImageView(views[index].id); + PixelFormat format{image_view.format}; + if constexpr (is_image) { + if (const auto explicit_format{PixelFormatFromImageFormat(desc.format)}) { + format = *explicit_format; + } + } buffer_cache.BindComputeTextureBuffer(index, image_view.GpuAddr(), - image_view.BufferSize(), image_view.format, + image_view.BufferSize(), format, is_written, is_image); ++index; } diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 32ae502b82..ebc6da5a4b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -426,8 +426,14 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { is_written = desc.is_written; } ImageView& image_view{texture_cache.GetImageView(texture_buffer_it->id)}; + PixelFormat format{image_view.format}; + if constexpr (is_image) { + if (const auto explicit_format{PixelFormatFromImageFormat(desc.format)}) { + format = *explicit_format; + } + } buffer_cache.BindGraphicsTextureBuffer(stage, index, image_view.GpuAddr(), - image_view.BufferSize(), image_view.format, + image_view.BufferSize(), format, is_written, is_image); ++index; ++texture_buffer_it;