Merge "Make Update() function of frame callback is called for every frame." into...
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / update-manager.cpp
index ce5cfb8..f8df0f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <dali/internal/update/manager/update-manager.h>
 
 // INTERNAL INCLUDES
-#include <dali/public-api/common/stage.h>
-#include <dali/devel-api/common/owner-container.h>
-#include <dali/devel-api/threading/mutex.h>
-
 #include <dali/integration-api/core.h>
-#include <dali/integration-api/render-controller.h>
-#include <dali/internal/common/shader-data.h>
-#include <dali/integration-api/debug.h>
-
-#include <dali/internal/common/core-impl.h>
-#include <dali/internal/common/message.h>
 
 #include <dali/internal/event/common/notification-manager.h>
-#include <dali/internal/event/common/property-notification-impl.h>
 #include <dali/internal/event/common/property-notifier.h>
 #include <dali/internal/event/effects/shader-factory.h>
 #include <dali/internal/event/animation/animation-playlist.h>
 
-#include <dali/internal/update/animation/scene-graph-animator.h>
-#include <dali/internal/update/animation/scene-graph-animation.h>
 #include <dali/internal/update/common/discard-queue.h>
-#include <dali/internal/update/common/scene-graph-buffers.h>
 #include <dali/internal/update/controllers/render-message-dispatcher.h>
 #include <dali/internal/update/controllers/scene-controller-impl.h>
-#include <dali/internal/update/gestures/scene-graph-pan-gesture.h>
 #include <dali/internal/update/manager/frame-callback-processor.h>
 #include <dali/internal/update/manager/render-task-processor.h>
-#include <dali/internal/update/manager/sorted-layers.h>
-#include <dali/internal/update/manager/scene-graph-frame-callback.h>
 #include <dali/internal/update/manager/update-algorithms.h>
 #include <dali/internal/update/manager/update-manager-debug.h>
 #include <dali/internal/update/manager/transform-manager.h>
 #include <dali/internal/update/nodes/node.h>
-#include <dali/internal/update/nodes/scene-graph-layer.h>
 #include <dali/internal/update/queue/update-message-queue.h>
-#include <dali/internal/update/render-tasks/scene-graph-render-task.h>
-#include <dali/internal/update/render-tasks/scene-graph-render-task-list.h>
-#include <dali/internal/update/render-tasks/scene-graph-camera.h>
 
-#include <dali/internal/render/common/render-instruction-container.h>
 #include <dali/internal/render/common/render-manager.h>
 #include <dali/internal/render/queue/render-queue.h>
-#include <dali/internal/render/shaders/scene-graph-shader.h>
 
 // Un-comment to enable node tree debug logging
 //#define NODE_TREE_LOGGING 1
@@ -173,6 +150,7 @@ struct UpdateManager::Impl
     Layer* root{ nullptr };                                   ///< Root node (root is a layer). The layer is not stored in the node memory pool.
     OwnerPointer< RenderTaskList > taskList;                  ///< Scene graph render task list
     SortedLayerPointers sortedLayerList;                      ///< List of Layer pointers sorted by depth (one list of sorted layers per root)
+    OwnerPointer< Scene > scene;                              ///< Scene graph object of the scene
   };
 
   Impl( NotificationManager& notificationManager,
@@ -195,9 +173,8 @@ struct UpdateManager::Impl
     sceneController( NULL ),
     renderManager( renderManager ),
     renderQueue( renderQueue ),
-    renderInstructions( renderManager.GetRenderInstructionContainer() ),
     renderTaskProcessor( renderTaskProcessor ),
-    backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ),
+    backgroundColor( Dali::DEFAULT_BACKGROUND_COLOR ),
     renderers(),
     textureSets(),
     shaders(),
@@ -283,7 +260,6 @@ struct UpdateManager::Impl
   SceneControllerImpl*                 sceneController;               ///< scene controller
   RenderManager&                       renderManager;                 ///< This is responsible for rendering the results of each "update"
   RenderQueue&                         renderQueue;                   ///< Used to queue messages for the next render
-  RenderInstructionContainer&          renderInstructions;            ///< Used to prepare the render instructions
   RenderTaskProcessor&                 renderTaskProcessor;           ///< Handles RenderTasks and RenderInstrucitons
 
   Vector4                              backgroundColor;               ///< The glClear color used at the beginning of each frame.
@@ -515,6 +491,42 @@ void UpdateManager::RemoveRenderTaskList( RenderTaskList* taskList )
   }
 }
 
