From 66d8b96ae3a2d627b2df446ba1ee2a3af0bd5b6b Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Thu, 8 May 2014 04:29:14 +0300 Subject: [PATCH] Cleanup textures after they are dead for a while --- core/hw/pvr/Renderer_if.cpp | 2 +- core/hw/pvr/ta_vtx.cpp | 2 ++ core/rend/gles/gldraw.cpp | 4 +++- core/rend/gles/gles.cpp | 4 ++++ core/rend/gles/gles.h | 3 +++ core/rend/gles/gltex.cpp | 34 ++++++++++++++++++++++++++++++---- 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/core/hw/pvr/Renderer_if.cpp b/core/hw/pvr/Renderer_if.cpp index 0d9e1a4c5..348c7a030 100644 --- a/core/hw/pvr/Renderer_if.cpp +++ b/core/hw/pvr/Renderer_if.cpp @@ -60,7 +60,7 @@ */ u32 VertexCount=0; -u32 FrameCount=0; +u32 FrameCount=1; Renderer* rend; cResetEvent rs(false,true); diff --git a/core/hw/pvr/ta_vtx.cpp b/core/hw/pvr/ta_vtx.cpp index 8a34243c9..7a813b7aa 100644 --- a/core/hw/pvr/ta_vtx.cpp +++ b/core/hw/pvr/ta_vtx.cpp @@ -1558,6 +1558,8 @@ void FillBGP(TA_context* ctx) u32 vertex_ptr=strip_vert_num*strip_vs+strip_base +3*4; //now , all the info is ready :p + bgpp->texid = -1; + bgpp->isp.full=vri(strip_base); bgpp->tsp.full=vri(strip_base+4); bgpp->tcw.full=vri(strip_base+8); diff --git a/core/rend/gles/gldraw.cpp b/core/rend/gles/gldraw.cpp index 28d1844ad..01041cd38 100644 --- a/core/rend/gles/gldraw.cpp +++ b/core/rend/gles/gldraw.cpp @@ -197,8 +197,10 @@ __forceinline if (gp->texid != cache.texture) { cache.texture=gp->texid; - if (gp->texid != -1) + if (gp->texid != -1) { + //verify(glIsTexture(gp->texid)); glBindTexture(GL_TEXTURE_2D, gp->texid); + } } if (gp->tsp.full!=cache.tsp.full) diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index def289365..26e42cb5f 100755 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -1178,11 +1178,15 @@ bool ProcessFrame(TA_context* ctx) if (!ta_parse_vdrc(ctx)) return false; + CollectCleanup(); + return true; } bool RenderFrame() { + DoCleanup(); + bool is_rtt=pvrrc.isRTT; OSD_HOOK(); diff --git a/core/rend/gles/gles.h b/core/rend/gles/gles.h index 02659cbe7..9b1097376 100755 --- a/core/rend/gles/gles.h +++ b/core/rend/gles/gles.h @@ -80,6 +80,9 @@ struct gl_ctx extern gl_ctx gl; GLuint GetTexture(TSP tsp,TCW tcw); +void CollectCleanup(); +void DoCleanup(); + void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt); int GetProgramID(u32 cp_AlphaTest, u32 pp_ClipTestMode, u32 pp_Texture, u32 pp_UseAlpha, u32 pp_IgnoreTexA, u32 pp_ShadInstr, u32 pp_Offset, diff --git a/core/rend/gles/gltex.cpp b/core/rend/gles/gltex.cpp index 43608200e..640de7e60 100644 --- a/core/rend/gles/gltex.cpp +++ b/core/rend/gles/gltex.cpp @@ -78,7 +78,7 @@ struct TextureCacheData PvrTexInfo* tex; TexConvFP* texconv; - bool dirty; + u32 dirty; vram_block* lock_block; u32 Lookups; @@ -128,7 +128,7 @@ struct TextureCacheData //Reset state info .. Lookups=0; Updates=0; - dirty=true; + dirty=FrameCount; lock_block=0; //decode info from tsp/tcw into the texture struct @@ -242,7 +242,7 @@ struct TextureCacheData { //texture state tracking stuff Updates++; - dirty=false; + dirty=0; GLuint textype=tex->type; @@ -419,6 +419,32 @@ GLuint GetTexture(TSP tsp,TCW tcw) return tf->texID; } +void CollectCleanup() { + vector list; + + u32 TargetFrame = max(120,FrameCount) - 120; + + for (TexCacheIter i=TexCache.begin();i!=TexCache.end();i++) + { + if ( i->second.dirty && i->second.dirty < TargetFrame) { + list.push_back(i->first); + } + + if (list.size() > 5) + break; + } + + for (size_t i=0; iuserdata; - tcd->dirty=true; + tcd->dirty=FrameCount; tcd->lock_block=0; libCore_vramlock_Unlock_block_wb(bl);