[Bf-blender-cvs] [b7f3ebe014a] blender-v2.93-release: Fix T86450: Random dark UI elements when redrawing

Campbell Barton noreply at git.blender.org
Sat May 1 16:12:50 CEST 2021


Commit: b7f3ebe014a250c417f7d0810aa102067979477d
Author: Campbell Barton
Date:   Sun May 2 00:09:43 2021 +1000
Branches: blender-v2.93-release
https://developer.blender.org/rBb7f3ebe014a250c417f7d0810aa102067979477d

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

===================================================================

M	source/blender/gpu/intern/gpu_shader.cc

===================================================================

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;
+  }
 }
 
 /** \} */



More information about the Bf-blender-cvs mailing list