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:
authorClément Foucault <foucault.clem@gmail.com>2018-03-29 17:35:45 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-03-29 17:36:01 +0300
commitd93e7e643031448dad7f407ccb285c3b9cf91034 (patch)
tree1f0e484a380459cf2ac0cc001fff962243109be5 /source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
parent26b9c502edced5142e4c2e0151566b31b524bbab (diff)
UI: Perf: Group fill/border/emboss batches together.
This roughly halves the number of drawcalls from widgetbase_draw.
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl')
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl62
1 files changed, 41 insertions, 21 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
index 78fbc4b132b..1920184aefe 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
@@ -1,3 +1,5 @@
+#define BIT_RANGE(x) ((1u << x) - 1u)
+
/* 2 bits for corner */
/* Attention! Not the same order as in UI_interface.h!
* Ordered by drawing order. */
@@ -5,11 +7,11 @@
#define BOTTOM_RIGHT 1u
#define TOP_RIGHT 2u
#define TOP_LEFT 3u
-#define CNR_FLAG_RANGE ((1u << 2u) - 1u)
+#define CNR_FLAG_RANGE BIT_RANGE(2u)
/* 4bits for corner id */
#define CORNER_VEC_OFS 2u
-#define CORNER_VEC_RANGE ((1u << 4u) - 1u)
+#define CORNER_VEC_RANGE BIT_RANGE(4u)
const vec2 cornervec[36] = vec2[36](
vec2(0.0, 1.0), vec2(0.02, 0.805), vec2(0.067, 0.617), vec2(0.169, 0.45), vec2(0.293, 0.293), vec2(0.45, 0.169), vec2(0.617, 0.076), vec2(0.805, 0.02), vec2(1.0, 0.0),
vec2(-1.0, 0.0), vec2(-0.805, 0.02), vec2(-0.617, 0.067), vec2(-0.45, 0.169), vec2(-0.293, 0.293), vec2(-0.169, 0.45), vec2(-0.076, 0.617), vec2(-0.02, 0.805), vec2(0.0, 1.0),
@@ -19,7 +21,7 @@ const vec2 cornervec[36] = vec2[36](
/* 4bits for jitter id */
#define JIT_OFS 6u
-#define JIT_RANGE ((1u << 4u) - 1u)
+#define JIT_RANGE BIT_RANGE(4u)
const vec2 jit[9] = vec2[9](
vec2( 0.468813, -0.481430), vec2(-0.155755, -0.352820),
vec2( 0.219306, -0.238501), vec2(-0.393286, -0.110949),
@@ -28,23 +30,32 @@ const vec2 jit[9] = vec2[9](
vec2( 0.0, 0.0)
);
-/* 2bits for other flag */
-#define INNER_FLAG (1u << 10u) /* is inner vert */
-#define EMBOSS_FLAG (1u << 11u) /* is emboss vert */
+/* 2bits for other flags */
+#define INNER_FLAG (1u << 10u) /* is inner vert */
+#define EMBOSS_FLAG (1u << 11u) /* is emboss vert */
+
+/* 2bits for color */
+#define COLOR_OFS 12u
+#define COLOR_RANGE BIT_RANGE(2u)
+#define COLOR_INNER 0u
+#define COLOR_EDGE 1u
+#define COLOR_EMBOSS 2u
uniform mat4 ModelViewProjectionMatrix;
-uniform vec4 parameters[7];
+uniform vec4 parameters[9];
/* radi and rad per corner */
-#define recti parameters[0]
-#define rect parameters[1]
-#define radsi parameters[2].x
-#define rads parameters[2].y
-#define faci parameters[2].zw
+#define recti parameters[0]
+#define rect parameters[1]
+#define radsi parameters[2].x
+#define rads parameters[2].y
+#define faci parameters[2].zw
#define roundCorners parameters[3]
-#define color1 parameters[4]
-#define color2 parameters[5]
-#define shadeDir parameters[6].x
+#define colorInner1 parameters[4]
+#define colorInner2 parameters[5]
+#define colorEdge parameters[6]
+#define colorEmboss parameters[7]
+#define shadeDir parameters[8].x
in uint vflag;
@@ -57,7 +68,7 @@ void main()
vec2 v = cornervec[cflag * 9u + vofs];
- bool is_inner = (vflag & INNER_FLAG) != 0.0;
+ bool is_inner = (vflag & INNER_FLAG) != 0u;
/* Scale by corner radius */
v *= roundCorners[cflag] * ((is_inner) ? radsi : rads);
@@ -74,11 +85,20 @@ void main()
v += rct.xw;
/* compute uv and color gradient */
- vec2 uv = faci * (v - recti.xz);
- float fac = clamp((shadeDir > 0.0) ? uv.y : uv.x, 0.0, 1.0);
- finalColor = mix(color2, color1, fac);
-
- bool is_emboss = (vflag & EMBOSS_FLAG) != 0.0;
+ uint color_id = (vflag >> COLOR_OFS) & COLOR_RANGE;
+ if (color_id == COLOR_INNER) {
+ vec2 uv = faci * (v - recti.xz);
+ float fac = clamp((shadeDir > 0.0) ? uv.y : uv.x, 0.0, 1.0);
+ finalColor = mix(colorInner2, colorInner1, fac);
+ }
+ else if (color_id == COLOR_EDGE) {
+ finalColor = colorEdge;
+ }
+ else /* (color_id == COLOR_EMBOSS) */ {
+ finalColor = colorEmboss;
+ }
+
+ bool is_emboss = (vflag & EMBOSS_FLAG) != 0u;
v.y -= (is_emboss) ? 1.0f : 0.0;
/* Antialiasing offset */