From a0b099df7c414af8e3d47646676dd84513b51958 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sun, 27 Dec 2020 08:58:48 +0100 Subject: [PATCH] gl: when loading custom textures, don't delete regular textures until after the current frame regular textures might be referenced by the current frame and deleting them cause gl errors Issue #144 --- core/rend/gl4/gles.cpp | 1 - core/rend/gles/gles.cpp | 3 +-- core/rend/gles/gles.h | 15 ++++++++++++++- core/rend/gles/gltex.cpp | 6 +----- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/core/rend/gl4/gles.cpp b/core/rend/gl4/gles.cpp index e1dcd1a13..46858b706 100644 --- a/core/rend/gl4/gles.cpp +++ b/core/rend/gl4/gles.cpp @@ -611,7 +611,6 @@ static void resize(int w, int h) static bool RenderFrame() { - DoCleanup(); create_modvol_shader(); const bool is_rtt = pvrrc.isRTT; diff --git a/core/rend/gles/gles.cpp b/core/rend/gles/gles.cpp index 2e24c2afa..297555a4b 100644 --- a/core/rend/gles/gles.cpp +++ b/core/rend/gles/gles.cpp @@ -1040,6 +1040,7 @@ bool ProcessFrame(TA_context* ctx) { if (KillTex) TexCache.Clear(); + TexCache.Cleanup(); if (ctx->rend.isRenderFramebuffer) { @@ -1050,7 +1051,6 @@ bool ProcessFrame(TA_context* ctx) if (!ta_parse_vdrc(ctx)) return false; } - TexCache.CollectCleanup(); return true; } @@ -1075,7 +1075,6 @@ static void upload_vertex_indices() bool RenderFrame() { - DoCleanup(); create_modvol_shader(); bool is_rtt = pvrrc.isRTT; diff --git a/core/rend/gles/gles.h b/core/rend/gles/gles.h index 2bec6cc95..a05ca6cbb 100755 --- a/core/rend/gles/gles.h +++ b/core/rend/gles/gles.h @@ -143,7 +143,6 @@ void SetupMatrices(float dc_width, float dc_height, float &ds2s_offs_x, glm::mat4& normal_mat, glm::mat4& scissor_mat); text_info raw_GetTexture(TSP tsp, TCW tcw); -void DoCleanup(); void SetCull(u32 CullMode); s32 SetTileClip(u32 val, GLint uniform); void SetMVS_Mode(ModifierVolumeMode mv_mode, ISP_Modvol ispc); @@ -228,6 +227,20 @@ public: class TextureCache final : public BaseTextureCache { +public: + void Cleanup() + { + if (!texturesToDelete.empty()) + { + glcache.DeleteTextures((GLsizei)texturesToDelete.size(), &texturesToDelete[0]); + texturesToDelete.clear(); + } + CollectCleanup(); + } + void DeleteLater(GLuint texId) { texturesToDelete.push_back(texId); } + +private: + std::vector texturesToDelete; }; extern TextureCache TexCache; diff --git a/core/rend/gles/gltex.cpp b/core/rend/gles/gltex.cpp index d44fb8f3c..584a878a8 100644 --- a/core/rend/gles/gltex.cpp +++ b/core/rend/gles/gltex.cpp @@ -321,7 +321,7 @@ u64 gl_GetTexture(TSP tsp, TCW tcw) { if (tf->IsCustomTextureAvailable()) { - glcache.DeleteTextures(1, &tf->texID); + TexCache.DeleteLater(tf->texID); tf->texID = glcache.GenTexture(); tf->CheckCustomTexture(); } @@ -340,10 +340,6 @@ u64 gl_GetTexture(TSP tsp, TCW tcw) return tf->texID; } -void DoCleanup() -{ -} - GLuint fbTextureId; void RenderFramebuffer()