#include <Ecore_Wayland.h>
#include <tbm_bufmgr.h>
#include <tbm_surface_queue.h>
+#include <tbm_surface_internal.h>
// INTERNAL INCLUDES
#include <trigger-event.h>
mColorDepth( isTransparent ? COLOR_DEPTH_32 : COLOR_DEPTH_24 ),
mTbmFormat( isTransparent ? TBM_FORMAT_ARGB8888 : TBM_FORMAT_RGB888 ),
mOwnSurface( false ),
+ mDrawableCompleted( false ),
mConsumeSurface( NULL ),
mThreadSynchronization( NULL )
{
ColorDepth mColorDepth;
tbm_format mTbmFormat;
bool mOwnSurface;
+ bool mDrawableCompleted;
tbm_surface_queue_h mTbmQueue;
tbm_surface_h mConsumeSurface;
// release the surface if we own one
if( mImpl->mOwnSurface )
{
- if( mImpl->mConsumeSurface )
- {
- tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
- mImpl->mConsumeSurface = NULL;
- }
+ ReleaseDrawable();
if( mImpl->mTbmQueue )
{
tbm_surface_h NativeRenderSurface::GetDrawable()
{
- ConditionalWait::ScopedLock lock( mImpl->mTbmSurfaceCondition );
-
return mImpl->mConsumeSurface;
}
{
DALI_LOG_TRACE_METHOD( gRenderSurfaceLogFilter );
- if( mImpl->mConsumeSurface )
- {
- tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
- mImpl->mConsumeSurface = NULL;
- }
-
- if( mImpl->mTbmQueue )
- {
- tbm_surface_queue_destroy( mImpl->mTbmQueue );
- }
-
- CreateNativeRenderable();
-
if( !mImpl->mTbmQueue )
{
return false;
}
}
+ tbm_surface_internal_ref( mImpl->mConsumeSurface );
+
+ if( replacingSurface )
+ {
+ ConditionalWait::ScopedLock lock( mImpl->mTbmSurfaceCondition );
+ mImpl->mDrawableCompleted = true;
+ mImpl->mTbmSurfaceCondition.Notify( lock );
+ }
+
// create damage for client applications which wish to know the update timing
- if( mImpl->mRenderNotification )
+ if( !replacingSurface && mImpl->mRenderNotification )
{
// use notification trigger
// Tell the event-thread to render the tbm_surface
}
// release the consumed surface after post render was completed
- if( mImpl->mConsumeSurface )
- {
- tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
- mImpl->mConsumeSurface = NULL;
- }
+ ReleaseDrawable();
}
void NativeRenderSurface::StopRender()
void NativeRenderSurface::CreateNativeRenderable()
{
// check we're creating one with a valid size
- DALI_ASSERT_ALWAYS( mImpl->mPosition.width > 0 && mImpl->mPosition.height > 0 && "Pixmap size is invalid" );
+ DALI_ASSERT_ALWAYS( mImpl->mPosition.width > 0 && mImpl->mPosition.height > 0 && "tbm_surface size is invalid" );
mImpl->mTbmQueue = tbm_surface_queue_create( 3, mImpl->mPosition.width, mImpl->mPosition.height, mImpl->mTbmFormat, TBM_BO_DEFAULT );
}
}
+void NativeRenderSurface::WaitDrawableAfterReplaceSurface()
+{
+ ConditionalWait::ScopedLock lock( mImpl->mTbmSurfaceCondition );
+ while( !mImpl->mDrawableCompleted )
+ {
+ mImpl->mTbmSurfaceCondition.Wait( lock );
+ }
+
+ mImpl->mDrawableCompleted = false;
+}
+
+void NativeRenderSurface::ReleaseDrawable()
+{
+ if( mImpl->mConsumeSurface )
+ {
+ tbm_surface_internal_unref( mImpl->mConsumeSurface );
+
+ if( tbm_surface_internal_is_valid( mImpl->mConsumeSurface ) )
+ {
+ tbm_surface_queue_release( mImpl->mTbmQueue, mImpl->mConsumeSurface );
+ }
+ mImpl->mConsumeSurface = NULL;
+ }
+}
+
} // namespace Dali