+void UpdateManager::AddScene( OwnerPointer< Scene >& scene )
+{
+  mImpl->scenes.back()->scene = scene.Release();
+
+  // Initialize the context from render manager
+  typedef MessageValue1< RenderManager, SceneGraph::Scene* > DerivedType;
+
+  // Reserve some memory inside the render queue
+  uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+  // Construct message in the render queue memory; note that delete should not be called on the return value
+  SceneGraph::Scene& sceneObject = *mImpl->scenes.back()->scene;
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::InitializeScene, &sceneObject );
+}
+
+void UpdateManager::RemoveScene( Scene* scene )
+{
+  // Initialize the context from render manager
+  using DerivedType = MessageValue1<RenderManager, SceneGraph::Scene*>;
+
+  // Reserve some memory inside the render queue
+  uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+  // Construct message in the render queue memory; note that delete should not be called on the return value
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::UninitializeScene, scene );
+
+  for ( auto&& sceneInfo : mImpl->scenes )
+  {
+    if ( sceneInfo && sceneInfo->scene && sceneInfo->scene.Get() == scene )
+    {
+      mImpl->discardQueue.Add( mSceneGraphBuffers.GetUpdateBufferIndex(), sceneInfo->scene.Release() ); // take the address of the reference to a pointer
+      break;
+    }
+  }
+}
+
 void UpdateManager::AddAnimation( OwnerPointer< SceneGraph::Animation >& animation )
 {
   mImpl->animations.PushBack( animation.Release() );
@@ -593,8 +605,7 @@ void UpdateManager::SetShaderProgram( Shader* shader,
 {
   if( shaderData )
   {
-
-    typedef MessageValue3< Shader, Internal::ShaderDataPtr, ProgramCache*, bool> DerivedType;
+    using DerivedType = MessageValue3<Shader, Internal::ShaderDataPtr, ProgramCache*, bool>;
 
     // Reserve some memory inside the render queue
     uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -693,6 +704,13 @@ void UpdateManager::ResetProperties( BufferIndex bufferIndex )
     mImpl->propertyResetters.EraseObject( elementPtr );
   }
 
+  // Clear all root nodes dirty flags
+  for( auto& scene : mImpl->scenes )
+  {
+    auto root = scene->root;
+    root->ResetDirtyFlags( bufferIndex );
+  }
+
   // Clear node dirty flags
   Vector<Node*>::Iterator iter = mImpl->nodes.Begin()+1;
   Vector<Node*>::Iterator endIter = mImpl->nodes.End();
@@ -873,6 +891,7 @@ uint32_t UpdateManager::Update( float elapsedSeconds,
       (mImpl->nodeDirtyFlags & RenderableUpdateFlags) ||    // ..nodes were dirty in previous frame OR
       IsAnimationRunning()                            ||    // ..at least one animation is running OR
       mImpl->messageQueue.IsSceneUpdateRequired()     ||    // ..a message that modifies the scene graph node tree is queued OR
+      mImpl->frameCallbackProcessor                   ||    // ..a frame callback processor is existed OR
       gestureUpdated;                                       // ..a gesture property was updated
 
   bool keepRendererRendering = false;
@@ -963,35 +982,30 @@ uint32_t UpdateManager::Update( float elapsedSeconds,
         }
       }
 
-      mImpl->renderInstructions.ResetAndReserve( bufferIndex,
-                                                 static_cast<uint32_t>( numberOfRenderTasks ) );
 
+      std::size_t numberOfRenderInstructions = 0;
       for ( auto&& scene : mImpl->scenes )
       {
-        if ( scene && scene->root && scene->taskList )
+        if ( scene && scene->root && scene->taskList && scene->scene )
         {
+          scene->scene->GetRenderInstructions().ResetAndReserve( bufferIndex,
+                                                     static_cast<uint32_t>( scene->taskList->GetTasks().Count() ) );
+
           keepRendererRendering |= mImpl->renderTaskProcessor.Process( bufferIndex,
                                               *scene->taskList,
                                               *scene->root,
                                               scene->sortedLayerList,
-                                              mImpl->renderInstructions,
+                                              scene->scene->GetRenderInstructions(),
                                               renderToFboEnabled,
                                               isRenderingToFbo );
+
+          numberOfRenderInstructions += scene->scene->GetRenderInstructions().Count( bufferIndex );
         }
       }
 
       DALI_LOG_INFO( gLogFilter, Debug::General,
                      "Update: numberOfRenderTasks(%d), Render Instructions(%d)\n",
-                     numberOfRenderTasks, mImpl->renderInstructions.Count( bufferIndex ) );
-
-
-
-      // If any node is dirty, i.e. a property has changed or a child has been deleted, and we do not have any instructions to send, then generate a dummy instruction to force another render
-      if( ( mImpl->nodeDirtyFlags != NodePropertyFlags::NOTHING ) && ( mImpl->renderInstructions.Count( bufferIndex ) == 0 ) )
-      {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "Node flags dirty, creating dummy instruction\n" );
-        mImpl->renderInstructions.GetNextInstruction( bufferIndex ); // This creates and adds an empty instruction. We do not need to modify it.
-      }
+                     numberOfRenderTasks, numberOfRenderInstructions );
     }
   }
 
