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 5138ca3f6d9b7c414a34dd7f8a71b7e8f7c9de05..2208d5460b0312751f6f30552bf189cdd54b5c91 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 d442c3e387887e0ca33f134197c180409a798999..53160ef02133c9256d070872fb474e19871e3a64 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 b9efaccd21d6347a0b7ffaaf601d11fbaff6f705..af2432674ea0bad722dc2b52e42bea14c34e9072 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
@@ -316,11 +321,6 @@ private:
   // assignment operator, not defined
   Program& operator=( const Program& );
 
-  /**
-   * Load the shader, from a precompiled binary if available, else from source code
-   */
-  void Load();
-
   /**
    * Unload the shader
    */
index 92eb46e3194c1b2774c0d2d0926c1ab020a0fc2c..21dd1af50b26c4a42a0a59d1dc36ef0572ed66c1 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 );