Revert "[Tizen] Move DevelHandle::GetCurrentProperty to public"
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Renderer.cpp
index 3bfbacf..240d1a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
  */
 
 // EXTERNAL INCLUDES
+#include <dali/devel-api/actors/actor-devel.h>
+
 #include <dali/public-api/dali-core.h>
 #include <dali/devel-api/images/texture-set-image.h>
+#include <dali/devel-api/object/handle-devel.h>
 #include <cstdio>
 #include <string>
 
@@ -991,15 +994,15 @@ int UtcDaliRendererConstraint01(void)
   application.Render(0);
 
   // Expect no blue component in either buffer - yellow
-  DALI_TEST_EQUALS( renderer.GetProperty<Vector4>(colorIndex), Color::YELLOW, TEST_LOCATION );
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( renderer, colorIndex ), Color::YELLOW, TEST_LOCATION );
   application.Render(0);
-  DALI_TEST_EQUALS( renderer.GetProperty<Vector4>(colorIndex), Color::YELLOW, TEST_LOCATION );
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( renderer, colorIndex ), Color::YELLOW, TEST_LOCATION );
 
   renderer.RemoveConstraints();
   renderer.SetProperty(colorIndex, Color::WHITE );
   application.SendNotification();
   application.Render(0);
-  DALI_TEST_EQUALS( renderer.GetProperty<Vector4>(colorIndex), Color::WHITE, TEST_LOCATION );
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( renderer, colorIndex ), Color::WHITE, TEST_LOCATION );
 
   END_TEST;
 }
@@ -1090,11 +1093,11 @@ int UtcDaliRendererAnimatedProperty01(void)
   application.SendNotification();
   application.Render(500);
 
-  DALI_TEST_EQUALS( renderer.GetProperty<Vector4>(colorIndex), Color::WHITE * 0.5f, TEST_LOCATION );
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( renderer, colorIndex ), Color::WHITE * 0.5f, TEST_LOCATION );
 
   application.Render(500);
 
-  DALI_TEST_EQUALS( renderer.GetProperty<Vector4>(colorIndex), Color::TRANSPARENT, TEST_LOCATION );
+  DALI_TEST_EQUALS( DevelHandle::GetCurrentProperty< Vector4 >( renderer, colorIndex ), Color::TRANSPARENT, TEST_LOCATION );
 
   END_TEST;
 }
@@ -1400,6 +1403,33 @@ int UtcDaliRendererUniformMapMultipleUniforms02(void)
   END_TEST;
 }
 
