Cache size uniform as its often same for many renderers now as we are scaling geometry 09/49209/1
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Thu, 8 Oct 2015 12:21:43 +0000 (13:21 +0100)
committerKimmo Hoikka <kimmo.hoikka@samsung.com>
Thu, 8 Oct 2015 12:21:43 +0000 (13:21 +0100)
Change-Id: Ic236e62c73b4c0db2c7ad2ab3fc13b4a957eaeaa

dali/internal/render/renderers/render-new-renderer.cpp
dali/internal/render/shaders/program.cpp
dali/internal/render/shaders/program.h

index ea825af..dfbf212 100644 (file)
@@ -205,7 +205,7 @@ void NewRenderer::SetUniforms( BufferIndex bufferIndex, const SceneGraph::NodeDa
   if( -1 != sizeLoc )
   {
     Vector3 size = node.GetRenderSize( bufferIndex );
-    program.SetUniform3f( sizeLoc, size.x, size.y, size.z );
+    program.SetSizeUniform3f( sizeLoc, size.x, size.y, size.z );
   }
 }
 
index 0c5ba69..7c1282b 100644 (file)
@@ -333,6 +333,19 @@ void Program::SetUniform2f( GLint location, GLfloat value0, GLfloat value1 )
   CHECK_GL( mGlAbstraction, mGlAbstraction.Uniform2f( location, value0, value1 ) );
 }
 
+void Program::SetSizeUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 )
+{
+  if( ( fabsf(value0 - mSizeUniformCache.x) >= Math::MACHINE_EPSILON_1 )||
+      ( fabsf(value1 - mSizeUniformCache.y) >= Math::MACHINE_EPSILON_1 )||
+      ( fabsf(value2 - mSizeUniformCache.z) >= Math::MACHINE_EPSILON_1 ) )
+  {
+    mSizeUniformCache.x = value0;
+    mSizeUniformCache.y = value1;
+    mSizeUniformCache.z = value2;
+    SetUniform3f( location, value0, value1, value2 );
+  }
+}
+
 void Program::SetUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 )
 {
   DALI_ASSERT_DEBUG( IsUsed() ); // should not call this if this program is not used
@@ -694,7 +707,9 @@ void Program::ResetAttribsUniformCache()
     mUniformLocations[ i ].second = UNIFORM_NOT_QUERIED;
   }
 
-  // reset uniform cache
+  // reset uniform caches
+  mSizeUniformCache.x = mSizeUniformCache.y = mSizeUniformCache.z = 0.f;
+
   for( int i = 0; i < MAX_UNIFORM_CACHE_SIZE; ++i )
   {
     // GL initializes uniforms to 0
index 50d02d6..e1e47cd 100644 (file)
@@ -198,6 +198,16 @@ public:
   void SetUniform2f( GLint location, GLfloat value0, GLfloat value1 );
 
   /**
+   * Special handling for size as we're using uniform geometry so size is passed on to most programs
+   * but it rarely changes so we can cache it
+   * @param [in] location of uniform
+   * @param [in] value0 as float
+   * @param [in] value1 as float
+   * @param [in] value2 as float
+   */
+  void SetSizeUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 );
+
+  /**
    * Sets the uniform value
    * @param [in] location of uniform
    * @param [in] value0 as float
@@ -363,6 +373,7 @@ private:  // Data
   GLint mUniformCacheInt[ MAX_UNIFORM_CACHE_SIZE ];         ///< Value cache for uniforms of single int
   GLfloat mUniformCacheFloat[ MAX_UNIFORM_CACHE_SIZE ];     ///< Value cache for uniforms of single float
   GLfloat mUniformCacheFloat4[ MAX_UNIFORM_CACHE_SIZE ][4]; ///< Value cache for uniforms of four float
+  Vector3 mSizeUniformCache;                                ///< Cache value for size uniform
   bool mModifiesGeometry;  ///< True if the program changes geometry
 
 };