New DepthTestMode API in Renderer 92/72592/15
authorTom Robinson <tom.robinson@samsung.com>
Wed, 1 Jun 2016 16:29:36 +0000 (17:29 +0100)
committerTom Robinson <tom.robinson@samsung.com>
Fri, 3 Jun 2016 15:39:53 +0000 (16:39 +0100)
DepthTestMode in Renderer:
  OFF - Renderer does not read from the depth buffer
  AUTO - Renderer only reads from the depth buffer if in a 3D layer (Default)
  ON - Renderer reads from the depth buffer regardless of layer type

Note: The SetDepthTestDisabled() API in Layer overrides Renderer.
If SetDepthTestDisabled( true ) is called, depth testing is NEVER done (regardless of Renderer properties).
If SetDepthTestDisabled( false ) is called, depth testing is MAY be done. This will be dependant on the Renderer properties.

Note: The default for DepthTestDisabled in Layer is now True. IE. Depth testing is disabled by default.

When the Layer behavior is changed ( Layer::SetBehavior() ), this will update Layer::SetDepthTestDisabled() with appropriate default behavior. IE:

Layer::SetBehavior( Dali::Layer::LAYER_2D ) -> Depth testing is turned off
Layer::SetBehavior( Dali::Layer::LAYER_3D ) -> Depth testing is turned on

This is to encourage optimal settings, but Layer::SetDepthTestDisabled() CAN be modified after changed layer behavior if required.

Change-Id: I874f45eca283e3960b6f6265272754e3e66d267c

16 files changed:
automated-tests/src/dali-devel/utc-Dali-Renderer.cpp
automated-tests/src/dali/utc-Dali-Layer.cpp
dali/devel-api/rendering/renderer.h
dali/internal/common/type-abstraction-enums.h
dali/internal/event/actors/layer-impl.cpp
dali/internal/event/rendering/renderer-impl.cpp
dali/internal/event/rendering/renderer-impl.h
dali/internal/render/common/render-algorithms.cpp
dali/internal/render/common/render-debug.cpp
dali/internal/render/common/render-list.h
dali/internal/render/renderers/render-renderer.cpp
dali/internal/render/renderers/render-renderer.h
dali/internal/update/manager/prepare-render-instructions.cpp
dali/internal/update/nodes/scene-graph-layer.cpp
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.h

index 243d2acde7c6a217c83a3f6446177603c2bc6812..fe9e0380ac53e0cc19740b19ea671ae39b0708bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -1905,18 +1905,6 @@ int UtcDaliRendererSetDepthFunction(void)
   std::ostringstream depthTestStr;
   depthTestStr << GL_DEPTH_TEST;
 
-  //OFF
-  {
-    renderer.SetProperty( Renderer::Property::DEPTH_FUNCTION, DepthFunction::OFF);
-    glEnableDisableStack.Reset();
-    glDepthFunctionStack.Reset();
-    application.SendNotification();
-    application.Render();
-
-    //Depth testing should be disabled
-    DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Disable", depthTestStr.str().c_str() ) );
-  }
-
   //GL_NEVER
   {
     renderer.SetProperty( Renderer::Property::DEPTH_FUNCTION, DepthFunction::NEVER);
index e6c38aa109d6a76d20ff22a08397b2333ad0149a..34c5741ba766ce06fb80066064c8042d731416f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -488,16 +488,17 @@ int UtcDaliLayerSetDepthTestDisabled(void)
   tet_infoline("Testing Dali::Layer::SetDepthTestDisabled() ");
 
   Layer actor = Layer::New();
+  // Note that IsDepthTestDisabled does not depend on layer behavior,
+  // as 2D layers can still have depth tests performed on a per-renderer basis.
+  // Check default.
   DALI_TEST_CHECK( actor.IsDepthTestDisabled() );
 
-  actor.SetBehavior( Layer::LAYER_3D );
-
-  Property::Value behavior = actor.GetProperty(Layer::Property::BEHAVIOR);
-  DALI_TEST_EQUALS(behavior.Get<std::string>().c_str(), "LAYER_3D", TEST_LOCATION );
+  // Check Set / Unset.
+  actor.SetDepthTestDisabled( false );
   DALI_TEST_CHECK( !actor.IsDepthTestDisabled() );
-
   actor.SetDepthTestDisabled( true );
   DALI_TEST_CHECK( actor.IsDepthTestDisabled() );
+
   END_TEST;
 }
 
index 9581b91cb7e20595533583577e6693ecd4e47eb7..dc6fef5a25891a9d0e4193e8c4ed820755efad93 100644 (file)
@@ -128,6 +128,21 @@ enum Type
 
 } // namespace DepthWriteMode
 
+namespace DepthTestMode
+{
+
+/**
+ * @brief Depth buffer test (reading) modes.
+ */
+enum Type
+{
+  OFF,  ///< Renderer does not read from the depth buffer @SINCE_1_1.38
+  AUTO, ///< Renderer only reads from the depth buffer if in a 3D layer @SINCE_1_1.38
+  ON    ///< Renderer reads from the depth buffer based on the DepthFunction @SINCE_1_1.38
+};
+
+} // namespace DepthTestMode
+
 namespace DepthFunction
 {
 
@@ -136,7 +151,6 @@ namespace DepthFunction
  */
 enum Type
 {
-  OFF,          ///< Depth test is disabled
   NEVER,        ///< Depth test never passes
   ALWAYS,       ///< Depth test always passes
   LESS,         ///< Depth test passes if the incoming depth value is less than the stored depth value
@@ -253,7 +267,15 @@ public:
        * @see DepthFunction
        * @note The default value is DepthFunction::LESS
        */
-      DEPTH_FUNCTION
+      DEPTH_FUNCTION,
+
+      /**
+       * @brief name "depthTestMode", type INTEGER
+       * @see DepthTestMode
+       * @note The default value is DepthTestMode::AUTO
+       * @SINCE_1_1.38
+       */
+      DEPTH_TEST_MODE
     };
   };
 
index e1b9a89848065b57c0a6bbeceae1030f4975a31c..04e36f0040f89e5b54f43e73ecc64ddee75fa4de 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_TYPE_ABSTRACTION_ENUMS_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -31,6 +31,7 @@ namespace Internal
 template <> struct ParameterType< Dali::FaceCullingMode::Type > : public BasicType< Dali::FaceCullingMode::Type > {};
 template <> struct ParameterType< Dali::BlendMode::Type > : public BasicType< Dali::BlendMode::Type > {};
 template <> struct ParameterType< Dali::DepthWriteMode::Type > : public BasicType< Dali::DepthWriteMode::Type > {};
+template <> struct ParameterType< Dali::DepthTestMode::Type > : public BasicType< Dali::DepthTestMode::Type > {};
 template <> struct ParameterType< Dali::DepthFunction::Type > : public BasicType< Dali::DepthFunction::Type > {};
 
 } //namespace Internal
index 078d16ae1b1c45b5da65115e5143da328a418595..7051f99e0724cab2927799767dc2fc6c008ea87d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -118,14 +118,14 @@ LayerPtr Layer::NewRoot( LayerList& layerList, UpdateManager& manager, bool syst
 
 Layer::Layer( Actor::DerivedType type )
 : Actor( type ),
-  mLayerList(NULL),
-  mClippingBox(0,0,0,0),
-  mSortFunction(Layer::ZValue),
-  mBehavior(Dali::Layer::LAYER_2D),
-  mIsClipping(false),
-  mDepthTestDisabled(false),
-  mTouchConsumed(false),
-  mHoverConsumed(false)
+  mLayerList( NULL ),
+  mClippingBox( 0, 0, 0, 0 ),
+  mSortFunction( Layer::ZValue ),
+  mBehavior( Dali::Layer::LAYER_2D ),
+  mIsClipping( false ),
+  mDepthTestDisabled( true ),
+  mTouchConsumed( false ),
+  mHoverConsumed( false )
 {
 }
 
@@ -224,8 +224,10 @@ void Layer::SetBehavior( Dali::Layer::Behavior behavior )
 {
   mBehavior = behavior;
 
-  // notify update side object
+  // Notify update side object.
   SetBehaviorMessage( GetEventThreadServices(), GetSceneLayerOnStage(), behavior );
+  // By default, disable depth test for LAYER_2D, and enable for LAYER_3D.
+  SetDepthTestDisabled( mBehavior == Dali::Layer::LAYER_2D );
 }
 
 void Layer::SetClipping(bool enabled)
@@ -269,7 +271,7 @@ void Layer::SetDepthTestDisabled( bool disable )
   {
     mDepthTestDisabled = disable;
 
-    // Send message .....
+    // Send message.
     // layerNode is being used in a separate thread; queue a message to set the value
     SetDepthTestDisabledMessage( GetEventThreadServices(), GetSceneLayerOnStage(), mDepthTestDisabled );
   }
@@ -277,7 +279,7 @@ void Layer::SetDepthTestDisabled( bool disable )
 
 bool Layer::IsDepthTestDisabled() const
 {
-  return mDepthTestDisabled || (mBehavior == Dali::Layer::LAYER_2D);
+  return mDepthTestDisabled;
 }
 
 void Layer::SetSortFunction(Dali::Layer::SortFunctionType function)
index 301a0ff09e56d2da84201c4c346ba810bb7e9ae7..5ea8e2b6ed5a282568147e4ca3510f6fd6484cb3 100644 (file)
@@ -55,6 +55,7 @@ DALI_PROPERTY( "indexRangeFirst",                 INTEGER,   true, false,  false
 DALI_PROPERTY( "indexRangeCount",                 INTEGER,   true, false,  false, Dali::Renderer::Property::INDEX_RANGE_COUNT )
 DALI_PROPERTY( "depthWriteMode",                  INTEGER,   true, false,  false, Dali::Renderer::Property::DEPTH_WRITE_MODE )
 DALI_PROPERTY( "depthFunction",                   INTEGER,   true, false,  false, Dali::Renderer::Property::DEPTH_FUNCTION )
+DALI_PROPERTY( "depthTestMode",                   INTEGER,   true, false,  false, Dali::Renderer::Property::DEPTH_TEST_MODE )
 DALI_PROPERTY_TABLE_END( DEFAULT_OBJECT_PROPERTY_START_INDEX )
 
 const ObjectImplHelper<DEFAULT_PROPERTY_COUNT> RENDERER_IMPL = { DEFAULT_PROPERTY_DETAILS };
@@ -471,7 +472,6 @@ void Renderer::SetDefaultProperty( Property::Index index,
         mDepthWriteMode = mode;
         SetDepthWriteModeMessage( GetEventThreadServices(), *mSceneObject, mode );
       }
-
       break;
     }
     case Dali::Renderer::Property::DEPTH_FUNCTION:
@@ -484,7 +484,18 @@ void Renderer::SetDefaultProperty( Property::Index index,
         mDepthFunction = depthFunction;
         SetDepthFunctionMessage( GetEventThreadServices(), *mSceneObject, depthFunction );
       }
-
+      break;
+    }
+    case Dali::Renderer::Property::DEPTH_TEST_MODE:
+    {
+      int value;
+      propertyValue.Get( value );
+      DepthTestMode::Type mode = static_cast<DepthTestMode::Type>(value);
+      if( mode != mDepthTestMode )
+      {
+        mDepthTestMode = mode;
+        SetDepthTestModeMessage( GetEventThreadServices(), *mSceneObject, mode );
+      }
       break;
     }
   }
@@ -605,6 +616,11 @@ Property::Value Renderer::GetDefaultProperty( Property::Index index ) const
       value = mDepthFunction;
       break;
     }
+    case Dali::Renderer::Property::DEPTH_TEST_MODE:
+    {
+      value = mDepthTestMode;
+      break;
+    }
   }
   return value;
 }
@@ -695,6 +711,7 @@ Renderer::Renderer()
   mBlendingOptions(),
   mDepthWriteMode( DepthWriteMode::AUTO ),
   mDepthFunction( DepthFunction::LESS ),
+  mDepthTestMode( DepthTestMode::AUTO ),
   mPremultipledAlphaEnabled( false )
 {
 }
index 2b3686d500b1776d2b202494cccdff511c073dd6..9e4dc45343f42482e6247ec94429dcad1c282432 100644 (file)
@@ -319,6 +319,7 @@ private: // data
   BlendingOptions mBlendingOptions;                 ///< Local copy of blending options bitmask
   Dali::DepthWriteMode::Type mDepthWriteMode;       ///< Local copy of depth write mode
   Dali::DepthFunction::Type mDepthFunction;         ///< Local copy of depth function
+  Dali::DepthTestMode::Type mDepthTestMode;         ///< Local copy of depth test mode
 
   bool mPremultipledAlphaEnabled : 1;               ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
 };
index e67f985ba823677d641ed5e21df44d0e246e5951..695a57440f51a5b0a875bceef7e3f10e4805732b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -24,6 +24,7 @@
 #include <dali/internal/render/common/render-instruction.h>
 #include <dali/internal/render/gl-resources/context.h>
 #include <dali/internal/render/renderers/render-renderer.h>
+#include <dali/internal/update/nodes/scene-graph-layer.h>
 
 using Dali::Internal::SceneGraph::RenderItem;
 using Dali::Internal::SceneGraph::RenderList;
@@ -39,70 +40,12 @@ namespace Internal
 namespace Render
 {
 
-/**
- * Helper to set the depth function
- * @param[in] context The GL context
- * @param[in] depthFunction The depth function
- */
-inline void SetDepthFunction( Context& context, DepthFunction::Type depthFunction )
+namespace
 {
-  switch( depthFunction )
-  {
-    case DepthFunction::OFF:
-    {
-      context.EnableDepthBuffer( false );
-      break;
-    }
-    case DepthFunction::NEVER:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_NEVER );
-      break;
-    }
-    case DepthFunction::ALWAYS:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_ALWAYS );
-      break;
-    }
-    case DepthFunction::LESS:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_LESS );
-      break;
-    }
-    case DepthFunction::GREATER:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_GREATER );
-      break;
-    }
-    case DepthFunction::EQUAL:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_EQUAL );
-      break;
-    }
-    case DepthFunction::NOT_EQUAL:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_NOTEQUAL );
-      break;
-    }
-    case DepthFunction::LESS_EQUAL:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_LEQUAL );
-      break;
-    }
-    case DepthFunction::GREATER_EQUAL:
-    {
-      context.EnableDepthBuffer( true );
-      context.DepthFunc( GL_GEQUAL );
-      break;
-    }
-  }
-}
+// Table for fast look-up of Dali::DepthFunction enum to a GL depth function.
+// Note: These MUST be in the same order as Dali::DepthFunction enum.
+const short DaliDepthToGLDepthTable[] = { GL_NEVER, GL_ALWAYS, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_LEQUAL, GL_GEQUAL };
+} // Unnamed namespace
 
 /**
  * Sets up the scissor test if required.
@@ -126,28 +69,16 @@ inline void SetScissorTest( const RenderList& renderList, Context& context )
 }
 
 /**
- * Sets the render flags for depth testing and stencil buffer
- *
+ * Sets the render flags for the stencil buffer and clears all required buffers (depth and stencil if required).
  * @param[in] renderList The render list from which to get the render flags
  * @param[in] context The context
+ * @param[in] depthTestEnabled True if depth test is enabled for the layer
+ * @param[in] isLayer3D True if the layer is a 3D layer
  */
-inline void SetRenderFlags( const RenderList& renderList, Context& context )
+inline void SetRenderFlags( const RenderList& renderList, Context& context, bool depthTestEnabled, bool isLayer3D )
 {
   const unsigned int renderFlags = renderList.GetFlags();
-
-  if( ( renderFlags & RenderList::DEPTH_BUFFER_ENABLED ) != 0u )
-  {
-    //Enable depth testing
-    context.EnableDepthBuffer( true );
-  }
-  else
-  {
-    //Disable depth test and depth write
-    context.EnableDepthBuffer( false );
-    context.DepthMask( false );
-  }
-
-  GLbitfield clearMask   = ( renderFlags & RenderList::DEPTH_CLEAR ) ? GL_DEPTH_BUFFER_BIT : 0u;
+  GLbitfield clearMask = 0u;
 
   // Stencil enabled, writing, and clearing...
   const bool enableStencilBuffer( renderFlags & RenderList::STENCIL_BUFFER_ENABLED );
@@ -155,24 +86,66 @@ inline void SetRenderFlags( const RenderList& renderList, Context& context )
   context.EnableStencilBuffer( enableStencilBuffer );
   if( enableStencilBuffer )
   {
-    context.StencilFunc( (enableStencilWrite ? GL_ALWAYS : GL_EQUAL), 1, 0xFF );
-    context.StencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
+    context.StencilFunc( ( enableStencilWrite ? GL_ALWAYS : GL_EQUAL ), 1, 0xFF );
+    context.StencilOp( GL_KEEP, GL_REPLACE, GL_REPLACE );
 
-    clearMask |= (renderFlags & RenderList::STENCIL_CLEAR) ? GL_STENCIL_BUFFER_BIT : 0u;
+    clearMask |= ( renderFlags & RenderList::STENCIL_CLEAR ) ? GL_STENCIL_BUFFER_BIT : 0u;
   }
 
   // Write to stencil buffer or color buffer, but not both
   context.StencilMask( enableStencilWrite ? 0xFF : 0x00 );
   context.ColorMask( !enableStencilWrite );
 
-  // Clear depth and/or stencil buffer.
-  if( clearMask )
+  // Enable and Clear the depth buffer if required.
+  // DepthTest must be enabled for the layer, else testing is turned off.
+  if( !depthTestEnabled )
+  {
+    context.EnableDepthBuffer( false );
+  }
+  else if( renderList.HasColorRenderItems() || isLayer3D ) // Also, within the context of this if(), depth test is enabled.
   {
-    // only clear if the depth and/or stencil buffer have been written to after a previous clear
-    context.Clear( clearMask, Context::CHECK_CACHED_VALUES );
+
+    clearMask |= GL_DEPTH_BUFFER_BIT;
+    // We need to enable the depth buffer to clear it.
+    // Subsequently it is enabled and disabled on a per-RenderItem basis.
+    // If we do not have color renderers, this is only done for 3D layers.
+    context.EnableDepthBuffer( true );
   }
+
+  // Clear Depth and/or stencil buffers as required.
+  // Note: The buffers will only be cleared if written to since a previous clear.
+  context.Clear( clearMask, Context::CHECK_CACHED_VALUES );
 }
 
