mirror of https://github.com/RPCS3/rpcs3.git
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
|
// Cleanup
|
||||||
m_gl_texture_cache.on_frame_end();
|
m_gl_texture_cache.on_frame_end();
|
||||||
|
|
||||||
for (auto &tex : m_rtts.invalidated_resources)
|
m_rtts.free_invalidated();
|
||||||
tex->remove();
|
|
||||||
|
|
||||||
m_rtts.invalidated_resources.clear();
|
|
||||||
m_vertex_cache->purge();
|
m_vertex_cache->purge();
|
||||||
|
|
||||||
//If we are skipping the next frame, do not reset perf counters
|
//If we are skipping the next frame, do not reset perf counters
|
||||||
|
|
|
@ -49,7 +49,7 @@ namespace rsx
|
||||||
|
|
||||||
namespace gl
|
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;
|
bool is_cleared = false;
|
||||||
|
|
||||||
|
@ -242,10 +242,10 @@ struct gl_render_target_traits
|
||||||
info->bpp = static_cast<u8>(info->native_pitch / info->surface_width);
|
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_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 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); }
|
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 "VKFormats.h"
|
||||||
#include "../rsx_utils.h"
|
#include "../rsx_utils.h"
|
||||||
|
|
||||||
struct ref_counted
|
|
||||||
{
|
|
||||||
u8 deref_count = 0;
|
|
||||||
|
|
||||||
void reset_refs() { deref_count = 0; }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace vk
|
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;
|
bool dirty = false;
|
||||||
u16 native_pitch = 0;
|
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,
|
framebuffer_holder(VkDevice dev,
|
||||||
VkRenderPass pass,
|
VkRenderPass pass,
|
||||||
|
|
|
@ -19,6 +19,14 @@ extern "C"
|
||||||
|
|
||||||
namespace rsx
|
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
|
//Holds information about a framebuffer
|
||||||
struct gcm_framebuffer_info
|
struct gcm_framebuffer_info
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue