[NUI] Keep DRGLView delegate at least 1 frame rendering
authorEunki Hong <eunkiki.hong@samsung.com>
Fri, 4 Apr 2025 17:50:36 +0000 (02:50 +0900)
committerJaehyun Cho <jaehyun0cho@gmail.com>
Wed, 9 Apr 2025 02:09:46 +0000 (11:09 +0900)
Since DRGLView's rendering callback invoked at render thread,
we need to keep those delegate at least 1 frame until those
delegate will never be called at native side.

We have good internal class for this case, named `RenderThreadObjectHolder`.

Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
src/Tizen.NUI/src/public/BaseComponents/DirectRenderingGLView.cs

index 32b9c32485cfaa8361937de75c6a98ce8d2c7a8c..06ef287ecabbfd0515aa32320f6d3c9dd4d3484f 100644 (file)
@@ -291,6 +291,36 @@ namespace Tizen.NUI.BaseComponents
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
+        /// <summary>
+        /// you can override it to clean-up your own resources.
+        /// </summary>
+        /// <param name="type">DisposeTypes</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void Dispose(DisposeTypes type)
+        {
+            if (Disposed)
+            {
+                return;
+            }
+
+            if (type == DisposeTypes.Explicit)
+            {
+                //Called by User
+                //Release your own managed resources here.
+                //You should release all of your own disposable objects here.
+
+                // Keep delegate life ownership until next frame rendered.
+                RenderThreadObjectHolder.RegisterDelegate(glInitializeCallback);
+                RenderThreadObjectHolder.RegisterDelegate(glRenderFrameCallback);
+                RenderThreadObjectHolder.RegisterDelegate(glTerminateCallback);
+                RenderThreadObjectHolder.RegisterDelegate(internalRenderFrameCallback);
+
+                // DevNote : Do not make glRenderFrameCallback as null here, to avoid race condition or lock overhead.
+            }
+
+            base.Dispose(type);
+        }
+
         private int OnRenderFrame(global::System.IntPtr cPtr)
         {
             if (glRenderFrameCallback != null)