[4.0] Caches stencil glStencilFunc() and glStencilOp() calls. 44/160544/1
authorVictor Cebollada <v.cebollada@samsung.com>
Wed, 8 Nov 2017 11:01:41 +0000 (11:01 +0000)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Thu, 16 Nov 2017 16:24:55 +0000 (16:24 +0000)
Change-Id: I970ec25b1a6ab39c284c561bf96c81a1515b9434
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
(cherry picked from commit 83e7fd6820cdb9d16d91377912f85bdbbdf84eb4)

automated-tests/src/dali/utc-Dali-Renderer.cpp
dali/internal/render/gl-resources/context.cpp
dali/internal/render/gl-resources/context.h

index a8164eb..9ea907d 100644 (file)
@@ -2278,6 +2278,8 @@ int UtcDaliRendererSetRenderModeToUseStencilBuffer(void)
   renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::COLOR );
   ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
   renderer.SetProperty( Renderer::Property::RENDER_MODE, RenderMode::COLOR_STENCIL );
+  // Set a different stencil function as the last one is cached.
+  renderer.SetProperty( Renderer::Property::STENCIL_FUNCTION, StencilFunction::ALWAYS );
   ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
 
   DALI_TEST_CHECK( glEnableDisableStack.FindMethodAndParams( "Enable", GetStencilTestString() ) );
@@ -2443,7 +2445,7 @@ int UtcDaliRendererSetStencilOperation(void)
   }; const int StencilOperationLookupTableCount = sizeof( StencilOperationLookupTable ) / sizeof( StencilOperationLookupTable[0] );
 
   // Set all 3 StencilOperation properties to a default.
-  renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_FAIL, StencilOperation::ZERO );
+  renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_FAIL, StencilOperation::KEEP );
   renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL, StencilOperation::ZERO );
   renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_PASS, StencilOperation::ZERO );
 
@@ -2459,40 +2461,48 @@ int UtcDaliRendererSetStencilOperation(void)
    *  - Checks the correct parameters to "glStencilFunc" were used
    *  - Checks the above for all 3 parameter placements of StencilOperation ( OnFail, OnZFail, OnPass )
    */
-  int stencilOperationPropertyKeys[] = { Renderer::Property::STENCIL_OPERATION_ON_FAIL, Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL, Renderer::Property::STENCIL_OPERATION_ON_Z_PASS };
   std::string methodString( "StencilOp" );
 
-  for( int parameterIndex = 0; parameterIndex < 3; ++parameterIndex )
+  for( int i = 0; i < StencilOperationLookupTableCount; ++i )
   {
-    for( int i = 0; i < StencilOperationLookupTableCount; ++i )
+    for( int j = 0; j < StencilOperationLookupTableCount; ++j )
     {
-      // Set the property (outer loop causes all 3 different properties to be set separately).
-      renderer.SetProperty( stencilOperationPropertyKeys[ parameterIndex ], static_cast<Dali::StencilFunction::Type>( i ) );
-
-      // Check GetProperty returns the same value.
-      DALI_TEST_EQUALS<int>( static_cast<int>( renderer.GetProperty( stencilOperationPropertyKeys[ parameterIndex ] ).Get<int>() ), i, TEST_LOCATION );
-
-      // Reset the trace debug.
-      ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
-
-      // Check the function is called and the parameters are correct.
-      // Set the expected parameter value at its correct index (only)
-      parameters[ parameterIndex ] = StencilOperationLookupTable[ i ];
-
-      // Build the parameter list.
-      std::stringstream parameterStream;
-      for( int parameterBuild = 0; parameterBuild < 3; ++parameterBuild )
+      for( int k = 0; k < StencilOperationLookupTableCount; ++k )
       {
-        parameterStream << parameters[ parameterBuild ];
-        // Comma-separate the parameters.
-        if( parameterBuild < 2 )
+        // Set the property (outer loop causes all 3 different properties to be set separately).
+        renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_FAIL, static_cast<Dali::StencilFunction::Type>( i ) );
+        renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL, static_cast<Dali::StencilFunction::Type>( j ) );
+        renderer.SetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_PASS, static_cast<Dali::StencilFunction::Type>( k ) );
+
+        // Check GetProperty returns the same value.
+        DALI_TEST_EQUALS<int>( static_cast<int>( renderer.GetProperty( Renderer::Property::STENCIL_OPERATION_ON_FAIL ).Get<int>() ), i, TEST_LOCATION );
+        DALI_TEST_EQUALS<int>( static_cast<int>( renderer.GetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL ).Get<int>() ), j, TEST_LOCATION );
+        DALI_TEST_EQUALS<int>( static_cast<int>( renderer.GetProperty( Renderer::Property::STENCIL_OPERATION_ON_Z_PASS ).Get<int>() ), k, TEST_LOCATION );
+
+        // Reset the trace debug.
+        ResetDebugAndFlush( application, glEnableDisableStack, glStencilFunctionStack );
+
+        // Check the function is called and the parameters are correct.
+        // Set the expected parameter value at its correct index (only)
+        parameters[ 0u ] = StencilOperationLookupTable[ i ];
+        parameters[ 1u ] = StencilOperationLookupTable[ j ];
+        parameters[ 2u ] = StencilOperationLookupTable[ k ];
+
+        // Build the parameter list.
+        std::stringstream parameterStream;
+        for( int parameterBuild = 0; parameterBuild < 3; ++parameterBuild )
         {
-          parameterStream << ", ";
+          parameterStream << parameters[ parameterBuild ];
+          // Comma-separate the parameters.
+          if( parameterBuild < 2 )
+          {
+            parameterStream << ", ";
+          }
         }
