mirror of
https://github.com/Takiiiiiiii/strato.git
synced 2025-07-17 08:46:39 +00:00
Integrate BCeNabler support into QuirkManager
Allows using BCn format textures on devices where they are unsupported by the driver.
This commit is contained in:
@ -65,7 +65,7 @@ namespace skyline::gpu::memory {
|
||||
.device = *gpu.vkDevice,
|
||||
.instance = *gpu.vkInstance,
|
||||
.pVulkanFunctions = &vulkanFunctions,
|
||||
.vulkanApiVersion = GPU::VkApiVersion,
|
||||
.vulkanApiVersion = VkApiVersion,
|
||||
};
|
||||
ThrowOnFail(vmaCreateAllocator(&allocatorCreateInfo, &vmaAllocator));
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// Copyright © 2021 Skyline Team and Contributors (https://github.com/skyline-emu/)
|
||||
|
||||
#include <adrenotools/bcenabler.h>
|
||||
#include "quirk_manager.h"
|
||||
|
||||
namespace skyline::gpu {
|
||||
@ -103,6 +104,31 @@ namespace skyline::gpu {
|
||||
subgroupSize = deviceProperties2.get<vk::PhysicalDeviceSubgroupProperties>().subgroupSize;
|
||||
}
|
||||
|
||||
void QuirkManager::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{
|
||||
.apiVersion = VK_API_VERSION_1_0,
|
||||
};
|
||||
|
||||
auto instance{vk::raii::Instance(context, vk::InstanceCreateInfo{
|
||||
.pApplicationInfo = &applicationInfo
|
||||
})};
|
||||
|
||||
auto physicalDevice{std::move(instance.enumeratePhysicalDevices().front())};
|
||||
auto properties{physicalDevice.getProperties()};
|
||||
|
||||
// Apply BCeNabler for Adreno devices
|
||||
auto type{adrenotools_get_bcn_type( VK_VERSION_MAJOR(properties.driverVersion), VK_VERSION_MINOR(properties.driverVersion), properties.vendorID)};
|
||||
if (type == ADRENOTOOLS_BCN_PATCH) {
|
||||
if (adrenotools_patch_bcn(reinterpret_cast<void *>(physicalDevice.getDispatcher()->vkGetPhysicalDeviceFormatProperties)))
|
||||
Logger::Info("Applied BCeNabler patch");
|
||||
else
|
||||
throw exception("Failed to apply BCeNabler patch!");
|
||||
} else if (type == ADRENOTOOLS_BCN_BLOB) {
|
||||
Logger::Info("BCeNabler skipped, blob BCN support is present");
|
||||
}
|
||||
}
|
||||
|
||||
std::string QuirkManager::Summary() {
|
||||
return fmt::format(
|
||||
"\n* Supports U8 Indices: {}\n* Supports Sampler Mirror Clamp To Edge: {}\n* Supports Sampler Reduction Mode: {}\n* Supports Custom Border Color (Without Format): {}\n* Supports Last Provoking Vertex: {}\n* Supports Logical Operations: {}\n* Supports Vertex Attribute Divisor: {}\n* Supports Vertex Attribute Zero Divisor: {}\n* Supports Multiple Viewports: {}\n* Supports Shader Viewport Index: {}\n* Supports SPIR-V 1.4: {}\n* Supports Shader Invocation Demotion: {}\n* Supports 16-bit FP: {}\n* Supports 8-bit Integers: {}\n* Supports 16-bit Integers: {}\n* Supports 64-bit Integers: {}\n* Supports Atomic 64-bit Integers: {}\n* Supports Floating Point Behavior Control: {}\n* Supports Image Read Without Format: {}\n* Supports Subgroup Vote: {}\n* Subgroup Size: {}",
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <vulkan/vulkan.hpp>
|
||||
#include <vulkan/vulkan_raii.hpp>
|
||||
#include <common.h>
|
||||
|
||||
namespace skyline::gpu {
|
||||
@ -43,6 +43,11 @@ namespace skyline::gpu {
|
||||
|
||||
QuirkManager(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);
|
||||
|
||||
/**
|
||||
* @brief Applies driver specific binary patches to the driver (e.g. BCeNabler)
|
||||
*/
|
||||
void ApplyDriverPatches(const vk::raii::Context &context);
|
||||
|
||||
/**
|
||||
* @return A summary of all the GPU quirks as a human-readable string
|
||||
*/
|
||||
|
Reference in New Issue
Block a user