diff options
| author | 2022-04-05 22:05:23 -0400 | |
|---|---|---|
| committer | 2022-04-06 19:44:33 -0400 | |
| commit | 52ebdd42c6ee2f7b22dc2c7a4f23d50a2940b4f5 (patch) | |
| tree | 32bc3c7182bb66d79ae2be212d2adacadf89bf52 | |
| parent | Merge pull request #8100 from Morph1984/registered-crash (diff) | |
| download | yuzu-52ebdd42c6ee2f7b22dc2c7a4f23d50a2940b4f5.tar.gz yuzu-52ebdd42c6ee2f7b22dc2c7a4f23d50a2940b4f5.tar.xz yuzu-52ebdd42c6ee2f7b22dc2c7a4f23d50a2940b4f5.zip | |
OpenGL: fix S8D24 to ABGR8 conversions
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/host_shaders/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/video_core/host_shaders/opengl_convert_s8d24.comp | 18 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/util_shaders.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/util_shaders.h | 3 |
6 files changed, 58 insertions, 4 deletions
diff --git a/src/video_core/host_shaders/CMakeLists.txt b/src/video_core/host_shaders/CMakeLists.txt index af05d47d1..190fc6aea 100644 --- a/src/video_core/host_shaders/CMakeLists.txt +++ b/src/video_core/host_shaders/CMakeLists.txt | |||
| @@ -18,6 +18,7 @@ set(SHADER_FILES | |||
| 18 | full_screen_triangle.vert | 18 | full_screen_triangle.vert |
| 19 | fxaa.frag | 19 | fxaa.frag |
| 20 | fxaa.vert | 20 | fxaa.vert |
| 21 | opengl_convert_s8d24.comp | ||
| 21 | opengl_copy_bc4.comp | 22 | opengl_copy_bc4.comp |
| 22 | opengl_present.frag | 23 | opengl_present.frag |
| 23 | opengl_present.vert | 24 | opengl_present.vert |
diff --git a/src/video_core/host_shaders/opengl_convert_s8d24.comp b/src/video_core/host_shaders/opengl_convert_s8d24.comp new file mode 100644 index 000000000..83e1ab176 --- /dev/null +++ b/src/video_core/host_shaders/opengl_convert_s8d24.comp | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // Copyright 2022 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #version 430 core | ||
| 6 | |||
| 7 | layout(local_size_x = 16, local_size_y = 8) in; | ||
| 8 | |||
| 9 | layout(binding = 0, rgba8ui) restrict uniform uimage2D destination; | ||
| 10 | layout(location = 0) uniform uvec3 size; | ||
| 11 | |||
| 12 | void main() { | ||
| 13 | if (any(greaterThanEqual(gl_GlobalInvocationID, size))) { | ||
| 14 | return; | ||
| 15 | } | ||
| 16 | uvec4 components = imageLoad(destination, ivec2(gl_GlobalInvocationID.xy)); | ||
| 17 | imageStore(destination, ivec2(gl_GlobalInvocationID.xy), components.wxyz); | ||
| 18 | } | ||
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 8f9a65beb..d12076358 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -409,8 +409,8 @@ ImageBufferMap::~ImageBufferMap() { | |||
| 409 | 409 | ||
| 410 | TextureCacheRuntime::TextureCacheRuntime(const Device& device_, ProgramManager& program_manager, | 410 | TextureCacheRuntime::TextureCacheRuntime(const Device& device_, ProgramManager& program_manager, |
| 411 | StateTracker& state_tracker_) | 411 | StateTracker& state_tracker_) |
| 412 | : device{device_}, state_tracker{state_tracker_}, | 412 | : device{device_}, state_tracker{state_tracker_}, util_shaders(program_manager), |
| 413 | util_shaders(program_manager), resolution{Settings::values.resolution_info} { | 413 | format_conversion_pass{util_shaders}, resolution{Settings::values.resolution_info} { |
| 414 | static constexpr std::array TARGETS{GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D}; | 414 | static constexpr std::array TARGETS{GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D}; |
| 415 | for (size_t i = 0; i < TARGETS.size(); ++i) { | 415 | for (size_t i = 0; i < TARGETS.size(); ++i) { |
| 416 | const GLenum target = TARGETS[i]; | 416 | const GLenum target = TARGETS[i]; |
| @@ -1325,6 +1325,9 @@ Framebuffer::Framebuffer(TextureCacheRuntime& runtime, std::span<ImageView*, NUM | |||
| 1325 | 1325 | ||
| 1326 | Framebuffer::~Framebuffer() = default; | 1326 | Framebuffer::~Framebuffer() = default; |
| 1327 | 1327 | ||
| 1328 | FormatConversionPass::FormatConversionPass(UtilShaders& util_shaders_) | ||
| 1329 | : util_shaders{util_shaders_} {} | ||
| 1330 | |||
| 1328 | void FormatConversionPass::ConvertImage(Image& dst_image, Image& src_image, | 1331 | void FormatConversionPass::ConvertImage(Image& dst_image, Image& src_image, |
| 1329 | std::span<const VideoCommon::ImageCopy> copies) { | 1332 | std::span<const VideoCommon::ImageCopy> copies) { |
| 1330 | const GLenum dst_target = ImageTarget(dst_image.info); | 1333 | const GLenum dst_target = ImageTarget(dst_image.info); |
| @@ -1357,6 +1360,12 @@ void FormatConversionPass::ConvertImage(Image& dst_image, Image& src_image, | |||
| 1357 | dst_origin.z, region.width, region.height, region.depth, | 1360 | dst_origin.z, region.width, region.height, region.depth, |
| 1358 | dst_image.GlFormat(), dst_image.GlType(), nullptr); | 1361 | dst_image.GlFormat(), dst_image.GlType(), nullptr); |
| 1359 | } | 1362 | } |
| 1363 | |||
| 1364 | // Swap component order of S8D24 to ABGR8 reinterprets | ||
| 1365 | if (src_image.info.format == PixelFormat::D24_UNORM_S8_UINT && | ||
| 1366 | dst_image.info.format == PixelFormat::A8B8G8R8_UNORM) { | ||
| 1367 | util_shaders.ConvertS8D24(dst_image, copies); | ||
| 1368 | } | ||
| 1360 | } | 1369 | } |
| 1361 | 1370 | ||
| 1362 | } // namespace OpenGL | 1371 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 53088b66e..672fa8dde 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h | |||
| @@ -55,13 +55,14 @@ struct FormatProperties { | |||
| 55 | 55 | ||
| 56 | class FormatConversionPass { | 56 | class FormatConversionPass { |
| 57 | public: | 57 | public: |
| 58 | FormatConversionPass() = default; | 58 | explicit FormatConversionPass(UtilShaders& util_shaders); |
| 59 | ~FormatConversionPass() = default; | 59 | ~FormatConversionPass() = default; |
| 60 | 60 | ||
| 61 | void ConvertImage(Image& dst_image, Image& src_image, | 61 | void ConvertImage(Image& dst_image, Image& src_image, |
| 62 | std::span<const VideoCommon::ImageCopy> copies); | 62 | std::span<const VideoCommon::ImageCopy> copies); |
| 63 | 63 | ||
| 64 | private: | 64 | private: |
| 65 | UtilShaders& util_shaders; | ||
| 65 | OGLBuffer intermediate_pbo; | 66 | OGLBuffer intermediate_pbo; |
| 66 | size_t pbo_size{}; | 67 | size_t pbo_size{}; |
| 67 | }; | 68 | }; |
diff --git a/src/video_core/renderer_opengl/util_shaders.cpp b/src/video_core/renderer_opengl/util_shaders.cpp index 897c380b3..04c482a09 100644 --- a/src/video_core/renderer_opengl/util_shaders.cpp +++ b/src/video_core/renderer_opengl/util_shaders.cpp | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include "video_core/host_shaders/astc_decoder_comp.h" | 13 | #include "video_core/host_shaders/astc_decoder_comp.h" |
| 14 | #include "video_core/host_shaders/block_linear_unswizzle_2d_comp.h" | 14 | #include "video_core/host_shaders/block_linear_unswizzle_2d_comp.h" |
| 15 | #include "video_core/host_shaders/block_linear_unswizzle_3d_comp.h" | 15 | #include "video_core/host_shaders/block_linear_unswizzle_3d_comp.h" |
| 16 | #include "video_core/host_shaders/opengl_convert_s8d24_comp.h" | ||
| 16 | #include "video_core/host_shaders/opengl_copy_bc4_comp.h" | 17 | #include "video_core/host_shaders/opengl_copy_bc4_comp.h" |
| 17 | #include "video_core/host_shaders/pitch_unswizzle_comp.h" | 18 | #include "video_core/host_shaders/pitch_unswizzle_comp.h" |
| 18 | #include "video_core/renderer_opengl/gl_shader_manager.h" | 19 | #include "video_core/renderer_opengl/gl_shader_manager.h" |
| @@ -50,7 +51,8 @@ UtilShaders::UtilShaders(ProgramManager& program_manager_) | |||
| 50 | block_linear_unswizzle_2d_program(MakeProgram(BLOCK_LINEAR_UNSWIZZLE_2D_COMP)), | 51 | block_linear_unswizzle_2d_program(MakeProgram(BLOCK_LINEAR_UNSWIZZLE_2D_COMP)), |
| 51 | block_linear_unswizzle_3d_program(MakeProgram(BLOCK_LINEAR_UNSWIZZLE_3D_COMP)), | 52 | block_linear_unswizzle_3d_program(MakeProgram(BLOCK_LINEAR_UNSWIZZLE_3D_COMP)), |
| 52 | pitch_unswizzle_program(MakeProgram(PITCH_UNSWIZZLE_COMP)), | 53 | pitch_unswizzle_program(MakeProgram(PITCH_UNSWIZZLE_COMP)), |
| 53 | copy_bc4_program(MakeProgram(OPENGL_COPY_BC4_COMP)) { | 54 | copy_bc4_program(MakeProgram(OPENGL_COPY_BC4_COMP)), |
| 55 | convert_s8d24_program(MakeProgram(OPENGL_CONVERT_S8D24_COMP)) { | ||
| 54 | const auto swizzle_table = Tegra::Texture::MakeSwizzleTable(); | 56 | const auto swizzle_table = Tegra::Texture::MakeSwizzleTable(); |
| 55 | swizzle_table_buffer.Create(); | 57 | swizzle_table_buffer.Create(); |
| 56 | glNamedBufferStorage(swizzle_table_buffer.handle, sizeof(swizzle_table), &swizzle_table, 0); | 58 | glNamedBufferStorage(swizzle_table_buffer.handle, sizeof(swizzle_table), &swizzle_table, 0); |
| @@ -248,6 +250,26 @@ void UtilShaders::CopyBC4(Image& dst_image, Image& src_image, std::span<const Im | |||
| 248 | program_manager.RestoreGuestCompute(); | 250 | program_manager.RestoreGuestCompute(); |
| 249 | } | 251 | } |
| 250 | 252 | ||
| 253 | void UtilShaders::ConvertS8D24(Image& dst_image, std::span<const ImageCopy> copies) { | ||
| 254 | static constexpr GLuint BINDING_DESTINATION = 0; | ||
| 255 | static constexpr GLuint LOC_SIZE = 0; | ||
| 256 | |||
| 257 | program_manager.BindComputeProgram(convert_s8d24_program.handle); | ||
| 258 | for (const ImageCopy& copy : copies) { | ||
| 259 | ASSERT(copy.src_subresource.base_layer == 0); | ||
| 260 | ASSERT(copy.src_subresource.num_layers == 1); | ||
| 261 | ASSERT(copy.dst_subresource.base_layer == 0); | ||
| 262 | ASSERT(copy.dst_subresource.num_layers == 1); | ||
| 263 | |||
| 264 | glUniform3ui(LOC_SIZE, copy.extent.width, copy.extent.height, copy.extent.depth); | ||
| 265 | glBindImageTexture(BINDING_DESTINATION, dst_image.StorageHandle(), | ||
| 266 | copy.dst_subresource.base_level, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8UI); | ||
| 267 | glDispatchCompute(Common::DivCeil(copy.extent.width, 16u), | ||
| 268 | Common::DivCeil(copy.extent.height, 8u), copy.extent.depth); | ||
| 269 | } | ||
| 270 | program_manager.RestoreGuestCompute(); | ||
| 271 | } | ||
| 272 | |||
| 251 | GLenum StoreFormat(u32 bytes_per_block) { | 273 | GLenum StoreFormat(u32 bytes_per_block) { |
| 252 | switch (bytes_per_block) { | 274 | switch (bytes_per_block) { |
| 253 | case 1: | 275 | case 1: |
diff --git a/src/video_core/renderer_opengl/util_shaders.h b/src/video_core/renderer_opengl/util_shaders.h index 5de95ea7a..5c132e67f 100644 --- a/src/video_core/renderer_opengl/util_shaders.h +++ b/src/video_core/renderer_opengl/util_shaders.h | |||
| @@ -39,6 +39,8 @@ public: | |||
| 39 | void CopyBC4(Image& dst_image, Image& src_image, | 39 | void CopyBC4(Image& dst_image, Image& src_image, |
| 40 | std::span<const VideoCommon::ImageCopy> copies); | 40 | std::span<const VideoCommon::ImageCopy> copies); |
| 41 | 41 | ||
| 42 | void ConvertS8D24(Image& dst_image, std::span<const VideoCommon::ImageCopy> copies); | ||
| 43 | |||
| 42 | private: | 44 | private: |
| 43 | ProgramManager& program_manager; | 45 | ProgramManager& program_manager; |
| 44 | 46 | ||
| @@ -49,6 +51,7 @@ private: | |||
| 49 | OGLProgram block_linear_unswizzle_3d_program; | 51 | OGLProgram block_linear_unswizzle_3d_program; |
| 50 | OGLProgram pitch_unswizzle_program; | 52 | OGLProgram pitch_unswizzle_program; |
| 51 | OGLProgram copy_bc4_program; | 53 | OGLProgram copy_bc4_program; |
| 54 | OGLProgram convert_s8d24_program; | ||
| 52 | }; | 55 | }; |
| 53 | 56 | ||
| 54 | GLenum StoreFormat(u32 bytes_per_block); | 57 | GLenum StoreFormat(u32 bytes_per_block); |