From 4a640560da7d3ea7167a731f4317beb6f03af575 Mon Sep 17 00:00:00 2001 From: Kimmo Hoikka Date: Mon, 20 Oct 2014 16:30:44 +0100 Subject: [PATCH] fix shader binary compilation to work with lazy compilation [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 | 3 +++ dali/internal/render/shaders/program.cpp | 6 +++++- dali/internal/render/shaders/program.h | 10 +++++----- dali/internal/render/shaders/shader.cpp | 8 ++++++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/dali/internal/render/gl-resources/context.cpp b/dali/internal/render/gl-resources/context.cpp index 5138ca3..2208d54 100644 --- a/dali/internal/render/gl-resources/context.cpp +++ b/dali/internal/render/gl-resources/context.cpp @@ -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 ) diff --git a/dali/internal/render/shaders/program.cpp b/dali/internal/render/shaders/program.cpp index d442c3e..53160ef 100644 --- a/dali/internal/render/shaders/program.cpp +++ b/dali/internal/render/shaders/program.cpp @@ -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() ); diff --git a/dali/internal/render/shaders/program.h b/dali/internal/render/shaders/program.h index b9efacc..af24326 100644 --- a/dali/internal/render/shaders/program.h +++ b/dali/internal/render/shaders/program.h @@ -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(); diff --git a/dali/internal/render/shaders/shader.cpp b/dali/internal/render/shaders/shader.cpp index 92eb46e..21dd1af 100644 --- a/dali/internal/render/shaders/shader.cpp +++ b/dali/internal/render/shaders/shader.cpp @@ -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 ); -- 2.7.4