From: Richard Huang Date: Tue, 9 Oct 2018 14:42:24 +0000 (+0100) Subject: Change RenderTaskList to behave like any other SceneGraph object X-Git-Tag: dali_1.3.47~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F41%2F190941%2F15;hp=6faed5800cc85bac847892524fe3eada264d1526;p=platform%2Fcore%2Fuifw%2Fdali-core.git Change RenderTaskList to behave like any other SceneGraph object Change-Id: Ide7b01c32aa7baa9243e8053d748219bfaaf6414 --- diff --git a/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp b/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp index 93630ed..800dea9 100644 --- a/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-HoverProcessing.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include using namespace Dali; @@ -1171,7 +1172,12 @@ int UtcDaliHoverSystemOverlayActor(void) TestApplication application; Dali::Integration::Core& core( application.GetCore() ); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // Create an actor and add it to the system overlay. Actor systemActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-LongPressGestureDetector.cpp b/automated-tests/src/dali/utc-Dali-LongPressGestureDetector.cpp index 2f2761f..908cb9b 100644 --- a/automated-tests/src/dali/utc-Dali-LongPressGestureDetector.cpp +++ b/automated-tests/src/dali/utc-Dali-LongPressGestureDetector.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -1269,7 +1270,12 @@ int UtcDaliLongPressGestureSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); @@ -1300,7 +1306,12 @@ int UtcDaliLongPressGestureBehindTouchableSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); @@ -1354,7 +1365,12 @@ int UtcDaliLongPressGestureTouchBehindGesturedSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-PanGestureDetector.cpp b/automated-tests/src/dali/utc-Dali-PanGestureDetector.cpp index 0767ab2..51a8532 100644 --- a/automated-tests/src/dali/utc-Dali-PanGestureDetector.cpp +++ b/automated-tests/src/dali/utc-Dali-PanGestureDetector.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -1608,7 +1609,12 @@ int UtcDaliPanGestureSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); @@ -1641,7 +1647,12 @@ int UtcDaliPanGestureBehindTouchableSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); @@ -1698,7 +1709,12 @@ int UtcDaliPanGestureTouchBehindGesturedSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-PinchGestureDetector.cpp b/automated-tests/src/dali/utc-Dali-PinchGestureDetector.cpp index 7d9358d..13ae5b5 100644 --- a/automated-tests/src/dali/utc-Dali-PinchGestureDetector.cpp +++ b/automated-tests/src/dali/utc-Dali-PinchGestureDetector.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -1189,7 +1190,12 @@ int UtcDaliPinchGestureSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); @@ -1222,7 +1228,12 @@ int UtcDaliPinchGestureBehindTouchableSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); @@ -1279,7 +1290,12 @@ int UtcDaliPinchGestureTouchBehindGesturedSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-TapGestureDetector.cpp b/automated-tests/src/dali/utc-Dali-TapGestureDetector.cpp index 05681a9..25b8e89 100644 --- a/automated-tests/src/dali/utc-Dali-TapGestureDetector.cpp +++ b/automated-tests/src/dali/utc-Dali-TapGestureDetector.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -1201,7 +1202,12 @@ int UtcDaliTapGestureSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); Actor actor = Actor::New(); actor.SetSize(100.0f, 100.0f); @@ -1233,7 +1239,12 @@ int UtcDaliTapGestureBehindTouchableSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); @@ -1288,7 +1299,12 @@ int UtcDaliTapGestureTouchBehindGesturedSystemOverlay(void) TestApplication application; Dali::Integration::Core& core = application.GetCore(); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // SystemOverlay actor Actor systemOverlayActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp b/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp index 99c9826..2d016be 100755 --- a/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-TouchDataProcessing.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include using namespace Dali; @@ -1404,7 +1405,12 @@ int UtcDaliTouchDataSystemOverlayActor(void) TestApplication application; Dali::Integration::Core& core( application.GetCore() ); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // Create an actor and add it to the system overlay. Actor systemActor = Actor::New(); diff --git a/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp b/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp index 6e48db1..79a73f3 100644 --- a/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp +++ b/automated-tests/src/dali/utc-Dali-TouchProcessing.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include using namespace Dali; @@ -1172,7 +1173,12 @@ int UtcDaliTouchSystemOverlayActor(void) TestApplication application; Dali::Integration::Core& core( application.GetCore() ); Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() ); - systemOverlay.GetOverlayRenderTasks().CreateTask(); + + Dali::RenderTaskList overlayRenderTaskList = Integration::RenderTaskList::New(); + Dali::Actor overlayRootActor = systemOverlay.GetDefaultRootActor(); + Dali::CameraActor overlayCameraActor = systemOverlay.GetDefaultCameraActor(); + Integration::RenderTaskList::CreateTask( overlayRenderTaskList, overlayRootActor, overlayCameraActor ); + systemOverlay.SetOverlayRenderTasks( overlayRenderTaskList ); // Create an actor and add it to the system overlay. Actor systemActor = Actor::New(); diff --git a/dali/integration-api/CMakeLists.txt b/dali/integration-api/CMakeLists.txt index 8beedf4..09f72ff 100644 --- a/dali/integration-api/CMakeLists.txt +++ b/dali/integration-api/CMakeLists.txt @@ -8,6 +8,7 @@ SET(SOURCES ${SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/input-options.cpp ${CMAKE_CURRENT_SOURCE_DIR}/system-overlay.cpp ${CMAKE_CURRENT_SOURCE_DIR}/lockless-buffer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/render-task-list-integ.cpp ${CMAKE_CURRENT_SOURCE_DIR}/events/event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/events/gesture-event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/events/hover-event-integ.cpp @@ -41,6 +42,7 @@ SET(INTEGRATION_API_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/platform-abstraction.h ${CMAKE_CURRENT_SOURCE_DIR}/system-overlay.h ${CMAKE_CURRENT_SOURCE_DIR}/lockless-buffer.h + ${CMAKE_CURRENT_SOURCE_DIR}/render-task-list-integ.h ${CMAKE_CURRENT_SOURCE_DIR}/events/event.h ${CMAKE_CURRENT_SOURCE_DIR}/events/gesture-event.h diff --git a/dali/integration-api/file.list b/dali/integration-api/file.list index 1931b6c..3534cab 100644 --- a/dali/integration-api/file.list +++ b/dali/integration-api/file.list @@ -9,6 +9,7 @@ platform_abstraction_src_files = \ $(platform_abstraction_src_dir)/input-options.cpp \ $(platform_abstraction_src_dir)/system-overlay.cpp \ $(platform_abstraction_src_dir)/lockless-buffer.cpp \ + $(platform_abstraction_src_dir)/render-task-list-integ.cpp \ $(platform_abstraction_src_dir)/events/event.cpp \ $(platform_abstraction_src_dir)/events/gesture-event.cpp \ $(platform_abstraction_src_dir)/events/hover-event-integ.cpp \ @@ -41,7 +42,8 @@ platform_abstraction_header_files = \ $(platform_abstraction_src_dir)/render-controller.h \ $(platform_abstraction_src_dir)/platform-abstraction.h \ $(platform_abstraction_src_dir)/system-overlay.h \ - $(platform_abstraction_src_dir)/lockless-buffer.h + $(platform_abstraction_src_dir)/lockless-buffer.h \ + $(platform_abstraction_src_dir)/render-task-list-integ.h platform_abstraction_events_header_files = \ $(platform_abstraction_src_dir)/events/event.h \ diff --git a/dali/integration-api/render-task-list-integ.cpp b/dali/integration-api/render-task-list-integ.cpp new file mode 100755 index 0000000..b37cdac --- /dev/null +++ b/dali/integration-api/render-task-list-integ.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include +#include +#include + +namespace Dali +{ + +namespace Integration +{ + +namespace RenderTaskList +{ + +Dali::RenderTaskList New() +{ + Dali::Internal::RenderTaskListPtr renderTaskList = Dali::Internal::RenderTaskList::New(); + return Dali::RenderTaskList( renderTaskList.Get() ); +} + +Dali::RenderTask CreateTask( Dali::RenderTaskList& taskList, Dali::Actor& sourceActor, Dali::CameraActor& cameraActor) +{ + return GetImplementation(taskList).CreateTask( &GetImplementation( sourceActor), &GetImplementation(cameraActor) ); +} + +} // namespace RenderTaskList + +} // namespace Integration + +} // namespace Dali diff --git a/dali/integration-api/render-task-list-integ.h b/dali/integration-api/render-task-list-integ.h new file mode 100755 index 0000000..3df930a --- /dev/null +++ b/dali/integration-api/render-task-list-integ.h @@ -0,0 +1,64 @@ +#ifndef __DALI_INTEGRATION_RENDER_TASK_LIST_H__ +#define __DALI_INTEGRATION_RENDER_TASK_LIST_H__ + +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// INTERNAL INCLUDES +#include + +namespace Dali +{ + +class Actor; +class CameraActor; + +namespace Integration +{ + +namespace RenderTaskList +{ + + /** + * @brief Helper function to create a new RenderTaskList object. + * + * A RenderTaskList is an ordered list of render tasks that describes + * how the Dali scene should be rendered. + * + * @return A handle to a newly allocated RenderTaskList + */ + DALI_CORE_API Dali::RenderTaskList New(); + + /** + * @brief Helper function to create a new RenderTask. + * + * The created task will be appended to the list of render-tasks. + * + * @param[in] taskList    The render task list containing all the render-tasks. + * @param[in] sourceActor The actor and its children to be rendered for this render task. + * @param[in] cameraActor The actor from which the scene is viewed for this render task. + * @return A valid handle to a new RenderTask + */ + DALI_CORE_API Dali::RenderTask CreateTask( Dali::RenderTaskList& taskList, Dali::Actor& sourceActor, Dali::CameraActor& cameraActor); + +} // namespace RenderTaskList + +} // namespace Integration + +} // namespace Dali + +#endif // __DALI_INTEGRATION_RENDER_TASK_LIST_H__ diff --git a/dali/integration-api/system-overlay.cpp b/dali/integration-api/system-overlay.cpp index a6ab5ad..6668762 100644 --- a/dali/integration-api/system-overlay.cpp +++ b/dali/integration-api/system-overlay.cpp @@ -20,9 +20,11 @@ // INTERNAL INCLUDES #include +#include #include #include #include +#include namespace Dali { @@ -45,11 +47,26 @@ void SystemOverlay::Remove( Actor actor ) mImpl->Remove( GetImplementation(actor) ); } +void SystemOverlay::SetOverlayRenderTasks(RenderTaskList& taskList) +{ + mImpl->SetOverlayRenderTasks( GetImplementation( taskList ) ); +} + RenderTaskList SystemOverlay::GetOverlayRenderTasks() { return RenderTaskList( &mImpl->GetOverlayRenderTasks() ); } +Actor SystemOverlay::GetDefaultRootActor() +{ + return Actor( &mImpl->GetDefaultRootActor() ); +} + +CameraActor SystemOverlay::GetDefaultCameraActor() +{ + return CameraActor( &mImpl->GetDefaultCameraActor() ); +} + SystemOverlay::SystemOverlay( Internal::SystemOverlay* impl ) : mImpl( impl ) { diff --git a/dali/integration-api/system-overlay.h b/dali/integration-api/system-overlay.h index 12f432e..f19cd6d 100644 --- a/dali/integration-api/system-overlay.h +++ b/dali/integration-api/system-overlay.h @@ -25,6 +25,7 @@ namespace Dali { class Actor; +class CameraActor; class RenderTaskList; namespace Internal @@ -65,13 +66,32 @@ public: void Remove( Actor actor ); /** + * Set the list of render-tasks for system-level overlays. + * This is a separate list, processed after the render-tasks provided by Stage::GetRenderTaskList(). + * @param[in] taskList The list of overlay render-tasks. + */ + void SetOverlayRenderTasks(RenderTaskList& taskList); + + /** * Retrieve the list of render-tasks for system-level overlays. - * This is a seperate list, processed after the render-tasks provided by Stage::GetRenderTaskList(). + * This is a separate list, processed after the render-tasks provided by Stage::GetRenderTaskList(). * @return The list of overlay render-tasks. */ RenderTaskList GetOverlayRenderTasks(); /** + * Retrieve the default SystemOverlay root actor. + * @note This is different to the root actor provided by Dali::Stage. + */ + Actor GetDefaultRootActor(); + + /** + * Retrieve the default SystemOverlay camera actor. + * @note This is different to the default camera actor provided by Dali::Stage. + */ + CameraActor GetDefaultCameraActor(); + + /** * Create the SystemOverlay entrance. * This is not intended for adaptor implementors; see also Dali::Integration::Core::GetSystemOverlay(). * @param[in] impl The SystemOverlay implementation. diff --git a/dali/internal/event/actors/layer-impl.cpp b/dali/internal/event/actors/layer-impl.cpp index 69e15b2..b790963 100644 --- a/dali/internal/event/actors/layer-impl.cpp +++ b/dali/internal/event/actors/layer-impl.cpp @@ -92,7 +92,7 @@ LayerPtr Layer::New() return layer; } -LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager, bool systemLevel ) +LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager ) { LayerPtr root( new Layer( Actor::ROOT_LAYER ) ); @@ -100,7 +100,7 @@ LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager, bool syst SceneGraph::Layer* rootLayer = static_cast( root->CreateNode() ); root->mNode = rootLayer; OwnerPointer< SceneGraph::Layer > transferOwnership( rootLayer ); - InstallRootMessage( manager, transferOwnership, systemLevel ); + InstallRootMessage( manager, transferOwnership ); // root actor is immediately considered to be on-stage root->mIsOnStage = true; @@ -110,6 +110,7 @@ LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager, bool syst // layer-list must be set for the root layer root->mLayerList = &layerList; + layerList.SetRootLayer( &(*root) ); layerList.RegisterLayer( *root ); return root; diff --git a/dali/internal/event/actors/layer-impl.h b/dali/internal/event/actors/layer-impl.h index c1f3b32..cf56615 100644 --- a/dali/internal/event/actors/layer-impl.h +++ b/dali/internal/event/actors/layer-impl.h @@ -70,10 +70,9 @@ public: * Create a new root layer; this is typically owned by the stage. * @param[in] layerList The layer will be added to this ordered list. * @param[in] manager The update manager to install a root node with. - * @param[in] systemLevel True if using the SystemOverlay API; see Integration::GetSystemOverlay() for more details. * @return A smart-pointer to the newly allocated Actor. */ - static LayerPtr NewRoot( LayerList& layerList, SceneGraph::UpdateManager& manager, bool systemLevel ); + static LayerPtr NewRoot( LayerList& layerList, SceneGraph::UpdateManager& manager ); /** * @copydoc Dali::Internal::Actor::OnInitialize diff --git a/dali/internal/event/actors/layer-list.cpp b/dali/internal/event/actors/layer-list.cpp index 37482d2..c78c1e9 100644 --- a/dali/internal/event/actors/layer-list.cpp +++ b/dali/internal/event/actors/layer-list.cpp @@ -60,9 +60,9 @@ template InputIterator Find( InputIterator first, InputIter } // unnamed namespace -LayerList* LayerList::New( SceneGraph::UpdateManager& updateManager, bool systemLevel ) +LayerList* LayerList::New( SceneGraph::UpdateManager& updateManager ) { - return new LayerList( updateManager, systemLevel ); + return new LayerList( updateManager ); } LayerList::~LayerList() @@ -234,9 +234,9 @@ void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target ) } } -LayerList::LayerList( SceneGraph::UpdateManager& updateManager, bool systemLevel ) +LayerList::LayerList( SceneGraph::UpdateManager& updateManager ) : mUpdateManager( updateManager ), - mIsSystemLevel( systemLevel ) + mRoot( NULL ) { } @@ -255,7 +255,14 @@ void LayerList::SetLayerDepths() } // Layers are being used in a separate thread; queue a message to set order - SetLayerDepthsMessage( mUpdateManager, layers, mIsSystemLevel ); + SetLayerDepthsMessage( mUpdateManager, layers, &( mRoot->GetSceneLayerOnStage() ) ); +} + +void LayerList::SetRootLayer(Layer* rootLayer) +{ + mRoot = rootLayer; + + SetLayerDepths(); } } // namespace Internal diff --git a/dali/internal/event/actors/layer-list.h b/dali/internal/event/actors/layer-list.h index 3f5dea2..c934682 100644 --- a/dali/internal/event/actors/layer-list.h +++ b/dali/internal/event/actors/layer-list.h @@ -50,9 +50,8 @@ public: /** * Create a new list of layers. * @param[in] updateManager A reference to the update manager. - * @param[in] systemLevel True if the layers are added via the SystemOverlay API. */ - static LayerList* New( SceneGraph::UpdateManager& updateManager, bool systemLevel ); + static LayerList* New( SceneGraph::UpdateManager& updateManager ); /** * Non-virtual destructor; not suitable as a base class. @@ -134,14 +133,20 @@ public: */ void MoveLayerBelow( const Layer& layer, const Layer& target ); + /** + * Sets the root layer that this layer list belongs to + * @pre the root layer is created + * @param rootLayer The root layer + */ + void SetRootLayer(Layer* rootLayer); + private: /** * Protected constructor; see also LayerList::New(). * @param[in] updateManager to send messages. - * @param[in] systemLevel True if the layers are added via the SystemOverlay API. */ - LayerList( SceneGraph::UpdateManager& updateManager, bool systemLevel ); + LayerList( SceneGraph::UpdateManager& updateManager ); /** * A private helper method to set the depth for each layer. @@ -154,7 +159,7 @@ private: SceneGraph::UpdateManager& mUpdateManager; - bool mIsSystemLevel; ///< True if the layers are added via the SystemOverlay API. + Layer* mRoot; ///< The root layer that this ordered list of layers belong to typedef std::vector LayerContainer; diff --git a/dali/internal/event/common/stage-impl.cpp b/dali/internal/event/common/stage-impl.cpp index 99a6683..2555276 100644 --- a/dali/internal/event/common/stage-impl.cpp +++ b/dali/internal/event/common/stage-impl.cpp @@ -102,10 +102,10 @@ void Stage::Initialize( bool renderToFbo ) mObjectRegistry = ObjectRegistry::New(); // Create the ordered list of layers - mLayerList = LayerList::New( mUpdateManager, false/*not system-level*/ ); + mLayerList = LayerList::New( mUpdateManager ); // The stage owns the default layer - mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager, false/*not system-level*/ ); + mRootLayer = Layer::NewRoot( *mLayerList, mUpdateManager ); mRootLayer->SetName("RootLayer"); // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE). // This stops actors parented to the stage having their relayout requests propagating @@ -116,10 +116,10 @@ void Stage::Initialize( bool renderToFbo ) CreateDefaultCameraActor(); // Create the list of render-tasks - mRenderTaskList = RenderTaskList::New( *this, *this, false/*not system-level*/ ); + mRenderTaskList = RenderTaskList::New(); // Create the default render-task - Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask(); + Dali::RenderTask defaultRenderTask = mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() ); } void Stage::Uninitialize() @@ -141,6 +141,11 @@ void Stage::Uninitialize() // signals or send messages to update mRootLayer.Reset(); } + + if( mRenderTaskList ) + { + mRenderTaskList.Reset(); + } } StagePtr Stage::GetCurrent() diff --git a/dali/internal/event/common/system-overlay-impl.cpp b/dali/internal/event/common/system-overlay-impl.cpp index 8003cbd..b071222 100644 --- a/dali/internal/event/common/system-overlay-impl.cpp +++ b/dali/internal/event/common/system-overlay-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,13 +66,13 @@ void SystemOverlay::Remove( Actor& actor ) } } -RenderTaskList& SystemOverlay::GetOverlayRenderTasks() +void SystemOverlay::SetOverlayRenderTasks(RenderTaskList& taskList) { - if ( !mOverlayRenderTaskList ) - { - mOverlayRenderTaskList = RenderTaskList::New( mEventThreadServices, *this, true/*system-overlay*/ ); - } + mOverlayRenderTaskList = &taskList; +} +RenderTaskList& SystemOverlay::GetOverlayRenderTasks() +{ return *mOverlayRenderTaskList; } @@ -119,7 +119,7 @@ SystemOverlay::SystemOverlay( EventThreadServices& eventThreadServices ) void SystemOverlay::Initialize() { // Create the ordered list of layers - mLayerList = LayerList::New( mEventThreadServices.GetUpdateManager(), true/*system layers*/ ); + mLayerList = LayerList::New( mEventThreadServices.GetUpdateManager() ); } void SystemOverlay::CreateRootLayer() @@ -127,7 +127,7 @@ void SystemOverlay::CreateRootLayer() // Lazy initialization; SystemOverlay may never be used if ( !mRootLayer ) { - mRootLayer = Layer::NewRoot( *mLayerList, mEventThreadServices.GetUpdateManager(), true/*system layer*/ ); + mRootLayer = Layer::NewRoot( *mLayerList, mEventThreadServices.GetUpdateManager() ); mRootLayer->SetName("SystemOverlayRoot"); mRootLayer->SetSize( mSize.width, mSize.height ); } diff --git a/dali/internal/event/common/system-overlay-impl.h b/dali/internal/event/common/system-overlay-impl.h index eeb9a54..8632014 100644 --- a/dali/internal/event/common/system-overlay-impl.h +++ b/dali/internal/event/common/system-overlay-impl.h @@ -65,6 +65,11 @@ public: void Remove( Actor& actor ); /** + * @copydoc Dali::Integration::SystemOverlay::SetOverlayRenderTasks() + */ + void SetOverlayRenderTasks(RenderTaskList& taskList); + + /** * @copydoc Dali::Integration::SystemOverlay::GetOverlayRenderTasks() */ RenderTaskList& GetOverlayRenderTasks(); diff --git a/dali/internal/event/render-tasks/render-task-impl.cpp b/dali/internal/event/render-tasks/render-task-impl.cpp index d907b8f..183d8eb 100644 --- a/dali/internal/event/render-tasks/render-task-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-impl.cpp @@ -71,9 +71,9 @@ SignalConnectorType signalConnector1( mType, SIGNAL_FINISHED, &RenderTask::DoCon } // Unnamed namespace -RenderTask* RenderTask::New( bool isSystemLevel ) +RenderTask* RenderTask::New() { - RenderTask* task( new RenderTask( isSystemLevel ) ); + RenderTask* task( new RenderTask() ); return task; } @@ -436,11 +436,6 @@ bool RenderTask::TranslateCoordinates( Vector2& screenCoords ) const return inside; } -bool RenderTask::IsSystemLevel() const -{ - return mIsSystemLevel; -} - bool RenderTask::WorldToViewport(const Vector3 &position, float& viewportX, float& viewportY) const { CameraActor* cam = GetCameraActor(); @@ -867,7 +862,7 @@ bool RenderTask::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface return connected; } -RenderTask::RenderTask( bool isSystemLevel ) +RenderTask::RenderTask() : mSceneObject( NULL ), mSourceConnector( Connector::SOURCE_CONNECTOR, *this ), mCameraConnector( Connector::CAMERA_CONNECTOR, *this ), @@ -882,7 +877,6 @@ RenderTask::RenderTask( bool isSystemLevel ) mInputEnabled( Dali::RenderTask::DEFAULT_INPUT_ENABLED ), mClearEnabled( Dali::RenderTask::DEFAULT_CLEAR_ENABLED ), mCullMode( Dali::RenderTask::DEFAULT_CULL_MODE ), - mIsSystemLevel( isSystemLevel ), mRequiresSync( false ) { DALI_LOG_INFO(gLogRender, Debug::General, "RenderTask::RenderTask(this:%p)\n", this); diff --git a/dali/internal/event/render-tasks/render-task-impl.h b/dali/internal/event/render-tasks/render-task-impl.h index 0038088..8b57800 100644 --- a/dali/internal/event/render-tasks/render-task-impl.h +++ b/dali/internal/event/render-tasks/render-task-impl.h @@ -49,9 +49,8 @@ public: /** * Creates a new RenderTask. - * @param[in] isSystemLevel Whether the render-task is on the system level task list. */ - static RenderTask* New( bool isSystemLevel ); + static RenderTask* New(); /** * @copydoc Dali::RenderTask::SetSourceActor() @@ -230,12 +229,6 @@ public: bool TranslateCoordinates( Vector2& screenCoords ) const; /** - * Query whether the RenderTask is on the system level render-task list. - * @return true, if on the system level task list, false otherwise. - */ - bool IsSystemLevel() const; - - /** * @copydoc Dali::RenderTask::WorldToViewport() */ bool WorldToViewport(const Vector3 &position, float& viewportX, float& viewportY) const; @@ -378,9 +371,8 @@ protected: /** * Construct a new RenderTask. - * @param[in] isSystemLevel Whether the RenderTask is on the system level task list. */ - RenderTask( bool isSystemLevel ); + RenderTask(); /** * A reference counted object may only be deleted by calling Unreference() @@ -484,7 +476,6 @@ private: bool mInputEnabled : 1; ///< True if the render-task should be considered for input handling. 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 diff --git a/dali/internal/event/render-tasks/render-task-list-impl.cpp b/dali/internal/event/render-tasks/render-task-list-impl.cpp index e20c147..3c4fe79 100644 --- a/dali/internal/event/render-tasks/render-task-list-impl.cpp +++ b/dali/internal/event/render-tasks/render-task-list-impl.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -43,18 +44,23 @@ namespace Dali namespace Internal { -RenderTaskList* RenderTaskList::New( EventThreadServices& eventServices, RenderTaskDefaults& defaults, bool systemLevel ) +RenderTaskListPtr RenderTaskList::New() { - RenderTaskList* taskList = new RenderTaskList( eventServices, defaults, systemLevel ); + RenderTaskListPtr taskList = new RenderTaskList(); - taskList->Initialize( eventServices.GetUpdateManager() ); + taskList->Initialize(); return taskList; } Dali::RenderTask RenderTaskList::CreateTask() { - RenderTask* taskImpl = RenderTask::New( mIsSystemLevel ); + return CreateTask( &mDefaults.GetDefaultRootActor(), &mDefaults.GetDefaultCameraActor() ); +} + +Dali::RenderTask RenderTaskList::CreateTask( Actor* sourceActor, CameraActor* cameraActor) +{ + RenderTask* taskImpl = RenderTask::New(); Dali::RenderTask newTask( taskImpl ); mTasks.push_back( newTask ); @@ -68,8 +74,8 @@ Dali::RenderTask RenderTaskList::CreateTask() } // Set the default source & camera actors - taskImpl->SetSourceActor( &mDefaults.GetDefaultRootActor() ); - taskImpl->SetCameraActor( &mDefaults.GetDefaultCameraActor() ); + taskImpl->SetSourceActor( sourceActor ); + taskImpl->SetCameraActor( cameraActor ); return newTask; } @@ -149,29 +155,53 @@ void RenderTaskList::SetExclusive( RenderTask* task, bool exclusive ) } } -RenderTaskList::RenderTaskList( EventThreadServices& eventThreadServices, RenderTaskDefaults& defaults, bool systemLevel ) -: mEventThreadServices( eventThreadServices ), - mDefaults( defaults ), - mIsSystemLevel( systemLevel ), +RenderTaskList::RenderTaskList() +: mEventThreadServices( *Stage::GetCurrent() ), + mDefaults( *Stage::GetCurrent() ), mSceneObject( NULL ) { } RenderTaskList::~RenderTaskList() { + if( EventThreadServices::IsCoreRunning() ) + { + DestroySceneObject(); + } } -void RenderTaskList::Initialize( UpdateManager& updateManager ) +void RenderTaskList::Initialize() { // This should only be called once, with no existing scene-object DALI_ASSERT_DEBUG( NULL == mSceneObject ); - // Get raw-pointer to render task list - mSceneObject = updateManager.GetRenderTaskList( mIsSystemLevel ); + CreateSceneObject(); + // set the callback to call us back when tasks are completed mSceneObject->SetCompleteNotificationInterface( this ); } +void RenderTaskList::CreateSceneObject() +{ + DALI_ASSERT_DEBUG( mSceneObject == NULL ); + + // Create a new render task list, Keep a const pointer to the render task list. + mSceneObject = SceneGraph::RenderTaskList::New(); + + OwnerPointer< SceneGraph::RenderTaskList > transferOwnership( const_cast< SceneGraph::RenderTaskList* >( mSceneObject ) ); + AddRenderTaskListMessage( mEventThreadServices.GetUpdateManager(), transferOwnership ); +} + +void RenderTaskList::DestroySceneObject() +{ + if ( mSceneObject != NULL ) + { + // Remove the render task list using a message to the update manager + RemoveRenderTaskListMessage( mEventThreadServices.GetUpdateManager(), *mSceneObject ); + mSceneObject = NULL; + } +} + void RenderTaskList::NotifyCompleted() { DALI_LOG_TRACE_METHOD(gLogRenderList); diff --git a/dali/internal/event/render-tasks/render-task-list-impl.h b/dali/internal/event/render-tasks/render-task-list-impl.h index 1cd8c03..6d351c2 100644 --- a/dali/internal/event/render-tasks/render-task-list-impl.h +++ b/dali/internal/event/render-tasks/render-task-list-impl.h @@ -34,6 +34,10 @@ namespace Internal class EventThreadServices; class RenderTaskDefaults; class Actor; +class CameraActor; + +class RenderTaskList; +typedef IntrusivePtr RenderTaskListPtr; namespace SceneGraph { @@ -59,12 +63,9 @@ public: /** * Create a RenderTaskList. - * @param[in] eventServices Used for sending message to the scene graph. - * @param[in] defaults Provides the default source & camera actors. - * @param[in] systemLevel True if this is the LayerList for actors added via the SystemLevel::Add(). * @return A newly allocated RenderTaskList; the caller takes ownership. */ - static RenderTaskList* New( EventThreadServices& eventServices, RenderTaskDefaults& defaults, bool systemLevel ); + static RenderTaskListPtr New(); /** * @copydoc Dali::RenderTaskList::CreateTask() @@ -72,6 +73,17 @@ public: Dali::RenderTask CreateTask(); /** + * @brief Creates a new RenderTask. + * + * This will be appended to the list of render-tasks. + * + * @param[in] sourceActor The actor and its children to be rendered for this render task. + * @param[in] cameraActor The actor from which the scene is viewed for this render task. + * @return A valid handle to a new RenderTask + */ + Dali::RenderTask CreateTask( Actor* sourceActor, CameraActor* cameraActor); + + /** * @copydoc Dali::RenderTaskList::RemoveTask() */ void RemoveTask( Dali::RenderTask task ); @@ -131,11 +143,8 @@ protected: /** * Construct a new RenderTaskList. - * @param[in] eventThreadServices Used for creating render-tasks in the scene graph. - * @param[in] defaults Provides the default source & camera actors. - * @param[in] systemLevel True if this is the system-level list. */ - RenderTaskList( EventThreadServices& eventThreadServices, RenderTaskDefaults& defaults, bool systemLevel ); + RenderTaskList(); /** * A reference counted object may only be deleted by calling Unreference() @@ -145,7 +154,17 @@ protected: /** * 2nd-phase construction */ - void Initialize( SceneGraph::UpdateManager& updateManager ); + void Initialize(); + + /** + * Helper to create a scene-graph render task list + */ + void CreateSceneObject(); + + /** + * Helper to destroy a scene-graph render task list + */ + void DestroySceneObject(); private: // from CompleteNotificationInterface @@ -159,8 +178,6 @@ private: EventThreadServices& mEventThreadServices; RenderTaskDefaults& mDefaults; - bool mIsSystemLevel; ///< True if the layers are added via the SystemLevel API - SceneGraph::RenderTaskList* mSceneObject; ///< Raw-pointer to the scene-graph object; not owned. RenderTaskContainer mTasks; ///< Reference counted render-tasks diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 7574d32..b913152 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -70,10 +70,13 @@ const uint32_t FRAME_COUNT_TRIGGER = 16;\ if( mImpl->frameCounter >= FRAME_COUNT_TRIGGER )\ {\ - if ( NULL != mImpl->root )\ + for( auto root : mImpl->roots ) {\ - mImpl->frameCounter = 0;\ - PrintNodeTree( *mImpl->root, mSceneGraphBuffers.GetUpdateBufferIndex(), "" );\ + if ( NULL != root )\ + {\ + mImpl->frameCounter = 0;\ + PrintNodeTree( *root, mSceneGraphBuffers.GetUpdateBufferIndex(), "" );\ + }\ }\ }\ mImpl->frameCounter++; @@ -187,10 +190,6 @@ struct UpdateManager::Impl renderInstructions( renderManager.GetRenderInstructionContainer() ), renderTaskProcessor( renderTaskProcessor ), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), - taskList( renderMessageDispatcher ), - systemLevelTaskList( renderMessageDispatcher ), - root( NULL ), - systemLevelRoot( NULL ), renderers(), textureSets(), shaders(), @@ -216,16 +215,13 @@ struct UpdateManager::Impl ~Impl() { // Disconnect render tasks from nodes, before destroying the nodes - RenderTaskList::RenderTaskContainer& tasks = taskList.GetTasks(); - for ( auto&& iter : tasks ) + for( auto taskList : taskLists ) { - iter->SetSourceNode( NULL ); - } - // ..repeat for system level RenderTasks - RenderTaskList::RenderTaskContainer& systemLevelTasks = systemLevelTaskList.GetTasks(); - for ( auto&& iter : systemLevelTasks ) - { - iter->SetSourceNode( NULL ); + RenderTaskList::RenderTaskContainer& tasks = taskList->GetTasks(); + for ( auto&& task : tasks ) + { + task->SetSourceNode( NULL ); + } } // UpdateManager owns the Nodes. Although Nodes are pool allocated they contain heap allocated parts @@ -238,21 +234,9 @@ struct UpdateManager::Impl Node::Delete(*iter); } - // If there is root, reset it, otherwise do nothing as rendering was never started - if( root ) + for( auto root : roots ) { root->OnDestroy(); - - Node::Delete( root ); - root = NULL; - } - - if( systemLevelRoot ) - { - systemLevelRoot->OnDestroy(); - - Node::Delete( systemLevelRoot ); - systemLevelRoot = NULL; } delete sceneController; @@ -287,16 +271,13 @@ struct UpdateManager::Impl Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame. - RenderTaskList taskList; ///< The list of scene graph render-tasks - RenderTaskList systemLevelTaskList; ///< Separate render-tasks for system-level content + OwnerContainer taskLists; ///< A container of scene graph render task lists - Layer* root; ///< The root node (root is a layer) - Layer* systemLevelRoot; ///< A separate root-node for system-level content + OwnerContainer roots; ///< A container of root nodes (root is a layer). The layers are not stored in the node memory pool. Vector nodes; ///< A container of all instantiated nodes - SortedLayerPointers sortedLayers; ///< A container of Layer pointers sorted by depth - SortedLayerPointers systemLevelSortedLayers; ///< A separate container of system-level Layers + std::vector sortedLayerLists; ///< A container of lists of Layer pointers sorted by depth (one list of sorted layers per root) OwnerContainer< Camera* > cameras; ///< A container of cameras OwnerContainer< PropertyOwner* > customObjects; ///< A container of owned objects (with custom properties) @@ -361,26 +342,18 @@ UpdateManager::~UpdateManager() delete mImpl; } -void UpdateManager::InstallRoot( OwnerPointer& layer, bool systemLevel ) +void UpdateManager::InstallRoot( OwnerPointer& layer ) { DALI_ASSERT_DEBUG( layer->IsLayer() ); DALI_ASSERT_DEBUG( layer->GetParent() == NULL); - if ( !systemLevel ) - { - DALI_ASSERT_DEBUG( mImpl->root == NULL && "Root Node already installed" ); - mImpl->root = layer.Release(); - mImpl->root->CreateTransform( &mImpl->transformManager ); - mImpl->root->SetRoot(true); - } - else - { - DALI_ASSERT_DEBUG( mImpl->systemLevelRoot == NULL && "System-level Root Node already installed" ); - mImpl->systemLevelRoot = layer.Release(); - mImpl->systemLevelRoot->CreateTransform( &mImpl->transformManager ); - mImpl->systemLevelRoot->SetRoot(true); - } + Layer* rootLayer = layer.Release(); + + DALI_ASSERT_DEBUG( std::find( mImpl->roots.begin(), mImpl->roots.end(), rootLayer ) == mImpl->roots.end() && "Root Node already installed" ); + rootLayer->CreateTransform( &mImpl->transformManager ); + rootLayer->SetRoot(true); + mImpl->roots.PushBack( rootLayer ); } void UpdateManager::AddNode( OwnerPointer& node ) @@ -474,6 +447,18 @@ void UpdateManager::RemoveObject( PropertyOwner* object ) mImpl->customObjects.EraseObject( object ); } +void UpdateManager::AddRenderTaskList( OwnerPointer& taskList ) +{ + RenderTaskList* taskListPointer = taskList.Release(); + taskListPointer->SetRenderMessageDispatcher( &mImpl->renderMessageDispatcher ); + mImpl->taskLists.PushBack( taskListPointer ); +} + +void UpdateManager::RemoveRenderTaskList( RenderTaskList* taskList ) +{ + mImpl->taskLists.EraseObject( taskList ); +} + void UpdateManager::AddAnimation( OwnerPointer< SceneGraph::Animation >& animation ) { mImpl->animations.PushBack( animation.Release() ); @@ -611,20 +596,6 @@ void UpdateManager::RemoveTextureSet( TextureSet* textureSet ) mImpl->textureSets.EraseObject( textureSet ); } -RenderTaskList* UpdateManager::GetRenderTaskList( bool systemLevel ) -{ - if ( !systemLevel ) - { - // copy the list, this is only likely to happen once in application life cycle - return &(mImpl->taskList); - } - else - { - // copy the list, this is only likely to happen once in application life cycle - return &(mImpl->systemLevelTaskList); - } -} - uint32_t* UpdateManager::ReserveMessageSlot( uint32_t size, bool updateScene ) { return mImpl->messageQueue.ReserveMessageSlot( size, updateScene ); @@ -737,18 +708,14 @@ void UpdateManager::ConstrainCustomObjects( BufferIndex bufferIndex ) void UpdateManager::ConstrainRenderTasks( BufferIndex bufferIndex ) { - // Constrain system-level render-tasks - const RenderTaskList::RenderTaskContainer& systemLevelTasks = mImpl->systemLevelTaskList.GetTasks(); - for ( auto&& task : systemLevelTasks ) - { - ConstrainPropertyOwner( *task, bufferIndex ); - } - // Constrain render-tasks - const RenderTaskList::RenderTaskContainer& tasks = mImpl->taskList.GetTasks(); - for ( auto&& task : tasks ) + for( auto taskList : mImpl->taskLists ) { - ConstrainPropertyOwner( *task, bufferIndex ); + RenderTaskList::RenderTaskContainer& tasks = taskList->GetTasks(); + for ( auto&& task : tasks ) + { + ConstrainPropertyOwner( *task, bufferIndex ); + } } } @@ -813,22 +780,13 @@ void UpdateManager::UpdateNodes( BufferIndex bufferIndex ) { mImpl->nodeDirtyFlags = NodePropertyFlags::NOTHING; - if ( !mImpl->root ) + for( auto&& rootLayer : mImpl->roots ) { - return; - } - - // Prepare resources, update shaders, for each node - // And add the renderers to the sorted layers. Start from root, which is also a layer - mImpl->nodeDirtyFlags = UpdateNodeTree( *( mImpl->root ), - bufferIndex, - mImpl->renderQueue ); - - if ( mImpl->systemLevelRoot ) - { - mImpl->nodeDirtyFlags |= UpdateNodeTree( *( mImpl->systemLevelRoot ), - bufferIndex, - mImpl->renderQueue ); + // Prepare resources, update shaders, for each node + // And add the renderers to the sorted layers. Start from root, which is also a layer + mImpl->nodeDirtyFlags |= UpdateNodeTree( *rootLayer, + bufferIndex, + mImpl->renderQueue ); } } @@ -882,14 +840,12 @@ uint32_t UpdateManager::Update( float elapsedSeconds, ConstrainCustomObjects( bufferIndex ); //Clear the lists of renderers from the previous update - for( auto&& layer : mImpl->sortedLayers ) + for( auto sortedLayers : mImpl->sortedLayerLists ) { - layer->ClearRenderables(); - } - - for( auto&& layer : mImpl->systemLevelSortedLayers ) - { - layer->ClearRenderables(); + for( auto&& layer : sortedLayers ) + { + layer->ClearRenderables(); + } } //Update node hierarchy, apply constraints and perform sorting / culling. @@ -925,25 +881,26 @@ uint32_t UpdateManager::Update( float elapsedSeconds, //reset the update buffer index and make sure there is enough room in the instruction container if( mImpl->renderersAdded ) { - mImpl->renderInstructions.ResetAndReserve( bufferIndex, mImpl->taskList.GetTaskCount() + mImpl->systemLevelTaskList.GetTaskCount() ); + // Calculate how many render tasks we have in total + VectorBase::SizeType numberOfRenderTasks = 0; + + const VectorBase::SizeType taskListCount = mImpl->taskLists.Count(); + for ( VectorBase::SizeType index = 0u; index < taskListCount; index++ ) + { + numberOfRenderTasks += mImpl->taskLists[index]->GetTasks().Count(); + } - if ( NULL != mImpl->root ) + mImpl->renderInstructions.ResetAndReserve( bufferIndex, + static_cast( numberOfRenderTasks ) ); + + for ( VectorBase::SizeType index = 0u; index < taskListCount; index++ ) { - mImpl->renderTaskProcessor.Process( bufferIndex, - mImpl->taskList, - *mImpl->root, - mImpl->sortedLayers, - mImpl->renderInstructions, - renderToFboEnabled, - isRenderingToFbo ); - - // Process the system-level RenderTasks last - if ( NULL != mImpl->systemLevelRoot ) + if ( NULL != mImpl->roots[index] ) { mImpl->renderTaskProcessor.Process( bufferIndex, - mImpl->systemLevelTaskList, - *mImpl->systemLevelRoot, - mImpl->systemLevelSortedLayers, + *mImpl->taskLists[index], + *mImpl->roots[index], + mImpl->sortedLayerLists[index], mImpl->renderInstructions, renderToFboEnabled, isRenderingToFbo ); @@ -952,31 +909,36 @@ uint32_t UpdateManager::Update( float elapsedSeconds, } } - // check the countdown and notify (note, at the moment this is only done for normal tasks, not for systemlevel tasks) - bool doRenderOnceNotify = false; - mImpl->renderTaskWaiting = false; - for ( auto&& renderTask : mImpl->taskList.GetTasks() ) + for( auto taskList : mImpl->taskLists ) { - renderTask->UpdateState(); + RenderTaskList::RenderTaskContainer& tasks = taskList->GetTasks(); - if( renderTask->IsWaitingToRender() && - renderTask->ReadyToRender( bufferIndex ) /*avoid updating forever when source actor is off-stage*/ ) + // check the countdown and notify + bool doRenderOnceNotify = false; + mImpl->renderTaskWaiting = false; + for ( auto&& renderTask : tasks ) { - mImpl->renderTaskWaiting = true; // keep update/render threads alive + renderTask->UpdateState(); + + if( renderTask->IsWaitingToRender() && + renderTask->ReadyToRender( bufferIndex ) /*avoid updating forever when source actor is off-stage*/ ) + { + mImpl->renderTaskWaiting = true; // keep update/render threads alive + } + + if( renderTask->HasRendered() ) + { + doRenderOnceNotify = true; + } } - if( renderTask->HasRendered() ) + if( doRenderOnceNotify ) { - doRenderOnceNotify = true; + DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); + mImpl->notificationManager.QueueCompleteNotification( taskList->GetCompleteNotificationInterface() ); } } - if( doRenderOnceNotify ) - { - DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Notify a render task has finished\n"); - mImpl->notificationManager.QueueCompleteNotification( mImpl->taskList.GetCompleteNotificationInterface() ); - } - // Macro is undefined in release build. SNAPSHOT_NODE_LOGGING; @@ -1066,16 +1028,22 @@ void UpdateManager::SetRenderingBehavior( DevelStage::Rendering renderingBehavio mImpl->renderingBehavior = renderingBehavior; } -void UpdateManager::SetLayerDepths( const SortedLayerPointers& layers, bool systemLevel ) +void UpdateManager::SetLayerDepths( const SortedLayerPointers& layers, const Layer* rootLayer ) { - if ( !systemLevel ) - { - // just copy the vector of pointers - mImpl->sortedLayers = layers; - } - else + const VectorBase::SizeType rootCount = mImpl->roots.Count(); + + // Make sure we reserve the correct size for the container so that + // we can save the sorted layers in the same order as the root layer + mImpl->sortedLayerLists.resize( rootCount ); + + for ( VectorBase::SizeType rootIndex = 0u; rootIndex < rootCount; rootIndex++ ) { - mImpl->systemLevelSortedLayers = layers; + Layer* root = mImpl->roots[rootIndex]; + if ( root == rootLayer ) + { + mImpl->sortedLayerLists[rootIndex] = layers; + break; + } } } @@ -1088,8 +1056,11 @@ void UpdateManager::SetDepthIndices( OwnerPointer< NodeDepths >& nodeDepths ) iter.node->SetDepthIndex( iter.sortedDepth ); } - // Go through node hierarchy and rearrange siblings according to depth-index - SortSiblingNodesRecursively( *( mImpl->root ) ); + for( auto root : mImpl->roots ) + { + // Go through node hierarchy and rearrange siblings according to depth-index + SortSiblingNodesRecursively( *root ); + } } bool UpdateManager::IsDefaultSurfaceRectChanged() diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index 401eb8b..c4b3904 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -38,6 +38,7 @@ #include // for OwnerPointer< TextureSet > #include #include +#include #include // for OwnerPointer< Shader > #include #include @@ -153,10 +154,9 @@ public: * @pre The layer is of derived Node type Layer. * @pre The layer does not have a parent. * @param[in] layer The new root node. - * @param[in] systemLevel True if using the system-level overlay. * @post The node is owned by UpdateManager. */ - void InstallRoot( OwnerPointer& layer, bool systemLevel ); + void InstallRoot( OwnerPointer& layer ); /** * Add a Node; UpdateManager takes ownership. @@ -216,6 +216,19 @@ public: */ void RemoveObject( PropertyOwner* object ); + /** + * Add a newly created render task list. + * @param[in] taskList The render task list to add. + * @post The render task list is owned by UpdateManager. + */ + void AddRenderTaskList( OwnerPointer& taskList ); + + /** + * Remove a render task list. + * @param[in] taskList The render task list to remove. + */ + void RemoveRenderTaskList( RenderTaskList* taskList ); + // Animations /** @@ -596,9 +609,9 @@ public: /** * Sets the depths of all layers. * @param layers The layers in depth order. - * @param[in] systemLevel True if using the system-level overlay. + * @param[in] rootLayer The root layer of the sorted layers. */ - void SetLayerDepths( const std::vector< Layer* >& layers, bool systemLevel ); + void SetLayerDepths( const std::vector< Layer* >& layers, const Layer* rootLayer ); /** * Set the depth indices of all nodes (in LayerUI's) @@ -715,16 +728,16 @@ private: // Messages for UpdateManager -inline void InstallRootMessage( UpdateManager& manager, OwnerPointer& root, bool systemLevel ) +inline void InstallRootMessage( UpdateManager& manager, OwnerPointer& root ) { // Message has ownership of Layer while in transit from event -> update - typedef MessageValue2< UpdateManager, OwnerPointer, bool > LocalType; + typedef MessageValue1< UpdateManager, OwnerPointer > LocalType; // Reserve some memory inside the message queue uint32_t* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::InstallRoot, root, systemLevel ); + new (slot) LocalType( &manager, &UpdateManager::InstallRoot, root ); } inline void AddNodeMessage( UpdateManager& manager, OwnerPointer& node ) @@ -867,6 +880,31 @@ inline void RemoveAnimationMessage( UpdateManager& manager, const Animation& con new (slot) LocalType( &manager, &UpdateManager::RemoveAnimation, &animation ); } +inline void AddRenderTaskListMessage( UpdateManager& manager, OwnerPointer< SceneGraph::RenderTaskList >& taskList ) +{ + typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::RenderTaskList > > LocalType; + + // Reserve some memory inside the message queue + uint32_t* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddRenderTaskList, taskList ); +} + +inline void RemoveRenderTaskListMessage( UpdateManager& manager, const RenderTaskList& constTaskList ) +{ + // The scene-graph thread owns this object so it can safely edit it. + RenderTaskList& taskList = const_cast< RenderTaskList& >( constTaskList ); + + typedef MessageValue1< UpdateManager, RenderTaskList* > LocalType; + + // Reserve some memory inside the message queue + uint32_t* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveRenderTaskList, &taskList ); +} + inline void AddPropertyNotificationMessage( UpdateManager& manager, OwnerPointer< PropertyNotification >& propertyNotification ) { // Message has ownership of PropertyNotification while in transit from event -> update @@ -995,17 +1033,17 @@ inline void SetRenderingBehaviorMessage( UpdateManager& manager, DevelStage::Ren * Create a message for setting the depth of a layer * @param[in] manager The update manager * @param[in] layers list of layers - * @param[in] systemLevel True if the layers are added via the SystemOverlay API + * @param[in] rootLayer True if the layers are added via the SystemOverlay API */ -inline void SetLayerDepthsMessage( UpdateManager& manager, const std::vector< Layer* >& layers, bool systemLevel ) +inline void SetLayerDepthsMessage( UpdateManager& manager, const std::vector< Layer* >& layers, const Layer* rootLayer ) { - typedef MessageValue2< UpdateManager, std::vector< Layer* >, bool > LocalType; + typedef MessageValue2< UpdateManager, std::vector< Layer* >, const Layer* > LocalType; // Reserve some memory inside the message queue uint32_t* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::SetLayerDepths, layers, systemLevel ); + new (slot) LocalType( &manager, &UpdateManager::SetLayerDepths, layers, rootLayer ); } inline void AddRendererMessage( UpdateManager& manager, OwnerPointer< Renderer >& object ) diff --git a/dali/internal/update/nodes/scene-graph-layer.h b/dali/internal/update/nodes/scene-graph-layer.h index 80ef912..7109694 100755 --- a/dali/internal/update/nodes/scene-graph-layer.h +++ b/dali/internal/update/nodes/scene-graph-layer.h @@ -83,6 +83,11 @@ public: static SceneGraph::Layer* New( uint32_t id ); /** + * Virtual destructor + */ + virtual ~Layer(); + + /** * From Node, to convert a node to a layer. * @return The layer. */ @@ -214,11 +219,6 @@ private: // Undefined Layer(const Layer&); - /** - * Virtual destructor - */ - virtual ~Layer(); - // Undefined Layer& operator=(const Layer& rhs); diff --git a/dali/internal/update/render-tasks/scene-graph-render-task-list.cpp b/dali/internal/update/render-tasks/scene-graph-render-task-list.cpp index 893eb6e..70665a9 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task-list.cpp +++ b/dali/internal/update/render-tasks/scene-graph-render-task-list.cpp @@ -19,7 +19,15 @@ #include // INTERNAL INCLUDES -#include +#include + +namespace //Unnamed namespace +{ + +//Memory pool used to allocate new RenderTaskLists. Memory used by this pool will be released when shutting down DALi +Dali::Internal::MemoryPoolObjectAllocator gRenderTaskListMemoryPool; + +} // unnamed namespace namespace Dali { @@ -30,9 +38,14 @@ namespace Internal namespace SceneGraph { -RenderTaskList::RenderTaskList( RenderMessageDispatcher& renderMessageDispatcher ) +RenderTaskList* RenderTaskList::New() +{ + return new ( gRenderTaskListMemoryPool.AllocateRawThreadSafe() ) RenderTaskList(); +} + +RenderTaskList::RenderTaskList() : mNotificationObject( NULL ), - mRenderMessageDispatcher( renderMessageDispatcher ) + mRenderMessageDispatcher( NULL ) { } @@ -40,11 +53,22 @@ RenderTaskList::~RenderTaskList() { } +void RenderTaskList::operator delete( void* ptr ) +{ + gRenderTaskListMemoryPool.FreeThreadSafe( static_cast( ptr ) ); +} + +void RenderTaskList::SetRenderMessageDispatcher( RenderMessageDispatcher* renderMessageDispatcher ) +{ + mRenderMessageDispatcher = renderMessageDispatcher; +} + void RenderTaskList::AddTask( OwnerPointer< RenderTask >& newTask ) { DALI_ASSERT_DEBUG( newTask != NULL && "SceneGraph RenderTask is null"); + DALI_ASSERT_DEBUG( mRenderMessageDispatcher != NULL && "RenderMessageDispatcher is null"); - newTask->Initialize( mRenderMessageDispatcher ); + newTask->Initialize( *mRenderMessageDispatcher ); // mRenderTasks container takes ownership mRenderTasks.PushBack( newTask.Release() ); } diff --git a/dali/internal/update/render-tasks/scene-graph-render-task-list.h b/dali/internal/update/render-tasks/scene-graph-render-task-list.h index ce8301f..116ccd3 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task-list.h +++ b/dali/internal/update/render-tasks/scene-graph-render-task-list.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace Dali { @@ -46,10 +47,10 @@ public: typedef OwnerContainer< RenderTask* > RenderTaskContainer; /** - * Constructor - * @param renderMessageDispatcher to send messages + * Construct a new RenderTaskList. + * @return A new RenderTaskList */ - RenderTaskList( RenderMessageDispatcher& renderMessageDispatcher ); + static RenderTaskList* New(); /** * Destructor @@ -57,6 +58,18 @@ public: ~RenderTaskList(); /** + * Overriden delete operator + * Deletes the RenderTaskList from its global memory pool + */ + void operator delete( void* ptr ); + + /** + * Set the renderMessageDispatcher to send message. + * @param[in] renderMessageDispatcher The renderMessageDispatcher to send messages. + */ + void SetRenderMessageDispatcher( RenderMessageDispatcher* renderMessageDispatcher ); + + /** * Add a new RenderTask to the list. * @param[in] newTask The RenderTaskList takes ownership of this task. */ @@ -97,6 +110,13 @@ public: */ CompleteNotificationInterface* GetCompleteNotificationInterface(); +protected: + + /** + * Protected constructor. See New() + */ + RenderTaskList(); + private: // Undefined @@ -108,7 +128,7 @@ private: private: CompleteNotificationInterface* mNotificationObject; ///< object to pass in to the complete notification - RenderMessageDispatcher& mRenderMessageDispatcher; ///< for sending messages to render thread + RenderMessageDispatcher* mRenderMessageDispatcher; ///< for sending messages to render thread RenderTaskContainer mRenderTasks; ///< A container of owned RenderTasks };