[3.0] Stop calling destroy methods of texture and FrameBuffers on RenderManager destr... 32/119132/3
authorFerran Sole <ferran.sole@samsung.com>
Tue, 6 Dec 2016 09:33:51 +0000 (09:33 +0000)
committerNick Holland <nick.holland@partner.samsung.com>
Wed, 15 Mar 2017 15:41:39 +0000 (15:41 +0000)
Crashes because most OpenGL calls get the OpenGL context from
thread local storage. In this case, we're trying to delete
textures on the main thread which has no OpenGL context.

Cherry picked from devel/master branch
https://review.tizen.org/gerrit/#/c/102672/5

Removed destruction of texture and framebuffer resources since they
will be cleaned up automatically when the GL context is destroyed

Change-Id: I67e817a1f40c12b4c6730deb72eb742288575bf1

automated-tests/src/dali/utc-Dali-FrameBuffer.cpp
automated-tests/src/dali/utc-Dali-Texture.cpp
dali/internal/render/common/render-manager.cpp
dali/internal/render/renderers/render-frame-buffer.cpp
dali/internal/render/renderers/render-frame-buffer.h
dali/internal/render/renderers/render-texture.cpp
dali/internal/render/renderers/render-texture.h

index f0e295b..6278193 100644 (file)
@@ -312,3 +312,26 @@ int UtcDaliFrameBufferGetColorTexture02(void)
   END_TEST;
 }
 
+int UtcDaliFramebufferContextLoss(void)
+{
+  tet_infoline("UtcDaliFramebufferContextLoss\n");
+  TestApplication application; // Default config: DALI_DISCARDS_ALL_DATA
+
+  //Create the texture
+  unsigned int width(64);
+  unsigned int height(64);
+  Texture texture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height );
+  DALI_TEST_CHECK( texture );
+  FrameBuffer frameBuffer = FrameBuffer::New( width, height, FrameBuffer::Attachment::NONE );
+  DALI_TEST_CHECK( frameBuffer );
+  frameBuffer.AttachColorTexture( texture, 0u, 1u );
+
+  application.SendNotification();
+  application.Render(16);
+
+  // Lose & regain context (in render 'thread')
+  application.ResetContext();
+  DALI_TEST_CHECK( frameBuffer );
+
+  END_TEST;
+}
index 1eada6c..12fd9a7 100644 (file)
@@ -520,3 +520,23 @@ int UtcDaliTextureGetHeight(void)
   END_TEST;
 }
 
+int UtcDaliTextureContextLoss(void)
+{
+  tet_infoline("UtcDaliTextureContextLoss\n");
+  TestApplication application; // Default config: DALI_DISCARDS_ALL_DATA
+
+  //Create the texture
+  unsigned int width(64);
+  unsigned int height(64);
+  Texture texture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, width, height );
+  DALI_TEST_CHECK( texture );
+
+  application.SendNotification();
+  application.Render(16);
+
+  // Lose & regain context (in render 'thread')
+  application.ResetContext();
+  DALI_TEST_CHECK( texture );
+
+  END_TEST;
+}
index 96ab1ff..269cec0 100644 (file)
@@ -184,16 +184,6 @@ RenderManager::RenderManager()
 
 RenderManager::~RenderManager()
 {
-  for ( TextureOwnerIter iter = mImpl->textureContainer.Begin(); iter != mImpl->textureContainer.End(); ++iter )
-  {
-    (*iter)->Destroy( mImpl->context );
-  }
-
-  for ( FrameBufferOwnerIter iter = mImpl->frameBufferContainer.Begin(); iter != mImpl->frameBufferContainer.End(); ++iter )
-  {
-    (*iter)->Destroy( mImpl->context );
-  }
-
   delete mImpl;
 }
 
@@ -224,6 +214,18 @@ void RenderManager::ContextDestroyed()
   // inform texture cache
   mImpl->textureCache.GlContextDestroyed(); // Clears gl texture ids
 
+  //Inform textures
+  for( TextureOwnerIter iter = mImpl->textureContainer.Begin(); iter != mImpl->textureContainer.End(); ++iter )
+  {
+    (*iter)->GlContextDestroyed();
+  }
+
+  //Inform framebuffers
+  for( FrameBufferOwnerIter iter = mImpl->frameBufferContainer.Begin(); iter != mImpl->frameBufferContainer.End(); ++iter )
+  {
+    (*iter)->GlContextDestroyed();
+  }
+
   // inform renderers
   RendererOwnerContainer::Iterator end = mImpl->rendererContainer.End();
   RendererOwnerContainer::Iterator iter = mImpl->rendererContainer.Begin();
index b0cad27..2799893 100644 (file)
@@ -47,6 +47,11 @@ void FrameBuffer::Destroy( Context& context )
   }
 }
 
+void FrameBuffer::GlContextDestroyed()
+{
+  mId = 0u;
+}
+
 void FrameBuffer::Initialize(Context& context)
 {
   context.GenFramebuffers( 1, &mId );
index e27e072..9240c69 100644 (file)
@@ -62,6 +62,11 @@ public:
   void Destroy( Context& context );
 
   /**
+   * Called by RenderManager to inform the framebuffer that the context has been destroyed
+   */
+  void GlContextDestroyed();
+
+  /**
    * @brief Attach a texture for color rendering. Valid only for Framebuffers with COLOR attachments.
    * param[in] context The GL context
    * @param[in] texture The texture that will be used as output when rendering
index 8ca2647..4f26bb7 100644 (file)
@@ -633,6 +633,11 @@ void NewTexture::Destroy( Context& context )
   }
 }
 
+void NewTexture::GlContextDestroyed()
+{
+  mId = 0u;
+}
+
 void NewTexture::Initialize(Context& context)
 {
   if( mNativeImage )
index 8e3dc3d..74255cc 100644 (file)
@@ -134,6 +134,11 @@ public:
   void Destroy( Context& context );
 
   /**
+   * Called by RenderManager to inform the texture that the context has been destroyed
+   */
+  void GlContextDestroyed();
+
+  /**
    * Uploads data to the texture.
    * @param[in] context The GL context
    * @param[in] pixelData A pixel data object