diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_descriptor_pool.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 5 |
3 files changed, 14 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp index adb557f60..d87da2a34 100644 --- a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp | |||
| @@ -19,7 +19,6 @@ namespace Vulkan { | |||
| 19 | // Prefer small grow rates to avoid saturating the descriptor pool with barely used pipelines | 19 | // Prefer small grow rates to avoid saturating the descriptor pool with barely used pipelines |
| 20 | constexpr size_t SETS_GROW_RATE = 16; | 20 | constexpr size_t SETS_GROW_RATE = 16; |
| 21 | constexpr s32 SCORE_THRESHOLD = 3; | 21 | constexpr s32 SCORE_THRESHOLD = 3; |
| 22 | constexpr u32 SETS_PER_POOL = 64; | ||
| 23 | 22 | ||
| 24 | struct DescriptorBank { | 23 | struct DescriptorBank { |
| 25 | DescriptorBankInfo info; | 24 | DescriptorBankInfo info; |
| @@ -59,11 +58,12 @@ static DescriptorBankInfo MakeBankInfo(std::span<const Shader::Info> infos) { | |||
| 59 | static void AllocatePool(const Device& device, DescriptorBank& bank) { | 58 | static void AllocatePool(const Device& device, DescriptorBank& bank) { |
| 60 | std::array<VkDescriptorPoolSize, 6> pool_sizes; | 59 | std::array<VkDescriptorPoolSize, 6> pool_sizes; |
| 61 | size_t pool_cursor{}; | 60 | size_t pool_cursor{}; |
| 61 | const u32 sets_per_pool = device.GetSetsPerPool(); | ||
| 62 | const auto add = [&](VkDescriptorType type, u32 count) { | 62 | const auto add = [&](VkDescriptorType type, u32 count) { |
| 63 | if (count > 0) { | 63 | if (count > 0) { |
| 64 | pool_sizes[pool_cursor++] = { | 64 | pool_sizes[pool_cursor++] = { |
| 65 | .type = type, | 65 | .type = type, |
| 66 | .descriptorCount = count * SETS_PER_POOL, | 66 | .descriptorCount = count * sets_per_pool, |
| 67 | }; | 67 | }; |
| 68 | } | 68 | } |
| 69 | }; | 69 | }; |
| @@ -78,7 +78,7 @@ static void AllocatePool(const Device& device, DescriptorBank& bank) { | |||
| 78 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, | 78 | .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, |
| 79 | .pNext = nullptr, | 79 | .pNext = nullptr, |
| 80 | .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, | 80 | .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, |
| 81 | .maxSets = SETS_PER_POOL, | 81 | .maxSets = sets_per_pool, |
| 82 | .poolSizeCount = static_cast<u32>(pool_cursor), | 82 | .poolSizeCount = static_cast<u32>(pool_cursor), |
| 83 | .pPoolSizes = std::data(pool_sizes), | 83 | .pPoolSizes = std::data(pool_sizes), |
| 84 | })); | 84 | })); |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 24821c1a3..40b7ea90f 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -599,6 +599,12 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 599 | 599 | ||
| 600 | graphics_queue = logical.GetQueue(graphics_family); | 600 | graphics_queue = logical.GetQueue(graphics_family); |
| 601 | present_queue = logical.GetQueue(present_family); | 601 | present_queue = logical.GetQueue(present_family); |
| 602 | |||
| 603 | sets_per_pool = 64; | ||
| 604 | if (driver_id == VK_DRIVER_ID_AMD_PROPRIETARY || driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE) { | ||
| 605 | // AMD drivers need a higher amount of Sets per Pool in certain circunstances like in XC2. | ||
| 606 | sets_per_pool = 96; | ||
| 607 | } | ||
| 602 | } | 608 | } |
| 603 | 609 | ||
| 604 | Device::~Device() = default; | 610 | Device::~Device() = default; |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 5599c38c5..bc180a32a 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -323,6 +323,10 @@ public: | |||
| 323 | return device_access_memory; | 323 | return device_access_memory; |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | u32 GetSetsPerPool() const { | ||
| 327 | return sets_per_pool; | ||
| 328 | } | ||
| 329 | |||
| 326 | private: | 330 | private: |
| 327 | /// Checks if the physical device is suitable. | 331 | /// Checks if the physical device is suitable. |
| 328 | void CheckSuitability(bool requires_swapchain) const; | 332 | void CheckSuitability(bool requires_swapchain) const; |
| @@ -376,6 +380,7 @@ private: | |||
| 376 | VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced. | 380 | VkShaderStageFlags guest_warp_stages{}; ///< Stages where the guest warp size can be forced. |
| 377 | u64 device_access_memory{}; ///< Total size of device local memory in bytes. | 381 | u64 device_access_memory{}; ///< Total size of device local memory in bytes. |
| 378 | u32 max_push_descriptors{}; ///< Maximum number of push descriptors | 382 | u32 max_push_descriptors{}; ///< Maximum number of push descriptors |
| 383 | u32 sets_per_pool{}; ///< Sets per Description Pool | ||
| 379 | bool is_optimal_astc_supported{}; ///< Support for native ASTC. | 384 | bool is_optimal_astc_supported{}; ///< Support for native ASTC. |
| 380 | bool is_float16_supported{}; ///< Support for float16 arithmetic. | 385 | bool is_float16_supported{}; ///< Support for float16 arithmetic. |
| 381 | bool is_int8_supported{}; ///< Support for int8 arithmetic. | 386 | bool is_int8_supported{}; ///< Support for int8 arithmetic. |