@@ -1040,6 +1054,9 @@ uint32_t UpdateManager::Update( float elapsedSeconds,
   if( keepRendererRendering )
   {
     keepUpdating |= KeepUpdating::STAGE_KEEP_RENDERING;
+
+    // Set dirty flags for next frame to continue rendering
+    mImpl->nodeDirtyFlags |= RenderableUpdateFlags;
   }
 
   // tell the update manager that we're done so the queue can be given to event thread
@@ -1088,28 +1105,28 @@ uint32_t UpdateManager::KeepUpdatingCheck( float elapsedSeconds ) const
   return keepUpdatingRequest;
 }
 
-void UpdateManager::SetBackgroundColor( const Vector4& color )
+void UpdateManager::SetDefaultSurfaceRect( const Rect<int32_t>& rect )
 {
-  typedef MessageValue1< RenderManager, Vector4 > DerivedType;
+  mImpl->surfaceRectChanged = true;
+
+  using DerivedType = MessageValue1<RenderManager, Rect<int32_t> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetBackgroundColor, color );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SetDefaultSurfaceRect, rect );
 }
 
-void UpdateManager::SetDefaultSurfaceRect( const Rect<int32_t>& rect )
+void UpdateManager::SurfaceReplaced( Scene* scene )
 {
-  mImpl->surfaceRectChanged = true;
-
-  typedef MessageValue1< RenderManager, Rect<int32_t> > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Scene*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SetDefaultSurfaceRect, rect );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SurfaceReplaced, scene );
 }
 
 void UpdateManager::KeepRendering( float durationSeconds )
@@ -1176,7 +1193,7 @@ void UpdateManager::RemoveFrameCallback( FrameCallbackInterface* frameCallback )
 void UpdateManager::AddSampler( OwnerPointer< Render::Sampler >& sampler )
 {
   // Message has ownership of Sampler while in transit from update to render
-  typedef MessageValue1< RenderManager, OwnerPointer< Render::Sampler > > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, OwnerPointer<Render::Sampler> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1187,7 +1204,7 @@ void UpdateManager::AddSampler( OwnerPointer< Render::Sampler >& sampler )
 
 void UpdateManager::RemoveSampler( Render::Sampler* sampler )
 {
-  typedef MessageValue1< RenderManager, Render::Sampler* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::Sampler*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1198,7 +1215,7 @@ void UpdateManager::RemoveSampler( Render::Sampler* sampler )
 
 void UpdateManager::SetFilterMode( Render::Sampler* sampler, uint32_t minFilterMode, uint32_t magFilterMode )
 {
-  typedef MessageValue3< RenderManager, Render::Sampler*, uint32_t, uint32_t > DerivedType;
+  using DerivedType = MessageValue3<RenderManager, Render::Sampler*, uint32_t, uint32_t>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1209,7 +1226,7 @@ void UpdateManager::SetFilterMode( Render::Sampler* sampler, uint32_t minFilterM
 
 void UpdateManager::SetWrapMode( Render::Sampler* sampler, uint32_t rWrapMode, uint32_t sWrapMode, uint32_t tWrapMode )
 {
-  typedef MessageValue4< RenderManager, Render::Sampler*, uint32_t, uint32_t, uint32_t > DerivedType;
+  using DerivedType = MessageValue4<RenderManager, Render::Sampler*, uint32_t, uint32_t, uint32_t>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1218,57 +1235,57 @@ void UpdateManager::SetWrapMode( Render::Sampler* sampler, uint32_t rWrapMode, u
   new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SetWrapMode, sampler, rWrapMode, sWrapMode, tWrapMode );
 }
 
-void UpdateManager::AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertyBuffer )
+void UpdateManager::AddVertexBuffer( OwnerPointer< Render::VertexBuffer >& vertexBuffer )
 {
   // Message has ownership of format while in transit from update -> render
-  typedef MessageValue1< RenderManager, OwnerPointer< Render::PropertyBuffer > > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, OwnerPointer<Render::VertexBuffer> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AddPropertyBuffer, propertyBuffer );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AddVertexBuffer, vertexBuffer );
 }
 
-void UpdateManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer )
+void UpdateManager::RemoveVertexBuffer( Render::VertexBuffer* vertexBuffer )
 {
-  typedef MessageValue1< RenderManager, Render::PropertyBuffer* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::VertexBuffer*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::RemovePropertyBuffer, propertyBuffer );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::RemoveVertexBuffer, vertexBuffer );
 }
 
