[Bf-blender-cvs] [a1459b2f7a5] master: Cleanup: GPU: Move towards an explicit Blend state

Clément Foucault noreply at git.blender.org
Tue Aug 18 21:31:00 CEST 2020


Commit: a1459b2f7a53fc9e7a52260e975c47c48c6c383d
Author: Clément Foucault
Date:   Sun Aug 16 14:47:13 2020 +0200
Branches: master
https://developer.blender.org/rBa1459b2f7a53fc9e7a52260e975c47c48c6c383d

Cleanup: GPU: Move towards an explicit Blend state

This make use of the GLStateStack functions for:
- `GPU_blend()`
- `GPU_blend_set_func()`
- `GPU_blend_set_func_separate()`

The goal is to unify them using an explicit state setting.
This will remove the need to use obscure blend functions

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

M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_draw.c
M	source/blender/editors/sculpt_paint/paint_cursor.c
M	source/blender/gpu/intern/gpu_state.cc
M	source/blender/windowmanager/intern/wm_draw.c
M	source/blender/windowmanager/intern/wm_gesture.c
M	source/blender/windowmanager/intern/wm_init_exit.c

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

diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 267fc441f20..68d39246e5f 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -135,7 +135,6 @@ static void region_draw_emboss(const ARegion *region, const rcti *scirct, int si
   immUnbindProgram();
 
   GPU_blend(false);
-  GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
 }
 
 void ED_region_pixelspace(ARegion *region)
diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c
index d8d47fb01aa..b0e96c2dae1 100644
--- a/source/blender/editors/screen/screen_draw.c
+++ b/source/blender/editors/screen/screen_draw.c
@@ -308,10 +308,9 @@ static void scrarea_draw_shape_dark(ScrArea *area, char dir, uint pos)
  */
 static void scrarea_draw_shape_light(ScrArea *area, char UNUSED(dir), uint pos)
 {
-  GPU_blend_set_func(GPU_DST_COLOR, GPU_SRC_ALPHA);
-  /* value 181 was hardly computed: 181~105 */
-  immUniformColor4ub(255, 255, 255, 50);
-  /* draw_join_shape(area, dir); */
+  GPU_blend_set_func_separate(
+      GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+  immUniformColor4ub(255, 255, 255, 25);
 
   immRectf(pos, area->v1->vec.x, area->v1->vec.y, area->v3->vec.x, area->v3->vec.y);
 }
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 63b4516b1cc..0c5e4ea9538 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -634,8 +634,8 @@ static bool paint_draw_tex_overlay(UnifiedPaintSettings *ups,
     uint texCoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
     /* Premultiplied alpha blending. */
-    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
     GPU_blend(true);
+    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
 
     immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_COLOR);
 
@@ -670,8 +670,6 @@ static bool paint_draw_tex_overlay(UnifiedPaintSettings *ups,
 
     GPU_texture_unbind(texture);
 
-    GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
-
     if (ELEM(mtex->brush_map_mode, MTEX_MAP_MODE_STENCIL, MTEX_MAP_MODE_VIEW)) {
       GPU_matrix_pop();
     }
@@ -729,8 +727,8 @@ static bool paint_draw_cursor_overlay(
     uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
     uint texCoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 
-    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
     GPU_blend(true);
+    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
 
     immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_COLOR);
 
@@ -757,8 +755,6 @@ static bool paint_draw_cursor_overlay(
 
     immUnbindProgram();
 
-    GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
-
     if (do_pop) {
       GPU_matrix_pop();
     }
diff --git a/source/blender/gpu/intern/gpu_state.cc b/source/blender/gpu/intern/gpu_state.cc
index 485aa3b852e..d2aa0816a3f 100644
--- a/source/blender/gpu/intern/gpu_state.cc
+++ b/source/blender/gpu/intern/gpu_state.cc
@@ -35,8 +35,17 @@
 
 #include "gpu_state_private.hh"
 
+/* TODO remove */
+#include "gl_state.hh"
+
 using namespace blender::gpu;
 
+// /* This should replace GPU_blend, GPU_blend_set_func and GPU_blend_set_func_separate. */
+// void GPU_blend_set(eGPUBlend blend)
+// {
+//   GLStateStack::set_blend(blend);
+// }
+
 static GLenum gpu_get_gl_blendfunction(eGPUBlendFunction blend)
 {
   switch (blend) {
@@ -59,16 +68,30 @@ static GLenum gpu_get_gl_blendfunction(eGPUBlendFunction blend)
 void GPU_blend(bool enable)
 {
   if (enable) {
-    glEnable(GL_BLEND);
+    GLStateStack::set_blend(GPU_BLEND_ALPHA);
   }
   else {
-    glDisable(GL_BLEND);
+    GLStateStack::set_blend(GPU_BLEND_NONE);
   }
 }
 
 void GPU_blend_set_func(eGPUBlendFunction sfactor, eGPUBlendFunction dfactor)
 {
-  glBlendFunc(gpu_get_gl_blendfunction(sfactor), gpu_get_gl_blendfunction(dfactor));
+  if (sfactor == GPU_ONE && dfactor == GPU_ONE) {
+    GLStateStack::set_blend(GPU_BLEND_ADDITIVE);
+  }
+  else if (sfactor == GPU_ONE && dfactor == GPU_ONE_MINUS_SRC_ALPHA) {
+    GLStateStack::set_blend(GPU_BLEND_ALPHA_PREMULT);
+  }
+  else if (sfactor == GPU_SRC_ALPHA && dfactor == GPU_ONE_MINUS_SRC_ALPHA) {
+    GLStateStack::set_blend(GPU_BLEND_ALPHA);
+  }
+  else if (sfactor == GPU_DST_COLOR && dfactor == GPU_ZERO) {
+    GLStateStack::set_blend(GPU_BLEND_MULTIPLY);
+  }
+  else {
+    BLI_assert(0);
+  }
 }
 
 void GPU_blend_set_func_separate(eGPUBlendFunction src_rgb,
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index bfc155dce16..a9af4f16747 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -577,8 +577,8 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend)
 
   if (blend) {
     /* GL_ONE because regions drawn offscreen have premultiplied alpha. */
-    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
     GPU_blend(true);
+    GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
   }
 
   /* setup actual texture */
@@ -603,7 +603,6 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend)
   GPU_texture_unbind(texture);
 
   if (blend) {
-    GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
     GPU_blend(false);
   }
 }
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index 55233168ab2..abe8364d7c3 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -370,7 +370,6 @@ static void draw_filled_lasso(wmGesture *gt)
     MEM_freeN(pixel_buf);
 
     GPU_blend(false);
-    GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA);
   }
 
   MEM_freeN(mcoords);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 075469743ec..e8f663b0c4a 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -350,8 +350,6 @@ void WM_init(bContext *C, int argc, const char **argv)
   BKE_material_copybuf_clear();
   ED_render_clear_mtex_copybuf();
 
-  // GPU_blend_set_func(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
-
   wm_history_file_read();
 
   /* allow a path of "", this is what happens when making a new file */



More information about the Bf-blender-cvs mailing list