+
+Renderer CreateRenderer( Actor actor, Geometry geometry, Shader shader, int depthIndex )
+{
+  Image image0 = BufferImage::New( 64, 64, Pixel::RGB888 );
+  TextureSet textureSet0 = CreateTextureSet( image0 );
+  Renderer renderer0 = Renderer::New( geometry, shader );
+  renderer0.SetTextures( textureSet0 );
+  renderer0.SetProperty( Renderer::Property::DEPTH_INDEX, depthIndex );
+  actor.AddRenderer(renderer0);
+  return renderer0;
+}
+
+
+Actor CreateActor( Actor parent, int siblingOrder, const char* location )
+{
+  Actor actor0 = Actor::New();
+  actor0.SetAnchorPoint(AnchorPoint::CENTER);
+  actor0.SetParentOrigin(AnchorPoint::CENTER);
+  actor0.SetPosition(0.0f,0.0f);
+  actor0.SetSize(100, 100);
+  actor0.SetProperty( Dali::DevelActor::Property::SIBLING_ORDER, siblingOrder );
+  DALI_TEST_EQUALS( actor0.GetProperty<int>( Dali::DevelActor::Property::SIBLING_ORDER), siblingOrder, TEST_INNER_LOCATION(location) );
+  parent.Add(actor0);
+
+  return actor0;
+}
+
 int UtcDaliRendererRenderOrder2DLayer(void)
 {
   TestApplication application;
@@ -1408,59 +1438,20 @@ int UtcDaliRendererRenderOrder2DLayer(void)
   Shader shader = Shader::New("VertexSource", "FragmentSource");
   Geometry geometry = CreateQuadGeometry();
 
-  Actor actor0 = Actor::New();
-  actor0.SetAnchorPoint(AnchorPoint::CENTER);
-  actor0.SetParentOrigin(AnchorPoint::CENTER);
-  actor0.SetPosition(0.0f,0.0f);
-  Image image0 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet0 = CreateTextureSet( image0 );
-  Renderer renderer0 = Renderer::New( geometry, shader );
-  renderer0.SetTextures( textureSet0 );
-  actor0.AddRenderer(renderer0);
-  actor0.SetSize(1, 1);
-  Stage::GetCurrent().Add(actor0);
-  application.SendNotification();
-  application.Render(0);
+  Actor root = Stage::GetCurrent().GetRootLayer();
 
-  Actor actor1 = Actor::New();
-  actor1.SetAnchorPoint(AnchorPoint::CENTER);
-  actor1.SetParentOrigin(AnchorPoint::CENTER);
-  actor1.SetPosition(0.0f,0.0f);
-  Image image1= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet1 = CreateTextureSet( image1 );
-  Renderer renderer1 = Renderer::New( geometry, shader );
-  renderer1.SetTextures( textureSet1 );
-  actor1.AddRenderer(renderer1);
-  actor1.SetSize(1, 1);
-  Stage::GetCurrent().Add(actor1);
-  application.SendNotification();
-  application.Render(0);
+  Actor actor0 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer0 = CreateRenderer( actor0, geometry, shader, 0 );
 
-  Actor actor2 = Actor::New();
-  actor2.SetAnchorPoint(AnchorPoint::CENTER);
-  actor2.SetParentOrigin(AnchorPoint::CENTER);
-  actor2.SetPosition(0.0f,0.0f);
-  Image image2= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet2 = CreateTextureSet( image2 );
-  Renderer renderer2 = Renderer::New( geometry, shader );
-  renderer2.SetTextures( textureSet2 );
-  actor2.AddRenderer(renderer2);
-  actor2.SetSize(1, 1);
-  Stage::GetCurrent().Add(actor2);
-  application.SendNotification();
-  application.Render(0);
+  Actor actor1 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer1 = CreateRenderer( actor1, geometry, shader, 0 );
+
+  Actor actor2 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer2 = CreateRenderer( actor2, geometry, shader, 0 );
+
+  Actor actor3 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer3 = CreateRenderer( actor3, geometry, shader, 0 );
 
-  Actor actor3 = Actor::New();
-  actor3.SetAnchorPoint(AnchorPoint::CENTER);
-  actor3.SetParentOrigin(AnchorPoint::CENTER);
-  actor3.SetPosition(0.0f,0.0f);
-  Image image3 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet3 = CreateTextureSet( image3 );
-  Renderer renderer3 = Renderer::New( geometry, shader );
-  renderer3.SetTextures( textureSet3 );
-  actor3.AddRenderer(renderer3);
-  actor3.SetSize(1, 1);
-  Stage::GetCurrent().Add(actor3);
   application.SendNotification();
   application.Render(0);
 
@@ -1539,81 +1530,20 @@ int UtcDaliRendererRenderOrder2DLayerMultipleRenderers(void)
   Shader shader = Shader::New("VertexSource", "FragmentSource");
   Geometry geometry = CreateQuadGeometry();
 
-  Actor actor0 = Actor::New();
-  actor0.SetAnchorPoint(AnchorPoint::CENTER);
-  actor0.SetParentOrigin(AnchorPoint::CENTER);
-  actor0.SetPosition(0.0f,0.0f);
-  actor0.SetSize(1, 1);
-  Stage::GetCurrent().Add(actor0);
-
-  Actor actor1 = Actor::New();
-  actor1.SetAnchorPoint(AnchorPoint::CENTER);
-  actor1.SetParentOrigin(AnchorPoint::CENTER);
-  actor1.SetPosition(0.0f,0.0f);
-  actor1.SetSize(1, 1);
-  actor0.Add(actor1);
-
-  //Renderer0
-  Image image0 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet0 = CreateTextureSet( image0 );
-  Renderer renderer0 = Renderer::New( geometry, shader );
-  renderer0.SetTextures( textureSet0 );
-  renderer0.SetProperty( Renderer::Property::DEPTH_INDEX, 2 );
-  actor0.AddRenderer(renderer0);
-  application.SendNotification();
-  application.Render(0);
-
-  //Renderer1
-  Image image1= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet1 = CreateTextureSet( image1 );
-  Renderer renderer1 = Renderer::New( geometry, shader );
-  renderer1.SetTextures( textureSet1 );
-  renderer1.SetProperty( Renderer::Property::DEPTH_INDEX, 0 );
-  actor0.AddRenderer(renderer1);
-  application.SendNotification();
-  application.Render(0);
-
-  //Renderer2
-  Image image2= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet2 = CreateTextureSet( image2 );
-  Renderer renderer2 = Renderer::New( geometry, shader );
-  renderer2.SetTextures( textureSet2 );
-  renderer2.SetProperty( Renderer::Property::DEPTH_INDEX, 1 );
-  actor0.AddRenderer(renderer2);
-  application.SendNotification();
-  application.Render(0);
+  Actor root = Stage::GetCurrent().GetRootLayer();
 
-  //Renderer3
-  Image image3 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet3 = CreateTextureSet( image3 );
-  Renderer renderer3 = Renderer::New( geometry, shader );
-  renderer3.SetTextures( textureSet3 );
-  renderer3.SetProperty( Renderer::Property::DEPTH_INDEX, 1 );
-  actor1.AddRenderer(renderer3);
-  application.SendNotification();
-  application.Render(0);
-
-  //Renderer4
-  Image image4= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet4 = CreateTextureSet( image4 );
-  Renderer renderer4 = Renderer::New( geometry, shader );
-  renderer4.SetTextures( textureSet4 );
-  renderer4.SetProperty( Renderer::Property::DEPTH_INDEX, 0 );
-  actor1.AddRenderer(renderer4);
-  application.SendNotification();
-  application.Render(0);
+  Actor actor0 = CreateActor( root, 0, TEST_LOCATION );
+  Actor actor1 = CreateActor( actor0, 0, TEST_LOCATION );
+  Renderer renderer0 = CreateRenderer( actor0, geometry, shader, 2 );
+  Renderer renderer1 = CreateRenderer( actor0, geometry, shader, 0 );
+  Renderer renderer2 = CreateRenderer( actor0, geometry, shader, 1 );
+  Renderer renderer3 = CreateRenderer( actor1, geometry, shader, 1 );
+  Renderer renderer4 = CreateRenderer( actor1, geometry, shader, 0 );
+  Renderer renderer5 = CreateRenderer( actor1, geometry, shader, -1 );
 
-  //Renderer5
-  Image image5= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet5 = CreateTextureSet( image5 );
-  Renderer renderer5 = Renderer::New( geometry, shader );
-  renderer5.SetTextures( textureSet5 );
-  renderer5.SetProperty( Renderer::Property::DEPTH_INDEX, -1 );
-  actor1.AddRenderer(renderer5);
   application.SendNotification();
   application.Render(0);
 
-
   TestGlAbstraction& gl = application.GetGlAbstraction();
   gl.EnableTextureCallTrace(true);
   application.SendNotification();
@@ -1645,87 +1575,118 @@ int UtcDaliRendererRenderOrder2DLayerMultipleRenderers(void)
   END_TEST;
 }
 
