Use CallbackBase in GlWindow's register gl callback function.
In addition, renderFrameCallback function's return value is changed.
It is for efficient rendering in render callback function.
Change-Id: I7b1210d3a0ff7f1e4b30f10ae1809924a9f867e5
}
// Internal callback function
-void glInit()
+void glInit(void)
{
}
-void glRenderFrame()
+int glRenderFrame(void)
{
+ static unsigned int retFlag = 0;
+ return retFlag++;
}
-void glTerminate()
+void glTerminate(void)
{
}
try
{
- window.RegisterGlCallback( glInit, glRenderFrame, glTerminate );
+ window.RegisterGlCallback( Dali::MakeCallback( glInit ), Dali::MakeCallback( glRenderFrame ), Dali::MakeCallback( glTerminate ) );
DALI_TEST_CHECK( false );
}
try
{
- window.RegisterGlCallback( glInit, glRenderFrame, glTerminate );
+ window.RegisterGlCallback( Dali::MakeCallback( glInit ), Dali::MakeCallback( glRenderFrame ), Dali::MakeCallback( glTerminate ) );
window.RenderOnce();
DALI_TEST_CHECK( false );
{
GetImplementation(*this).SetPreferredOrientation( orientation );
}
-void GlWindow::RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate )
+void GlWindow::RegisterGlCallback( CallbackBase* initCallback, CallbackBase* renderFrameCallback, CallbackBase* terminateCallback )
{
- GetImplementation(*this).RegisterGlCallback( glInit, glRenderFrame, glTerminate );
+ GetImplementation(*this).RegisterGlCallback( initCallback, renderFrameCallback, terminateCallback );
}
void GlWindow::RenderOnce()
{
}
}
-namespace
-{
-typedef void (*GlInitialize)();
-typedef void (*GlRenderFrame)();
-typedef void (*GlTerminate)();
-}
-
class TouchEvent;
class KeyEvent;
/**
* @brief Registers a GL callback function for application.
*
- * @param[in] glInit the callback function for application initialize
- * @param[in] glRenderFrame the callback function to render to the frame.
- * @param[in] glTerminate the callback function to clean-up application GL resource.
+ * @param[in] initCallback the callback function for application initialize
+ * @param[in] renderFrameCallback the callback function to render for the frame.
+ * @param[in] terminateCallback the callback function to clean-up application GL resource.
+ *
+ * @note Function must be called on idle time
+ *
+ * A initCallback of the following type should be used:
+ * @code
+ * void intializeGL();
+ * @endcode
+ * This callback will be called before renderFrame callback is called at once.
+ *
+ * A renderFrameCallback of the following type should be used:
+ * @code
+ * int renderFrameGL();
+ * @endcode
+ * This callback's return value is not 0, the eglSwapBuffers() will be called.
*
+ * A terminateCallback of the following type should be used:
+ * @code
+ * void terminateGL();
+ * @endcode
+ * This callback is called when GlWindow is deleted.
*/
- void RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate );
+ void RegisterGlCallback( CallbackBase* initCallback, CallbackBase* renderFrameCallback, CallbackBase* terminateCallback );
/**
* @brief Renders once more even if GL render functions are not added to idler.
mFocusChangeSignal(),
mResizeSignal(),
mVisibilityChangedSignal(),
- mGLInitCallback( 0 ),
- mGLRenderFrameCallback( 0 ),
- mGLTerminateCallback( 0 ),
+ mGLInitCallback(),
+ mGLRenderFrameCallback(),
+ mGLTerminateCallback(),
mGLRenderCallback( nullptr ),
mEGLSurface( nullptr ),
mEGLContext( nullptr ),
if( mGLTerminateCallback )
{
- mGLTerminateCallback();
+ CallbackBase::Execute(*mGLTerminateCallback);
}
if( mIsEGLInitialize )
}
}
-void GlWindow::RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate )
+void GlWindow::RegisterGlCallback( CallbackBase* initCallback, CallbackBase* renderFrameCallback, CallbackBase* terminateCallback )
{
if( mIsEGLInitialize == false )
{
InitializeGraphics();
}
- mGLInitCallback = glInit;
- mGLRenderFrameCallback = glRenderFrame;
- mGLTerminateCallback = glTerminate;
+ mGLInitCallback = std::unique_ptr< CallbackBase >(initCallback);
+ mGLRenderFrameCallback = std::unique_ptr< CallbackBase >( renderFrameCallback );
+ mGLTerminateCallback = std::unique_ptr< CallbackBase >( terminateCallback );
mInitCallback = false;
eglImpl.MakeContextCurrent( mEGLSurface, mEGLContext );
+ int renderFrameResult = 0;
+
if( mIsRotated )
{
mWindowBase->SetEglWindowBufferTransform( mTotalRotationAngle );
{
if( mGLInitCallback )
{
- mGLInitCallback();
+ CallbackBase::Execute(*mGLInitCallback);
}
mInitCallback = true;
}
if( mGLRenderFrameCallback )
{
- mGLRenderFrameCallback();
+ renderFrameResult = CallbackBase::ExecuteReturn<int>(*mGLRenderFrameCallback);
}
if( mIsWindowRotated )
mIsWindowRotated = false;
}
- eglImpl.SwapBuffers( mEGLSurface );
+ if(renderFrameResult)
+ {
+ eglImpl.SwapBuffers( mEGLSurface );
+ }
return true;
}
/**
* @copydoc Dali::GlWindow::RegisterGlCallback()
*/
- void RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate );
+ void RegisterGlCallback( CallbackBase* initCallback, CallbackBase* renderFrameCallback, CallbackBase* terminateCallback );
/**
* @copydoc Dali::GlWindow::RenderOnce()
VisibilityChangedSignalType mVisibilityChangedSignal;
// EGL, GL Resource
- GlInitialize mGLInitCallback;
- GlRenderFrame mGLRenderFrameCallback;
- GlTerminate mGLTerminateCallback;
+ std::unique_ptr< CallbackBase > mGLInitCallback;
+ std::unique_ptr< CallbackBase > mGLRenderFrameCallback;
+ std::unique_ptr< CallbackBase > mGLTerminateCallback;
CallbackBase* mGLRenderCallback;
EGLSurface mEGLSurface;
EGLContext mEGLContext;