+/**
+ * Sets up the depth buffer for reading and writing based on the current render item.
+ * The items read and write mode are used if specified.
+ * If AUTO is selected for reading, the decision will be based on the Layer Behavior.
+ * If AUTO is selected for writing, the decision will be based on the items opacity.
+ * @param item The RenderItem to set up the depth buffer for
+ * @param context The context used to execute GL commands.
+ * @param isLayer3D True if the layer behavior is set to LAYER_3D
+ */
+inline void SetupDepthBuffer( const RenderItem& item, Context& context, bool isLayer3D )
+{
+  // Set up whether or not to write to the depth buffer.
+  const DepthWriteMode::Type depthWriteMode = item.mRenderer->GetDepthWriteMode();
+  // Most common mode (AUTO) is tested first.
+  bool enableDepthWrite = ( ( depthWriteMode == DepthWriteMode::AUTO ) && item.mIsOpaque ) ||
+                          ( depthWriteMode == DepthWriteMode::ON );
+  context.DepthMask( enableDepthWrite );
+
+  // Set up whether or not to read from (test) the depth buffer.
+  const DepthTestMode::Type depthTestMode = item.mRenderer->GetDepthTestMode();
+  // Most common mode (AUTO) is tested first.
+  bool enableDepthTest = ( ( depthTestMode == DepthTestMode::AUTO ) && isLayer3D ) ||
+                         ( depthTestMode == DepthTestMode::ON );
+  // Look-up the GL depth function from the Dali::DepthFunction enum, and set it.
+  context.DepthFunc( DaliDepthToGLDepthTable[ item.mRenderer->GetDepthFunction() ] );
+
+  // The depth buffer must be enabled if either reading or writing.
+  context.EnableDepthBuffer( enableDepthWrite || enableDepthTest );
+}
 
 /**
  * Process a render-list.
@@ -194,39 +167,25 @@ inline void ProcessRenderList(
 {
   DALI_PRINT_RENDER_LIST( renderList );
 
+  bool depthTestEnabled = !( renderList.GetSourceLayer()->IsDepthTestDisabled() );
+  bool isLayer3D = renderList.GetSourceLayer()->GetBehavior() == Dali::Layer::LAYER_3D;
+
   SetScissorTest( renderList, context );
-  SetRenderFlags( renderList, context );
+  SetRenderFlags( renderList, context, depthTestEnabled, isLayer3D );
 
-  if( renderList.HasColorRenderItems() )
+  // The Layers depth enabled flag overrides the per-renderer depth flags.
+  // So if depth test is disabled at the layer level, we ignore per-render flags.
+  // Note: Overlay renderers will not read or write from the depth buffer.
+  if( DALI_LIKELY( !renderList.HasColorRenderItems() || !depthTestEnabled ) )
   {
-    bool depthBufferEnabled = ( ( renderList.GetFlags() & RenderList::DEPTH_BUFFER_ENABLED ) != 0u );
     size_t count = renderList.Count();
-
-    if( depthBufferEnabled )
+    for ( size_t index = 0; index < count; ++index )
     {
-      for ( size_t index = 0; index < count; ++index )
-      {
-        const RenderItem& item = renderList.GetItem( index );
-        DALI_PRINT_RENDER_ITEM( item );
-
-        DepthWriteMode::Type depthWriteMode = item.mRenderer->GetDepthWriteMode();
-        context.DepthMask( ( depthWriteMode == DepthWriteMode::AUTO && item.mIsOpaque ) ||
-                           ( depthWriteMode == DepthWriteMode::ON ) );
+      const RenderItem& item = renderList.GetItem( index );
+      DALI_PRINT_RENDER_ITEM( item );
 
-        SetDepthFunction( context, item.mRenderer->GetDepthFunction() );
-        item.mRenderer->Render( context, textureCache, bufferIndex, *item.mNode, defaultShader,
-                                item.mModelMatrix, item.mModelViewMatrix, viewMatrix, projectionMatrix, item.mSize, !item.mIsOpaque );
-      }
-    }
-    else
-    {
-      for ( size_t index = 0; index < count; ++index )
-      {
-        const RenderItem& item = renderList.GetItem( index );
-        DALI_PRINT_RENDER_ITEM( item );
-        item.mRenderer->Render( context, textureCache, bufferIndex, *item.mNode, defaultShader,
-                                item.mModelMatrix, item.mModelViewMatrix, viewMatrix, projectionMatrix, item.mSize, !item.mIsOpaque );
-      }
+      item.mRenderer->Render( context, textureCache, bufferIndex, *item.mNode, defaultShader,
+                              item.mModelMatrix, item.mModelViewMatrix, viewMatrix, projectionMatrix, item.mSize, !item.mIsOpaque );
     }
   }
   else
@@ -237,10 +196,12 @@ inline void ProcessRenderList(
       const RenderItem& item = renderList.GetItem( index );
       DALI_PRINT_RENDER_ITEM( item );
 
+      // Set up the depth buffer based on per-renderer flags.
+      SetupDepthBuffer( item, context, isLayer3D );
+
       item.mRenderer->Render( context, textureCache, bufferIndex, *item.mNode, defaultShader,
                               item.mModelMatrix, item.mModelViewMatrix, viewMatrix, projectionMatrix, item.mSize, !item.mIsOpaque );
     }
-
   }
 }
 
index dc82202a1810208cc63c4854bd1a2d11310ec648..d5f1165e965195aa87de1d38c6e3a0bef25a13be 100644 (file)
@@ -80,21 +80,6 @@ void PrintRenderList( const RenderList& list )
   {
     debugStream << " with:";
 
-    if( flags & RenderList::DEPTH_BUFFER_ENABLED )
-    {
-      debugStream << " DEPTH_TEST";
-    }
-
-    if( flags & RenderList::DEPTH_WRITE )
-    {
-      debugStream << " DEPTH_WRITE";
-    }
-
-    if( flags & RenderList::DEPTH_CLEAR )
-    {
-      debugStream << " DEPTH_CLEAR";
-    }
-
     if( flags & RenderList::STENCIL_BUFFER_ENABLED )
     {
       debugStream << " STENCIL_TEST";
@@ -112,7 +97,7 @@ void PrintRenderList( const RenderList& list )
   }
   else
   {
-    debugStream << " without any DEPTH_TEST, DEPTH_WRITE etc";
+    debugStream << " without any STENCIL settings";
   }
 
   if( list.IsClipping() )
index 4f509c6a3f10421ee16985c7ba6999265b47eaa1..734ad0f06a0947d603fab575a01b354620952f28 100644 (file)
@@ -55,22 +55,13 @@ struct RenderList
 public:
 
   /**
-   * The RenderFlags describe how the objects are rendered using the depth and stencil buffer.
-   *
-   * The flags which relate to GL_DEPTH_TEST and GL_STENCIL_TEST are called
-   * DEPTH_BUFFER_ENABLED and STENCIL_BUFFER_ENABLED to avoid any confusion.
-   * E.g. if GL_DEPTH_TEST is not enabled you can't write to the depth buffer, which can cause confusion.
-   *
+   * The RenderFlags describe how the objects are rendered using the stencil buffer.
    */
   enum RenderFlags
   {
-    DEPTH_BUFFER_ENABLED   = 1 << 0, ///< If depth buffer should be used for writing / test operations
-    DEPTH_WRITE            = 1 << 1, ///< If the depth buffer is writable
-    DEPTH_CLEAR            = 1 << 2, ///< If the depth buffer should first be cleared
-    STENCIL_BUFFER_ENABLED = 1 << 3, ///< If stencil buffer should be used for writing / test operation
-    STENCIL_WRITE          = 1 << 4, ///< If the stencil buffer is writable
-    STENCIL_CLEAR          = 1 << 5, ///< If the stencil buffer should first be cleared
-
+    STENCIL_BUFFER_ENABLED = 1 << 0, ///< If stencil buffer should be used for writing / test operation
+    STENCIL_WRITE          = 1 << 1, ///< If the stencil buffer is writable
+    STENCIL_CLEAR          = 1 << 2, ///< If the stencil buffer should first be cleared
   };
 
   /**
@@ -273,13 +264,13 @@ public:
   /**
    * @return the source layer these renderitems originate from
    */