-      }
 
-      // Check the function was called and the parameters were correct.
-      DALI_TEST_CHECK( glStencilFunctionStack.FindMethodAndParams( methodString, parameterStream.str() ) );
+        // Check the function was called and the parameters were correct.
+        DALI_TEST_CHECK( glStencilFunctionStack.FindMethodAndParams( methodString, parameterStream.str() ) );
+      }
     }
   }
 
index 2d883bc..0819de8 100644 (file)
@@ -91,6 +91,12 @@ Context::Context(Integration::GlAbstraction& glAbstraction)
   mBlendFuncSeparateDstAlpha(GL_ZERO),
   mBlendEquationSeparateModeRGB( GL_FUNC_ADD ),
   mBlendEquationSeparateModeAlpha( GL_FUNC_ADD ),
+  mStencilFunc( GL_ALWAYS ),
+  mStencilFuncRef( 0 ),
+  mStencilFuncMask( 0xFFFFFFFF ),
+  mStencilOpFail( GL_KEEP ),
+  mStencilOpDepthFail( GL_KEEP ),
+  mStencilOpDepthPass( GL_KEEP ),
   mDepthFunction( GL_LESS ),
   mMaxTextureSize(0),
   mClearColor(Color::WHITE),    // initial color, never used until it's been set by the user
index 59ed396..fdd9a8e 100644 (file)
@@ -1497,10 +1497,15 @@ public:
    */
   void StencilFunc(GLenum func, GLint ref, GLuint mask)
   {
+    if( ( func != mStencilFunc ) || ( ref != mStencilFuncRef ) || ( mask != mStencilFuncMask ) )
+    {
+      mStencilFunc = func;
+      mStencilFuncRef = ref;
+      mStencilFuncMask = mask;
 
-
-    LOG_GL("StencilFunc %x %d %d\n", func, ref, mask);
-    CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) );
+      LOG_GL("StencilFunc %x %d %d\n", func, ref, mask);
+      CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) );
+    }
   }
 
   /**
@@ -1540,8 +1545,15 @@ public:
    */
   void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
   {
-    LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass);
-    CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) );
+    if( ( fail != mStencilOpFail ) || ( zfail != mStencilOpDepthFail ) || ( zpass != mStencilOpDepthPass ) )
+    {
+      mStencilOpFail = fail;
+      mStencilOpDepthFail = zfail;
+      mStencilOpDepthPass = zpass;
+
+      LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass);
+      CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) );
+    }
   }
 
   /**
@@ -1749,6 +1761,14 @@ private: // Data
   GLenum mBlendEquationSeparateModeRGB;    ///< Controls RGB blend mode
   GLenum mBlendEquationSeparateModeAlpha;  ///< Controls Alpha blend mode
 
+  // glStencilFunc() and glStencilOp() state.
+  GLenum mStencilFunc;
+  GLint mStencilFuncRef;
+  GLuint mStencilFuncMask;
+  GLenum mStencilOpFail;
+  GLenum mStencilOpDepthFail;
+  GLenum mStencilOpDepthPass;
+
   GLenum mDepthFunction;  ///The depth function
 
   GLint mMaxTextureSize;      ///< return value from GetIntegerv(GL_MAX_TEXTURE_SIZE)