Fixes for recent GLSL display space conversions
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 2 Apr 2013 17:28:29 +0000 (17:28 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 2 Apr 2013 17:28:29 +0000 (17:28 +0000)
- Building without OCIO will give correct results again
- If GLSL failed to compile, fallback to glaDrawPixelsAuto
  will happen.

intern/opencolorio/fallback_impl.cc
intern/opencolorio/ocio_capi.cc
intern/opencolorio/ocio_capi.h
intern/opencolorio/ocio_impl.h
intern/opencolorio/ocio_impl_glsl.cc
source/blender/imbuf/intern/colormanagement.c

index 47c648e9cbab4e079533366ce39bef42ea18950f..4c19c454aee77f7847c79e9b20e2710d7c0e50ee 100644 (file)
@@ -381,8 +381,9 @@ void FallbackImpl::matrixTransformScale(float * , float * , const float *)
 {
 }
 
-void FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
+bool FallbackImpl::setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
 {
+       return false;
 }
 
 void FallbackImpl::finishGLSLDraw(OCIO_GLSLDrawState *state)
index 73d8af295f20053ac8753f2d086236c2d26fdf18..8e831bb0736b67082249a4f2c90d4ae0d9e33a86 100644 (file)
@@ -283,9 +283,9 @@ void OCIO_matrixTransformScale(float * m44, float * offset4, const float *scale4
        impl->matrixTransformScale(m44, offset4, scale4f);
 }
 
-void OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
+int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
 {
-       impl->setupGLSLDraw(state_r, processor);
+       return (int) impl->setupGLSLDraw(state_r, processor);
 }
 
 void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state)
index 3c42e0a1a1e7524f60ae466d1f858880e3055a9f..8d8db1610778cff2fd6a8cb11f07b78948659e11 100644 (file)
@@ -121,7 +121,7 @@ void OCIO_matrixTransformRelease(OCIO_MatrixTransformRcPtr *mt);
 
 void OCIO_matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
-void OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
+int OCIO_setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
 void OCIO_finishGLSLDraw(struct OCIO_GLSLDrawState *state);
 void OCIO_freeOGLState(struct OCIO_GLSLDrawState *state);
 
index 2a1f88be5f4962eebc922dd917ac2b06566b500c..3a1207d08704dd06e423f11b32bd4c7f64e49ae8 100644 (file)
@@ -96,7 +96,7 @@ public:
 
        virtual void matrixTransformScale(float * m44, float * offset4, const float * scale4) = 0;
 
-       virtual void setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor) = 0;
+       virtual bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor) = 0;
        virtual void finishGLSLDraw(struct OCIO_GLSLDrawState *state) = 0;
        virtual void freeGLState(struct OCIO_GLSLDrawState *state_r) = 0;
 };
@@ -169,7 +169,7 @@ public:
 
        void matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
-       void setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
+       bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
        void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
        void freeGLState(struct OCIO_GLSLDrawState *state_r);
 };
@@ -243,7 +243,7 @@ public:
 
        void matrixTransformScale(float * m44, float * offset4, const float * scale4);
 
-       void setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
+       bool setupGLSLDraw(struct OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor);
        void finishGLSLDraw(struct OCIO_GLSLDrawState *state);
        void freeGLState(struct OCIO_GLSLDrawState *state_r);
 };
index c79593779cf4ba8995cc291acd0ef9a5c6cf6882..59845abca338fe65d534d739ff7b991b3ac10dac 100644 (file)
@@ -187,7 +187,7 @@ static void ensureLUT3DAllocated(OCIO_GLSLDrawState *state)
  * When all drawing is finished, finishGLSLDraw shall be called to
  * restore OpenGL context to it's pre-GLSL draw state.
  */
-void OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
+bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor)
 {
        ConstProcessorRcPtr ocio_processor = *(ConstProcessorRcPtr *) processor;
 
@@ -232,22 +232,35 @@ void OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
 
                if (state->fragShader)
                        glDeleteShader(state->fragShader);
+
                state->fragShader = compileShaderText(GL_FRAGMENT_SHADER, os.str().c_str());
 
-               if (state->program)
-                       glDeleteProgram(state->program);
+               if (state->fragShader) {
+                       if (state->program)
+                               glDeleteProgram(state->program);
 
-               state->program = linkShaders(state->fragShader);
+                       state->program = linkShaders(state->fragShader);
+               }
        }
 
-       glActiveTexture(GL_TEXTURE1);
-       glBindTexture(GL_TEXTURE_3D, state->lut3d_texture);
+       if (state->program) {
+               glActiveTexture(GL_TEXTURE1);
+               glBindTexture(GL_TEXTURE_3D, state->lut3d_texture);
 
-       glActiveTexture(GL_TEXTURE0);
+               glActiveTexture(GL_TEXTURE0);
 
-       glUseProgram(state->program);
-       glUniform1i(glGetUniformLocation(state->program, "tex1"), 0);
-       glUniform1i(glGetUniformLocation(state->program, "tex2"), 1);
+               glUseProgram(state->program);
+               glUniform1i(glGetUniformLocation(state->program, "tex1"), 0);
+               glUniform1i(glGetUniformLocation(state->program, "tex2"), 1);
+
+               return true;
+       }
+       else {
+               glActiveTexture(state->last_texture_unit);
+               glBindTexture(GL_TEXTURE_2D, state->last_texture);
+
+               return false;
+       }
 }
 
 void OCIOImpl::finishGLSLDraw(OCIO_GLSLDrawState *state)
@@ -267,6 +280,12 @@ void OCIOImpl::freeGLState(struct OCIO_GLSLDrawState *state)
        if (state->lut3d)
                MEM_freeN(state->lut3d);
 
+       if (state->program)
+               glDeleteProgram(state->program);
+
+       if (state->fragShader)
+               glDeleteShader(state->fragShader);
+
        state->lut3dcacheid.~string();
        state->shadercacheid.~string();
 
index 95f67b9b21dcbb461f9e227d35c207ebe8f6627c..e9447d255cb210b7a0fdd04a163573f01c865ff9 100644 (file)
@@ -2775,9 +2775,7 @@ int IMB_coloemanagement_setup_glsl_draw(const ColorManagedViewSettings *view_set
        /* Make sure OCIO processor is up-to-date. */
        update_glsl_display_processor(applied_view_settings, display_settings);
 
-       OCIO_setupGLSLDraw(&global_glsl_state.ocio_glsl_state, global_glsl_state.processor);
-
-       return TRUE;
+       return OCIO_setupGLSLDraw(&global_glsl_state.ocio_glsl_state, global_glsl_state.processor);
 }
 
 int IMB_coloemanagement_setup_glsl_draw_from_ctx(const bContext *C)