-  Layer* GetSourceLayer()
+  Layer* GetSourceLayer() const
   {
     return mSourceLayer;
   }
 
   /**
-   * @param layer these renderitems originate from
+   * @param layer The layer these RenderItems originate from
    */
   void SetSourceLayer( Layer* layer )
   {
index 2c44c52f45e9433c54ccf4dc086b16eeab77c127..ab653044db32cf2a0940500a2625ecaf85fd264c 100644 (file)
@@ -117,9 +117,10 @@ Renderer* Renderer::New( SceneGraph::RenderDataProvider* dataProvider,
                          FaceCullingMode::Type faceCullingMode,
                          bool preMultipliedAlphaEnabled,
                          DepthWriteMode::Type depthWriteMode,
+                         DepthTestMode::Type depthTestMode,
                          DepthFunction::Type depthFunction )
 {
-  return new Renderer( dataProvider, geometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled, depthWriteMode, depthFunction );
+  return new Renderer( dataProvider, geometry, blendingBitmask, blendColor, faceCullingMode, preMultipliedAlphaEnabled, depthWriteMode, depthTestMode, depthFunction );
 }
 
 Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
@@ -129,6 +130,7 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
                     FaceCullingMode::Type faceCullingMode,
                     bool preMultipliedAlphaEnabled,
                     DepthWriteMode::Type depthWriteMode,
+                    DepthTestMode::Type depthTestMode,
                     DepthFunction::Type depthFunction )
 : mRenderDataProvider( dataProvider ),
   mContext(NULL),
@@ -138,11 +140,12 @@ Renderer::Renderer( SceneGraph::RenderDataProvider* dataProvider,
   mUniformIndexMap(),
   mAttributesLocation(),
   mBlendingOptions(),
-  mFaceCullingMode( faceCullingMode  ),
-  mDepthWriteMode( depthWriteMode ),
+  mFaceCullingMode( faceCullingMode ),
   mDepthFunction( depthFunction ),
   mIndexedDrawFirstElement( 0 ),
   mIndexedDrawElementsCount( 0 ),
+  mDepthWriteMode( depthWriteMode ),
+  mDepthTestMode( depthTestMode ),
   mUpdateAttributesLocation( true ),
   mPremultipledAlphaEnabled( preMultipliedAlphaEnabled )
 {
@@ -445,11 +448,21 @@ void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode )
   mDepthWriteMode = depthWriteMode;
 }
 
+void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode )
+{
+  mDepthTestMode = depthTestMode;
+}
+
 DepthWriteMode::Type Renderer::GetDepthWriteMode() const
 {
   return mDepthWriteMode;
 }
 
