Use modern construct 'using' instead of typedef.
[platform/core/uifw/dali-core.git] / dali / internal / update / common / scene-graph-scene.h
1 #ifndef DALI_INTERNAL_SCENE_GRAPH_SCENE_H
2 #define DALI_INTERNAL_SCENE_GRAPH_SCENE_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 // INTERNAL INCLUDES
21 #include <dali/integration-api/scene.h>
22 #include <dali/internal/common/message.h>
23 #include <dali/internal/event/common/event-thread-services.h>
24 #include <dali/internal/render/common/render-instruction-container.h>
25 #include <dali/public-api/common/vector-wrapper.h>
26
27 namespace Dali
28 {
29
30 namespace Internal
31 {
32
33 class Context;
34
35 namespace SceneGraph
36 {
37 class RenderInstructionContainer;
38
39 class Scene
40 {
41 public:
42
43   /**
44    * Constructor
45    * @param[in] surface The render surface
46    */
47   Scene();
48
49   /**
50    * Destructor
51    */
52   virtual ~Scene();
53
54   /**
55    * Creates a scene object in the GPU.
56    * @param[in] context The GL context
57    */
58   void Initialize( Context& context );
59
60   /**
61    * Gets the context holding the GL state of rendering for the scene
62    * @return the context
63    */
64   Context* GetContext();
65
66   /**
67    * Gets the render instructions for the scene
68    * @return the render instructions
69    */
70   RenderInstructionContainer& GetRenderInstructions();
71
72   /**
73    * @brief Adds a callback that is called when the frame rendering is done by the graphics driver.
74    *
75    * @param[in] callback The function to call
76    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
77    *
78    * @note A callback of the following type may be used:
79    * @code
80    *   void MyFunction( int frameId );
81    * @endcode
82    * This callback will be deleted once it is called.
83    *
84    * @note Ownership of the callback is passed onto this class.
85    */
86   void AddFrameRenderedCallback( CallbackBase* callback, int32_t frameId );
87
88   /**
89    * @brief Adds a callback that is called when the frame is displayed on the display.
90    *
91    * @param[in] callback The function to call
92    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
93    *
94    * @note A callback of the following type may be used:
95    * @code
96    *   void MyFunction( int frameId );
97    * @endcode
98    * This callback will be deleted once it is called.
99    *
100    * @note Ownership of the callback is passed onto this class.
101    */
102   void AddFramePresentedCallback( CallbackBase* callback, int32_t frameId );
103
104   /**
105    * @brief Gets the callback list that is called when the frame rendering is done by the graphics driver.
106    *
107    * @param[out] callbacks The callback list
108    */
109   void GetFrameRenderedCallback( Dali::Integration::Scene::FrameCallbackContainer& callbacks );
110
111   /**
112    * @brief Gets the callback list that is called when the frame is displayed on the display.
113    *
114    * @param[out] callbacks The callback list
115    */
116   void GetFramePresentedCallback( Dali::Integration::Scene::FrameCallbackContainer& callbacks );
117
118 private:
119
120   Context*                    mContext;   ///< The context holding the GL state of rendering for the scene, not owned
121
122   // Render instructions describe what should be rendered during RenderManager::RenderScene()
123   // Update manager updates instructions for the next frame while we render the current one
124
125   RenderInstructionContainer  mInstructions;   ///< Render instructions for the scene
126
127   Dali::Integration::Scene::FrameCallbackContainer mFrameRenderedCallbacks;   ///< Frame rendered callbacks
128   Dali::Integration::Scene::FrameCallbackContainer mFramePresentedCallbacks;  ///< Frame presented callbacks
129 };
130
131 /// Messages
132 inline void AddFrameRenderedCallbackMessage( EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId )
133 {
134   using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
135
136   // Reserve some memory inside the message queue
137   uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
138
139   // Construct message in the message queue memory; note that delete should not be called on the return value
140   new (slot) LocalType( &scene, &Scene::AddFrameRenderedCallback, const_cast< CallbackBase* >( callback ), frameId );
141 }
142
143 inline void AddFramePresentedCallbackMessage( EventThreadServices& eventThreadServices, const Scene& scene, const CallbackBase* callback, int32_t frameId )
144 {
145   using LocalType = MessageValue2<Scene, CallbackBase*, int32_t>;
146
147   // Reserve some memory inside the message queue
148   uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
149
150   // Construct message in the message queue memory; note that delete should not be called on the return value
151   new (slot) LocalType( &scene, &Scene::AddFramePresentedCallback, const_cast< CallbackBase* >( callback ), frameId );
152 }
153
154 } // namespace SceneGraph
155
156 } // namespace Internal
157
158 } // namespace Dali
159
160
161 #endif // DALI_INTERNAL_SCENE_GRAPH_SCENE_H