gl: Reuse framebuffer textures whenever possible

This commit is contained in:
kd-11 2018-02-02 10:04:55 +03:00
parent f20fd217f8
commit 98e50d3064
4 changed files with 29 additions and 17 deletions

View File

@ -1341,10 +1341,7 @@ void GLGSRender::flip(int buffer)
// Cleanup
m_gl_texture_cache.on_frame_end();
for (auto &tex : m_rtts.invalidated_resources)
tex->remove();
m_rtts.invalidated_resources.clear();
m_rtts.free_invalidated();
m_vertex_cache->purge();
//If we are skipping the next frame, do not reset perf counters

View File

@ -49,7 +49,7 @@ namespace rsx
namespace gl
{
class render_target : public texture, public rsx::render_target_descriptor<u32>
class render_target : public texture, public rsx::ref_counted, public rsx::render_target_descriptor<u32>
{
bool is_cleared = false;
@ -242,10 +242,10 @@ struct gl_render_target_traits
info->bpp = static_cast<u8>(info->native_pitch / info->surface_width);
}
static void prepare_rtt_for_drawing(void *, gl::render_target*) {}
static void prepare_rtt_for_drawing(void *, gl::render_target *rtt) { rtt->reset_refs(); }
static void prepare_rtt_for_sampling(void *, gl::render_target*) {}
static void prepare_ds_for_drawing(void *, gl::render_target*) {}
static void prepare_ds_for_drawing(void *, gl::render_target *ds) { ds->reset_refs(); }
static void prepare_ds_for_sampling(void *, gl::render_target*) {}
static void invalidate_rtt_surface_contents(void *, gl::render_target *rtt, gl::render_target* /*old*/, bool forced) { if (forced) rtt->set_cleared(false); }
@ -318,6 +318,20 @@ struct gl_render_target_traits
}
};
class gl_render_targets : public rsx::surface_store<gl_render_target_traits>
struct gl_render_targets : public rsx::surface_store<gl_render_target_traits>
{
void free_invalidated()
{
invalidated_resources.remove_if([&](auto &rtt)
{
if (rtt->deref_count >= 2)
{
rtt->remove();
return true;
}
rtt->deref_count++;
return false;
});
}
};

View File

@ -8,16 +8,9 @@
#include "VKFormats.h"
#include "../rsx_utils.h"
struct ref_counted
{
u8 deref_count = 0;
void reset_refs() { deref_count = 0; }
};
namespace vk
{
struct render_target : public image, public ref_counted, public rsx::render_target_descriptor<vk::image*>
struct render_target : public image, public rsx::ref_counted, public rsx::render_target_descriptor<vk::image*>
{
bool dirty = false;
u16 native_pitch = 0;
@ -90,7 +83,7 @@ namespace vk
}
};
struct framebuffer_holder: public vk::framebuffer, public ref_counted
struct framebuffer_holder: public vk::framebuffer, public rsx::ref_counted
{
framebuffer_holder(VkDevice dev,
VkRenderPass pass,

View File

@ -19,6 +19,14 @@ extern "C"
namespace rsx
{
//Base for resources with reference counting
struct ref_counted
{
u8 deref_count = 0;
void reset_refs() { deref_count = 0; }
};
//Holds information about a framebuffer
struct gcm_framebuffer_info
{