Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/opencolorio/ocio_impl_glsl.cc')
-rw-r--r--intern/opencolorio/ocio_impl_glsl.cc39
1 files changed, 29 insertions, 10 deletions
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();