mirror of
https://github.com/Takiiiiiiii/strato.git
synced 2025-07-17 08:46:39 +00:00
Fix Adreno Texture Sampler Binding Bug
Adreno proprietary drivers suffer from a bug where `VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER` requires 2 descriptor slots rather than one, we add a padding slot to fix this issue. `QuirkManager` was introduced to handle per-vendor/per-device errata and allow enabling this on Adreno proprietary drivers specifically as to not affect the performance of other devices.
This commit is contained in:
@ -5,7 +5,7 @@
|
||||
#include "trait_manager.h"
|
||||
|
||||
namespace skyline::gpu {
|
||||
TraitManager::TraitManager(const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector<vk::ExtensionProperties> &deviceExtensions, std::vector<std::array<char, VK_MAX_EXTENSION_NAME_SIZE>> &enabledExtensions, const DeviceProperties2 &deviceProperties2) {
|
||||
TraitManager::TraitManager(const DeviceFeatures2 &deviceFeatures2, DeviceFeatures2 &enabledFeatures2, const std::vector<vk::ExtensionProperties> &deviceExtensions, std::vector<std::array<char, VK_MAX_EXTENSION_NAME_SIZE>> &enabledExtensions, const DeviceProperties2 &deviceProperties2) : quirks(deviceProperties2.get<vk::PhysicalDeviceProperties2>().properties, deviceProperties2.get<vk::PhysicalDeviceDriverProperties>()) {
|
||||
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
|
||||
|
||||
@ -48,11 +48,13 @@ namespace skyline::gpu {
|
||||
#undef EXT_SET_V
|
||||
}
|
||||
|
||||
#define FEAT_SET(structName, feature, property) \
|
||||
if (deviceFeatures2.get<structName>().feature) { \
|
||||
property = true; \
|
||||
enabledFeatures2.get<structName>().feature = true; \
|
||||
}
|
||||
#define FEAT_SET(structName, feature, property) \
|
||||
do { \
|
||||
if (deviceFeatures2.get<structName>().feature) { \
|
||||
property = true; \
|
||||
enabledFeatures2.get<structName>().feature = true; \
|
||||
} \
|
||||
} while(false);
|
||||
|
||||
FEAT_SET(vk::PhysicalDeviceFeatures2, features.logicOp, supportsLogicOp)
|
||||
FEAT_SET(vk::PhysicalDeviceFeatures2, features.multiViewport, supportsMultipleViewports)
|
||||
@ -96,10 +98,9 @@ namespace skyline::gpu {
|
||||
else
|
||||
enabledFeatures2.unlink<vk::PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT>();
|
||||
|
||||
|
||||
if (supportsUniformBufferStandardLayout) {
|
||||
FEAT_SET(vk::PhysicalDeviceUniformBufferStandardLayoutFeatures, uniformBufferStandardLayout, supportsUniformBufferStandardLayout)
|
||||
}else {
|
||||
} else {
|
||||
enabledFeatures2.unlink<vk::PhysicalDeviceUniformBufferStandardLayoutFeatures>();
|
||||
Logger::Warn("Cannot find VK_KHR_uniform_buffer_standard_layout, assuming implicit support");
|
||||
}
|
||||
@ -121,6 +122,25 @@ namespace skyline::gpu {
|
||||
);
|
||||
}
|
||||
|
||||
TraitManager::QuirkManager::QuirkManager(const vk::PhysicalDeviceProperties &deviceProperties, const vk::PhysicalDeviceDriverProperties &driverProperties) {
|
||||
switch (driverProperties.driverID) {
|
||||
case vk::DriverId::eQualcommProprietary: {
|
||||
needsTextureBindingPadding = true;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::string TraitManager::QuirkManager::Summary() {
|
||||
return fmt::format(
|
||||
"\n* Needs Texture Binding Padding: {}",
|
||||
needsTextureBindingPadding
|
||||
);
|
||||
}
|
||||
|
||||
void TraitManager::ApplyDriverPatches(const vk::raii::Context &context) {
|
||||
// Create an instance without validation layers in order to get pointers to the functions we need to patch from the driver
|
||||
vk::ApplicationInfo applicationInfo{
|
||||
|
Reference in New Issue
Block a user