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 );
}
}
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
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
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
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
};