mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-15 13:21:14 +00:00
gl: Reuse framebuffer textures whenever possible
This commit is contained in:
parent
f20fd217f8
commit
98e50d3064
@ -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
|
||||
|
@ -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;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user