mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-20 19:45:20 +00:00
rsx/vk: Be a little more frugal with texture memory to avoid running out of VRAM on 1GB cards
This commit is contained in:
parent
e9f293f522
commit
6918e265ec
2 changed files with 25 additions and 4 deletions
|
@ -165,7 +165,7 @@ namespace rsx
|
|||
bool blit_engine_incompatibility_warning_raised = false;
|
||||
|
||||
//Memory usage
|
||||
const s32 m_max_zombie_objects = 128; //Limit on how many texture objects to keep around for reuse after they are invalidated
|
||||
const s32 m_max_zombie_objects = 64; //Limit on how many texture objects to keep around for reuse after they are invalidated
|
||||
std::atomic<s32> m_unreleased_texture_objects = { 0 }; //Number of invalidated objects not yet freed from memory
|
||||
std::atomic<u32> m_texture_memory_in_use = { 0 };
|
||||
|
||||
|
@ -1239,7 +1239,7 @@ namespace rsx
|
|||
return m_unreleased_texture_objects;
|
||||
}
|
||||
|
||||
const u32 get_texture_memory_in_use() const
|
||||
virtual const u32 get_texture_memory_in_use() const
|
||||
{
|
||||
return m_texture_memory_in_use;
|
||||
}
|
||||
|
|
|
@ -286,6 +286,9 @@ namespace vk
|
|||
std::unique_ptr<vk::image_view> view;
|
||||
std::unique_ptr<vk::image> img;
|
||||
|
||||
//Memory held by this temp storage object
|
||||
u32 block_size = 0;
|
||||
|
||||
const u64 frame_tag = vk::get_current_frame_id();
|
||||
|
||||
discarded_storage(std::unique_ptr<vk::image_view>& _view)
|
||||
|
@ -308,6 +311,7 @@ namespace vk
|
|||
{
|
||||
view = std::move(tex.get_view());
|
||||
img = std::move(tex.get_texture());
|
||||
block_size = tex.get_section_size();
|
||||
}
|
||||
|
||||
const bool test(u64 ref_frame) const
|
||||
|
@ -329,6 +333,7 @@ namespace vk
|
|||
|
||||
//Stuff that has been dereferenced goes into these
|
||||
std::list<discarded_storage> m_discardable_storage;
|
||||
std::atomic<u32> m_discarded_memory_size = { 0 };
|
||||
|
||||
void purge_cache()
|
||||
{
|
||||
|
@ -354,12 +359,14 @@ namespace vk
|
|||
m_discardable_storage.clear();
|
||||
m_unreleased_texture_objects = 0;
|
||||
m_texture_memory_in_use = 0;
|
||||
m_discarded_memory_size = 0;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
void free_texture_section(cached_texture_section& tex) override
|
||||
{
|
||||
m_discarded_memory_size += tex.get_section_size();
|
||||
m_discardable_storage.push_back(tex);
|
||||
tex.destroy();
|
||||
}
|
||||
|
@ -667,13 +674,22 @@ namespace vk
|
|||
|
||||
void on_frame_end() override
|
||||
{
|
||||
if (m_unreleased_texture_objects >= m_max_zombie_objects)
|
||||
if (m_unreleased_texture_objects >= m_max_zombie_objects ||
|
||||
m_discarded_memory_size > 0x4000000) //If already holding over 64M in discardable memory, be frugal with memory resources
|
||||
{
|
||||
purge_dirty();
|
||||
}
|
||||
|
||||
const u64 last_complete_frame = vk::get_last_completed_frame_id();
|
||||
m_discardable_storage.remove_if([&](const discarded_storage& o) {return o.test(last_complete_frame);});
|
||||
m_discardable_storage.remove_if([&](const discarded_storage& o)
|
||||
{
|
||||
if (o.test(last_complete_frame))
|
||||
{
|
||||
m_discarded_memory_size -= o.block_size;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
template<typename RsxTextureType>
|
||||
|
@ -727,5 +743,10 @@ namespace vk
|
|||
{
|
||||
return m_unreleased_texture_objects + (u32)m_discardable_storage.size();
|
||||
}
|
||||
|
||||
const u32 get_texture_memory_in_use() const override
|
||||
{
|
||||
return m_texture_memory_in_use + m_discarded_memory_size;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue