mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-11-30 16:03:05 +00:00
Vulkan/Descriptors: Increase sets per pool on AMFD propietary driver.
This commit is contained in:
parent
c20ea89390
commit
e7ca37b1e5
|
@ -18,7 +18,6 @@ namespace Vulkan {
|
||||||
// Prefer small grow rates to avoid saturating the descriptor pool with barely used pipelines
|
// Prefer small grow rates to avoid saturating the descriptor pool with barely used pipelines
|
||||||
constexpr size_t SETS_GROW_RATE = 16;
|
constexpr size_t SETS_GROW_RATE = 16;
|
||||||
constexpr s32 SCORE_THRESHOLD = 3;
|
constexpr s32 SCORE_THRESHOLD = 3;
|
||||||
constexpr u32 SETS_PER_POOL = 64;
|
|
||||||
|
|
||||||
struct DescriptorBank {
|
struct DescriptorBank {
|
||||||
DescriptorBankInfo info;
|
DescriptorBankInfo info;
|
||||||
|
@ -58,11 +57,12 @@ static DescriptorBankInfo MakeBankInfo(std::span<const Shader::Info> infos) {
|
||||||
static void AllocatePool(const Device& device, DescriptorBank& bank) {
|
static void AllocatePool(const Device& device, DescriptorBank& bank) {
|
||||||
std::array<VkDescriptorPoolSize, 6> pool_sizes;
|
std::array<VkDescriptorPoolSize, 6> pool_sizes;
|
||||||
size_t pool_cursor{};
|
size_t pool_cursor{};
|
||||||
|
const u32 sets_per_pool = device.GetSetsPerPool();
|
||||||
const auto add = [&](VkDescriptorType type, u32 count) {
|
const auto add = [&](VkDescriptorType type, u32 count) {
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
pool_sizes[pool_cursor++] = {
|
pool_sizes[pool_cursor++] = {
|
||||||
.type = type,
|
.type = type,
|
||||||
.descriptorCount = count * SETS_PER_POOL,
|
.descriptorCount = count * sets_per_pool,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -77,7 +77,7 @@ static void AllocatePool(const Device& device, DescriptorBank& bank) {
|
||||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
|
.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
|
||||||
.maxSets = SETS_PER_POOL,
|
.maxSets = sets_per_pool,
|
||||||
.poolSizeCount = static_cast<u32>(pool_cursor),
|
.poolSizeCount = static_cast<u32>(pool_cursor),
|
||||||
.pPoolSizes = std::data(pool_sizes),
|
.pPoolSizes = std::data(pool_sizes),
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -599,6 +599,12 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
||||||
|
|
||||||
graphics_queue = logical.GetQueue(graphics_family);
|
graphics_queue = logical.GetQueue(graphics_family);
|
||||||
present_queue = logical.GetQueue(present_family);
|
present_queue = logical.GetQueue(present_family);
|
||||||
|
|
||||||
|
sets_per_pool = 64;
|
||||||
|
if (driver_id == VK_DRIVER_ID_AMD_PROPRIETARY || driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE) {
|
||||||
|
// AMD drivers need a higher amount of Sets per Pool in certain circunstances like in XC2.
|
||||||
|
sets_per_pool = 96;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Device::~Device() = default;
|
Device::~Device() = default;
|
||||||
|
|
|
@ -318,6 +318,10 @@ public:
|
||||||
return device_access_memory;
|
return device_access_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 GetSetsPerPool() const {
|
||||||
|
return sets_per_pool;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Checks if the physical device is suitable.
|
/// Checks if the physical device is suitable.
|
||||||
void CheckSuitability(bool requires_swapchain) const;
|
void CheckSuitability(bool requires_swapchain) const;
|
||||||
|
@ -371,6 +375,7 @@ private:
|
||||||
VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced.
|
VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced.
|
||||||
u64 device_access_memory{}; ///< Total size of device local memory in bytes.
|
u64 device_access_memory{}; ///< Total size of device local memory in bytes.
|
||||||
u32 max_push_descriptors{}; ///< Maximum number of push descriptors
|
u32 max_push_descriptors{}; ///< Maximum number of push descriptors
|
||||||
|
u32 sets_per_pool{}; ///< Sets per Description Pool
|
||||||
bool is_optimal_astc_supported{}; ///< Support for native ASTC.
|
bool is_optimal_astc_supported{}; ///< Support for native ASTC.
|
||||||
bool is_float16_supported{}; ///< Support for float16 arithmetic.
|
bool is_float16_supported{}; ///< Support for float16 arithmetic.
|
||||||
bool is_int8_supported{}; ///< Support for int8 arithmetic.
|
bool is_int8_supported{}; ///< Support for int8 arithmetic.
|
||||||
|
|
Loading…
Reference in a new issue