9311b3fa49bff2f554a5a0f9319969e810e77ead
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer.h
1 #ifndef DALI_INTERNAL_SCENE_GRAPH_RENDERER2_H
2 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER2_H
3
4 /*
5  * Copyright (c) 2015 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 #include <dali/devel-api/rendering/geometry.h>
22 #include <dali/devel-api/rendering/renderer.h> // Dali::Renderer
23 #include <dali/internal/common/blending-options.h>
24 #include <dali/internal/event/common/event-thread-services.h>
25 #include <dali/internal/update/common/property-owner.h>
26 #include <dali/internal/update/common/uniform-map.h>
27 #include <dali/internal/update/common/scene-graph-connection-change-propagator.h>
28 #include <dali/internal/render/data-providers/render-data-provider.h>
29
30 namespace Dali
31 {
32 namespace Internal
33 {
34
35 namespace Render
36 {
37 class Renderer;
38 class Geometry;
39 }
40
41 namespace SceneGraph
42 {
43 class SceneController;
44
45 class Renderer;
46 typedef Dali::Vector< Renderer* > RendererContainer;
47 typedef RendererContainer::Iterator RendererIter;
48 typedef RendererContainer::ConstIterator RendererConstIter;
49
50 class TextureSet;
51 class Geometry;
52
53 class Renderer :  public PropertyOwner,
54                   public UniformMapDataProvider,
55                   public UniformMap::Observer,
56                   public ConnectionChangePropagator::Observer
57 {
58 public:
59
60   enum Opacity
61   {
62     OPAQUE,
63     TRANSPARENT,
64     TRANSLUCENT
65   };
66
67   /**
68    * Construct a new Renderer
69    */
70   static Renderer* New();
71
72   /**
73    * Destructor
74    */
75   virtual ~Renderer();
76
77   /**
78    * Overriden delete operator
79    * Deletes the renderer from its global memory pool
80    */
81   void operator delete( void* ptr );
82
83   /**
84    * Set the texture set for the renderer
85    * @param[in] textureSet The texture set this renderer will use
86    */
87   void SetTextures( TextureSet* textureSet );
88
89
90   /**
91    * Set the shader for the renderer
92    * @param[in] shader The shader this renderer will use
93    */
94   void SetShader( Shader* shader );
95
96   /**
97    * Get the shader used by this renderer
98    * @return the shader this renderer uses
99    */
100   Shader& GetShader()
101   {
102     return *mShader;
103   }
104
105   /**
106    * Set the geometry for the renderer
107    * @param[in] geometry The geometry this renderer will use
108    */
109   void SetGeometry( Render::Geometry* geometry );
110
111   /**
112    * Set the depth index
113    * @param[in] depthIndex the new depth index to use
114    */
115   void SetDepthIndex( int depthIndex );
116
117   /**
118    * @brief Get the depth index
119    * @return The depth index
120    */
121   int GetDepthIndex() const
122   {
123     return mDepthIndex;
124   }
125
126   /**
127    * Set the face culling mode
128    * @param[in] faceCullingMode to use
129    */
130   void SetFaceCullingMode( unsigned int faceCullingMode );
131
132   /**
133    * Set the blending mode
134    * @param[in] blendingMode to use
135    */
136   void SetBlendingMode( unsigned int blendingMode );
137
138   /**
139    * Set the blending options. This should only be called from the update thread.
140    * @param[in] options A bitmask of blending options.
141    */
142   void SetBlendingOptions( unsigned int options );
143
144   /**
145    * Set the blend color for blending operation
146    * @param blendColor to pass to GL
147    */
148   void SetBlendColor( const Vector4& blendColor );
149
150   /**
151    * Set the index of first element for indexed draw
152    * @param[in] firstElement index of first element to draw
153    */
154   void SetIndexedDrawFirstElement( size_t firstElement );
155
156   /**
157    * Set the number of elements to draw by indexed draw
158    * @param[in] elementsCount number of elements to draw
159    */
160   void SetIndexedDrawElementsCount( size_t elementsCount );
161
162   /**
163    * @brief Set whether the Pre-multiplied Alpha Blending is required
164    *
165    * @param[in] preMultipled whether alpha is pre-multiplied.
166    */
167   void EnablePreMultipliedAlpha( bool preMultipled );
168
169   /**
170    * Called when an actor with this renderer is added to the stage
171    */
172   void OnStageConnect();
173
174   /*
175    * Called when an actor with this renderer is removed from the stage
176    */
177   void OnStageDisconnect();
178
179   /**
180    * Prepare the object for rendering.
181    * This is called by the UpdateManager when an object is due to be rendered in the current frame.
182    * @param[in] updateBufferIndex The current update buffer index.
183    */
184   void PrepareRender( BufferIndex updateBufferIndex );
185
186   /*
187    * Retrieve the Render thread renderer
188    * @return The associated render thread renderer
189    */
190   Render::Renderer& GetRenderer();
191
192   /**
193    * Check whether the renderer has been marked as ready to render
194    * ready means that renderer has all resources and should produce correct result
195    * complete means all resources have finished loading
196    * It's possible that renderer is complete but not ready,
197    * for example in case of resource load failed
198    * @param[out] ready TRUE if the renderer has resources to render
199    * @param[out] complete TRUE if the renderer resources are complete
200    */
201   void GetReadyAndComplete( bool& ready, bool& complete ) const;
202
203   /**
204    * Query whether the renderer is fully opaque, fully transparent or transparent.
205    * @param[in] updateBufferIndex The current update buffer index.
206    * @return OPAQUE if fully opaque, TRANSPARENT if fully transparent and TRANSLUCENT if in between
207    */
208   Opacity GetOpacity( BufferIndex updateBufferIndex, const Node& node ) const;
209
210   /**
211    * Query whether the renderer is currently in use by an actor on the stage
212    */
213   bool IsReferenced() const
214   {
215     return mReferenceCount > 0;
216   }
217
218
219 public: // Implementation of ObjectOwnerContainer template methods
220   /**
221    * Connect the object to the scene graph
222    *
223    * @param[in] sceneController The scene controller - used for sending messages to render thread
224    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
225    */
226   void ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
227
228   /**
229    * Disconnect the object from the scene graph
230    * @param[in] sceneController The scene controller - used for sending messages to render thread
231    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
232    */
233   void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
234
235 public: // Implementation of ConnectionChangePropagator
236   /**
237    * @copydoc ConnectionChangePropagator::AddObserver
238    */
239   void AddConnectionObserver(ConnectionChangePropagator::Observer& observer){};
240
241   /**
242    * @copydoc ConnectionChangePropagator::RemoveObserver
243    */
244   void RemoveConnectionObserver(ConnectionChangePropagator::Observer& observer){};
245
246 public:
247
248
249 public: // UniformMap::Observer
250   /**
251    * @copydoc UniformMap::Observer::UniformMappingsChanged
252    */
253   virtual void UniformMappingsChanged( const UniformMap& mappings );
254
255 public: // ConnectionChangePropagator::Observer
256
257   /**
258    * @copydoc ConnectionChangePropagator::ConnectionsChanged
259    */
260   virtual void ConnectionsChanged( PropertyOwner& owner );
261
262   /**
263    * @copydoc ConnectionChangePropagator::ConnectedUniformMapChanged
264    */
265   virtual void ConnectedUniformMapChanged( );
266
267   /**
268    * @copydoc ConnectionChangePropagator::ConnectedUniformMapChanged
269    */
270   virtual void ObservedObjectDestroyed(PropertyOwner& owner);
271
272 public: // PropertyOwner implementation
273   /**
274    * @copydoc Dali::Internal::SceneGraph::PropertyOwner::ResetDefaultProperties()
275    */
276   virtual void ResetDefaultProperties( BufferIndex updateBufferIndex ){};
277
278 public: // From UniformMapDataProvider
279
280   /**
281    * @copydoc UniformMapDataProvider::GetUniformMapChanged
282    */
283   virtual bool GetUniformMapChanged( BufferIndex bufferIndex ) const{ return mUniformMapChanged[bufferIndex];}
284
285   /**
286    * @copydoc UniformMapDataProvider::GetUniformMap
287    */
288   virtual const CollectedUniformMap& GetUniformMap( BufferIndex bufferIndex ) const;
289
290 private:
291
292   /**
293    * Protected constructor; See also Renderer::New()
294    */
295   Renderer();
296
297   /**
298    * Helper function to create a new render data provider
299    * @return the new (initialized) data provider
300    */
301   RenderDataProvider* NewRenderDataProvider();
302
303 private:
304
305   SceneController*   mSceneController;  ///< Used for initializing renderers whilst attached
306   Render::Renderer*  mRenderer;    ///< Raw pointer to the renderer (that's owned by RenderManager)
307   TextureSet*        mTextureSet;    ///< The texture set this renderer uses. (Not owned)
308   Render::Geometry*  mGeometry;    ///< The geometry this renderer uses. (Not owned)
309   Shader*            mShader;
310
311   Vector4*                        mBlendColor;      ///< The blend color for blending operation
312   unsigned int                    mBlendBitmask;    ///< The bitmask of blending options
313   Dali::Renderer::FaceCullingMode mFaceCullingMode; ///< The mode of face culling
314   BlendingMode::Type              mBlendingMode;    ///< The mode of blending
315
316   CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer
317
318   size_t mIndexedDrawFirstElement;             ///< first element index to be drawn using indexed draw
319   size_t mIndexedDrawElementsCount;            ///< number of elements to be drawn using indexed draw
320   unsigned int mReferenceCount;                ///< Number of nodes currently using this renderer
321   unsigned int mRegenerateUniformMap;          ///< 2 if the map should be regenerated, 1 if it should be copied.
322   unsigned char mResendFlag;                    ///< Indicate whether data should be resent to the renderer
323   bool         mUniformMapChanged[2];          ///< Records if the uniform map has been altered this frame
324   bool         mResourcesReady;                ///< Set during the Update algorithm; true if the attachment has resources ready for the current frame.
325   bool         mFinishedResourceAcquisition;   ///< Set during DoPrepareResources; true if ready & all resource acquisition has finished (successfully or otherwise)
326   bool         mPremultipledAlphaEnabled;      ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
327
328 public:
329   int mDepthIndex; ///< Used only in PrepareRenderInstructions
330 };
331
332
333 /// Messages
334 inline void SetTexturesMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const TextureSet& textureSet )
335 {
336   typedef MessageValue1< Renderer, TextureSet* > LocalType;
337
338   // Reserve some memory inside the message queue
339   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
340
341   // Construct message in the message queue memory; note that delete should not be called on the return value
342   new (slot) LocalType( &renderer, &Renderer::SetTextures, const_cast<TextureSet*>(&textureSet) );
343 }
344
345 inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry )
346 {
347   typedef MessageValue1< Renderer, Render::Geometry* > LocalType;
348
349   // Reserve some memory inside the message queue
350   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
351
352   // Construct message in the message queue memory; note that delete should not be called on the return value
353   new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast<Render::Geometry*>(&geometry) );
354 }
355
356 inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Shader& shader )
357 {
358   typedef MessageValue1< Renderer, Shader* > LocalType;
359
360   // Reserve some memory inside the message queue
361   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
362
363   // Construct message in the message queue memory; note that delete should not be called on the return value
364   new (slot) LocalType( &renderer, &Renderer::SetShader, &shader );
365 }
366
367 inline void SetDepthIndexMessage( EventThreadServices& eventThreadServices, const Renderer& attachment, int depthIndex )
368 {
369   typedef MessageValue1< Renderer, int > LocalType;
370
371   // Reserve some memory inside the message queue
372   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
373
374   // Construct message in the message queue memory; note that delete should not be called on the return value
375   new (slot) LocalType( &attachment, &Renderer::SetDepthIndex, depthIndex );
376 }
377
378 inline void SetFaceCullingModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Dali::Renderer::FaceCullingMode faceCullingMode )
379 {
380   typedef MessageValue1< Renderer, unsigned int > LocalType;
381
382   // Reserve some memory inside the message queue
383   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
384
385   new (slot) LocalType( &renderer, &Renderer::SetFaceCullingMode, faceCullingMode );
386 }
387
388 inline void SetBlendingModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, BlendingMode::Type blendingMode )
389 {
390   typedef MessageValue1< Renderer, unsigned int > LocalType;
391
392   // Reserve some memory inside the message queue
393   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
394
395   new (slot) LocalType( &renderer, &Renderer::SetBlendingMode, blendingMode );
396 }
397
398 inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, unsigned int options )
399 {
400   typedef MessageValue1< Renderer, unsigned int > LocalType;
401
402   // Reserve some memory inside the message queue
403   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
404
405   new (slot) LocalType( &renderer, &Renderer::SetBlendingOptions, options );
406 }
407
408 inline void SetBlendColorMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Vector4& blendColor )
409 {
410   typedef MessageValue1< Renderer, Vector4 > LocalType;
411
412   // Reserve some memory inside the message queue
413   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
414
415   new (slot) LocalType( &renderer, &Renderer::SetBlendColor, blendColor );
416 }
417
418 inline void SetIndexedDrawFirstElementMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t firstElement )
419 {
420   typedef MessageValue1< Renderer, size_t > LocalType;
421
422   // Reserve some memory inside the message queue
423   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
424
425   new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawFirstElement, firstElement );
426 }
427
428 inline void SetIndexedDrawElementsCountMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t elementsCount )
429 {
430   typedef MessageValue1< Renderer, size_t > LocalType;
431
432   // Reserve some memory inside the message queue
433   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
434
435   new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawElementsCount, elementsCount );
436 }
437
438 inline void SetEnablePreMultipliedAlphaMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, bool preMultiplied )
439 {
440   typedef MessageValue1< Renderer, bool > LocalType;
441
442   // Reserve some memory inside the message queue
443   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
444
445   new (slot) LocalType( &renderer, &Renderer::EnablePreMultipliedAlpha, preMultiplied );
446 }
447
448 inline void OnStageConnectMessage( EventThreadServices& eventThreadServices, const Renderer& renderer )
449 {
450   typedef Message< Renderer > LocalType;
451
452   // Reserve some memory inside the message queue
453   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
454
455   // Construct message in the message queue memory; note that delete should not be called on the return value
456   new (slot) LocalType( &renderer, &Renderer::OnStageConnect );
457 }
458
459 inline void OnStageDisconnectMessage( EventThreadServices& eventThreadServices, const Renderer& renderer )
460 {
461   typedef Message< Renderer > LocalType;
462
463   // Reserve some memory inside the message queue
464   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
465
466   // Construct message in the message queue memory; note that delete should not be called on the return value
467   new (slot) LocalType( &renderer, &Renderer::OnStageDisconnect );
468 }
469
470 } // namespace SceneGraph
471 } // namespace Internal
472 } // namespace Dali
473
474 #endif //  DALI_INTERNAL_SCENE_GRAPH_RENDERER_H