-int UtcDaliRendererRenderOrder2DLayerOverlay(void)
+
+int UtcDaliRendererRenderOrder2DLayerSiblingOrder(void)
 {
   TestApplication application;
-  tet_infoline("Test the rendering order in a 2D layer is correct for overlays");
+  tet_infoline("Test the rendering order in a 2D layer is correct using sibling order");
+
+  /*
+   * Creates the following hierarchy:
+   *
+   *                            Layer
+   *                           /    \
+   *                         /        \
+   *                       /            \
+   *                     /                \
+   *                   /                    \
+   *             actor0 (SIBLING_ORDER:1)     actor1 (SIBLING_ORDER:0)
+   *            /   |   \                    /   |   \
+   *          /     |     \                /     |     \
+   *        /       |       \            /       |       \
+   * renderer0 renderer1  actor2     renderer2 renderer3 renderer4
+   *    DI:2      DI:0      |           DI:0      DI:1      DI:2
+   *                        |
+   *                   renderer5
+   *                      DI:-1
+   *
+   *  actor0 has sibling order 1
+   *  actor1 has sibling order 0
+   *  actor2 has sibling order 0
+   *
+   *  renderer0 has depth index 2
+   *  renderer1 has depth index 0
+   *
+   *  renderer2 has depth index 0
+   *  renderer3 has depth index 1
+   *  renderer4 has depth index 2
+   *
+   *  renderer5 has depth index -1
+   *
+   *  Expected rendering order: renderer2 - renderer3 - renderer4 - renderer1 - renderer0 - renderer5
+   */
 
   Shader shader = Shader::New("VertexSource", "FragmentSource");
   Geometry geometry = CreateQuadGeometry();
+  Actor root = Stage::GetCurrent().GetRootLayer();
+  Actor actor0 = CreateActor( root,   1, TEST_LOCATION );
+  Actor actor1 = CreateActor( root,   0, TEST_LOCATION );
+  Actor actor2 = CreateActor( actor0, 0, TEST_LOCATION );
 
-  Actor actor0 = Actor::New();
-  actor0.SetAnchorPoint(AnchorPoint::CENTER);
-  actor0.SetParentOrigin(AnchorPoint::CENTER);
-  Image image0 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet0 = CreateTextureSet( image0 );
-  Renderer renderer0 = Renderer::New( geometry, shader );
-  renderer0.SetTextures( textureSet0 );
-  actor0.AddRenderer(renderer0);
-  actor0.SetPosition(0.0f,0.0f);
-  actor0.SetSize(100, 100);
-  Stage::GetCurrent().Add(actor0);
-  actor0.SetDrawMode( DrawMode::OVERLAY_2D );
-  application.SendNotification();
-  application.Render(0);
+  Renderer renderer0 = CreateRenderer( actor0, geometry, shader, 2 );
+  Renderer renderer1 = CreateRenderer( actor0, geometry, shader, 0 );
+  Renderer renderer2 = CreateRenderer( actor1, geometry, shader, 0 );
+  Renderer renderer3 = CreateRenderer( actor1, geometry, shader, 1 );
+  Renderer renderer4 = CreateRenderer( actor1, geometry, shader, 2 );
+  Renderer renderer5 = CreateRenderer( actor2, geometry, shader, -1 );
 
-  Actor actor1 = Actor::New();
-  actor1.SetAnchorPoint(AnchorPoint::CENTER);
-  actor1.SetParentOrigin(AnchorPoint::CENTER);
-  Image image1= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet1 = CreateTextureSet( image1 );
-  Renderer renderer1 = Renderer::New( geometry, shader );
-  renderer1.SetTextures( textureSet1 );
-  actor1.SetPosition(0.0f,0.0f);
-  actor1.AddRenderer(renderer1);
-  actor1.SetSize(100, 100);
-  Stage::GetCurrent().Add(actor1);
-  actor1.SetDrawMode( DrawMode::OVERLAY_2D );
   application.SendNotification();
-  application.Render(0);
+  application.Render();
 
-  Actor actor2 = Actor::New();
-  actor2.SetAnchorPoint(AnchorPoint::CENTER);
-  actor2.SetParentOrigin(AnchorPoint::CENTER);
-  Image image2= BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet2 = CreateTextureSet( image2 );
-  Renderer renderer2 = Renderer::New( geometry, shader );
-  renderer2.SetTextures( textureSet2 );
-  actor2.AddRenderer(renderer2);
-  actor2.SetPosition(0.0f,0.0f);
-  actor2.SetSize(100, 100);
-  Stage::GetCurrent().Add(actor2);
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  gl.EnableTextureCallTrace(true);
   application.SendNotification();
   application.Render(0);
 
-  Actor actor3 = Actor::New();
-  actor3.SetAnchorPoint(AnchorPoint::CENTER);
-  actor3.SetParentOrigin(AnchorPoint::CENTER);
-  Image image3 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet3 = CreateTextureSet( image3 );
-  Renderer renderer3 = Renderer::New( geometry, shader );
-  renderer3.SetTextures( textureSet3 );
-  actor3.SetPosition(0.0f,0.0f);
-  actor3.AddRenderer(renderer3);
-  actor3.SetSize(100, 100);
-  Stage::GetCurrent().Add(actor3);
-  actor3.SetDrawMode( DrawMode::OVERLAY_2D );
-  application.SendNotification();
-  application.Render(0);
+  int textureBindIndex[6];
+  for( unsigned int i(0); i<6; ++i )
+  {
+    std::stringstream params;
+    params << GL_TEXTURE_2D<<", "<<i+1;
+    textureBindIndex[i] = gl.GetTextureTrace().FindIndexFromMethodAndParams("BindTexture", params.str() );
+  }
 
-  Actor actor4 = Actor::New();
-  actor4.SetAnchorPoint(AnchorPoint::CENTER);
-  actor4.SetParentOrigin(AnchorPoint::CENTER);
-  Image image4 = BufferImage::New( 64, 64, Pixel::RGB888 );
-  TextureSet textureSet4 = CreateTextureSet( image4 );
-  Renderer renderer4 = Renderer::New( geometry, shader );
-  renderer4.SetTextures( textureSet4 );
-  actor4.AddRenderer(renderer4);
-  actor4.SetPosition(0.0f,0.0f);
-  actor4.SetSize(100, 100);
-  Stage::GetCurrent().Add(actor4);
+  DALI_TEST_EQUALS( textureBindIndex[2], 0, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[3], 1, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[4], 2, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[1], 3, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[0], 4, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[5], 5, TEST_LOCATION );
+
+  // Change sibling order of actor1
+  // New Expected rendering order: renderer1 - renderer0 - renderer 5 - renderer2 - renderer3 - renderer4
+  actor1.SetProperty( Dali::DevelActor::Property::SIBLING_ORDER, 2 );
+
+  gl.GetTextureTrace().Reset();
   application.SendNotification();
   application.Render(0);
 
+  for( unsigned int i(0); i<6; ++i )
+  {
+    std::stringstream params;
+    params << GL_TEXTURE_2D<<", "<<i+1;
+    textureBindIndex[i] = gl.GetTextureTrace().FindIndexFromMethodAndParams("BindTexture", params.str() );
+  }
+
+  DALI_TEST_EQUALS( textureBindIndex[1], 0, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[0], 1, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[5], 2, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[2], 3, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[3], 4, TEST_LOCATION );
+  DALI_TEST_EQUALS( textureBindIndex[4], 5, TEST_LOCATION );
+
+  END_TEST;
+}
+
+int UtcDaliRendererRenderOrder2DLayerOverlay(void)
+{
+  TestApplication application;
+  tet_infoline("Test the rendering order in a 2D layer is correct for overlays");
+
+  Shader shader = Shader::New("VertexSource", "FragmentSource");
+  Geometry geometry = CreateQuadGeometry();
+  Actor root = Stage::GetCurrent().GetRootLayer();
+
   /*
    * Create the following hierarchy:
    *
@@ -1746,13 +1707,32 @@ int UtcDaliRendererRenderOrder2DLayerOverlay(void)
    *
    *  Expected rendering order : actor2 - actor4 - actor1 - actor0 - actor3
    */
-  Stage::GetCurrent().Add( actor2 );
+
+  Actor actor0 = CreateActor( root, 0, TEST_LOCATION );
+  actor0.SetDrawMode( DrawMode::OVERLAY_2D );
+  Renderer renderer0 = CreateRenderer( actor0, geometry, shader, 0 );
+
+  Actor actor1 = CreateActor( root, 0, TEST_LOCATION );
+  actor1.SetDrawMode( DrawMode::OVERLAY_2D );
+  Renderer renderer1 = CreateRenderer( actor1, geometry, shader, 0 );
+
+  Actor actor2 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer2 = CreateRenderer( actor2, geometry, shader, 0 );
+
+  Actor actor3 = CreateActor( root, 0, TEST_LOCATION );
+  actor3.SetDrawMode( DrawMode::OVERLAY_2D );
+  Renderer renderer3 = CreateRenderer( actor3, geometry, shader, 0 );
+
+  Actor actor4 = CreateActor( root, 0, TEST_LOCATION );
+  Renderer renderer4 = CreateRenderer( actor4, geometry, shader, 0 );
+
+  application.SendNotification();
+  application.Render(0);
+
   actor2.Add(actor1);
   actor2.Add(actor4);
   actor1.Add(actor0);
   actor0.Add(actor3);
-  application.SendNotification();
-  application.Render(0);
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   gl.EnableTextureCallTrace(true);
@@ -2058,10 +2038,13 @@ template< typename T >
 void CheckEnumerationProperty( Renderer& renderer, Property::Index propertyIndex, T initialValue, T firstCheckEnumeration, T secondCheckEnumeration, std::string secondCheckString )
 {
   DALI_TEST_CHECK( renderer.GetProperty<int>( propertyIndex ) == static_cast<int>( initialValue ) );
+  DALI_TEST_CHECK( DevelHandle::GetCurrentProperty< int >( renderer, propertyIndex ) == static_cast<int>( initialValue ) );
   renderer.SetProperty( propertyIndex, firstCheckEnumeration );
   DALI_TEST_CHECK( renderer.GetProperty<int>( propertyIndex ) == static_cast<int>( firstCheckEnumeration ) );
+  DALI_TEST_CHECK( DevelHandle::GetCurrentProperty< int >( renderer, propertyIndex ) == static_cast<int>( firstCheckEnumeration ) );
   renderer.SetProperty( propertyIndex, secondCheckString );
   DALI_TEST_CHECK( renderer.GetProperty<int>( propertyIndex ) == static_cast<int>( secondCheckEnumeration ) );
+  DALI_TEST_CHECK( DevelHandle::GetCurrentProperty< int >( renderer, propertyIndex ) == static_cast<int>( secondCheckEnumeration ) );
 }
 
 int UtcDaliRendererEnumProperties(void)
@@ -2090,7 +2073,7 @@ int UtcDaliRendererEnumProperties(void)
   CheckEnumerationProperty< DepthFunction::Type >( renderer, Renderer::Property::DEPTH_FUNCTION, DepthFunction::LESS, DepthFunction::ALWAYS, DepthFunction::GREATER, "GREATER" );
   CheckEnumerationProperty< DepthTestMode::Type >( renderer, Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::AUTO, DepthTestMode::OFF, DepthTestMode::ON, "ON" );
   CheckEnumerationProperty< StencilFunction::Type >( renderer, Renderer::Property::STENCIL_FUNCTION, StencilFunction::ALWAYS, StencilFunction::LESS, StencilFunction::EQUAL, "EQUAL" );
-  CheckEnumerationProperty< StencilMode::Type >( renderer, Renderer::Property::STENCIL_MODE, StencilMode::AUTO, StencilMode::OFF, StencilMode::ON, "ON" );
+  CheckEnumerationProperty< RenderMode::Type >( renderer, Renderer::Property::RENDER_MODE, RenderMode::AUTO, RenderMode::NONE, RenderMode::STENCIL, "STENCIL" );
   CheckEnumerationProperty< StencilOperation::Type >( renderer, Renderer::Property::STENCIL_OPERATION_ON_FAIL, StencilOperation::KEEP, StencilOperation::REPLACE, StencilOperation::INCREMENT, "INCREMENT" );
   CheckEnumerationProperty< StencilOperation::Type >( renderer, Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL, StencilOperation::KEEP, StencilOperation::REPLACE, StencilOperation::INCREMENT, "INCREMENT" );
   CheckEnumerationProperty< StencilOperation::Type >( renderer, Renderer::Property::STENCIL_OPERATION_ON_Z_PASS, StencilOperation::KEEP, StencilOperation::REPLACE, StencilOperation::INCREMENT, "INCREMENT" );
@@ -2166,8 +2149,7 @@ int UtcDaliRendererSetDepthTestMode(void)
   // Check depth-test is disabled.
   DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Disable", GetDepthTestString() ) );
 
-  // Turn the layer depth-test flag back on, and confirm that depth testing is *still* off.
-  // This is because our renderer has DepthTestMode::AUTO and our layer behavior is LAYER_2D.
+  // Turn the layer depth-test flag back on, and confirm that depth testing is now on.
   Stage::GetCurrent().GetRootLayer().SetDepthTestDisabled( false );
 
   glEnableDisableStack.Reset();
@@ -2175,7 +2157,7 @@ int UtcDaliRendererSetDepthTestMode(void)
   application.Render();
 
   // Check depth-test is *still* disabled.
-  DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Disable", GetDepthTestString() ) );
+  DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Enable", GetDepthTestString() ) );
 
   END_TEST;
 }