+DepthTestMode::Type Renderer::GetDepthTestMode() const
+{
+  return mDepthTestMode;
+}
+
 void Renderer::SetDepthFunction( DepthFunction::Type depthFunction )
 {
   mDepthFunction = depthFunction;
index 9fbe5ab7d3650eebe34fad01c16d379e8ab94e1d..2faf69b7e350209a11aa77dd208c239fca98a982 100644 (file)
@@ -83,6 +83,7 @@ public:
    * @param[in] faceCullingMode The face-culling mode.
    * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
    * @param[in] depthWriteMode Depth buffer write mode
+   * @param[in] depthTestMode Depth buffer test mode
    * @param[in] depthFunction Depth function
    */
   static Renderer* New( SceneGraph::RenderDataProvider* dataProviders,
@@ -92,6 +93,7 @@ public:
                         FaceCullingMode::Type faceCullingMode,
                         bool preMultipliedAlphaEnabled,
                         DepthWriteMode::Type depthWriteMode,
+                        DepthTestMode::Type depthTestMode,
                         DepthFunction::Type depthFunction );
 
   /**
@@ -103,6 +105,7 @@ public:
    * @param[in] faceCullingMode The face-culling mode.
    * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
    * @param[in] depthWriteMode Depth buffer write mode
+   * @param[in] depthTestMode Depth buffer test mode
    * @param[in] depthFunction Depth function
    */
   Renderer( SceneGraph::RenderDataProvider* dataProviders,
@@ -112,6 +115,7 @@ public:
             FaceCullingMode::Type faceCullingMode,
             bool preMultipliedAlphaEnabled,
             DepthWriteMode::Type depthWriteMode,
+            DepthTestMode::Type depthTestMode,
             DepthFunction::Type depthFunction );
 
   /**
@@ -188,6 +192,18 @@ public:
    */
   DepthWriteMode::Type GetDepthWriteMode() const;
 
+  /**
+   * Sets the depth test mode
+   * @param[in] depthTestMode The depth test mode
+   */
+  void SetDepthTestMode( DepthTestMode::Type depthTestMode );
+
+  /**
+   * Query the Renderer's depth test mode
+   * @return The renderer depth test mode
+   */
+  DepthTestMode::Type GetDepthTestMode() const;
+
   /**
    * Sets the depth function
    * @param[in] depthFunction The depth function
@@ -296,14 +312,16 @@ private:
 
   BlendingOptions       mBlendingOptions; /// Blending options including blend color, blend func and blend equation
   FaceCullingMode::Type mFaceCullingMode; /// Mode of face culling
-  DepthWriteMode::Type  mDepthWriteMode;  /// Depth write mode
   DepthFunction::Type   mDepthFunction;   /// Depth function
 
-  size_t mIndexedDrawFirstElement;                  /// Offset of first element to draw
-  size_t mIndexedDrawElementsCount;                 /// Number of elements to draw
+  size_t mIndexedDrawFirstElement;        /// Offset of first element to draw
+  size_t mIndexedDrawElementsCount;       /// Number of elements to draw
+
+  DepthWriteMode::Type mDepthWriteMode:2; /// Depth write mode
+  DepthTestMode::Type mDepthTestMode:2;   /// Depth test mode
 
-  bool mUpdateAttributesLocation:1;                 ///< Indicates attribute locations have changed
-  bool mPremultipledAlphaEnabled:1;                 ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
+  bool mUpdateAttributesLocation:1;       ///< Indicates attribute locations have changed
+  bool mPremultipledAlphaEnabled:1;       ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
 };
 
 } // namespace SceneGraph
index 53042c953dff1523ee04e12935849b9f998c4db7..76603b9840b807dbba9da7400888426537a9177b 100644 (file)
@@ -345,6 +345,7 @@ inline void AddColorRenderers( BufferIndex updateBufferIndex,
 {
   RenderList& renderList = instruction.GetNextFreeRenderList( layer.colorRenderables.Size() );
   renderList.SetClipping( layer.IsClipping(), layer.GetClippingBox() );
+  renderList.SetSourceLayer( &layer );
   renderList.SetHasColorRenderItems( true );
 
   // try to reuse cached renderitems from last time around
@@ -359,30 +360,13 @@ inline void AddColorRenderers( BufferIndex updateBufferIndex,
   AddRenderersToRenderList( updateBufferIndex, renderList, layer.colorRenderables, viewMatrix, camera, layer.GetBehavior() == Dali::Layer::LAYER_3D, cull );
   SortRenderItems( updateBufferIndex, renderList, layer, sortingHelper );
 
-  //Set render flags
-  unsigned int flags = 0u;
+  // Setup the render flags for stencil.
+  renderList.ClearFlags();
   if( stencilRenderablesExist )
   {
-    flags = RenderList::STENCIL_BUFFER_ENABLED;
-  }
-
-  // Special optimization. If this layer has got exactly one renderer
-  // and this renderer is not writing to the depth buffer there is no point on enabling
-  // depth buffering
-  if ( ( renderList.Count() == 1 ) &&
-       (( renderList.GetRenderer( 0 ).GetDepthWriteMode() == DepthWriteMode::OFF ) ||
-        ( renderList.GetRenderer( 0 ).GetDepthWriteMode() == DepthWriteMode::AUTO && !renderList.GetItem(0).mIsOpaque )))
-  {
-    //Nothing to do here
+    // Note: SetFlags does not overwrite, it ORs, so ClearFlags() is also required.
+    renderList.SetFlags( RenderList::STENCIL_BUFFER_ENABLED );
   }
-  else if( !layer.IsDepthTestDisabled())
-  {
-    flags |= RenderList::DEPTH_BUFFER_ENABLED;
-    flags |= RenderList::DEPTH_CLEAR;
-  }
-
-  renderList.ClearFlags();
-  renderList.SetFlags( flags );
 }
 
 /**
@@ -408,6 +392,7 @@ inline void AddOverlayRenderers( BufferIndex updateBufferIndex,
 {
   RenderList& overlayRenderList = instruction.GetNextFreeRenderList( layer.overlayRenderables.Size() );
   overlayRenderList.SetClipping( layer.IsClipping(), layer.GetClippingBox() );
+  overlayRenderList.SetSourceLayer( &layer );
   overlayRenderList.SetHasColorRenderItems( false );
 
   //Set render flags
@@ -449,6 +434,7 @@ inline void AddStencilRenderers( BufferIndex updateBufferIndex,
 {
   RenderList& stencilRenderList = instruction.GetNextFreeRenderList( layer.stencilRenderables.Size() );
   stencilRenderList.SetClipping( layer.IsClipping(), layer.GetClippingBox() );
+  stencilRenderList.SetSourceLayer( &layer );
   stencilRenderList.SetHasColorRenderItems( false );
 
   //Set render flags
index 3540e010e50bb50583599bf72bb7cd8eb677c98d..1d920be6d1a5d3ebe9668d876250470757b262a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 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.
@@ -42,7 +42,7 @@ Layer::Layer()
   mLastCamera( NULL ),
   mBehavior( Dali::Layer::LAYER_2D ),
   mIsClipping( false ),
-  mDepthTestDisabled( false ),
+  mDepthTestDisabled( true ),
   mIsDefaultSortFunction( true )
 {
   // layer starts off dirty
@@ -97,7 +97,7 @@ void Layer::SetDepthTestDisabled( bool disable )
 
 bool Layer::IsDepthTestDisabled() const
 {
-  return ( mBehavior == Dali::Layer::LAYER_2D ) || mDepthTestDisabled;
+  return mDepthTestDisabled;
 }
 
 void Layer::ClearRenderables()
index 1d7adcaaa024b30f6eb89fcb14a44d615ab4b44c..a6b720bc28993395287d5076f9c8a2ed2d940c3f 100644 (file)
@@ -89,16 +89,17 @@ void AddMappings( Dali::Internal::SceneGraph::CollectedUniformMap& localMap, con
 // flags for resending data to renderer
 enum Flags
 {
-  RESEND_DATA_PROVIDER = 1,
-  RESEND_GEOMETRY = 1 << 1,
-  RESEND_FACE_CULLING_MODE = 1 << 2,
-  RESEND_BLEND_COLOR = 1 << 3,
-  RESEND_BLEND_BIT_MASK = 1 << 4,
-  RESEND_PREMULTIPLIED_ALPHA = 1 << 5,
-  RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 6,
+  RESEND_DATA_PROVIDER               = 1,
+  RESEND_GEOMETRY                    = 1 << 1,
+  RESEND_FACE_CULLING_MODE           = 1 << 2,
+  RESEND_BLEND_COLOR                 = 1 << 3,
+  RESEND_BLEND_BIT_MASK              = 1 << 4,
+  RESEND_PREMULTIPLIED_ALPHA         = 1 << 5,
+  RESEND_INDEXED_DRAW_FIRST_ELEMENT  = 1 << 6,
   RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 7,
-  RESEND_DEPTH_WRITE_MODE = 1 << 8,
-  RESEND_DEPTH_FUNCTION = 1 << 9,
+  RESEND_DEPTH_WRITE_MODE            = 1 << 8,
+  RESEND_DEPTH_TEST_MODE             = 1 << 9,
+  RESEND_DEPTH_FUNCTION              = 1 << 10,
 };
 
 }
@@ -116,26 +117,27 @@ Renderer* Renderer::New()
 }
 
 Renderer::Renderer()
-:mSceneController( 0 ),
- mRenderer( NULL ),
- mTextureSet( NULL ),
- mGeometry( NULL ),
- mShader( NULL ),
- mBlendColor( NULL ),
- mBlendBitmask( 0u ),
- mFaceCullingMode( FaceCullingMode::NONE ),
- mBlendMode( BlendMode::AUTO ),
- mDepthWriteMode( DepthWriteMode::AUTO ),
- mDepthFunction( DepthFunction::LESS ),
- mIndexedDrawFirstElement( 0 ),
- mIndexedDrawElementsCount( 0 ),
- mReferenceCount( 0 ),
- mRegenerateUniformMap( 0 ),
- mResendFlag( 0 ),
- mResourcesReady( false ),
- mFinishedResourceAcquisition( false ),
- mPremultipledAlphaEnabled(false),
- mDepthIndex( 0 )
+: mSceneController( 0 ),
+  mRenderer( NULL ),
+  mTextureSet( NULL ),
+  mGeometry( NULL ),
+  mShader( NULL ),
+  mBlendColor( NULL ),
+  mIndexedDrawFirstElement( 0u ),
+  mIndexedDrawElementsCount( 0u ),
+  mBlendBitmask( 0u ),
+  mReferenceCount( 0u ),
+  mRegenerateUniformMap( 0u ),
+  mResendFlag( 0u ),
+  mDepthFunction( DepthFunction::LESS ),
+  mFaceCullingMode( FaceCullingMode::NONE ),
+  mBlendMode( BlendMode::AUTO ),
+  mDepthWriteMode( DepthWriteMode::AUTO ),
+  mDepthTestMode( DepthTestMode::AUTO ),
+  mResourcesReady( false ),
+  mFinishedResourceAcquisition( false ),
+  mPremultipledAlphaEnabled( false ),
+  mDepthIndex( 0 )
 {
   mUniformMapChanged[0] = false;
   mUniformMapChanged[1] = false;
@@ -289,6 +291,13 @@ void Renderer::PrepareRender( BufferIndex updateBufferIndex )
       new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthWriteMode, mDepthWriteMode );
     }
 
+    if( mResendFlag & RESEND_DEPTH_TEST_MODE )
+    {
+      typedef MessageValue1< Render::Renderer, DepthTestMode::Type > DerivedType;
+      unsigned int* slot = mSceneController->GetRenderQueue().ReserveMessageSlot( updateBufferIndex, sizeof( DerivedType ) );
+      new (slot) DerivedType( mRenderer, &Render::Renderer::SetDepthTestMode, mDepthTestMode );
+    }
+
     if( mResendFlag & RESEND_DEPTH_FUNCTION )
     {
       typedef MessageValue1< Render::Renderer, DepthFunction::Type > DerivedType;
@@ -404,6 +413,12 @@ void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode )
   mResendFlag |= RESEND_DEPTH_WRITE_MODE;
 }
 
+void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode )
+{
+  mDepthTestMode = depthTestMode;
+  mResendFlag |= RESEND_DEPTH_TEST_MODE;
+}
+
 void Renderer::SetDepthFunction( DepthFunction::Type depthFunction )
 {
   mDepthFunction = depthFunction;
@@ -423,6 +438,7 @@ void Renderer::OnStageConnect()
                                        static_cast< FaceCullingMode::Type >( mFaceCullingMode ),
                                        mPremultipledAlphaEnabled,
                                        mDepthWriteMode,
+                                       mDepthTestMode,
                                        mDepthFunction );
 
     mSceneController->GetRenderMessageDispatcher().AddRenderer( *mRenderer );
index 34d3606b012f1f86cf7f29365a0ecd4605dc52dd..931f2fdc097c74f111a955a4bb48160fec6071e9 100644 (file)
@@ -173,6 +173,12 @@ public:
    */
   void SetDepthWriteMode( DepthWriteMode::Type depthWriteMode );
 
+  /**
+   * Sets the depth buffer test mode
+   * @param[in] depthTestMode The depth buffer test mode
+   */
+  void SetDepthTestMode( DepthTestMode::Type depthTestMode );
+
   /**
    * Sets the depth function
    * @param[in] depthFunction The depth function
@@ -319,34 +325,35 @@ private:
 
 private:
 
-  SceneController*   mSceneController; ///< Used for initializing renderers
-  Render::Renderer*  mRenderer;        ///< Raw pointer to the renderer (that's owned by RenderManager)
-  TextureSet*        mTextureSet;      ///< The texture set this renderer uses. (Not owned)
-  Render::Geometry*  mGeometry;        ///< The geometry this renderer uses. (Not owned)
-  Shader*            mShader;
-
-  Vector4*              mBlendColor;      ///< The blend color for blending operation
-  unsigned int          mBlendBitmask;    ///< The bitmask of blending options
-  FaceCullingMode::Type mFaceCullingMode; ///< The mode of face culling
-  BlendMode::Type       mBlendMode;       ///< The mode of blending
-  DepthWriteMode::Type  mDepthWriteMode;  ///< The depth write mode
-  DepthFunction::Type   mDepthFunction;   ///< The depth function
-
-  CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer
-
-  size_t mIndexedDrawFirstElement;             ///< first element index to be drawn using indexed draw
-  size_t mIndexedDrawElementsCount;            ///< number of elements to be drawn using indexed draw
-  unsigned int mReferenceCount;                ///< Number of nodes currently using this renderer
-  unsigned int mRegenerateUniformMap;          ///< 2 if the map should be regenerated, 1 if it should be copied.
-  unsigned short mResendFlag;                  ///< Indicate whether data should be resent to the renderer
-  bool         mUniformMapChanged[2];          ///< Records if the uniform map has been altered this frame
-  bool         mResourcesReady;                ///< Set during the Update algorithm; true if the renderer has resources ready for the current frame.
-  bool         mFinishedResourceAcquisition;   ///< Set during DoPrepareResources; true if ready & all resource acquisition has finished (successfully or otherwise)
-  bool         mPremultipledAlphaEnabled : 1;  ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
-
+  CollectedUniformMap   mCollectedUniformMap[2];        ///< Uniform maps collected by the renderer
+  SceneController*      mSceneController;               ///< Used for initializing renderers
+  Render::Renderer*     mRenderer;                      ///< Raw pointer to the renderer (that's owned by RenderManager)
+  TextureSet*           mTextureSet;                    ///< The texture set this renderer uses. (Not owned)
+  Render::Geometry*     mGeometry;                      ///< The geometry this renderer uses. (Not owned)
+  Shader*               mShader;                        ///< The shader this renderer uses. (Not owned)
+  Vector4*              mBlendColor;                    ///< The blend color for blending operation
+
+  size_t                mIndexedDrawFirstElement;       ///< first element index to be drawn using indexed draw
+  size_t                mIndexedDrawElementsCount;      ///< number of elements to be drawn using indexed draw
+  unsigned int          mBlendBitmask;                  ///< The bitmask of blending options
+  unsigned int          mReferenceCount;                ///< Number of nodes currently using this renderer
+  unsigned int          mRegenerateUniformMap;          ///< 2 if the map should be regenerated, 1 if it should be copied.
+  unsigned short        mResendFlag;                    ///< Indicate whether data should be resent to the renderer
+
+  DepthFunction::Type   mDepthFunction:3;               ///< The depth function
+  FaceCullingMode::Type mFaceCullingMode:2;             ///< The mode of face culling
+  BlendMode::Type       mBlendMode:2;                   ///< The mode of blending
+  DepthWriteMode::Type  mDepthWriteMode:2;              ///< The depth write mode
+  DepthTestMode::Type   mDepthTestMode:2;               ///< The depth test mode
+
+  bool                  mUniformMapChanged[2];          ///< Records if the uniform map has been altered this frame
+  bool                  mResourcesReady;                ///< Set during the Update algorithm; true if the renderer has resources ready for the current frame.
+  bool                  mFinishedResourceAcquisition;   ///< Set during DoPrepareResources; true if ready & all resource acquisition has finished (successfully or otherwise)
+  bool                  mPremultipledAlphaEnabled:1;    ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
 
 public:
-  int mDepthIndex; ///< Used only in PrepareRenderInstructions
+
+  int                   mDepthIndex;                    ///< Used only in PrepareRenderInstructions
 };
 
 
@@ -475,6 +482,16 @@ inline void SetDepthWriteModeMessage( EventThreadServices& eventThreadServices,
   new (slot) LocalType( &renderer, &Renderer::SetDepthWriteMode, depthWriteMode );
 }
 
+inline void SetDepthTestModeMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DepthTestMode::Type depthTestMode )
+{
+  typedef MessageValue1< Renderer, DepthTestMode::Type > LocalType;
+
+  // Reserve some memory inside the message queue
+  unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
+
+  new (slot) LocalType( &renderer, &Renderer::SetDepthTestMode, depthTestMode );
+}
+
 inline void SetDepthFunctionMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DepthFunction::Type depthFunction )
 {
   typedef MessageValue1< Renderer, DepthFunction::Type > LocalType;