From bd718175cee2f124a5ebf2b0be9232ec2d7a062f Mon Sep 17 00:00:00 2001 From: PixelyIon Date: Sat, 22 Jan 2022 06:10:46 +0530 Subject: [PATCH] Enable `VK_KHR_uniform_buffer_standard_layout` when available We now attempt to enable `VK_KHR_uniform_buffer_standard_layout` when present as lax UBO layout significantly reduces complexity. If a device doesn't support this extension, we still assume that the device supports it implicitly as this has proven to be true across all major mobile GPU vendors regardless of the driver version but enabling this prevents validation layer errors. --- app/src/main/cpp/skyline/gpu.cpp | 2 +- app/src/main/cpp/skyline/gpu/quirk_manager.cpp | 10 ++++++++++ app/src/main/cpp/skyline/gpu/quirk_manager.h | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/cpp/skyline/gpu.cpp b/app/src/main/cpp/skyline/gpu.cpp index b5729066..69e4c6a8 100644 --- a/app/src/main/cpp/skyline/gpu.cpp +++ b/app/src/main/cpp/skyline/gpu.cpp @@ -123,7 +123,7 @@ namespace skyline::gpu { const vk::raii::PhysicalDevice &physicalDevice, decltype(vk::DeviceQueueCreateInfo::queueCount) &vkQueueFamilyIndex, QuirkManager &quirks) { - auto deviceFeatures2{physicalDevice.getFeatures2()}; + auto deviceFeatures2{physicalDevice.getFeatures2()}; decltype(deviceFeatures2) enabledFeatures2{}; // We only want to enable features we required due to potential overhead from unused features #define FEAT_REQ(structName, feature) \ diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp index 8ff20248..62a6d8a5 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.cpp @@ -7,6 +7,7 @@ namespace skyline::gpu { QuirkManager::QuirkManager(const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions, const DeviceProperties2 &deviceProperties2) { bool hasCustomBorderColorExtension{}, hasShaderAtomicInt64{}, hasShaderFloat16Int8Ext{}, hasShaderDemoteToHelper{}; + bool supportsUniformBufferStandardLayout{}; // We require VK_KHR_uniform_buffer_standard_layout but assume it is implicitly supported even when not present for (auto &extension : deviceExtensions) { #define EXT_SET(name, property) \ @@ -40,6 +41,7 @@ namespace skyline::gpu { EXT_SET("VK_KHR_shader_atomic_int64", hasShaderAtomicInt64); EXT_SET("VK_KHR_shader_float16_int8", hasShaderFloat16Int8Ext); EXT_SET("VK_KHR_shader_float_controls", supportsFloatControls); + EXT_SET("VK_KHR_uniform_buffer_standard_layout", supportsUniformBufferStandardLayout); } #undef EXT_SET @@ -94,6 +96,14 @@ namespace skyline::gpu { else enabledFeatures2.unlink(); + + if (supportsUniformBufferStandardLayout) { + FEAT_SET(vk::PhysicalDeviceUniformBufferStandardLayoutFeatures, uniformBufferStandardLayout, supportsUniformBufferStandardLayout) + }else { + enabledFeatures2.unlink(); + Logger::Warn("Cannot find VK_KHR_uniform_buffer_standard_layout, assuming implicit support"); + } + #undef FEAT_SET if (supportsFloatControls) diff --git a/app/src/main/cpp/skyline/gpu/quirk_manager.h b/app/src/main/cpp/skyline/gpu/quirk_manager.h index efd42e9e..495cd3fc 100644 --- a/app/src/main/cpp/skyline/gpu/quirk_manager.h +++ b/app/src/main/cpp/skyline/gpu/quirk_manager.h @@ -39,7 +39,7 @@ namespace skyline::gpu { using DeviceProperties2 = vk::StructureChain; - using DeviceFeatures2 = vk::StructureChain; + using DeviceFeatures2 = vk::StructureChain; QuirkManager(const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector &deviceExtensions, std::vector> &enabledExtensions, const DeviceProperties2 &deviceProperties2);