From fae5332f20f17e1b2cdf2a82d3718759b6cc163e Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Wed, 16 Mar 2022 21:14:52 +0000 Subject: [PATCH] Disable descriptor aliasing on Adreno to workaround shader compiler bug Alised descriptor sets are incorrectly interpreted by the shader compiler causing it to bugger up LLVM function argument types and crash Co-authored-by: PixelyIon --- app/src/main/cpp/skyline/gpu/shader_manager.cpp | 2 +- app/src/main/cpp/skyline/gpu/trait_manager.cpp | 1 + app/src/main/cpp/skyline/gpu/trait_manager.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/skyline/gpu/shader_manager.cpp b/app/src/main/cpp/skyline/gpu/shader_manager.cpp index e10ea888..3b09969e 100644 --- a/app/src/main/cpp/skyline/gpu/shader_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/shader_manager.cpp @@ -35,7 +35,7 @@ namespace skyline::gpu { profile = Shader::Profile{ .supported_spirv = traits.supportsSpirv14 ? 0x00010400U : 0x00010000U, .unified_descriptor_binding = true, - .support_descriptor_aliasing = true, + .support_descriptor_aliasing = !traits.quirks.brokenDescriptorAliasing, .support_int8 = traits.supportsInt8, .support_int16 = traits.supportsInt16, .support_int64 = traits.supportsInt64, diff --git a/app/src/main/cpp/skyline/gpu/trait_manager.cpp b/app/src/main/cpp/skyline/gpu/trait_manager.cpp index 4efa5e26..a39651aa 100644 --- a/app/src/main/cpp/skyline/gpu/trait_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/trait_manager.cpp @@ -132,6 +132,7 @@ namespace skyline::gpu { case vk::DriverId::eQualcommProprietary: { needsIndividualTextureBindingWrites = true; vkImageMutableFormatCostly = true; // Disables UBWC + brokenDescriptorAliasing = true; break; } diff --git a/app/src/main/cpp/skyline/gpu/trait_manager.h b/app/src/main/cpp/skyline/gpu/trait_manager.h index 0f68e5ac..41a19c9f 100644 --- a/app/src/main/cpp/skyline/gpu/trait_manager.h +++ b/app/src/main/cpp/skyline/gpu/trait_manager.h @@ -41,6 +41,7 @@ namespace skyline::gpu { struct QuirkManager { bool needsIndividualTextureBindingWrites{}; //!< [Adreno Proprietary] A bug that requires descriptor set writes for VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER to be done individually with descriptorCount = 1 rather than batched bool vkImageMutableFormatCostly{}; //!< [Adreno Proprietary/Freedreno] An indication that VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT is costly and should not be enabled unless absolutely necessary (Disables UBWC on Adreno GPUs) + bool brokenDescriptorAliasing{}; //!< [Adreno Proprietary] A bug that causes alised descriptor sets to be incorrectly interpreted by the shader compiler leading to it buggering up LLVM function argument types and crashing QuirkManager() = default;