@@ -2252,10 +2234,10 @@ int UtcDaliRendererCheckStencilDefaults(void)
   END_TEST;
 }
 
-int UtcDaliRendererSetStencilMode(void)
+int UtcDaliRendererSetRenderModeToUseStencilBuffer(void)
 {
   TestApplication application;
-  tet_infoline("Test setting the StencilMode");
+  tet_infoline("Test setting the RenderMode to use the stencil buffer");
 
   Renderer renderer = RendererTestFixture( application );
   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
@@ -2264,24 +2246,80 @@ int UtcDaliRendererSetStencilMode(void)
   TraceCallStack& glEnableDisableStack = glAbstraction.GetEnableDisableTrace();
   TraceCallStack& glStencilFunctionStack = glAbstraction.GetStencilFunctionTrace();
 
+  // Set the StencilFunction to something other than the default, to confirm it is set as a property,
+  // but NO GL call has been made while the RenderMode is set to not use the stencil buffer.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::NONE );
   ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
 
-  // Set the StencilFunction to something other than the default, to confirm it is set as a property,
-  // but NO GL call has been made while the StencilMode is set to OFF.
   renderer.SetProperty( Renderer::Property::STENCIL_FUNCTION, StencilFunction::NEVER );
   DALI_TEST_EQUALS<int>( static_cast<int>( renderer.GetProperty( Renderer::Property::STENCIL_FUNCTION ).Get<int>() ), static_cast<int>( StencilFunction::NEVER ), TEST_LOCATION );
-  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
 
+  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
   std::string methodString( "StencilFunc" );
   DALI_TEST_CHECK( !glStencilFunctionStack.FindMethod( methodString ) );
 
-  // Now set the StencilMode to ON and check the StencilFunction has changed.
-  renderer.SetProperty( Renderer::Property::STENCIL_MODE, StencilMode::ON );
+  // Test the other RenderModes that will not enable the stencil buffer.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::AUTO );
+  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
+  DALI_TEST_CHECK( !glStencilFunctionStack.FindMethod( methodString ) );
+
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::COLOR );
+  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
+  DALI_TEST_CHECK( !glStencilFunctionStack.FindMethod( methodString ) );
+
+  // Now set the RenderMode to modes that will use the stencil buffer, and check the StencilFunction has changed.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::STENCIL );
   ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
 
   DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Enable", GetStencilTestString() ) );
   DALI_TEST_CHECK( glStencilFunctionStack.FindMethod( methodString ) );
 
+  // Test the COLOR_STENCIL RenderMode as it also enables the stencil buffer.
+  // First set a mode to turn off the stencil buffer, so the enable is required.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::COLOR );
+  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::COLOR_STENCIL );
+  ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
+
+  DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Enable", GetStencilTestString() ) );
+  DALI_TEST_CHECK( glStencilFunctionStack.FindMethod( methodString ) );
+
+  END_TEST;
+}
+
+// Helper function for the SetRenderModeToUseColorBuffer test.
+void CheckRenderModeColorMask( TestApplication& application, Renderer& renderer, RenderMode::Type renderMode, bool expectedValue )
+{
+  // Set the RenderMode property to a value that should not allow color buffer writes.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, renderMode );
+  application.SendNotification();
+  application.Render();
+
+  // Check if ColorMask has been called, and that the values are correct.
+  TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+  const TestGlAbstraction::ColorMaskParams& colorMaskParams( glAbstraction.GetColorMaskParams() );
+
+  DALI_TEST_EQUALS<bool>( colorMaskParams.red,   expectedValue, TEST_LOCATION );
+  DALI_TEST_EQUALS<bool>( colorMaskParams.green, expectedValue, TEST_LOCATION );
+  DALI_TEST_EQUALS<bool>( colorMaskParams.blue,  expectedValue, TEST_LOCATION );
+  DALI_TEST_EQUALS<bool>( colorMaskParams.alpha, expectedValue, TEST_LOCATION );
+}
+
+int UtcDaliRendererSetRenderModeToUseColorBuffer(void)
+{
+  TestApplication application;
+  tet_infoline("Test setting the RenderMode to use the color buffer");
+
+  Renderer renderer = RendererTestFixture( application );
+
+  // Set the RenderMode property to a value that should not allow color buffer writes.
+  // Then check if ColorMask has been called, and that the values are correct.
+  CheckRenderModeColorMask( application, renderer, RenderMode::AUTO, true );
+  CheckRenderModeColorMask( application, renderer, RenderMode::NONE, false );
+  CheckRenderModeColorMask( application, renderer, RenderMode::COLOR, true );
+  CheckRenderModeColorMask( application, renderer, RenderMode::STENCIL, false );
+  CheckRenderModeColorMask( application, renderer, RenderMode::COLOR_STENCIL, true );
+
   END_TEST;
 }
 
