mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-19 12:48:57 +02:00
[vk, vendor, mobile] Improved mobile staging buffer data
This commit is contained in:
parent
1c3f9c4730
commit
93d87f8372
4 changed files with 184 additions and 6 deletions
|
|
@ -600,11 +600,39 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
|||
}
|
||||
}
|
||||
|
||||
const bool needs_mobile_alignment_clamp = is_qualcomm || is_arm;
|
||||
use_mobile_megabuffer = needs_mobile_alignment_clamp;
|
||||
|
||||
if (is_qualcomm) {
|
||||
const u32 version = (properties.properties.driverVersion << 3) >> 3;
|
||||
if (version < VK_MAKE_API_VERSION(0, 255, 615, 512)) {
|
||||
has_broken_parallel_compiling = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_mobile_alignment_clamp) {
|
||||
const char* driver_label = is_qualcomm ? "Qualcomm" : "ARM";
|
||||
|
||||
constexpr VkDeviceSize MIN_UNIFORM_ALIGNMENT = 256;
|
||||
const VkDeviceSize reported_uniform_alignment =
|
||||
properties.properties.limits.minUniformBufferOffsetAlignment;
|
||||
if (reported_uniform_alignment < MIN_UNIFORM_ALIGNMENT) {
|
||||
uniform_buffer_alignment_minimum = MIN_UNIFORM_ALIGNMENT;
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"{} driver reports {}-byte minUniformBufferOffsetAlignment; clamping to {}",
|
||||
driver_label, reported_uniform_alignment, uniform_buffer_alignment_minimum);
|
||||
}
|
||||
|
||||
constexpr VkDeviceSize MIN_STORAGE_ALIGNMENT = 64;
|
||||
const VkDeviceSize reported_storage_alignment =
|
||||
properties.properties.limits.minStorageBufferOffsetAlignment;
|
||||
if (reported_storage_alignment < MIN_STORAGE_ALIGNMENT) {
|
||||
storage_buffer_alignment_minimum = MIN_STORAGE_ALIGNMENT;
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"{} driver reports {}-byte minStorageBufferOffsetAlignment; clamping to {}",
|
||||
driver_label, reported_storage_alignment, storage_buffer_alignment_minimum);
|
||||
}
|
||||
|
||||
const size_t sampler_limit = properties.properties.limits.maxSamplerAllocationCount;
|
||||
if (sampler_limit > 0) {
|
||||
constexpr size_t MIN_SAMPLER_BUDGET = 1024U;
|
||||
|
|
@ -613,9 +641,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
|||
(std::max)(MIN_SAMPLER_BUDGET, sampler_limit - reserved);
|
||||
sampler_heap_budget = derived_budget;
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"Qualcomm driver reports max {} samplers; reserving {} (25%) and "
|
||||
"{} driver reports max {} samplers; reserving {} (25%) and "
|
||||
"allowing Eden to use {} (75%) to avoid heap exhaustion",
|
||||
sampler_limit, reserved, sampler_heap_budget);
|
||||
driver_label, sampler_limit, reserved, sampler_heap_budget);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <span>
|
||||
|
|
@ -315,12 +316,14 @@ public:
|
|||
|
||||
/// Returns uniform buffer alignment requirement.
|
||||
VkDeviceSize GetUniformBufferAlignment() const {
|
||||
return properties.properties.limits.minUniformBufferOffsetAlignment;
|
||||
return (std::max)(properties.properties.limits.minUniformBufferOffsetAlignment,
|
||||
uniform_buffer_alignment_minimum);
|
||||
}
|
||||
|
||||
/// Returns storage alignment requirement.
|
||||
VkDeviceSize GetStorageBufferAlignment() const {
|
||||
return properties.properties.limits.minStorageBufferOffsetAlignment;
|
||||
return (std::max)(properties.properties.limits.minStorageBufferOffsetAlignment,
|
||||
storage_buffer_alignment_minimum);
|
||||
}
|
||||
|
||||
/// Returns the maximum range for storage buffers.
|
||||
|
|
@ -373,6 +376,11 @@ public:
|
|||
return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY;
|
||||
}
|
||||
|
||||
/// Returns true when the driver should use the mobile mega buffer allocator.
|
||||
bool ShouldUseMobileMegaBuffer() const {
|
||||
return use_mobile_megabuffer;
|
||||
}
|
||||
|
||||
/// Returns true if the device supports float64 natively.
|
||||
bool IsFloat64Supported() const {
|
||||
return features.features.shaderFloat64;
|
||||
|
|
@ -1076,6 +1084,7 @@ private:
|
|||
bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting.
|
||||
bool must_emulate_scaled_formats{}; ///< Requires scaled vertex format emulation
|
||||
bool must_emulate_bgr565{}; ///< Emulates BGR565 by swizzling RGB565 format.
|
||||
bool use_mobile_megabuffer{}; ///< Use the Android mega buffer path.
|
||||
bool dynamic_state3_blending{}; ///< Has blending features of dynamic_state3.
|
||||
bool dynamic_state3_enables{}; ///< Has at least one enable feature of dynamic_state3.
|
||||
bool dynamic_state3_depth_clamp_enable{};
|
||||
|
|
@ -1087,6 +1096,8 @@ private:
|
|||
bool dynamic_state3_alpha_to_one{};
|
||||
bool supports_conditional_barriers{}; ///< Allows barriers in conditional control flow.
|
||||
size_t sampler_heap_budget{}; ///< Sampler budget for buggy drivers (0 = unlimited).
|
||||
VkDeviceSize uniform_buffer_alignment_minimum{}; ///< Minimum enforced UBO alignment.
|
||||
VkDeviceSize storage_buffer_alignment_minimum{}; ///< Minimum enforced SSBO alignment.
|
||||
u64 device_access_memory{}; ///< Total size of device local memory in bytes.
|
||||
u32 sets_per_pool{}; ///< Sets per Description Pool
|
||||
NvidiaArchitecture nvidia_arch{NvidiaArchitecture::Arch_AmpereOrNewer};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue