Merge "Fix WeakHandleBase::Reset()" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer.h
1 #ifndef DALI_INTERNAL_SCENE_GRAPH_RENDERER_H
2 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_H
3
4 /*
5  * Copyright (c) 2016 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 #include <dali/public-api/rendering/geometry.h>
21 #include <dali/public-api/rendering/renderer.h> // Dali::Renderer
22 #include <dali/internal/common/blending-options.h>
23 #include <dali/internal/common/type-abstraction-enums.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 #include <dali/internal/render/renderers/render-renderer.h>
30
31 namespace Dali
32 {
33 namespace Internal
34 {
35
36 namespace Render
37 {
38 class Renderer;
39 class Geometry;
40 }
41
42 namespace SceneGraph
43 {
44 class SceneController;
45
46 class Renderer;
47 typedef Dali::Vector< Renderer* > RendererContainer;
48 typedef RendererContainer::Iterator RendererIter;
49 typedef RendererContainer::ConstIterator RendererConstIter;
50
51 class TextureSet;
52 class Geometry;
53
54 class Renderer :  public PropertyOwner,
55                   public UniformMapDataProvider,
56                   public UniformMap::Observer,
57                   public ConnectionChangePropagator::Observer
58 {
59 public:
60
61   enum Opacity
62   {
63     OPAQUE,
64     TRANSPARENT,
65     TRANSLUCENT
66   };
67
68   /**
69    * Construct a new Renderer
70    */
71   static Renderer* New();
72
73   /**
74    * Destructor
75    */
76   virtual ~Renderer();
77
78   /**
79    * Overriden delete operator
80    * Deletes the renderer from its global memory pool
81    */
82   void operator delete( void* ptr );
83
84   /**
85    * Set the texture set for the renderer
86    * @param[in] textureSet The texture set this renderer will use
87    */
88   void SetTextures( TextureSet* textureSet );
89
90   /**
91    * Returns current texture set object
92    * @return Pointer to the texture set
93    */
94   const TextureSet* GetTextures() const
95   {
96     return mTextureSet;
97   }
98
99   /**
100    * Set the shader for the renderer
101    * @param[in] shader The shader this renderer will use
102    */
103   void SetShader( Shader* shader );
104
105   /**
106    * Get the shader used by this renderer
107    * @return the shader this renderer uses
108    */
109   const Shader& GetShader() const
110   {
111     return *mShader;
112   }
113
114   /**
115    * Set the geometry for the renderer
116    * @param[in] geometry The geometry this renderer will use
117    */
118   void SetGeometry( Render::Geometry* geometry );
119
120   /**
121    * Get the geometry of this renderer
122    * @return the geometry this renderer uses
123    */
124   const Render::Geometry& GetGeometry() const
125   {
126     return *mGeometry;
127   }
128
129   /**
130    * Set the depth index
131    * @param[in] depthIndex the new depth index to use
132    */
133   void SetDepthIndex( int depthIndex );
134
135   /**
136    * @brief Get the depth index
137    * @return The depth index
138    */
139   int GetDepthIndex() const
140   {
141     return mDepthIndex;
142   }
143
144   /**
145    * Set the face culling mode
146    * @param[in] faceCullingMode to use
147    */
148   void SetFaceCullingMode( FaceCullingMode::Type faceCullingMode );
149
150   /**
151    * Set the blending mode
152    * @param[in] blendingMode to use
153    */
154   void SetBlendMode( BlendMode::Type blendingMode );
155
156   /**
157    * Set the blending options. This should only be called from the update thread.
158    * @param[in] options A bitmask of blending options.
159    */
160   void SetBlendingOptions( unsigned int options );
161
162   /**
163    * Set the blend color for blending operation
164    * @param blendColor to pass to GL
165    */
166   void SetBlendColor( const Vector4& blendColor );
167
168   /**
169    * Set the index of first element for indexed draw
170    * @param[in] firstElement index of first element to draw
171    */
172   void SetIndexedDrawFirstElement( size_t firstElement );
173
174   /**
175    * Set the number of elements to draw by indexed draw
176    * @param[in] elementsCount number of elements to draw
177    */
178   void SetIndexedDrawElementsCount( size_t elementsCount );
179
180   /**
181    * @brief Set whether the Pre-multiplied Alpha Blending is required
182    * @param[in] preMultipled whether alpha is pre-multiplied.
183    */
184   void EnablePreMultipliedAlpha( bool preMultipled );
185
186   /**
187    * Sets the depth buffer write mode
188    * @param[in] depthWriteMode The depth buffer write mode
189    */
190   void SetDepthWriteMode( DepthWriteMode::Type depthWriteMode );
191
192   /**
193    * Sets the depth buffer test mode
194    * @param[in] depthTestMode The depth buffer test mode
195    */
196   void SetDepthTestMode( DepthTestMode::Type depthTestMode );
197
198   /**
199    * Sets the depth function
200    * @param[in] depthFunction The depth function
201    */
202   void SetDepthFunction( DepthFunction::Type depthFunction );
203
204   /**
205    * Sets the render mode
206    * @param[in] mode The render mode
207    */
208   void SetRenderMode( RenderMode::Type mode );
209
210   /**
211    * Sets the stencil function
212    * @param[in] stencilFunction The stencil function
213    */
214   void SetStencilFunction( StencilFunction::Type stencilFunction );
215
216   /**
217    * Sets the stencil function mask
218    * @param[in] stencilFunctionMask The stencil function mask
219    */
220   void SetStencilFunctionMask( int stencilFunctionMask );
221
222   /**
223    * Sets the stencil function reference
224    * @param[in] stencilFunctionReference The stencil function reference
225    */
226   void SetStencilFunctionReference( int stencilFunctionReference );
227
228   /**
229    * Sets the stencil mask
230    * @param[in] stencilMask The stencil mask
231    */
232   void SetStencilMask( int stencilMask );
233
234   /**
235    * Sets the stencil operation for when the stencil test fails
236    * @param[in] stencilOperationOnFail The stencil operation
237    */
238   void SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail );
239
240   /**
241    * Sets the stencil operation for when the depth test fails
242    * @param[in] stencilOperationOnZFail The stencil operation
243    */
244   void SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail );
245
246   /**
247    * Sets the stencil operation for when the depth test passes
248    * @param[in] stencilOperationOnZPass The stencil operation
249    */
250   void SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass );
251
252   /**
253    * Turns on batching feature for the renderer
254    * @param[in] batchingEnabled if true, enables the batching mode for the renderer
255    */
256   void SetBatchingEnabled( bool batchingEnabled );
257
258   /**
259    * Tests whether batching feature is enabled for this renderer
260    * @return batching state
261    */
262   bool IsBatchingEnabled() const
263   {
264     return mBatchingEnabled;
265   }
266
267   /**
268    * Prepare the object for rendering.
269    * This is called by the UpdateManager when an object is due to be rendered in the current frame.
270    * @param[in] updateBufferIndex The current update buffer index.
271    */
272   void PrepareRender( BufferIndex updateBufferIndex );
273
274   /*
275    * Retrieve the Render thread renderer
276    * @return The associated render thread renderer
277    */
278   Render::Renderer& GetRenderer();
279
280   /**
281    * Check whether the renderer has been marked as ready to render
282    * ready means that renderer has all resources and should produce correct result
283    * complete means all resources have finished loading
284    * It's possible that renderer is complete but not ready,
285    * for example in case of resource load failed
286    * @param[out] ready TRUE if the renderer has resources to render
287    * @param[out] complete TRUE if the renderer resources are complete
288    */
289   void GetReadyAndComplete( bool& ready, bool& complete ) const;
290
291   /**
292    * Query whether the renderer is fully opaque, fully transparent or transparent.
293    * @param[in] updateBufferIndex The current update buffer index.
294    * @return OPAQUE if fully opaque, TRANSPARENT if fully transparent and TRANSLUCENT if in between
295    */
296   Opacity GetOpacity( BufferIndex updateBufferIndex, const Node& node ) const;
297
298   /**
299    * Called by the TextureSet to notify to the renderer that it has changed
300    */
301   void TextureSetChanged();
302
303 public: // Implementation of ObjectOwnerContainer template methods
304   /**
305    * Connect the object to the scene graph
306    *
307    * @param[in] sceneController The scene controller - used for sending messages to render thread
308    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
309    */
310   void ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
311
312   /**
313    * Disconnect the object from the scene graph
314    * @param[in] sceneController The scene controller - used for sending messages to render thread
315    * @param[in] bufferIndex The current buffer index - used for sending messages to render thread
316    */
317   void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex );
318
319 public: // Implementation of ConnectionChangePropagator
320   /**
321    * @copydoc ConnectionChangePropagator::AddObserver
322    */
323   void AddConnectionObserver(ConnectionChangePropagator::Observer& observer){};
324
325   /**
326    * @copydoc ConnectionChangePropagator::RemoveObserver
327    */
328   void RemoveConnectionObserver(ConnectionChangePropagator::Observer& observer){};
329
330 public:
331
332
333 public: // UniformMap::Observer
334   /**
335    * @copydoc UniformMap::Observer::UniformMappingsChanged
336    */
337   virtual void UniformMappingsChanged( const UniformMap& mappings );
338
339 public: // ConnectionChangePropagator::Observer
340
341   /**
342    * @copydoc ConnectionChangePropagator::ConnectionsChanged
343    */
344   virtual void ConnectionsChanged( PropertyOwner& owner );
345
346   /**
347    * @copydoc ConnectionChangePropagator::ConnectedUniformMapChanged
348    */
349   virtual void ConnectedUniformMapChanged( );
350
351   /**
352    * @copydoc ConnectionChangePropagator::ConnectedUniformMapChanged
353    */
354   virtual void ObservedObjectDestroyed(PropertyOwner& owner);
355
356 public: // PropertyOwner implementation
357   /**
358    * @copydoc Dali::Internal::SceneGraph::PropertyOwner::ResetDefaultProperties()
359    */
360   virtual void ResetDefaultProperties( BufferIndex updateBufferIndex ){};
361
362 public: // From UniformMapDataProvider
363
364   /**
365    * @copydoc UniformMapDataProvider::GetUniformMapChanged
366    */
367   virtual bool GetUniformMapChanged( BufferIndex bufferIndex ) const{ return mUniformMapChanged[bufferIndex];}
368
369   /**
370    * @copydoc UniformMapDataProvider::GetUniformMap
371    */
372   virtual const CollectedUniformMap& GetUniformMap( BufferIndex bufferIndex ) const;
373
374 private:
375
376   /**
377    * Protected constructor; See also Renderer::New()
378    */
379   Renderer();
380
381   /**
382    * Helper function to create a new render data provider
383    * @return the new (initialized) data provider
384    */
385   RenderDataProvider* NewRenderDataProvider();
386
387 private:
388
389   CollectedUniformMap          mCollectedUniformMap[2];           ///< Uniform maps collected by the renderer
390   SceneController*             mSceneController;                  ///< Used for initializing renderers
391   Render::Renderer*            mRenderer;                         ///< Raw pointer to the renderer (that's owned by RenderManager)
392   TextureSet*                  mTextureSet;                       ///< The texture set this renderer uses. (Not owned)
393   Render::Geometry*            mGeometry;                         ///< The geometry this renderer uses. (Not owned)
394   Shader*                      mShader;                           ///< The shader this renderer uses. (Not owned)
395   Vector4*                     mBlendColor;                       ///< The blend color for blending operation
396
397   Render::Renderer::StencilParameters mStencilParameters;         ///< Struct containing all stencil related options
398
399   size_t                       mIndexedDrawFirstElement;          ///< first element index to be drawn using indexed draw
400   size_t                       mIndexedDrawElementsCount;         ///< number of elements to be drawn using indexed draw
401   unsigned int                 mBlendBitmask;                     ///< The bitmask of blending options
402   unsigned int                 mRegenerateUniformMap;             ///< 2 if the map should be regenerated, 1 if it should be copied.
403   unsigned int                 mResendFlag;                       ///< Indicate whether data should be resent to the renderer
404
405   DepthFunction::Type          mDepthFunction:3;                  ///< Local copy of the depth function
406   FaceCullingMode::Type        mFaceCullingMode:2;                ///< Local copy of the mode of face culling
407   BlendMode::Type              mBlendMode:2;                      ///< Local copy of the mode of blending
408   DepthWriteMode::Type         mDepthWriteMode:2;                 ///< Local copy of the depth write mode
409   DepthTestMode::Type          mDepthTestMode:2;                  ///< Local copy of the depth test mode
410
411   bool                         mUniformMapChanged[2];             ///< Records if the uniform map has been altered this frame
412   bool                         mResourcesReady;                   ///< Set during the Update algorithm; true if the renderer has resources ready for the current frame.
413   bool                         mFinishedResourceAcquisition;      ///< Set during DoPrepareResources; true if ready & all resource acquisition has finished (successfully or otherwise)
414   bool                         mPremultipledAlphaEnabled:1;       ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
415
416 public:
417
418   bool                         mBatchingEnabled : 1;              ///< Flag indicating whether the render supports batching
419   int                          mDepthIndex;                       ///< Used only in PrepareRenderInstructions
420 };
421
422
423 /// Messages
424 inline void SetTexturesMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const TextureSet& textureSet )
425 {
426   typedef MessageValue1< Renderer, TextureSet* > LocalType;
427
428   // Reserve some memory inside the message queue
429   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
430
431   // Construct message in the message queue memory; note that delete should not be called on the return value
432   new (slot) LocalType( &renderer, &Renderer::SetTextures, const_cast<TextureSet*>(&textureSet) );
433 }
434
435 inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Render::Geometry& geometry )
436 {
437   typedef MessageValue1< Renderer, Render::Geometry* > LocalType;
438
439   // Reserve some memory inside the message queue
440   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
441
442   // Construct message in the message queue memory; note that delete should not be called on the return value
443   new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast<Render::Geometry*>(&geometry) );
444 }
445
446 inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Shader& shader )
447 {
448   typedef MessageValue1< Renderer, Shader* > LocalType;
449
450   // Reserve some memory inside the message queue
451   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
452
453   // Construct message in the message queue memory; note that delete should not be called on the return value
454   new (slot) LocalType( &renderer, &Renderer::SetShader, &shader );
455 }
456
457 inline void SetDepthIndexMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, int depthIndex )
458 {
459   typedef MessageValue1< Renderer, int > LocalType;
460
461   // Reserve some memory inside the message queue
462   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
463
464   // Construct message in the message queue memory; note that delete should not be called on the return value
465   new (slot) LocalType( &renderer, &Renderer::SetDepthIndex, depthIndex );
466 }
467
468 inline void SetFaceCullingModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, FaceCullingMode::Type faceCullingMode )
469 {
470   typedef MessageValue1< Renderer, FaceCullingMode::Type > LocalType;
471
472   // Reserve some memory inside the message queue
473   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
474
475   new (slot) LocalType( &renderer, &Renderer::SetFaceCullingMode, faceCullingMode );
476 }
477
478 inline void SetBlendModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, BlendMode::Type blendingMode )
479 {
480   typedef MessageValue1< Renderer, BlendMode::Type > LocalType;
481
482   // Reserve some memory inside the message queue
483   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
484
485   new (slot) LocalType( &renderer, &Renderer::SetBlendMode, blendingMode );
486 }
487
488 inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, unsigned int options )
489 {
490   typedef MessageValue1< Renderer, unsigned int > LocalType;
491
492   // Reserve some memory inside the message queue
493   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
494
495   new (slot) LocalType( &renderer, &Renderer::SetBlendingOptions, options );
496 }
497
498 inline void SetBlendColorMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Vector4& blendColor )
499 {
500   typedef MessageValue1< Renderer, Vector4 > LocalType;
501
502   // Reserve some memory inside the message queue
503   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
504
505   new (slot) LocalType( &renderer, &Renderer::SetBlendColor, blendColor );
506 }
507
508 inline void SetIndexedDrawFirstElementMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t firstElement )
509 {
510   typedef MessageValue1< Renderer, size_t > LocalType;
511
512   // Reserve some memory inside the message queue
513   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
514
515   new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawFirstElement, firstElement );
516 }
517
518 inline void SetIndexedDrawElementsCountMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t elementsCount )
519 {
520   typedef MessageValue1< Renderer, size_t > LocalType;
521
522   // Reserve some memory inside the message queue
523   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
524
525   new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawElementsCount, elementsCount );
526 }
527
528 inline void SetEnablePreMultipliedAlphaMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, bool preMultiplied )
529 {
530   typedef MessageValue1< Renderer, bool > LocalType;
531
532   // Reserve some memory inside the message queue
533   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
534
535   new (slot) LocalType( &renderer, &Renderer::EnablePreMultipliedAlpha, preMultiplied );
536 }
537
538 inline void SetDepthWriteModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DepthWriteMode::Type depthWriteMode )
539 {
540   typedef MessageValue1< Renderer, DepthWriteMode::Type > LocalType;
541
542   // Reserve some memory inside the message queue
543   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
544
545   new (slot) LocalType( &renderer, &Renderer::SetDepthWriteMode, depthWriteMode );
546 }
547
548 inline void SetDepthTestModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DepthTestMode::Type depthTestMode )
549 {
550   typedef MessageValue1< Renderer, DepthTestMode::Type > LocalType;
551
552   // Reserve some memory inside the message queue
553   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
554
555   new (slot) LocalType( &renderer, &Renderer::SetDepthTestMode, depthTestMode );
556 }
557
558 inline void SetDepthFunctionMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DepthFunction::Type depthFunction )
559 {
560   typedef MessageValue1< Renderer, DepthFunction::Type > LocalType;
561
562   // Reserve some memory inside the message queue
563   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
564
565   new (slot) LocalType( &renderer, &Renderer::SetDepthFunction, depthFunction );
566 }
567
568 inline void SetRenderModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, RenderMode::Type mode )
569 {
570   typedef MessageValue1< Renderer, RenderMode::Type > LocalType;
571
572   // Reserve some memory inside the message queue
573   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
574
575   new (slot) LocalType( &renderer, &Renderer::SetRenderMode, mode );
576 }
577
578 inline void SetStencilFunctionMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, StencilFunction::Type stencilFunction )
579 {
580   typedef MessageValue1< Renderer, StencilFunction::Type > LocalType;
581
582   // Reserve some memory inside the message queue
583   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
584
585   new (slot) LocalType( &renderer, &Renderer::SetStencilFunction, stencilFunction );
586 }
587
588 inline void SetStencilFunctionMaskMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, int mask )
589 {
590   typedef MessageValue1< Renderer, int > LocalType;
591
592   // Reserve some memory inside the message queue
593   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
594
595   new (slot) LocalType( &renderer, &Renderer::SetStencilFunctionMask, mask );
596 }
597
598 inline void SetStencilFunctionReferenceMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilFunctionReference )
599 {
600   typedef MessageValue1< Renderer, int > LocalType;
601
602   // Reserve some memory inside the message queue
603   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
604
605   new (slot) LocalType( &renderer, &Renderer::SetStencilFunctionReference, stencilFunctionReference );
606 }
607
608 inline void SetStencilMaskMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, int stencilMask )
609 {
610   typedef MessageValue1< Renderer, int > LocalType;
611
612   // Reserve some memory inside the message queue
613   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
614
615   new (slot) LocalType( &renderer, &Renderer::SetStencilMask, stencilMask );
616 }
617
618 inline void SetStencilOperationOnFailMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation )
619 {
620   typedef MessageValue1< Renderer, StencilOperation::Type > LocalType;
621
622   // Reserve some memory inside the message queue
623   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
624
625   new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnFail, stencilOperation );
626 }
627
628 inline void SetStencilOperationOnZFailMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation )
629 {
630   typedef MessageValue1< Renderer, StencilOperation::Type > LocalType;
631
632   // Reserve some memory inside the message queue
633   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
634
635   new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnZFail, stencilOperation );
636 }
637
638 inline void SetStencilOperationOnZPassMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, StencilOperation::Type stencilOperation )
639 {
640   typedef MessageValue1< Renderer, StencilOperation::Type > LocalType;
641
642   // Reserve some memory inside the message queue
643   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
644
645   new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnZPass, stencilOperation );
646 }
647
648 inline void SetBatchingEnabledMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, bool batchable )
649 {
650   typedef MessageValue1< Renderer, bool > LocalType;
651
652   // Reserve some memory inside the message queue
653   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
654
655   new (slot) LocalType( &renderer, &Renderer::SetBatchingEnabled, batchable );
656 }
657
658 } // namespace SceneGraph
659 } // namespace Internal
660 } // namespace Dali
661
662 #endif //  DALI_INTERNAL_SCENE_GRAPH_RENDERER_H