summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/host_shaders/CMakeLists.txt1
-rw-r--r--src/video_core/host_shaders/convert_s8d24_to_abgr8.frag23
-rw-r--r--src/video_core/renderer_vulkan/blit_image.cpp9
-rw-r--r--src/video_core/renderer_vulkan/blit_image.h4
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp6
5 files changed, 41 insertions, 2 deletions
diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt
index fd3e41434..37b47d692 100644
--- a/src/video_core/host_shaders/CMakeLists.txt
+++ b/src/video_core/host_shaders/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SHADER_FILES
12 block_linear_unswizzle_3d.comp 12 block_linear_unswizzle_3d.comp
13 convert_abgr8_to_d24s8.frag 13 convert_abgr8_to_d24s8.frag
14 convert_d24s8_to_abgr8.frag 14 convert_d24s8_to_abgr8.frag
15 convert_s8d24_to_abgr8.frag
15 convert_depth_to_float.frag 16 convert_depth_to_float.frag
16 convert_float_to_depth.frag 17 convert_float_to_depth.frag
17 full_screen_triangle.vert 18 full_screen_triangle.vert
diff --git a/src/video_core/host_shaders/convert_s8d24_to_abgr8.frag b/src/video_core/host_shaders/convert_s8d24_to_abgr8.frag
new file mode 100644
index 000000000..7ab73a8dd
--- /dev/null
+++ b/src/video_core/host_shaders/convert_s8d24_to_abgr8.frag
@@ -0,0 +1,23 @@
1// Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#version 450
6
7layout(binding = 0) uniform sampler2D depth_tex;
8layout(binding = 1) uniform isampler2D stencil_tex;
9
10layout(location = 0) out vec4 color;
11
12void main() {
13 ivec2 coord = ivec2(gl_FragCoord.xy);
14 uint depth = uint(textureLod(depth_tex, coord, 0).r * (exp2(24.0) - 1.0f));
15 uint stencil = uint(textureLod(stencil_tex, coord, 0).r);
16
17 highp uint depth_val =
18 uint(textureLod(depth_tex, coord, 0).r * (exp2(32.0) - 1.0));
19 lowp uint stencil_val = textureLod(stencil_tex, coord, 0).r;
20 highp uvec4 components =
21 uvec4((uvec3(depth_val) >> uvec3(24u, 16u, 8u)) & 0x000000FFu, stencil_val);
22 color.rgba = vec4(components) / (exp2(8.0) - 1.0);
23}
diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp
index 2c3914459..ec03cca38 100644
--- a/src/video_core/renderer_vulkan/blit_image.cpp
+++ b/src/video_core/renderer_vulkan/blit_image.cpp
@@ -9,6 +9,7 @@
9#include "video_core/host_shaders/convert_d24s8_to_abgr8_frag_spv.h" 9#include "video_core/host_shaders/convert_d24s8_to_abgr8_frag_spv.h"
10#include "video_core/host_shaders/convert_depth_to_float_frag_spv.h" 10#include "video_core/host_shaders/convert_depth_to_float_frag_spv.h"
11#include "video_core/host_shaders/convert_float_to_depth_frag_spv.h" 11#include "video_core/host_shaders/convert_float_to_depth_frag_spv.h"
12#include "video_core/host_shaders/convert_s8d24_to_abgr8_frag_spv.h"
12#include "video_core/host_shaders/full_screen_triangle_vert_spv.h" 13#include "video_core/host_shaders/full_screen_triangle_vert_spv.h"
13#include "video_core/host_shaders/vulkan_blit_color_float_frag_spv.h" 14#include "video_core/host_shaders/vulkan_blit_color_float_frag_spv.h"
14#include "video_core/host_shaders/vulkan_blit_depth_stencil_frag_spv.h" 15#include "video_core/host_shaders/vulkan_blit_depth_stencil_frag_spv.h"
@@ -370,6 +371,7 @@ BlitImageHelper::BlitImageHelper(const Device& device_, VKScheduler& scheduler_,
370 convert_float_to_depth_frag(BuildShader(device, CONVERT_FLOAT_TO_DEPTH_FRAG_SPV)), 371 convert_float_to_depth_frag(BuildShader(device, CONVERT_FLOAT_TO_DEPTH_FRAG_SPV)),
371 convert_abgr8_to_d24s8_frag(BuildShader(device, CONVERT_ABGR8_TO_D24S8_FRAG_SPV)), 372 convert_abgr8_to_d24s8_frag(BuildShader(device, CONVERT_ABGR8_TO_D24S8_FRAG_SPV)),
372 convert_d24s8_to_abgr8_frag(BuildShader(device, CONVERT_D24S8_TO_ABGR8_FRAG_SPV)), 373 convert_d24s8_to_abgr8_frag(BuildShader(device, CONVERT_D24S8_TO_ABGR8_FRAG_SPV)),
374 convert_s8d24_to_abgr8_frag(BuildShader(device, CONVERT_S8D24_TO_ABGR8_FRAG_SPV)),
373 linear_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_LINEAR>)), 375 linear_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_LINEAR>)),
374 nearest_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_NEAREST>)) { 376 nearest_sampler(device.GetLogical().CreateSampler(SAMPLER_CREATE_INFO<VK_FILTER_NEAREST>)) {
375 if (device.IsExtShaderStencilExportSupported()) { 377 if (device.IsExtShaderStencilExportSupported()) {
@@ -474,6 +476,13 @@ void BlitImageHelper::ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer,
474 ConvertDepthStencil(*convert_d24s8_to_abgr8_pipeline, dst_framebuffer, src_image_view); 476 ConvertDepthStencil(*convert_d24s8_to_abgr8_pipeline, dst_framebuffer, src_image_view);
475} 477}
476 478
479void BlitImageHelper::ConvertS8D24ToABGR8(const Framebuffer* dst_framebuffer,
480 ImageView& src_image_view) {
481 ConvertPipelineColorTargetEx(convert_s8d24_to_abgr8_pipeline, dst_framebuffer->RenderPass(),
482 convert_s8d24_to_abgr8_frag);
483 ConvertDepthStencil(*convert_s8d24_to_abgr8_pipeline, dst_framebuffer, src_image_view);
484}
485
477void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, 486void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
478 const ImageView& src_image_view) { 487 const ImageView& src_image_view) {
479 const VkPipelineLayout layout = *one_texture_pipeline_layout; 488 const VkPipelineLayout layout = *one_texture_pipeline_layout;
diff --git a/src/video_core/renderer_vulkan/blit_image.h b/src/video_core/renderer_vulkan/blit_image.h
index 85e7dca5b..1a3944179 100644
--- a/src/video_core/renderer_vulkan/blit_image.h
+++ b/src/video_core/renderer_vulkan/blit_image.h
@@ -56,6 +56,8 @@ public:
56 56
57 void ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view); 57 void ConvertD24S8ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view);
58 58
59 void ConvertS8D24ToABGR8(const Framebuffer* dst_framebuffer, ImageView& src_image_view);
60
59private: 61private:
60 void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, 62 void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
61 const ImageView& src_image_view); 63 const ImageView& src_image_view);
@@ -99,6 +101,7 @@ private:
99 vk::ShaderModule convert_float_to_depth_frag; 101 vk::ShaderModule convert_float_to_depth_frag;
100 vk::ShaderModule convert_abgr8_to_d24s8_frag; 102 vk::ShaderModule convert_abgr8_to_d24s8_frag;
101 vk::ShaderModule convert_d24s8_to_abgr8_frag; 103 vk::ShaderModule convert_d24s8_to_abgr8_frag;
104 vk::ShaderModule convert_s8d24_to_abgr8_frag;
102 vk::Sampler linear_sampler; 105 vk::Sampler linear_sampler;
103 vk::Sampler nearest_sampler; 106 vk::Sampler nearest_sampler;
104 107
@@ -112,6 +115,7 @@ private:
112 vk::Pipeline convert_r16_to_d16_pipeline; 115 vk::Pipeline convert_r16_to_d16_pipeline;
113 vk::Pipeline convert_abgr8_to_d24s8_pipeline; 116 vk::Pipeline convert_abgr8_to_d24s8_pipeline;
114 vk::Pipeline convert_d24s8_to_abgr8_pipeline; 117 vk::Pipeline convert_d24s8_to_abgr8_pipeline;
118 vk::Pipeline convert_s8d24_to_abgr8_pipeline;
115}; 119};
116 120
117} // namespace Vulkan 121} // namespace Vulkan
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index ca6019a3a..8101eb42c 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1067,10 +1067,12 @@ void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, Im
1067 } 1067 }
1068 break; 1068 break;
1069 case PixelFormat::A8B8G8R8_UNORM: 1069 case PixelFormat::A8B8G8R8_UNORM:
1070 if (src_view.format == PixelFormat::S8_UINT_D24_UNORM || 1070 if (src_view.format == PixelFormat::S8_UINT_D24_UNORM) {
1071 src_view.format == PixelFormat::D24_UNORM_S8_UINT) {
1072 return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view); 1071 return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view);
1073 } 1072 }
1073 if (src_view.format == PixelFormat::D24_UNORM_S8_UINT) {
1074 return blit_image_helper.ConvertS8D24ToABGR8(dst, src_view);
1075 }
1074 break; 1076 break;
1075 case PixelFormat::R32_FLOAT: 1077 case PixelFormat::R32_FLOAT:
1076 if (src_view.format == PixelFormat::D32_FLOAT) { 1078 if (src_view.format == PixelFormat::D32_FLOAT) {