From 948f72d3204f5a1cd44de1aa85331c8a35d7f612 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Sun, 9 Oct 2022 12:01:19 +0300 Subject: [PATCH] renderer_opengl: Specify precision in compute shader and add RGB5A1 converter * Fixes OpenGLES crash --- .../gl_format_reinterpreter.cpp | 6 +-- .../vk_format_reinterpreter.cpp | 6 +-- .../renderer_vulkan/vk_texture_runtime.cpp | 2 + src/video_core/texture/texture_decode.cpp | 41 +++++++++++-------- src/video_core/texture/texture_decode.h | 6 ++- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_format_reinterpreter.cpp b/src/video_core/renderer_opengl/gl_format_reinterpreter.cpp index 46a11024f..2577714e5 100644 --- a/src/video_core/renderer_opengl/gl_format_reinterpreter.cpp +++ b/src/video_core/renderer_opengl/gl_format_reinterpreter.cpp @@ -12,9 +12,9 @@ namespace OpenGL { D24S8toRGBA8::D24S8toRGBA8(bool use_texture_view) : use_texture_view{use_texture_view} { constexpr std::string_view cs_source = R"( layout(local_size_x = 32, local_size_y = 32, local_size_z = 1) in; -layout(binding = 0) uniform sampler2D depth; -layout(binding = 1) uniform usampler2D stencil; -layout(rgba8, binding = 2) uniform writeonly image2D color; +layout(binding = 0) uniform highp sampler2D depth; +layout(binding = 1) uniform lowp usampler2D stencil; +layout(rgba8, binding = 2) uniform highp writeonly image2D color; uniform mediump ivec2 src_offset; diff --git a/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp b/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp index e434d48df..5119ac2d1 100644 --- a/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp +++ b/src/video_core/renderer_vulkan/vk_format_reinterpreter.cpp @@ -15,9 +15,9 @@ D24S8toRGBA8::D24S8toRGBA8(const Instance& instance, TaskScheduler& scheduler, #version 450 core #extension GL_EXT_samplerless_texture_functions : require layout(local_size_x = 32, local_size_y = 32, local_size_z = 1) in; -layout(set = 0, binding = 0) uniform texture2D depth; -layout(set = 0, binding = 1) uniform utexture2D stencil; -layout(set = 0, binding = 2, rgba8) uniform writeonly image2D color; +layout(set = 0, binding = 0) uniform highp texture2D depth; +layout(set = 0, binding = 1) uniform lowp utexture2D stencil; +layout(set = 0, binding = 2, rgba8) uniform highp writeonly image2D color; layout(push_constant, std140) uniform ComputeInfo { mediump ivec2 src_offset; diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index e4f9f9e6d..a8dc43948 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -231,6 +231,8 @@ void TextureRuntime::FormatConvert(const Surface& surface, bool upload, std::spa return Pica::Texture::ConvertBGRToRGBA(source, dest); case VideoCore::PixelFormat::RGBA4: return Pica::Texture::ConvertRGBA4ToRGBA8(source, dest); + case VideoCore::PixelFormat::RGB5A1: + return Pica::Texture::ConvertRGB5A1ToRGBA8(source, dest); default: break; } diff --git a/src/video_core/texture/texture_decode.cpp b/src/video_core/texture/texture_decode.cpp index 3e5212f73..99c467999 100644 --- a/src/video_core/texture/texture_decode.cpp +++ b/src/video_core/texture/texture_decode.cpp @@ -251,22 +251,6 @@ void ConvertABGRToRGBA(std::span source, std::span d } } -void ConvertD32S8ToD24S8(std::span source, std::span dest) { - std::size_t depth_offset = 0; - std::size_t stencil_offset = 4 * source.size() / 5; - for (std::size_t i = 0; i < dest.size(); i += 4) { - float depth; - std::memcpy(&depth, source.data() + depth_offset, sizeof(float)); - u32 depth_uint = depth * 0xFFFFFF; - - dest[i] = source[stencil_offset]; - std::memcpy(dest.data() + i + 1, &depth_uint, 3); - - depth_offset += 4; - stencil_offset += 1; - } -} - void ConvertRGBA4ToRGBA8(std::span source, std::span dest) { u32 j = 0; for (std::size_t i = 0; i < dest.size(); i += 4) { @@ -286,6 +270,31 @@ void ConvertRGBA8ToRGBA4(std::span source, std::span } } +void ConvertRGB5A1ToRGBA8(std::span source, std::span dest) { + u32 j = 0; + for (std::size_t i = 0; i < dest.size(); i += 4) { + auto rgba = Color::DecodeRGB5A1(reinterpret_cast(source.data() + j)); + std::memcpy(dest.data() + i, rgba.AsArray(), sizeof(rgba)); + j += 2; + } +} + +void ConvertD32S8ToD24S8(std::span source, std::span dest) { + std::size_t depth_offset = 0; + std::size_t stencil_offset = 4 * source.size() / 5; + for (std::size_t i = 0; i < dest.size(); i += 4) { + float depth; + std::memcpy(&depth, source.data() + depth_offset, sizeof(float)); + u32 depth_uint = depth * 0xFFFFFF; + + dest[i] = source[stencil_offset]; + std::memcpy(dest.data() + i + 1, &depth_uint, 3); + + depth_offset += 4; + stencil_offset += 1; + } +} + void InterleaveD24S8(std::span source, std::span dest) { std::size_t depth_offset = 0; std::size_t stencil_offset = 3 * source.size() / 4; diff --git a/src/video_core/texture/texture_decode.h b/src/video_core/texture/texture_decode.h index 4fb79d47f..afdc3f429 100644 --- a/src/video_core/texture/texture_decode.h +++ b/src/video_core/texture/texture_decode.h @@ -79,12 +79,14 @@ void ConvertBGRToRGBA(std::span source, std::span de */ void ConvertABGRToRGBA(std::span source, std::span dest); -void ConvertD32S8ToD24S8(std::span source, std::span dest); - void ConvertRGBA4ToRGBA8(std::span source, std::span dest); void ConvertRGBA8ToRGBA4(std::span source, std::span dest); +void ConvertRGB5A1ToRGBA8(std::span source, std::span dest); + +void ConvertD32S8ToD24S8(std::span source, std::span dest); + void InterleaveD24S8(std::span source, std::span dest); } // namespace Pica::Texture