From f9b9b381c3ff9b28b15842fdaa98c2865b24d3de Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Fri, 11 Dec 2020 00:41:33 +0800 Subject: [PATCH 1/3] Fix texture is not released issue. If tbm_surface is not valid, we need release tbm_surface, when flutter engine acquire external texture. if tbm_surface is not released, the next frame cannot be rendered. --- shell/platform/tizen/external_texture_gl.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/platform/tizen/external_texture_gl.cc b/shell/platform/tizen/external_texture_gl.cc index 3f826d9c74cbb..2125b9404a263 100644 --- a/shell/platform/tizen/external_texture_gl.cc +++ b/shell/platform/tizen/external_texture_gl.cc @@ -72,6 +72,8 @@ bool ExternalTextureGL::PopulateTextureWithIdentifier( } if (!tbm_surface_internal_is_valid(texture_tbm_surface_)) { LoggerE("tbm_surface not valid"); + tbm_surface_internal_unref(texture_tbm_surface_); + texture_tbm_surface_ = NULL; mutex_.unlock(); return false; } From cfa376edebb495315c8d3798cb99b03c89b65dcf Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Fri, 11 Dec 2020 21:45:11 +0800 Subject: [PATCH 2/3] Reuse DestructionTbmSurface for destructing tbm_surface_ 1.replace std::mutex with std::recursive_metux. 2.change some log level to debug. 3.call DestructionTbmSurface fuction to desturct tbm_surface_. --- shell/platform/tizen/external_texture_gl.cc | 16 ++++++---------- shell/platform/tizen/external_texture_gl.h | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/shell/platform/tizen/external_texture_gl.cc b/shell/platform/tizen/external_texture_gl.cc index 2125b9404a263..dd34391b9d093 100644 --- a/shell/platform/tizen/external_texture_gl.cc +++ b/shell/platform/tizen/external_texture_gl.cc @@ -32,10 +32,7 @@ ExternalTextureGL::~ExternalTextureGL() { glDeleteTextures(1, &state_->gl_texture); } state_.release(); - if (texture_tbm_surface_) { - tbm_surface_internal_unref(texture_tbm_surface_); - texture_tbm_surface_ = NULL; - } + DestructionTbmSurface(); mutex_.unlock(); } @@ -47,12 +44,12 @@ bool ExternalTextureGL::OnFrameAvailable(tbm_surface_h tbm_surface) { return false; } if (texture_tbm_surface_) { - LoggerE("texture_tbm_surface_ does not destruction, discard"); + LoggerD("texture_tbm_surface_ does not destruction, discard"); mutex_.unlock(); return false; } if (!tbm_surface_internal_is_valid(tbm_surface)) { - LoggerE("tbm_surface not valid, pass"); + LoggerD("tbm_surface not valid, pass"); mutex_.unlock(); return false; } @@ -66,14 +63,13 @@ bool ExternalTextureGL::PopulateTextureWithIdentifier( size_t width, size_t height, FlutterOpenGLTexture* opengl_texture) { mutex_.lock(); if (!texture_tbm_surface_) { - LoggerE("texture_tbm_surface_ is NULL"); + LoggerD("texture_tbm_surface_ is NULL"); mutex_.unlock(); return false; } if (!tbm_surface_internal_is_valid(texture_tbm_surface_)) { - LoggerE("tbm_surface not valid"); - tbm_surface_internal_unref(texture_tbm_surface_); - texture_tbm_surface_ = NULL; + LoggerD("tbm_surface not valid"); + DestructionTbmSurface(); mutex_.unlock(); return false; } diff --git a/shell/platform/tizen/external_texture_gl.h b/shell/platform/tizen/external_texture_gl.h index 2defe2800b382..5673a2ecd23e3 100644 --- a/shell/platform/tizen/external_texture_gl.h +++ b/shell/platform/tizen/external_texture_gl.h @@ -46,7 +46,7 @@ class ExternalTextureGL { private: std::unique_ptr state_; - std::mutex mutex_; + std::recursive_mutex mutex_; tbm_surface_h texture_tbm_surface_; static void destructionCallback(void* user_data); const long texture_id_; From 40ea715879ef3bebc45e05705f6230cdfaff28f0 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Tue, 15 Dec 2020 02:13:03 +0800 Subject: [PATCH 3/3] Remove recursive mutex To avoid reentrantlock, add a new method without using lock code. --- shell/platform/tizen/external_texture_gl.cc | 11 +++++++---- shell/platform/tizen/external_texture_gl.h | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/shell/platform/tizen/external_texture_gl.cc b/shell/platform/tizen/external_texture_gl.cc index dd34391b9d093..a423220869d77 100644 --- a/shell/platform/tizen/external_texture_gl.cc +++ b/shell/platform/tizen/external_texture_gl.cc @@ -120,20 +120,23 @@ bool ExternalTextureGL::PopulateTextureWithIdentifier( return true; } -void ExternalTextureGL::DestructionTbmSurface() { +void ExternalTextureGL::DestructionTbmSurfaceWithLock() { mutex_.lock(); + DestructionTbmSurface(); + mutex_.unlock(); +} + +void ExternalTextureGL::DestructionTbmSurface() { if (!texture_tbm_surface_) { LoggerE("tbm_surface_h is NULL"); - mutex_.unlock(); return; } tbm_surface_internal_unref(texture_tbm_surface_); texture_tbm_surface_ = NULL; - mutex_.unlock(); } void ExternalTextureGL::destructionCallback(void* user_data) { ExternalTextureGL* externalTextureGL = reinterpret_cast(user_data); - externalTextureGL->DestructionTbmSurface(); + externalTextureGL->DestructionTbmSurfaceWithLock(); } diff --git a/shell/platform/tizen/external_texture_gl.h b/shell/platform/tizen/external_texture_gl.h index 5673a2ecd23e3..e6fb8d1ed222b 100644 --- a/shell/platform/tizen/external_texture_gl.h +++ b/shell/platform/tizen/external_texture_gl.h @@ -43,10 +43,11 @@ class ExternalTextureGL { FlutterOpenGLTexture* opengl_texture); bool OnFrameAvailable(tbm_surface_h tbm_surface); void DestructionTbmSurface(); + void DestructionTbmSurfaceWithLock(); private: std::unique_ptr state_; - std::recursive_mutex mutex_; + std::mutex mutex_; tbm_surface_h texture_tbm_surface_; static void destructionCallback(void* user_data); const long texture_id_;