@@ -2297,8 +2335,8 @@ int UtcDaliRendererSetStencilFunction(void)
   TraceCallStack& glEnableDisableStack = glAbstraction.GetEnableDisableTrace();
   TraceCallStack& glStencilFunctionStack = glAbstraction.GetStencilFunctionTrace();
 
-  // StencilMode must be ON for StencilFunction to operate.
-  renderer.SetProperty( Renderer::Property::STENCIL_MODE, StencilMode::ON );
+  // RenderMode must use the stencil for StencilFunction to operate.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::STENCIL );
   ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
 
   /*
@@ -2387,8 +2425,8 @@ int UtcDaliRendererSetStencilOperation(void)
   TraceCallStack& glEnableDisableStack = glAbstraction.GetEnableDisableTrace();
   TraceCallStack& glStencilFunctionStack = glAbstraction.GetStencilFunctionTrace();
 
-  // StencilMode must be ON for StencilOperation to operate.
-  renderer.SetProperty( Renderer::Property::STENCIL_MODE, StencilMode::ON );
+  // RenderMode must use the stencil for StencilOperation to operate.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::STENCIL );
 
   /*
    * Lookup table for testing StencilOperation.
@@ -2474,8 +2512,8 @@ int UtcDaliRendererSetStencilMask(void)
   TraceCallStack& glEnableDisableStack = glAbstraction.GetEnableDisableTrace();
   TraceCallStack& glStencilFunctionStack = glAbstraction.GetStencilFunctionTrace();
 
-  // StencilMode must be ON for StencilMask to operate.
-  renderer.SetProperty( Renderer::Property::STENCIL_MODE, StencilMode::ON );
+  // RenderMode must use the stencil for StencilMask to operate.
+  renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::STENCIL );
 
   // Set the StencilMask property to a value.
   renderer.SetProperty( Renderer::Property::STENCIL_MASK, 0x00 );
@@ -2507,47 +2545,52 @@ int UtcDaliRendererSetStencilMask(void)
   END_TEST;
 }
 
-int UtcDaliRendererSetWriteToColorBuffer(void)
+int UtcDaliRendererWrongNumberOfTextures(void)
 {
   TestApplication application;
-  tet_infoline("Test setting the WriteToColorBuffer flag");
-
-  Renderer renderer = RendererTestFixture( application );
-  TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+  tet_infoline("Test renderer does render even if number of textures is different than active samplers in the shader");
+
+  //Create a TextureSet with 4 textures (One more texture in the texture set than active samplers)
+  //@note Shaders in the test suit have 3 active samplers. See TestGlAbstraction::GetActiveUniform()
+  Texture texture = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 64u, 64u );
+  TextureSet textureSet = CreateTextureSet();
+  textureSet.SetTexture(0, texture );
+  textureSet.SetTexture(1, texture );
+  textureSet.SetTexture(2, texture );
+  textureSet.SetTexture(3, texture );
+  Shader shader = Shader::New("VertexSource", "FragmentSource");
+  Geometry geometry = CreateQuadGeometry();
+  Renderer renderer = Renderer::New( geometry, shader );
+  renderer.SetTextures( textureSet );
 
-  // Set the StencilMask property to a value.
-  renderer.SetProperty( Renderer::Property::WRITE_TO_COLOR_BUFFER, false );
+  Actor actor= Actor::New();
+  actor.AddRenderer(renderer);
+  actor.SetPosition(0.0f,0.0f);
+  actor.SetSize(100, 100);
+  Stage::GetCurrent().Add(actor);
 
-  // Check GetProperty returns the same value.
-  DALI_TEST_CHECK( !renderer.GetProperty( Renderer::Property::WRITE_TO_COLOR_BUFFER ).Get<bool>() );
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  TraceCallStack& drawTrace = gl.GetDrawTrace();
+  drawTrace.Reset();
+  drawTrace.Enable(true);
 
   application.SendNotification();
-  application.Render();
-
-  // Check if ColorMask has been called, and that the values are correct.
-  const TestGlAbstraction::ColorMaskParams& colorMaskParams( glAbstraction.GetColorMaskParams() );
-
-  DALI_TEST_EQUALS<bool>( colorMaskParams.red,   false, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParams.green, false, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParams.blue,  false, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParams.alpha, false, TEST_LOCATION );
-
-  // Set the StencilMask property to true.
-  renderer.SetProperty( Renderer::Property::WRITE_TO_COLOR_BUFFER, true );
+  application.Render(0);
 
-  // Check GetProperty returns the same value.
-  DALI_TEST_CHECK( renderer.GetProperty( Renderer::Property::WRITE_TO_COLOR_BUFFER ).Get<bool>() );
+  //Test we do the drawcall when TextureSet has more textures than there are active samplers in the shader
+  DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
 
+  //Create a TextureSet with 1 texture (two more active samplers than texture in the texture set)
+  //@note Shaders in the test suit have 3 active samplers. See TestGlAbstraction::GetActiveUniform()
+  textureSet = CreateTextureSet();
+  renderer.SetTextures( textureSet );
+  textureSet.SetTexture(0, texture );
+  drawTrace.Reset();
   application.SendNotification();
-  application.Render();
-
-  // Check if ColorMask has been called, and that the values are correct.
-  const TestGlAbstraction::ColorMaskParams& colorMaskParamsChanged( glAbstraction.GetColorMaskParams() );
+  application.Render(0);
 
-  DALI_TEST_EQUALS<bool>( colorMaskParamsChanged.red,   true, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParamsChanged.green, true, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParamsChanged.blue,  true, TEST_LOCATION );
-  DALI_TEST_EQUALS<bool>( colorMaskParamsChanged.alpha, true, TEST_LOCATION );
+  //Test we do the drawcall when TextureSet has less textures than there are active samplers in the shader.
+  DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
 
   END_TEST;
 }