From 74e7f07bef46d485ca490de9d3f0f59855e48873 Mon Sep 17 00:00:00 2001 From: lat9nq Date: Thu, 19 May 2022 15:50:48 -0400 Subject: [PATCH] shader_recompiler: Implement LowerInt16ToInt32 AMD drivers 22.3.2 and later expose a bug in yuzu, where the application would submit 16-bit integer instructions to GPUs that don't support 16-bit integers, namely GCN 4 devices. Replace any 16-bit instructions with 32-bit ones so newer AMD drivers will work with VK_KHR_workgroup_memory_explicit_layout. --- src/shader_recompiler/CMakeLists.txt | 1 + .../frontend/maxwell/translate_program.cpp | 3 + src/shader_recompiler/host_translate_info.h | 1 + .../ir_opt/lower_int16_to_int32.cpp | 72 +++++++++++++++++++ src/shader_recompiler/ir_opt/passes.h | 1 + .../renderer_vulkan/vk_pipeline_cache.cpp | 1 + 6 files changed, 79 insertions(+) create mode 100644 src/shader_recompiler/ir_opt/lower_int16_to_int32.cpp diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 4c76ce1ea8..63b38428d0 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -219,6 +219,7 @@ add_library(shader_recompiler STATIC ir_opt/global_memory_to_storage_buffer_pass.cpp ir_opt/identity_removal_pass.cpp ir_opt/lower_fp16_to_fp32.cpp + ir_opt/lower_int16_to_int32.cpp ir_opt/lower_int64_to_int32.cpp ir_opt/passes.h ir_opt/rescaling_pass.cpp diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index 77efb4f577..cd526f517a 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -209,6 +209,9 @@ IR::Program TranslateProgram(ObjectPool& inst_pool, ObjectPoolInstructions()) { + inst.ReplaceOpcode(Replace(inst.GetOpcode())); + } + } +} + +} // namespace Shader::Optimization diff --git a/src/shader_recompiler/ir_opt/passes.h b/src/shader_recompiler/ir_opt/passes.h index 6ff8e42666..33e00deaad 100644 --- a/src/shader_recompiler/ir_opt/passes.h +++ b/src/shader_recompiler/ir_opt/passes.h @@ -14,6 +14,7 @@ void DeadCodeEliminationPass(IR::Program& program); void GlobalMemoryToStorageBufferPass(IR::Program& program); void IdentityRemovalPass(IR::Program& program); void LowerFp16ToFp32(IR::Program& program); +void LowerInt16ToInt32(IR::Program& program); void LowerInt64ToInt32(IR::Program& program); void RescalingPass(IR::Program& program); void SsaRewritePass(IR::Program& program); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 5196bdcf28..bd07aaf0ed 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -322,6 +322,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, Tegra::Engines::Maxw }; host_info = Shader::HostTranslateInfo{ .support_float16 = device.IsFloat16Supported(), + .support_int16 = device.IsShaderInt16Supported(), .support_int64 = device.IsShaderInt64Supported(), .needs_demote_reorder = driver_id == VK_DRIVER_ID_AMD_PROPRIETARY_KHR || driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR,