fix shader binary compilation to work with lazy compilation 48/29048/29
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Mon, 20 Oct 2014 15:30:44 +0000 (16:30 +0100)
committerFrancisco Santos <f1.santos@samsung.com>
Thu, 20 Nov 2014 15:06:29 +0000 (15:06 +0000)
[Problem] shader binary saving was assuming immediately compilation
[Cause]
[Solution] if shader binaries are supported, compile shader immediately for the first time

Change-Id: Id3089046edf5a366ec8c852382a069927f4c980d

dali/internal/render/gl-resources/context.cpp
dali/internal/render/shaders/program.cpp
dali/internal/render/shaders/program.h
dali/internal/render/shaders/shader.cpp

index 5138ca3..2208d54 100644 (file)
@@ -345,6 +345,9 @@ void Context::ResetGlState()
   // get maximum texture size
   mGlAbstraction.GetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
 
+  // reset any potential previous errors
+  mGlAbstraction.GetError();
+
   GLint numProgramBinaryFormats;
   mGlAbstraction.GetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES, &numProgramBinaryFormats);
   if( GL_NO_ERROR == mGlAbstraction.GetError() && 0 != numProgramBinaryFormats )
index d442c3e..53160ef 100644 (file)
@@ -461,7 +461,11 @@ void Program::Load()
 {
   DALI_ASSERT_ALWAYS( NULL != mProgramData.Get() && "Program data is not initialized" );
 
-  Unload();
+  // If already linked don't do anything
+  if( mLinked )
+  {
+    return;
+  }
 
   LOG_GL( "CreateProgram()\n" );
   mProgramId = CHECK_GL( mContext, mGlAbstraction.CreateProgram() );
index b9efacc..af24326 100644 (file)
@@ -309,6 +309,11 @@ public:
    */
   ~Program();
 
+  /**
+   * Load the shader, from a precompiled binary if available, else from source code
+   */
+  void Load();
+
 private:
 
   // default constructor, not defined
@@ -317,11 +322,6 @@ private:
   Program& operator=( const Program& );
 
   /**
-   * Load the shader, from a precompiled binary if available, else from source code
-   */
-  void Load();
-
-  /**
    * Unload the shader
    */
   void Unload();
index 92eb46e..21dd1af 100644 (file)
@@ -253,9 +253,13 @@ void Shader::SetProgram( GeometryType geometryType,
     mPrograms[geometryIndex].mUseDefaultForAllSubtypes = false;
   }
 
-  if( !precompiledBinary )
+  // if platform supports program binaries and we haven't yet saved a binary
+  if( context->CachedNumberOfProgramBinaryFormats() > 0 && !precompiledBinary )
   {
-    // The binary will have been compiled/linked during Program::New(), so save it
+    // this is the first time this shader is being used so force compilation
+    program->Load();
+
+    // The binary should now have been compiled/linked, so save it
     if( shaderData->HasBinary() )
     {
       DALI_ASSERT_DEBUG( mPostProcessDispatcher != NULL );