[dali_1.1.45] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-renderer.cpp
1 /*
2  * Copyright (c) 2016 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 // CLASS HEADER
18 #include "scene-graph-renderer.h"
19
20 // INTERNAL INCLUDES
21 #include <dali/internal/update/controllers/scene-controller.h>
22 #include <dali/internal/render/renderers/render-geometry.h>
23 #include <dali/internal/update/controllers/render-message-dispatcher.h>
24 #include <dali/internal/update/rendering/scene-graph-texture-set.h>
25 #include <dali/internal/render/shaders/scene-graph-shader.h>
26 #include <dali/internal/render/data-providers/node-data-provider.h>
27 #include <dali/internal/update/nodes/node.h>
28 #include <dali/internal/render/queue/render-queue.h>
29 #include <dali/internal/common/internal-constants.h>
30 #include <dali/internal/common/memory-pool-object-allocator.h>
31
32
33 namespace // unnamed namespace
34 {
35
36 const unsigned int UNIFORM_MAP_READY      = 0;
37 const unsigned int COPY_UNIFORM_MAP       = 1;
38 const unsigned int REGENERATE_UNIFORM_MAP = 2;
39
40 //Memory pool used to allocate new renderers. Memory used by this pool will be released when shutting down DALi
41 Dali::Internal::MemoryPoolObjectAllocator<Dali::Internal::SceneGraph::Renderer> gRendererMemoryPool;
42
43 void AddMappings( Dali::Internal::SceneGraph::CollectedUniformMap& localMap, const Dali::Internal::SceneGraph::UniformMap& uniformMap )
44 {
45   // Iterate thru uniformMap.
46   //   Any maps that aren't in localMap should be added in a single step
47   Dali::Internal::SceneGraph::CollectedUniformMap newUniformMappings;
48
49   for( unsigned int i=0, count=uniformMap.Count(); i<count; ++i )
50   {
51     Dali::Internal::SceneGraph::UniformPropertyMapping::Hash nameHash = uniformMap[i].uniformNameHash;
52     bool found = false;
53
54     for( Dali::Internal::SceneGraph::CollectedUniformMap::Iterator iter = localMap.Begin() ; iter != localMap.End() ; ++iter )
55     {
56       const Dali::Internal::SceneGraph::UniformPropertyMapping* map = (*iter);
57       if( map->uniformNameHash == nameHash )
58       {
59         if( map->uniformName == uniformMap[i].uniformName )
60         {
61           found = true;
62           break;
63         }
64       }
65     }
66     if( !found )
67     {
68       // it's a new mapping. Add raw ptr to temporary list
69       newUniformMappings.PushBack( &uniformMap[i] );
70     }
71   }
72
73   if( newUniformMappings.Count() > 0 )
74   {
75     localMap.Reserve( localMap.Count() + newUniformMappings.Count() );
76
77     for( Dali::Internal::SceneGraph::CollectedUniformMap::Iterator iter = newUniformMappings.Begin(),
78            end = newUniformMappings.End() ;
79          iter != end ;
80          ++iter )
81     {
82       const Dali::Internal::SceneGraph::UniformPropertyMapping* map = (*iter);
83       localMap.PushBack( map );
84     }
85   }
86 }
87
88 // Flags for re-sending data to renderer.
89 enum Flags
90 {
91   RESEND_DATA_PROVIDER               = 1 << 0,
92   RESEND_GEOMETRY                    = 1 << 1,
93   RESEND_FACE_CULLING_MODE           = 1 << 2,
94   RESEND_BLEND_COLOR                 = 1 << 3,
95   RESEND_BLEND_BIT_MASK              = 1 << 4,
96   RESEND_PREMULTIPLIED_ALPHA         = 1 << 5,
97   RESEND_INDEXED_DRAW_FIRST_ELEMENT  = 1 << 6,
98   RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 7,
99   RESEND_DEPTH_WRITE_MODE            = 1 << 8,
100   RESEND_DEPTH_TEST_MODE             = 1 << 9,
101   RESEND_DEPTH_FUNCTION              = 1 << 10,
102   RESEND_STENCIL_MODE                = 1 << 11,
103   RESEND_STENCIL_FUNCTION            = 1 << 12,
104   RESEND_STENCIL_FUNCTION_MASK       = 1 << 13,
105   RESEND_STENCIL_FUNCTION_REFERENCE  = 1 << 14,
106   RESEND_STENCIL_MASK                = 1 << 15,
107   RESEND_STENCIL_OPERATION_ON_FAIL   = 1 << 16,
108   RESEND_STENCIL_OPERATION_ON_Z_FAIL = 1 << 17,
109   RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 18,
110   RESEND_WRITE_TO_COLOR_BUFFER       = 1 << 19
111 };
112
113 } // Anonymous namespace
114
115 namespace Dali
116 {
117 namespace Internal
118 {
119 namespace SceneGraph
120 {
121
122 Renderer* Renderer::New()
123 {
124   return new ( gRendererMemoryPool.AllocateRawThreadSafe() ) Renderer();
125 }
126
127 Renderer::Renderer()
128 : mSceneController( 0 ),
129   mRenderer( NULL ),
130   mTextureSet( NULL ),
131   mGeometry( NULL ),
132   mShader( NULL ),
133   mBlendColor( NULL ),
134   mStencilParameters( StencilMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP ),
135   mIndexedDrawFirstElement( 0u ),
136   mIndexedDrawElementsCount( 0u ),
137   mBlendBitmask( 0u ),
138   mRegenerateUniformMap( 0u ),
139   mResendFlag( 0u ),
140   mDepthFunction( DepthFunction::LESS ),
141   mFaceCullingMode( FaceCullingMode::NONE ),
142   mBlendMode( BlendMode::AUTO ),
143   mDepthWriteMode( DepthWriteMode::AUTO ),
144   mDepthTestMode( DepthTestMode::AUTO ),
145   mWriteToColorBuffer( true ),
146   mResourcesReady( false ),
147   mFinishedResourceAcquisition( false ),
148   mPremultipledAlphaEnabled( false ),
149   mDepthIndex( 0 )
150 {
151   mUniformMapChanged[0] = false;
152   mUniformMapChanged[1] = false;
153
154   // Observe our own PropertyOwner's uniform map
155   AddUniformMapObserver( *this );
156 }
157
158 Renderer::~Renderer()
159 {
160   if (mTextureSet)
161   {
162     mTextureSet->RemoveObserver(this);
163     mTextureSet=NULL;
164   }
165   if( mShader )
166   {
167     mShader->RemoveConnectionObserver(*this);
168     mShader=NULL;
169   }
170 }
171
172 void Renderer::operator delete( void* ptr )
173 {
174   gRendererMemoryPool.FreeThreadSafe( static_cast<Renderer*>( ptr ) );
175 }
176
177
178 void Renderer::PrepareRender( BufferIndex updateBufferIndex )
179 {
180   mResourcesReady = false;
181   mFinishedResourceAcquisition = false;
182
183   // Can only be considered ready when all the scene graph objects are connected to the renderer
184   if( mGeometry && mShader )
185   {
186     if( mTextureSet )
187     {
188       mTextureSet->GetResourcesStatus( mResourcesReady, mFinishedResourceAcquisition );
189     }
190     else
191     {
192       mResourcesReady = true;
193       mFinishedResourceAcquisition = true;
194     }
195   }
196
197   if( mRegenerateUniformMap > UNIFORM_MAP_READY )
198   {
199     DALI_ASSERT_DEBUG( mGeometry != NULL && "No geometry available in PrepareRender()" );
200     DALI_ASSERT_DEBUG( mShader != NULL && "No shader available in PrepareRender()" );
201
202     if( mRegenerateUniformMap == REGENERATE_UNIFORM_MAP)
203     {
204       CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ];
205       localMap.Resize(0);
206
207       const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap();
208       AddMappings( localMap, rendererUniformMap );
209
210       if( mShader )
211       {
212         AddMappings( localMap, mShader->GetUniformMap() );
213       }
214     }
215     else if( mRegenerateUniformMap == COPY_UNIFORM_MAP )
216     {
217       // Copy old map into current map
218       CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ];
219       CollectedUniformMap& oldMap = mCollectedUniformMap[ 1-updateBufferIndex ];
220
221       localMap.Resize( oldMap.Count() );
222
223       unsigned int index=0;
224       for( CollectedUniformMap::Iterator iter = oldMap.Begin(), end = oldMap.End() ; iter != end ; ++iter, ++index )
225       {
226         localMap[index] = *iter;
227       }
228     }
229
230     mUniformMapChanged[updateBufferIndex] = true;
231     mRegenerateUniformMap--;
232   }
233
234   if( mResendFlag != 0 )
235   {
236     if( mResendFlag & RESEND_DATA_PROVIDER )
237     {
238       RenderDataProvider* dataProvider = NewRenderDataProvider();
239
240       typedef MessageValue1< Render::Renderer, OwnerPointer<RenderDataProvider> > DerivedType;
241       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
242       new (slot) DerivedType( mRenderer, &Render::Renderer::SetRenderDataProvider, dataProvider );
243     }
244
245     if( mResendFlag & RESEND_GEOMETRY )
246     {
247       typedef MessageValue1< Render::Renderer, Render::Geometry* > DerivedType;
248       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
249
250       new (slot) DerivedType( mRenderer, &Render::Renderer::SetGeometry, mGeometry );
251     }
252
253     if( mResendFlag & RESEND_FACE_CULLING_MODE )
254     {
255       typedef MessageValue1< Render::Renderer, FaceCullingMode::Type > DerivedType;
256       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
257       new (slot) DerivedType( mRenderer, &Render::Renderer::SetFaceCullingMode, mFaceCullingMode );
258     }
259
260     if( mResendFlag & RESEND_BLEND_BIT_MASK )
261     {
262       typedef MessageValue1< Render::Renderer, unsigned int > DerivedType;
263       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
264       new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendingBitMask, mBlendBitmask );
265     }
266
267     if( mResendFlag & RESEND_BLEND_COLOR )
268     {
269       typedef MessageValue1< Render::Renderer, const Vector4* > DerivedType;
270       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
271       new (slot) DerivedType( mRenderer, &Render::Renderer::SetBlendColor, mBlendColor );
272     }
273
274     if( mResendFlag & RESEND_PREMULTIPLIED_ALPHA  )
275     {
276       typedef MessageValue1< Render::Renderer, bool > DerivedType;
277       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
278       new (slot) DerivedType( mRenderer, &Render::Renderer::EnablePreMultipliedAlpha, mPremultipledAlphaEnabled );
279     }
280
281     if( mResendFlag & RESEND_INDEXED_DRAW_FIRST_ELEMENT )
282     {
283       typedef MessageValue1< Render::Renderer, size_t > DerivedType;
284       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
285       new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawFirstElement, mIndexedDrawFirstElement );
286     }
287
288     if( mResendFlag & RESEND_INDEXED_DRAW_ELEMENTS_COUNT )
289     {
290       typedef MessageValue1< Render::Renderer, size_t > DerivedType;
291       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
292       new (slot) DerivedType( mRenderer, &Render::Renderer::SetIndexedDrawElementsCount, mIndexedDrawElementsCount );
293     }
294
295     if( mResendFlag & RESEND_DEPTH_WRITE_MODE )
296     {
297       typedef MessageValue1< Render::Renderer, DepthWriteMode::Type > DerivedType;
298       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
299       new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode );
300     }
301
302     if( mResendFlag & RESEND_DEPTH_TEST_MODE )
303     {
304       typedef MessageValue1< Render::Renderer, DepthTestMode::Type > DerivedType;
305       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
306       new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode );
307     }
308
309     if( mResendFlag & RESEND_DEPTH_FUNCTION )
310     {
311       typedef MessageValue1< Render::Renderer, DepthFunction::Type > DerivedType;
312       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
313       new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthFunction, mDepthFunction );
314     }
315
316     if( mResendFlag & RESEND_STENCIL_MODE )
317     {
318       typedef MessageValue1< Render::Renderer, StencilMode::Type > DerivedType;
319       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
320       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilMode, mStencilParameters.stencilMode );
321     }
322
323     if( mResendFlag & RESEND_STENCIL_FUNCTION )
324     {
325       typedef MessageValue1< Render::Renderer, StencilFunction::Type > DerivedType;
326       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
327       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunction, mStencilParameters.stencilFunction );
328     }
329
330     if( mResendFlag & RESEND_STENCIL_FUNCTION_MASK )
331     {
332       typedef MessageValue1< Render::Renderer, int > DerivedType;
333       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
334       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunctionMask, mStencilParameters.stencilFunctionMask );
335     }
336
337     if( mResendFlag & RESEND_STENCIL_FUNCTION_REFERENCE )
338     {
339       typedef MessageValue1< Render::Renderer, int > DerivedType;
340       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
341       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilFunctionReference, mStencilParameters.stencilFunctionReference );
342     }
343
344     if( mResendFlag & RESEND_STENCIL_MASK )
345     {
346       typedef MessageValue1< Render::Renderer, int > DerivedType;
347       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
348       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilMask, mStencilParameters.stencilMask );
349     }
350
351     if( mResendFlag & RESEND_STENCIL_OPERATION_ON_FAIL )
352     {
353       typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
354       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
355       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnFail, mStencilParameters.stencilOperationOnFail );
356     }
357
358     if( mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_FAIL )
359     {
360       typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
361       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
362       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnZFail, mStencilParameters.stencilOperationOnZFail );
363     }
364
365     if( mResendFlag & RESEND_STENCIL_OPERATION_ON_Z_PASS )
366     {
367       typedef MessageValue1< Render::Renderer, StencilOperation::Type > DerivedType;
368       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
369       new (slot) DerivedType( mRenderer, &Render::Renderer::SetStencilOperationOnZPass, mStencilParameters.stencilOperationOnZPass );
370     }
371
372     if( mResendFlag & RESEND_WRITE_TO_COLOR_BUFFER )
373     {
374       typedef MessageValue1< Render::Renderer, bool > DerivedType;
375       unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
376       new (slot) DerivedType( mRenderer, &Render::Renderer::SetWriteToColorBuffer, mWriteToColorBuffer );
377     }
378
379     mResendFlag = 0;
380   }
381 }
382
383 void Renderer::SetTextures( TextureSet* textureSet )
384 {
385   DALI_ASSERT_DEBUG( textureSet != NULL && "Texture set pointer is NULL" );
386
387   if( mTextureSet )
388   {
389     mTextureSet->RemoveObserver(this);
390   }
391
392   mTextureSet = textureSet;
393   mTextureSet->AddObserver( this );
394   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
395   mResendFlag |= RESEND_DATA_PROVIDER;
396 }
397
398 void Renderer::SetShader( Shader* shader )
399 {
400   DALI_ASSERT_DEBUG( shader != NULL && "Shader pointer is NULL" );
401
402   if( mShader )
403   {
404     mShader->RemoveConnectionObserver(*this);
405   }
406
407   mShader = shader;
408   mShader->AddConnectionObserver( *this );
409   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
410   mResendFlag |= RESEND_DATA_PROVIDER;
411 }
412
413 void Renderer::SetGeometry( Render::Geometry* geometry )
414 {
415   DALI_ASSERT_DEBUG( geometry != NULL && "Geometry pointer is NULL");
416   mGeometry = geometry;
417
418   if( mRenderer )
419   {
420     mResendFlag |= RESEND_GEOMETRY;
421   }
422 }
423
424 void Renderer::SetDepthIndex( int depthIndex )
425 {
426   mDepthIndex = depthIndex;
427 }
428
429 void Renderer::SetFaceCullingMode( FaceCullingMode::Type faceCullingMode )
430 {
431   mFaceCullingMode = faceCullingMode;
432   mResendFlag |= RESEND_FACE_CULLING_MODE;
433 }
434
435 void Renderer::SetBlendMode( BlendMode::Type blendingMode )
436 {
437   mBlendMode = blendingMode;
438 }
439
440 void Renderer::SetBlendingOptions( unsigned int options )
441 {
442   if( mBlendBitmask != options)
443   {
444     mBlendBitmask = options;
445     mResendFlag |= RESEND_BLEND_BIT_MASK;
446   }
447 }
448
449 void Renderer::SetBlendColor( const Vector4& blendColor )
450 {
451   if( !mBlendColor )
452   {
453     mBlendColor = new Vector4( blendColor );
454   }
455   else
456   {
457     *mBlendColor = blendColor;
458   }
459
460   mResendFlag |= RESEND_BLEND_COLOR;
461 }
462
463 void Renderer::SetIndexedDrawFirstElement( size_t firstElement )
464 {
465   mIndexedDrawFirstElement = firstElement;
466   mResendFlag |= RESEND_INDEXED_DRAW_FIRST_ELEMENT;
467 }
468
469 void Renderer::SetIndexedDrawElementsCount( size_t elementsCount )
470 {
471   mIndexedDrawElementsCount = elementsCount;
472   mResendFlag |= RESEND_INDEXED_DRAW_ELEMENTS_COUNT;
473 }
474
475 void Renderer::EnablePreMultipliedAlpha( bool preMultipled )
476 {
477   mPremultipledAlphaEnabled = preMultipled;
478   mResendFlag |= RESEND_PREMULTIPLIED_ALPHA;
479 }
480
481 void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode )
482 {
483   mDepthWriteMode = depthWriteMode;
484   mResendFlag |= RESEND_DEPTH_WRITE_MODE;
485 }
486
487 void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode )
488 {
489   mDepthTestMode = depthTestMode;
490   mResendFlag |= RESEND_DEPTH_TEST_MODE;
491 }
492
493 void Renderer::SetDepthFunction( DepthFunction::Type depthFunction )
494 {
495   mDepthFunction = depthFunction;
496   mResendFlag |= RESEND_DEPTH_FUNCTION;
497 }
498
499 void Renderer::SetStencilMode( StencilMode::Type mode )
500 {
501   mStencilParameters.stencilMode = mode;
502   mResendFlag |= RESEND_STENCIL_MODE;
503 }
504
505 void Renderer::SetStencilFunction( StencilFunction::Type stencilFunction )
506 {
507   mStencilParameters.stencilFunction = stencilFunction;
508   mResendFlag |= RESEND_STENCIL_FUNCTION;
509 }
510
511 void Renderer::SetStencilFunctionMask( int stencilFunctionMask )
512 {
513   mStencilParameters.stencilFunctionMask = stencilFunctionMask;
514   mResendFlag |= RESEND_STENCIL_FUNCTION_MASK;
515 }
516
517 void Renderer::SetStencilFunctionReference( int stencilFunctionReference )
518 {
519   mStencilParameters.stencilFunctionReference = stencilFunctionReference;
520   mResendFlag |= RESEND_STENCIL_FUNCTION_REFERENCE;
521 }
522
523 void Renderer::SetStencilMask( int stencilMask )
524 {
525   mStencilParameters.stencilMask = stencilMask;
526   mResendFlag |= RESEND_STENCIL_MASK;
527 }
528
529 void Renderer::SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail )
530 {
531   mStencilParameters.stencilOperationOnFail = stencilOperationOnFail;
532   mResendFlag |= RESEND_STENCIL_OPERATION_ON_FAIL;
533 }
534
535 void Renderer::SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail )
536 {
537   mStencilParameters.stencilOperationOnZFail = stencilOperationOnZFail;
538   mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_FAIL;
539 }
540
541 void Renderer::SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass )
542 {
543   mStencilParameters.stencilOperationOnZPass = stencilOperationOnZPass;
544   mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS;
545 }
546
547 void Renderer::SetWriteToColorBuffer( bool writeToColorBuffer )
548 {
549   mWriteToColorBuffer = writeToColorBuffer;
550   mResendFlag |= RESEND_WRITE_TO_COLOR_BUFFER;
551 }
552
553 //Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created )
554 void Renderer::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
555 {
556   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
557   mSceneController = &sceneController;
558   RenderDataProvider* dataProvider = NewRenderDataProvider();
559
560   mRenderer = Render::Renderer::New( dataProvider, mGeometry, mBlendBitmask, mBlendColor, static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
561                                          mPremultipledAlphaEnabled, mDepthWriteMode, mDepthTestMode, mDepthFunction, mStencilParameters, mWriteToColorBuffer );
562
563   mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer );
564 }
565
566 //Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced )
567 void Renderer::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
568 {
569   //Remove renderer from RenderManager
570   if( mRenderer )
571   {
572     mSceneController->GetRenderMessageDispatcher().RemoveRenderer( *mRenderer );
573     mRenderer = NULL;
574   }
575   mSceneController = NULL;
576 }
577
578 RenderDataProvider* Renderer::NewRenderDataProvider()
579 {
580   RenderDataProvider* dataProvider = new RenderDataProvider();
581
582   dataProvider->mUniformMapDataProvider = this;
583   dataProvider->mShader = mShader;
584
585   if( mTextureSet )
586   {
587     size_t textureCount( mTextureSet->GetTextureCount() );
588     dataProvider->mTextures.resize( textureCount );
589     dataProvider->mSamplers.resize( textureCount );
590     for( unsigned int i(0); i<textureCount; ++i )
591     {
592       dataProvider->mTextures[i] = Render::Texture( mTextureSet->GetTextureId(i),0);
593       dataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
594     }
595
596     textureCount = mTextureSet->GetNewTextureCount();
597     dataProvider->mNewTextures.resize( textureCount );
598     dataProvider->mSamplers.resize( textureCount );
599     for( unsigned int i(0); i<textureCount; ++i )
600     {
601       dataProvider->mNewTextures[i] = mTextureSet->GetNewTexture(i);
602       dataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i);
603     }
604   }
605
606   return dataProvider;
607 }
608
609 Render::Renderer& Renderer::GetRenderer()
610 {
611   return *mRenderer;
612 }
613
614 const CollectedUniformMap& Renderer::GetUniformMap( BufferIndex bufferIndex ) const
615 {
616   return mCollectedUniformMap[bufferIndex];
617 }
618
619 void Renderer::GetReadyAndComplete( bool& ready, bool& complete ) const
620 {
621   ready = mResourcesReady;
622   complete = mFinishedResourceAcquisition;
623 }
624
625 Renderer::Opacity Renderer::GetOpacity( BufferIndex updateBufferIndex, const Node& node ) const
626 {
627   Renderer::Opacity opacity = Renderer::OPAQUE;
628
629   switch( mBlendMode )
630   {
631     case BlendMode::ON: // If the renderer should always be use blending
632     {
633       opacity = Renderer::TRANSLUCENT;
634       break;
635     }
636     case BlendMode::AUTO:
637     {
638       bool shaderRequiresBlending( mShader->HintEnabled( Dali::Shader::Hint::OUTPUT_IS_TRANSPARENT ) );
639       if( shaderRequiresBlending || ( mTextureSet && mTextureSet->HasAlpha() ) )
640       {
641         opacity = Renderer::TRANSLUCENT;
642       }
643       else // renderer should determine opacity using the actor color
644       {
645         float alpha = node.GetWorldColor( updateBufferIndex ).a;
646         if( alpha <= FULLY_TRANSPARENT )
647         {
648           opacity = TRANSPARENT;
649         }
650         else if( alpha <= FULLY_OPAQUE )
651         {
652           opacity = TRANSLUCENT;
653         }
654       }
655       break;
656     }
657     case BlendMode::OFF: // the renderer should never use blending
658     default:
659     {
660       opacity = Renderer::OPAQUE;
661       break;
662     }
663   }
664
665
666   return opacity;
667 }
668
669 void Renderer::TextureSetChanged()
670 {
671   mResendFlag |= RESEND_DATA_PROVIDER;
672 }
673
674 void Renderer::ConnectionsChanged( PropertyOwner& object )
675 {
676   // One of our child objects has changed it's connections. Ensure the uniform
677   // map gets regenerated during PrepareRender
678   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
679
680   // Ensure the child object pointers get re-sent to the renderer
681   mResendFlag |= RESEND_DATA_PROVIDER;
682 }
683
684 void Renderer::ConnectedUniformMapChanged()
685 {
686   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
687 }
688
689 void Renderer::UniformMappingsChanged( const UniformMap& mappings )
690 {
691   // The mappings are either from PropertyOwner base class, or the Actor
692   mRegenerateUniformMap = REGENERATE_UNIFORM_MAP;
693 }
694
695 void Renderer::ObservedObjectDestroyed(PropertyOwner& owner)
696 {
697   if( reinterpret_cast<PropertyOwner*>(mTextureSet) == &owner )
698   {
699     mTextureSet = NULL;
700   }
701   else if( reinterpret_cast<PropertyOwner*>(mShader) == &owner )
702   {
703     mShader = NULL;
704   }
705 }
706
707 } // namespace SceneGraph
708 } // namespace Internal
709 } // namespace Dali