From 44b3985a180a1530f4f54bb8c269c82807d3f577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sat, 5 Sep 2020 02:45:25 +0200 Subject: GPUTexture: OCIO: Workaround new missing bind error checking We cannot change the texture bind point since the interface count 4/5 textures to bind. Changing the uniform to avoid one bind make the system thinks one texture is missing. Avoid this by creating a dummy texture and binding it to the empty slot. --- intern/opencolorio/ocio_impl_glsl.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'intern/opencolorio') diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index c6e194a2ea9..6a4b03976e4 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -97,7 +97,6 @@ struct OCIO_GLSLShader { /** Uniform locations. */ GLint dither_loc; GLint overlay_loc; - GLint overlay_tex_loc; GLint predivide_loc; GLint curve_mapping_loc; GLint ubo_bind; @@ -108,9 +107,10 @@ struct OCIO_GLSLShader { struct OCIO_GLSLLut3d { /** Cache IDs */ std::string cacheId; - /** OpenGL Texture handles. 0 if not allocated. */ + /** OpenGL Texture handles. NULL if not allocated. */ GPUTexture *texture; GPUTexture *texture_display; + GPUTexture *texture_dummy; /** Error checking. */ bool valid; }; @@ -188,7 +188,6 @@ static void updateGLSLShader(OCIO_GLSLShader *shader, if (shader->shader) { shader->dither_loc = GPU_shader_get_uniform(shader->shader, "dither"); - shader->overlay_tex_loc = GPU_shader_get_uniform(shader->shader, "overlay_texture"); shader->overlay_loc = GPU_shader_get_uniform(shader->shader, "overlay"); shader->predivide_loc = GPU_shader_get_uniform(shader->shader, "predivide"); shader->curve_mapping_loc = GPU_shader_get_uniform(shader->shader, "curve_mapping"); @@ -200,6 +199,7 @@ static void updateGLSLShader(OCIO_GLSLShader *shader, /* Set texture bind point uniform once. This is saved by the shader. */ GPUShader *sh = shader->shader; GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "image_texture"), 0); + GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "overlay_texture"), 1); GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_texture"), 2); GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "lut3d_display_texture"), 3); GPU_shader_uniform_int(sh, GPU_shader_get_uniform(sh, "curve_mapping_texture"), 4); @@ -293,6 +293,8 @@ static void ensureGLSLLut3d(OCIO_GLSLLut3d **lut3d_ptr, GPU_texture_filter_mode(lut3d->texture_display, true); GPU_texture_wrap_mode(lut3d->texture_display, false, true); + lut3d->texture_dummy = GPU_texture_create_error(2, false); + updateGLSLLut3d(lut3d, processor_scene_to_ui, processpr_ui_to_display, shaderDesc, cache_id); lut3d->valid = (lut3d->texture && lut3d->texture_display); @@ -304,6 +306,7 @@ static void freeGLSLLut3d(OCIO_GLSLLut3d *lut3d) { GPU_texture_free(lut3d->texture); GPU_texture_free(lut3d->texture_display); + GPU_texture_free(lut3d->texture_dummy); OBJECT_GUARDED_DELETE(lut3d, OCIO_GLSLLut3d); } @@ -543,6 +546,10 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, /* Bind textures to sampler units. Texture 0 is set by caller. * Uniforms have already been set for texture bind points.*/ + if (!use_overlay) { + /* Avoid missing binds. */ + GPU_texture_bind(shader_lut->texture_dummy, 1); + } GPU_texture_bind(shader_lut->texture, 2); GPU_texture_bind(shader_lut->texture_display, 3); GPU_texture_bind(shader_curvemap->texture, 4); @@ -556,7 +563,6 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, /* Bind Shader and set uniforms. */ // GPU_shader_bind(shader->shader); GPU_shader_uniform_float(shader->shader, shader->dither_loc, dither); - GPU_shader_uniform_int(shader->shader, shader->overlay_tex_loc, use_overlay ? 1 : 0); GPU_shader_uniform_int(shader->shader, shader->overlay_loc, use_overlay); GPU_shader_uniform_int(shader->shader, shader->predivide_loc, use_predivide); GPU_shader_uniform_int(shader->shader, shader->curve_mapping_loc, use_curve_mapping); -- cgit v1.2.3