From: Eunki Hong Date: Fri, 4 Apr 2025 17:50:36 +0000 (+0900) Subject: [NUI] Keep DRGLView delegate at least 1 frame rendering X-Git-Tag: submit/tizen/20250409.021432~1^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c66c6a68dbddd1ecd16e07c9d59bbee00de4acb3;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [NUI] Keep DRGLView delegate at least 1 frame rendering 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 --- diff --git a/src/Tizen.NUI/src/public/BaseComponents/DirectRenderingGLView.cs b/src/Tizen.NUI/src/public/BaseComponents/DirectRenderingGLView.cs index 32b9c3248..06ef287ec 100644 --- a/src/Tizen.NUI/src/public/BaseComponents/DirectRenderingGLView.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/DirectRenderingGLView.cs @@ -291,6 +291,36 @@ namespace Tizen.NUI.BaseComponents if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve(); } + /// + /// you can override it to clean-up your own resources. + /// + /// DisposeTypes + [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)