-void UpdateManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format )
+void UpdateManager::SetVertexBufferFormat( Render::VertexBuffer* vertexBuffer, OwnerPointer< Render::VertexBuffer::Format>& format )
 {
   // Message has ownership of format while in transit from update -> render
-  typedef MessageValue2< RenderManager, Render::PropertyBuffer*, OwnerPointer< Render::PropertyBuffer::Format > > DerivedType;
+  using DerivedType = MessageValue2<RenderManager, Render::VertexBuffer*, OwnerPointer<Render::VertexBuffer::Format> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SetPropertyBufferFormat, propertyBuffer, format );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::SetVertexBufferFormat, vertexBuffer, format );
 }
 
-void UpdateManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector<uint8_t> >& data, uint32_t size )
+void UpdateManager::SetVertexBufferData( Render::VertexBuffer* vertexBuffer, OwnerPointer< Vector<uint8_t> >& data, uint32_t size )
 {
   // Message has ownership of format while in transit from update -> render
-  typedef MessageValue3< RenderManager, Render::PropertyBuffer*, OwnerPointer< Dali::Vector<uint8_t> >, uint32_t > DerivedType;
+  using DerivedType = MessageValue3<RenderManager, Render::VertexBuffer*, OwnerPointer<Dali::Vector<uint8_t> >, uint32_t>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetPropertyBufferData, propertyBuffer, data, size );
+  new (slot) DerivedType( &mImpl->renderManager, &RenderManager::SetVertexBufferData, vertexBuffer, data, size );
 }
 
 void UpdateManager::AddGeometry( OwnerPointer< Render::Geometry >& geometry )
 {
   // Message has ownership of format while in transit from update -> render
-  typedef MessageValue1< RenderManager, OwnerPointer< Render::Geometry > > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, OwnerPointer<Render::Geometry> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1279,7 +1296,7 @@ void UpdateManager::AddGeometry( OwnerPointer< Render::Geometry >& geometry )
 
 void UpdateManager::RemoveGeometry( Render::Geometry* geometry )
 {
-  typedef MessageValue1< RenderManager, Render::Geometry* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::Geometry*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1290,7 +1307,7 @@ void UpdateManager::RemoveGeometry( Render::Geometry* geometry )
 
 void UpdateManager::SetGeometryType( Render::Geometry* geometry, uint32_t geometryType )
 {
-  typedef MessageValue2< RenderManager, Render::Geometry*, uint32_t > DerivedType;
+  using DerivedType = MessageValue2<RenderManager, Render::Geometry*, uint32_t>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1301,7 +1318,7 @@ void UpdateManager::SetGeometryType( Render::Geometry* geometry, uint32_t geomet
 
 void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<uint16_t>& indices )
 {
-  typedef IndexBufferMessage< RenderManager > DerivedType;
+  using DerivedType = IndexBufferMessage<RenderManager>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1310,32 +1327,32 @@ void UpdateManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector<uin
   new (slot) DerivedType( &mImpl->renderManager, geometry, indices );
 }
 
-void UpdateManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
+void UpdateManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer )
 {
-  typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType;
+  using DerivedType = MessageValue2<RenderManager, Render::Geometry*, Render::VertexBuffer*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::RemoveVertexBuffer, geometry, propertyBuffer );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::RemoveVertexBuffer, geometry, vertexBuffer );
 }
 
