Merge "Allow multiple renderers per Actor and sharing renderers between actors" into...
[platform/core/uifw/dali-core.git] / dali / internal / update / controllers / render-message-dispatcher.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/update/controllers/render-message-dispatcher.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/render/common/render-manager.h>
23 #include <dali/internal/render/queue/render-queue.h>
24 #include <dali/internal/common/message.h>
25
26 namespace Dali
27 {
28
29 namespace Internal
30 {
31
32 namespace SceneGraph
33 {
34
35 RenderMessageDispatcher::RenderMessageDispatcher( RenderManager& renderManager, RenderQueue& renderQueue, const SceneGraphBuffers& buffers )
36 : mRenderManager( renderManager ),
37   mRenderQueue( renderQueue ),
38   mBuffers( buffers )
39 {
40 }
41
42 RenderMessageDispatcher::~RenderMessageDispatcher()
43 {
44 }
45
46 void RenderMessageDispatcher::AddRenderer( Render::Renderer& renderer )
47 {
48   typedef MessageValue1< RenderManager, Render::Renderer* > DerivedType;
49
50   // Reserve some memory inside the render queue
51   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
52
53   // Construct message in the render queue memory; note that delete should not be called on the return value
54   new (slot) DerivedType( &mRenderManager, &RenderManager::AddRenderer, &renderer );
55 }
56
57 void RenderMessageDispatcher::RemoveRenderer( Render::Renderer& renderer )
58 {
59   typedef MessageValue1< RenderManager, Render::Renderer* > DerivedType;
60
61   // Reserve some memory inside the render queue
62   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
63
64   // Construct message in the render queue memory; note that delete should not be called on the return value
65   new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveRenderer, &renderer );
66 }
67
68 void RenderMessageDispatcher::AddGeometry( RenderGeometry& renderGeometry )
69 {
70   typedef MessageValue1< RenderManager, RenderGeometry* > DerivedType;
71
72   // Reserve some memory inside the render queue
73   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
74
75   // Construct message in the render queue memory; note that delete should not be called on the return value
76   new (slot) DerivedType( &mRenderManager, &RenderManager::AddGeometry, &renderGeometry );
77 }
78
79 void RenderMessageDispatcher::RemoveGeometry( RenderGeometry& renderGeometry )
80 {
81   typedef MessageValue1< RenderManager, RenderGeometry* > DerivedType;
82
83   // Reserve some memory inside the render queue
84   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
85
86   // Construct message in the render queue memory; note that delete should not be called on the return value
87   new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveGeometry, &renderGeometry );
88 }
89
90 void RenderMessageDispatcher::AddPropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer, GpuBuffer::Target target, GpuBuffer::Usage usage )
91 {
92   typedef MessageValue4< RenderManager, RenderGeometry*, PropertyBufferDataProvider*, GpuBuffer::Target, GpuBuffer::Usage > DerivedType;
93
94   // Reserve some memory inside the render queue
95   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
96
97   // Construct message in the render queue memory; note that delete should not be called on the return value
98   new (slot) DerivedType( &mRenderManager, &RenderManager::AddPropertyBuffer, &renderGeometry, propertyBuffer, target, usage );
99 }
100
101 void RenderMessageDispatcher::RemovePropertyBuffer( RenderGeometry& renderGeometry, PropertyBufferDataProvider* propertyBuffer )
102 {
103   typedef MessageValue2< RenderManager, RenderGeometry*, PropertyBufferDataProvider* > DerivedType;
104
105   // Reserve some memory inside the render queue
106   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
107
108   // Construct message in the render queue memory; note that delete should not be called on the return value
109   new (slot) DerivedType( &mRenderManager, &RenderManager::RemovePropertyBuffer, &renderGeometry, propertyBuffer );
110 }
111
112 void RenderMessageDispatcher::AddRenderTracker( RenderTracker& renderTracker )
113 {
114   typedef MessageValue1< RenderManager, RenderTracker* > DerivedType;
115
116   // Reserve some memory inside the render queue
117   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
118
119   // Construct message in the render queue memory; note that delete should not be called on the return value
120   new (slot) DerivedType( &mRenderManager, &RenderManager::AddRenderTracker, &renderTracker );
121 }
122
123 void RenderMessageDispatcher::RemoveRenderTracker( RenderTracker& renderTracker )
124 {
125   typedef MessageValue1< RenderManager, RenderTracker* > DerivedType;
126
127   // Reserve some memory inside the render queue
128   unsigned int* slot = mRenderQueue.ReserveMessageSlot( mBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
129
130   // Construct message in the render queue memory; note that delete should not be called on the return value
131   new (slot) DerivedType( &mRenderManager, &RenderManager::RemoveRenderTracker, &renderTracker );
132 }
133
134 } // namespace SceneGraph
135
136 } // namespace Internal
137
138 } // namespace Dali