newTask.SetExclusive( true );
newTask.SetRefreshRate( refreshRate );
newTask.SetTargetFrameBuffer( frameBufferImage );
+ newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, glSync );
return newTask;
}
newTask.SetExclusive( true );
newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
newTask.SetTargetFrameBuffer( frameBufferImage );
+ newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
bool finished = false;
RenderTaskFinished renderTaskFinished( finished );
newTask.SetExclusive( true );
newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
newTask.SetTargetFrameBuffer( frameBufferImage );
+ newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
// Framebuffer doesn't actually get created until Connected, i.e. by previous line
DALI_PROPERTY( "viewportPosition", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_POSITION )
DALI_PROPERTY( "viewportSize", VECTOR2, true, true, true, Dali::RenderTask::Property::VIEWPORT_SIZE )
DALI_PROPERTY( "clearColor", VECTOR4, true, true, true, Dali::RenderTask::Property::CLEAR_COLOR )
+DALI_PROPERTY( "requiresSync", BOOLEAN, true, false, false, Dali::RenderTask::Property::REQUIRES_SYNC )
DALI_PROPERTY_TABLE_END( DEFAULT_OBJECT_PROPERTY_START_INDEX )
// Signals
return mSceneObject->GetClearColor( GetEventThreadServices().GetEventBufferIndex() );
}
+void RenderTask::SetSyncRequired( bool requiresSync )
+{
+ if( mRequiresSync != requiresSync )
+ {
+ mRequiresSync = requiresSync;
+
+ if( mSceneObject )
+ {
+ // mSceneObject is being used in a separate thread; queue a message to set the value
+ SetSyncRequiredMessage( GetEventThreadServices(), *mSceneObject, requiresSync );
+ }
+ }
+}
+
+bool RenderTask::IsSyncRequired() const
+{
+ return mRequiresSync;
+}
+
void RenderTask::SetClearEnabled( bool enabled )
{
if ( mClearEnabled != enabled )
SetClearColor( property.Get<Vector4>() );
break;
}
+ case Dali::RenderTask::Property::REQUIRES_SYNC:
+ {
+ SetSyncRequired( property.Get<bool>() );
+ break;
+ }
default:
{
// nothing to do
value = GetClearColor();
break;
}
+ case Dali::RenderTask::Property::REQUIRES_SYNC:
+ {
+ value = IsSyncRequired();
+ break;
+ }
default:
{
break;
case Dali::RenderTask::Property::CLEAR_COLOR:
- property = &mSceneObject->mViewportSize;
+ property = &mSceneObject->mClearColor;
break;
default:
mInputEnabled( Dali::RenderTask::DEFAULT_INPUT_ENABLED ),
mClearEnabled( Dali::RenderTask::DEFAULT_CLEAR_ENABLED ),
mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ),
- mIsSystemLevel( isSystemLevel )
+ mIsSystemLevel( isSystemLevel ),
+ mRequiresSync( false )
{
DALI_LOG_INFO(gLogRender, Debug::General, "RenderTask::RenderTask(this:%p)\n", this);
}
const Vector4& GetClearColor() const;
/**
+ * Set whether whether GL sync is required for native render target.
+ * @param[in] requiresSync whether whether GL sync is required.
+ */
+ void SetSyncRequired( bool requiresSync );
+
+ /**
+ * Query whether the sync object is required for native render target.
+ * @return True if the sync object is required, false otherwise.
+ */
+ bool IsSyncRequired() const;
+
+ /**
* @copydoc Dali::RenderTask::SetClearEnabled()
*/
void SetClearEnabled( bool enabled );
bool mClearEnabled : 1; ///< True if the render-task should be clear the color buffer.
bool mCullMode : 1; ///< True if the render-task's actors should be culled
bool mIsSystemLevel : 1; ///< True if the render-task is on the system level task list.
+ bool mRequiresSync : 1; ///< True if the GL sync is required to track the render of
//Signals
Dali::RenderTask::RenderTaskSignalType mSignalFinished; ///< Signal emmited when the render task has been processed.
viewportSet ? &viewport : NULL,
mClearEnabled ? &GetClearColor( updateBufferIndex ) : NULL );
- if( mTargetIsNativeFramebuffer &&
+ if( mTargetIsNativeFramebuffer && mRequiresSync &&
mRefreshRate == Dali::RenderTask::REFRESH_ONCE &&
mResourcesFinished )
{
return mCameraNode;
}
+void RenderTask::SetSyncRequired( bool requiresSync )
+{
+ mRequiresSync = requiresSync;
+}
+
void RenderTask::ResetDefaultProperties( BufferIndex updateBufferIndex )
{
// Reset default properties
mRefreshRate( Dali::RenderTask::DEFAULT_REFRESH_RATE ),
mFrameCounter( 0u ),
mRenderedOnceCounter( 0u ),
- mTargetIsNativeFramebuffer( false )
+ mTargetIsNativeFramebuffer( false ),
+ mRequiresSync( false )
{
}
*/
Node* GetCamera() const;
+ /**
+ * Set whether GL sync is required for native render target.
+ * @param[in] whether GL sync is required for native render target
+ */
+ void SetSyncRequired( bool requiresSync );
+
private:
/**
unsigned int mRenderedOnceCounter; ///< Incremented whenever state changes to RENDERED_ONCE_AND_NOTIFIED
bool mTargetIsNativeFramebuffer; ///< Tells if our target is a native framebuffer
+ bool mRequiresSync; ///< Whether sync is needed to track the render
};
new (slot) LocalType( &task, &RenderTask::SetExclusive, exclusive );
}
+inline void SetSyncRequiredMessage(EventThreadServices& eventThreadServices, RenderTask& task, bool requiresSync )
+{
+ typedef MessageValue1< RenderTask, bool > LocalType;
+
+ // Reserve some memory inside the message queue
+ unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
+
+ // Construct message in the message queue memory; note that delete should not be called on the return value
+ new (slot) LocalType( &task, &RenderTask::SetSyncRequired, requiresSync );
+}
+
inline void BakeViewportPositionMessage( EventThreadServices& eventThreadServices, const RenderTask& task, const Vector2& value )
{
typedef MessageDoubleBuffered1< RenderTask, Vector2 > LocalType;
{
enum
{
- VIEWPORT_POSITION = DEFAULT_OBJECT_PROPERTY_START_INDEX, ///< name "viewportPosition", type Vector2 @SINCE_1_0.0
- VIEWPORT_SIZE, ///< name "viewportSize", type Vector2 @SINCE_1_0.0
- CLEAR_COLOR, ///< name "clearColor", type Vector4 @SINCE_1_0.0
+ /**
+ * @brief name "viewportPosition", type Vector2
+ * @SINCE_1_0.0
+ */
+ VIEWPORT_POSITION = DEFAULT_OBJECT_PROPERTY_START_INDEX,
+ /**
+ * @brief name "viewportSize", type Vector2
+ * @SINCE_1_0.0
+ */
+ VIEWPORT_SIZE,
+ /**
+ * @brief name "clearColor", type Vector4
+ * @SINCE_1_0.0
+ */
+ CLEAR_COLOR,
+ /**
+ * @brief name "requiresSync", type BOOLEAN
+ * @details By default, the sync object is not created.
+ * When native image source is used as render target, in order to track when the render to pixmap is completed, the GL sync should be enabled.
+ * Thus the RENDER_ONCE finished signal can be emit at the correct timing.
+ * @note The use of GL sync might cause deadlock with multiple access to the single pixmap happening in the same time.
+ * @SINCE_1_1.29
+ */
+ REQUIRES_SYNC,
};
};