[NUI] Fix blinking issue after resizing. 83/296083/4 accepted/tizen/7.0/unified/20230721.170108
authorYongGeol Jung <yg48.jung@samsung.com>
Wed, 19 Jul 2023 08:47:29 +0000 (01:47 -0700)
committerYongGeol Jung <yg48.jung@samsung.com>
Thu, 20 Jul 2023 02:13:50 +0000 (02:13 +0000)
Blinking issue was observed after resizing becasue newly created surface was not
finished compositing before delivering buffer to NUI App. Changed to ensure
completion of compositing by calling |glFinish|. And call |glClear| to fill
resized area using the background color.

Change-Id: I478aff1e1fc3850ac7c1bcbe91c76c9e8cb3b57f
Signed-off-by: YongGeol Jung <yg48.jung@samsung.com>
components/viz/service/display/gl_renderer.cc
components/viz/service/display/output_surface.h
tizen_src/chromium_impl/content/browser/compositor/evasgl_delegated_frame_host.cc
tizen_src/chromium_impl/content/browser/compositor/evasgl_output_surface.cc
tizen_src/chromium_impl/content/browser/compositor/evasgl_output_surface.h

index cb20bc0750d21e4440542f1e0fc9c75e9b724f30..0a9e92bd24382409a00e1fdfde6cb2afb024ca3f 100644 (file)
@@ -580,6 +580,10 @@ void GLRenderer::ClearFramebuffer() {
       clear_bits |= GL_STENCIL_BUFFER_BIT;
     gl_->Clear(clear_bits);
   }
+#if defined(TIZEN_TBM_SUPPORT)
+  else
+    output_surface_->ClearFramebufferIfNeeded();
+#endif`
 }
 
 void GLRenderer::BeginDrawingFrame() {
index 202d8fdcffde63ea4d7997ca51f760a75b50fea1..9dd901182e8aa1d7ff8179d6fd2897033283971c 100644 (file)
@@ -302,6 +302,9 @@ class VIZ_SERVICE_EXPORT OutputSurface {
           pending_receiver);
 
 #if defined(TIZEN_TBM_SUPPORT)
+  virtual void ClearFramebufferIfNeeded() {}
+  virtual void SetBackgroundColor(SkColor background_color) {}
+
   virtual void* RenderedOffscreenBuffer() { return nullptr; }
   virtual void CopySurface(
       unsigned char* dest, int x, int y, int width, int height) {}
index ed80554bc17b250b920f6913d7dddc3c0daf6f6b..e3ac81311bab32ce9226404632c147c35771d85f 100644 (file)
@@ -235,6 +235,11 @@ void EvasGLDelegatedFrameHost::RenderDelegatedFrame(const gfx::Rect& bounds) {
 
   client_->ClearBrowserFrame(background_color_);
 
+#if defined(TIZEN_TBM_SUPPORT)
+  if (client_->OffscreenRenderingEnabled())
+    output_surface_->SetBackgroundColor(background_color_);
+#endif
+
   display::DeviceDisplayInfoEfl display_info;
 
   viz::AggregatedRenderPassList render_pass_list;
index efc9ce7803f9c64ddd547ab40a494d6471917fa3..a4ebd59ef5724c8d795b0a6709160546eecc787b 100644 (file)
@@ -92,6 +92,8 @@ void EvasGLTBMBuffer::Create(int width, int height) {
   gl->GenTextures(1, &render_target_texture_);
   gl->BindTexture(GL_TEXTURE_2D, render_target_texture_);
   gl->ImageTargetTexture2DOES(image_);
+
+  swapped_before_ = false;
 }
 
 void EvasGLTBMBuffer::Destory() {
@@ -211,6 +213,20 @@ void EvasGLTBMOutputSurface::SwapBuffers(viz::OutputSurfaceFrame frame) {
   }
 }
 
+void EvasGLTBMOutputSurface::ClearFramebufferIfNeeded() {
+  auto gl = ContextGLEfl();
+  gl->ClearColor(
+      static_cast<float>(SkColorGetR(background_color_)) / 255.0f,
+      static_cast<float>(SkColorGetG(background_color_)) / 255.0f,
+      static_cast<float>(SkColorGetB(background_color_)) / 255.0f,
+      static_cast<float>(SkColorGetA(background_color_)) / 255.0f);
+  gl->Clear(GL_COLOR_BUFFER_BIT);
+}
+
+void EvasGLTBMOutputSurface::SetBackgroundColor(SkColor background_color) {
+  background_color_ = background_color;
+}
+
 void* EvasGLTBMOutputSurface::RenderedOffscreenBuffer() {
   return tbm_buffer_[rendered_buffer_].tbm_surface();
 }
index d542ebf7663e56a93ed6af609cd18268972dff4e..4ece78ba1475b79805b7dcd453149fe745cbdc09 100644 (file)
@@ -94,9 +94,13 @@ class CONTENT_EXPORT EvasGLTBMOutputSurface : public EvasGLOutputSurface {
                bool use_stencil) override;
   void SwapBuffers(viz::OutputSurfaceFrame frame) override;
 
-  void* RenderedOffscreenBuffer() override;
   gpu::gles2::GLES2ImplementationEfl* ContextGLEfl();
 
+  void ClearFramebufferIfNeeded() override;
+  void SetBackgroundColor(SkColor background_color) override;
+
+  void* RenderedOffscreenBuffer() override;
+
   void CopySurface(
       unsigned char* dest, int x, int y, int width, int height) override;
 
@@ -113,6 +117,8 @@ class CONTENT_EXPORT EvasGLTBMOutputSurface : public EvasGLOutputSurface {
   unsigned offscreen_framebuffer_id_;
   int current_buffer_;
   int rendered_buffer_;
+
+  SkColor background_color_ = SK_ColorTRANSPARENT;
 };
 #endif  // TIZEN_TBM_SUPPORT
 }  // namespace content