rsx/vk: Be a little more frugal with texture memory to avoid running out of VRAM on 1GB cards

This commit is contained in:
kd-11 2017-10-24 15:58:53 +03:00
parent e9f293f522
commit 6918e265ec
2 changed files with 25 additions and 4 deletions

View file

@ -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;
}

View file

@ -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;
}
};
}