From f871d9a82f06e70fb26cbe0bfbd4db18d481059c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 2 Apr 2013 17:28:29 +0000 Subject: Fixes for recent GLSL display space conversions - Building without OCIO will give correct results again - If GLSL failed to compile, fallback to glaDrawPixelsAuto will happen. --- intern/opencolorio/fallback_impl.cc | 3 ++- intern/opencolorio/ocio_capi.cc | 4 ++-- intern/opencolorio/ocio_capi.h | 2 +- intern/opencolorio/ocio_impl.h | 6 +++--- intern/opencolorio/ocio_impl_glsl.cc | 39 +++++++++++++++++++++++++++--------- 5 files changed, 37 insertions(+), 17 deletions(-) (limited to 'intern/opencolorio') diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc index 47c648e9cba..4c19c454aee 100644 --- a/intern/opencolorio/fallback_impl.cc +++ b/intern/opencolorio/fallback_impl.cc @@ -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) diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc index 73d8af295f2..8e831bb0736 100644 --- a/intern/opencolorio/ocio_capi.cc +++ b/intern/opencolorio/ocio_capi.cc @@ -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) diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h index 3c42e0a1a1e..8d8db161077 100644 --- a/intern/opencolorio/ocio_capi.h +++ b/intern/opencolorio/ocio_capi.h @@ -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); diff --git a/intern/opencolorio/ocio_impl.h b/intern/opencolorio/ocio_impl.h index 2a1f88be5f4..3a1207d0870 100644 --- a/intern/opencolorio/ocio_impl.h +++ b/intern/opencolorio/ocio_impl.h @@ -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); }; diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index c79593779cf..59845abca33 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -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(); -- cgit v1.2.3