c8739676fb99ec87b0a735fa4701ff4d69753027
[platform/core/uifw/dali-core.git] / dali / internal / update / queue / update-message-queue.h
1 #ifndef __DALI_INTERNAL_UPDATE_MESSAGE_QUEUE_H__
2 #define __DALI_INTERNAL_UPDATE_MESSAGE_QUEUE_H__
3
4 /*
5  * Copyright (c) 2014 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
21 // INTERNAL INCLUDES
22 #include <dali/internal/common/buffer-index.h>
23 #include <dali/internal/update/common/scene-graph-buffers.h>
24
25 namespace Dali
26 {
27
28 namespace Integration
29 {
30 class RenderController;
31 }
32
33 namespace Internal
34 {
35 class MessageBase;
36
37 namespace SceneGraph
38 {
39 class SceneGraphBuffers;
40 }
41
42
43 namespace Update
44 {
45
46 /**
47  * Used by UpdateManager to receive messages from the event-thread.
48  */
49 class MessageQueue
50 {
51 public:
52
53   /**
54    * Create a new UpdateMessageQueue.
55    * @param[in] renderController After messages are flushed, we request a render from the RenderController.
56    * @param[in] sceneGraphBuffers Used to keep track of which buffers are being written or read.
57    */
58   MessageQueue( Integration::RenderController& renderController,
59                 const SceneGraph::SceneGraphBuffers& sceneGraphBuffers );
60
61   /**
62    * Destructor
63    */
64   ~MessageQueue();
65
66   /**
67    * Inform the queue that event processing has started
68    */
69   void EventProcessingStarted();
70
71   /**
72    * Reserve space for a message
73    * @param[in] size the message size with respect to the size of type 'char'
74    * @param[in] updateScene If set to true, denotes that the message will cause the scene graph node tree to require an update
75    * @return A pointer to the first char allocated for the message
76    */
77   unsigned int* ReserveMessageSlot( unsigned int size, bool updateScene );
78
79   /**
80    * Flushes the message queue
81    * @return true if there are messages to process
82    */
83   bool FlushQueue();
84
85   // Exclusive to UpdateManager
86
87   /**
88    * Called once per update; process the previously flushed messages.
89    * @param updateBufferIndex to use
90    */
91   void ProcessMessages( BufferIndex updateBufferIndex );
92
93   /**
94    * Query whether the queue was empty this frame.
95    */
96   bool WasEmpty() const;
97
98   /**
99    * Query whether the queue contains at least one message that requires that the scene-graph
100    * node tree be updated.
101    * @return A flag, true if the scene graph needs an update
102    */
103   bool IsSceneUpdateRequired() const;
104
105 private:
106
107   /**
108    * Helper to call Process and destructor on each queued message
109    * @param[in] minorQueue The queue to process.
110    */
111   void ProcessMinorQueue( char* minorQueue );
112
113 private:
114
115   // Not copyable:
116   MessageQueue ( const MessageQueue& rhs );
117   MessageQueue& operator=( const MessageQueue& rhs );
118
119 private:
120
121   struct Impl;
122   Impl* mImpl;
123 };
124
125 } // namespace Update
126
127 } // namespace Internal
128
129 } // namespace Dali
130
131 #endif // __DALI_INTERNAL_UPDATE_MESSAGE_QUEUE_H__