vk: Make best-effort attempt to utilize the low-latency pool
This commit is contained in:
@@ -76,9 +76,9 @@ public:
|
|||||||
data_heap(const data_heap&) = delete;
|
data_heap(const data_heap&) = delete;
|
||||||
data_heap(data_heap&&) = delete;
|
data_heap(data_heap&&) = delete;
|
||||||
|
|
||||||
void init(usz heap_size, const char* buffer_name = "unnamed", usz min_guard_size=0x10000)
|
void init(usz heap_size, const char* buffer_name = nullptr, usz min_guard_size=0x10000)
|
||||||
{
|
{
|
||||||
m_name = const_cast<char*>(buffer_name);
|
m_name = const_cast<char*>(buffer_name ? buffer_name : "<unnamed>");
|
||||||
|
|
||||||
m_size = heap_size;
|
m_size = heap_size;
|
||||||
m_put_pos = 0;
|
m_put_pos = 0;
|
||||||
|
|||||||
@@ -22,12 +22,17 @@ namespace vk
|
|||||||
if ((flags & heap_pool_low_latency) && g_cfg.video.vk.use_rebar_upload_heap)
|
if ((flags & heap_pool_low_latency) && g_cfg.video.vk.use_rebar_upload_heap)
|
||||||
{
|
{
|
||||||
// Prefer uploading to BAR if low latency is desired.
|
// Prefer uploading to BAR if low latency is desired.
|
||||||
m_prefer_writethrough = memory_map.device_bar_total_bytes > (2048ull * 0x100000);
|
const int max_usage = memory_map.device_bar_total_bytes <= (256 * 0x100000) ? 75 : 90;
|
||||||
|
m_prefer_writethrough = can_allocate_heap(memory_map.device_bar, size, max_usage);
|
||||||
|
|
||||||
// Log it
|
// Log it
|
||||||
if (m_prefer_writethrough && name)
|
if (m_prefer_writethrough)
|
||||||
{
|
{
|
||||||
rsx_log.notice("Data heap %s will attempt to use Re-BAR memory", name);
|
rsx_log.notice("Data heap %s will attempt to use Re-BAR memory", m_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rsx_log.warning("Could not fit heap '%s' into Re-BAR memory", m_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +91,17 @@ namespace vk
|
|||||||
VkBufferUsageFlags usage = heap->info.usage;
|
VkBufferUsageFlags usage = heap->info.usage;
|
||||||
const auto& memory_map = g_render_device->get_memory_mapping();
|
const auto& memory_map = g_render_device->get_memory_mapping();
|
||||||
|
|
||||||
|
if (m_prefer_writethrough)
|
||||||
|
{
|
||||||
|
const int max_usage = memory_map.device_bar_total_bytes <= (256 * 0x100000) ? 75 : 90;
|
||||||
|
m_prefer_writethrough = can_allocate_heap(memory_map.device_bar, aligned_new_size, max_usage);
|
||||||
|
|
||||||
|
if (!m_prefer_writethrough)
|
||||||
|
{
|
||||||
|
rsx_log.warning("Could not fit heap '%s' into Re-BAR memory during reallocation", m_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VkFlags memory_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
VkFlags memory_flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||||
auto memory_index = m_prefer_writethrough ? memory_map.device_bar : memory_map.host_visible_coherent;
|
auto memory_index = m_prefer_writethrough ? memory_map.device_bar : memory_map.host_visible_coherent;
|
||||||
|
|
||||||
@@ -116,6 +132,14 @@ namespace vk
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool data_heap::can_allocate_heap(const vk::memory_type_info& target_heap, usz size, int max_usage_percent)
|
||||||
|
{
|
||||||
|
const auto current_usage = vmm_get_application_memory_usage(target_heap);
|
||||||
|
const auto after_usage = current_usage + size;
|
||||||
|
const auto limit = (target_heap.total_bytes() * max_usage_percent) / 100;
|
||||||
|
return after_usage < limit;
|
||||||
|
}
|
||||||
|
|
||||||
void* data_heap::map(usz offset, usz size)
|
void* data_heap::map(usz offset, usz size)
|
||||||
{
|
{
|
||||||
if (!_ptr)
|
if (!_ptr)
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ namespace vk
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool grow(usz size) override;
|
bool grow(usz size) override;
|
||||||
|
bool can_allocate_heap(const vk::memory_type_info& target_heap, usz size, int max_usage_percent);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::unique_ptr<buffer> heap;
|
std::unique_ptr<buffer> heap;
|
||||||
|
|||||||
@@ -44,6 +44,16 @@ namespace vk
|
|||||||
return type_ids.size();
|
return type_ids.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 memory_type_info::total_bytes() const
|
||||||
|
{
|
||||||
|
u64 result = 0;
|
||||||
|
for (const auto& size : type_sizes)
|
||||||
|
{
|
||||||
|
result += size;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
memory_type_info::operator bool() const
|
memory_type_info::operator bool() const
|
||||||
{
|
{
|
||||||
return !type_ids.empty();
|
return !type_ids.empty();
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ namespace vk
|
|||||||
const_iterator end() const;
|
const_iterator end() const;
|
||||||
u32 first() const;
|
u32 first() const;
|
||||||
size_t count() const;
|
size_t count() const;
|
||||||
|
u64 total_bytes() const;
|
||||||
|
|
||||||
operator bool() const;
|
operator bool() const;
|
||||||
bool operator == (const memory_type_info& other) const;
|
bool operator == (const memory_type_info& other) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user