From b7f3ebe014a250c417f7d0810aa102067979477d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 2 May 2021 00:09:43 +1000 Subject: Fix T86450: Random dark UI elements when redrawing Resolves occasional glitch/flicker drawing dark buttons in the UI. Regression in 405a5d3bd7ada5dd5af605b59ba07c7144f144a2 which removed shader unbinding when the batch is drawn. GPU_shader_bind could run with the sRGB uniform in an unexpected state. Reviewed By: fclem Ref D11124 --- source/blender/gpu/intern/gpu_shader.cc | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index bb657ff1645..75fe7652715 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -57,6 +57,8 @@ static CLG_LogRef LOG = {"gpu.shader"}; using namespace blender; using namespace blender::gpu; +static bool gpu_shader_srgb_uniform_dirty_get(); + /* -------------------------------------------------------------------- */ /** \name Debug functions * \{ */ @@ -501,9 +503,13 @@ void GPU_shader_bind(GPUShader *gpu_shader) GPU_matrix_bind(gpu_shader); GPU_shader_set_srgb_uniform(gpu_shader); } - - if (GPU_matrix_dirty_get()) { - GPU_matrix_bind(gpu_shader); + else { + if (gpu_shader_srgb_uniform_dirty_get()) { + GPU_shader_set_srgb_uniform(gpu_shader); + } + if (GPU_matrix_dirty_get()) { + GPU_matrix_bind(gpu_shader); + } } } @@ -715,6 +721,12 @@ void GPU_shader_uniform_4fv_array(GPUShader *sh, const char *name, int len, cons * \{ */ static int g_shader_builtin_srgb_transform = 0; +static bool g_shader_builtin_srgb_is_dirty = false; + +static bool gpu_shader_srgb_uniform_dirty_get(void) +{ + return g_shader_builtin_srgb_is_dirty; +} void GPU_shader_set_srgb_uniform(GPUShader *shader) { @@ -722,11 +734,15 @@ void GPU_shader_set_srgb_uniform(GPUShader *shader) if (loc != -1) { GPU_shader_uniform_vector_int(shader, loc, 1, 1, &g_shader_builtin_srgb_transform); } + g_shader_builtin_srgb_is_dirty = false; } void GPU_shader_set_framebuffer_srgb_target(int use_srgb_to_linear) { - g_shader_builtin_srgb_transform = use_srgb_to_linear; + if (g_shader_builtin_srgb_transform != use_srgb_to_linear) { + g_shader_builtin_srgb_transform = use_srgb_to_linear; + g_shader_builtin_srgb_is_dirty = true; + } } /** \} */ -- cgit v1.2.3