-void UpdateManager::AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer )
+void UpdateManager::AttachVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer )
 {
-  typedef MessageValue2< RenderManager, Render::Geometry*, Render::PropertyBuffer* > DerivedType;
+  using DerivedType = MessageValue2<RenderManager, Render::Geometry*, Render::VertexBuffer*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
 
   // Construct message in the render queue memory; note that delete should not be called on the return value
-  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AttachVertexBuffer, geometry, propertyBuffer );
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AttachVertexBuffer, geometry, vertexBuffer );
 }
 
 void UpdateManager::AddTexture( OwnerPointer< Render::Texture >& texture )
 {
   // Message has ownership of Texture while in transit from update -> render
-  typedef MessageValue1< RenderManager, OwnerPointer< Render::Texture > > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, OwnerPointer<Render::Texture> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1346,7 +1363,7 @@ void UpdateManager::AddTexture( OwnerPointer< Render::Texture >& texture )
 
 void UpdateManager::RemoveTexture( Render::Texture* texture)
 {
-  typedef MessageValue1< RenderManager, Render::Texture* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::Texture*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1357,7 +1374,7 @@ void UpdateManager::RemoveTexture( Render::Texture* texture)
 
 void UpdateManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params )
 {
-  typedef MessageValue3< RenderManager, Render::Texture*, PixelDataPtr, Texture::UploadParams > DerivedType;
+  using DerivedType = MessageValue3<RenderManager, Render::Texture*, PixelDataPtr, Texture::UploadParams>;
 
   // Reserve some memory inside the message queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1368,7 +1385,7 @@ void UpdateManager::UploadTexture( Render::Texture* texture, PixelDataPtr pixelD
 
 void UpdateManager::GenerateMipmaps( Render::Texture* texture )
 {
-  typedef MessageValue1< RenderManager, Render::Texture* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::Texture*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1379,7 +1396,7 @@ void UpdateManager::GenerateMipmaps( Render::Texture* texture )
 
 void UpdateManager::AddFrameBuffer( OwnerPointer< Render::FrameBuffer >& frameBuffer )
 {
-  typedef MessageValue1< RenderManager, OwnerPointer< Render::FrameBuffer > > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, OwnerPointer<Render::FrameBuffer> >;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1390,7 +1407,7 @@ void UpdateManager::AddFrameBuffer( OwnerPointer< Render::FrameBuffer >& frameBu
 
 void UpdateManager::RemoveFrameBuffer( Render::FrameBuffer* frameBuffer)
 {
-  typedef MessageValue1< RenderManager, Render::FrameBuffer* > DerivedType;
+  using DerivedType = MessageValue1<RenderManager, Render::FrameBuffer*>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1401,7 +1418,7 @@ void UpdateManager::RemoveFrameBuffer( Render::FrameBuffer* frameBuffer)
 
 void UpdateManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel, uint32_t layer )
 {
-  typedef MessageValue4< RenderManager, Render::FrameBuffer*, Render::Texture*, uint32_t, uint32_t > DerivedType;
+  using DerivedType = MessageValue4<RenderManager, Render::FrameBuffer*, Render::Texture*, uint32_t, uint32_t>;
 
   // Reserve some memory inside the render queue
   uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
@@ -1410,6 +1427,28 @@ void UpdateManager::AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameB
   new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AttachColorTextureToFrameBuffer, frameBuffer, texture, mipmapLevel, layer );
 }
 
+void UpdateManager::AttachDepthTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel )
+{
+  using DerivedType = MessageValue3<RenderManager, Render::FrameBuffer*, Render::Texture*, uint32_t>;
+
+  // Reserve some memory inside the render queue
+  uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+  // Construct message in the render queue memory; note that delete should not be called on the return value
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AttachDepthTextureToFrameBuffer, frameBuffer, texture, mipmapLevel );
+}
+
+void UpdateManager::AttachDepthStencilTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel )
+{
+  using DerivedType = MessageValue3<RenderManager, Render::FrameBuffer*, Render::Texture*, uint32_t>;
+
+  // Reserve some memory inside the render queue
+  uint32_t* slot = mImpl->renderQueue.ReserveMessageSlot( mSceneGraphBuffers.GetUpdateBufferIndex(), sizeof( DerivedType ) );
+
+  // Construct message in the render queue memory; note that delete should not be called on the return value
+  new (slot) DerivedType( &mImpl->renderManager,  &RenderManager::AttachDepthStencilTextureToFrameBuffer, frameBuffer, texture, mipmapLevel );
+}
+
 } // namespace SceneGraph
 
 } // namespace Internal