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-04-01 12:49:15 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-04-02 19:47:56 +0300
commite1d6e524b3cc835a99dfbcf749e695fd831f9e95 (patch)
tree5f2471b760d33659a47e0a095f9d6c442ebe447d /source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
parentb49290be14d985d4cc60b0d110b8b8ad4d543ba0 (diff)
UI: Perf: Batch Trias with widgets.
This remove another portion of imm calls and reduce overall drawcall count.
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.glsl66
1 files changed, 63 insertions, 3 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 1920184aefe..2686f443c87 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
@@ -41,9 +41,37 @@ const vec2 jit[9] = vec2[9](
#define COLOR_EDGE 1u
#define COLOR_EMBOSS 2u
+/* 2bits for trias type */
+#define TRIA_FLAG (1u << 14u) /* is tria vert */
+#define TRIA_FIRST INNER_FLAG /* is first tria (reuse INNER_FLAG) */
+
+/* We can reuse the CORNER_* bits for tria */
+#define TRIA_VEC_RANGE BIT_RANGE(6u)
+const vec2 triavec[34] = vec2[34](
+ /* horizontal tria */
+ vec2(-0.352077, 0.532607), vec2(-0.352077, -0.549313), vec2( 0.330000, -0.008353),
+ vec2( 0.352077, 0.532607), vec2( 0.352077, -0.549313), vec2(-0.330000, -0.008353),
+ /* circle tria (triangle strip) */
+ vec2(0.000000, 1.000000),
+ vec2(0.382684, 0.923879), vec2(-0.382683, 0.923880),
+ vec2(0.707107, 0.707107), vec2(-0.707107, 0.707107),
+ vec2(0.923879, 0.382684), vec2(-0.923879, 0.382684),
+ vec2(1.000000, 0.000000), vec2(-1.000000, 0.000000),
+ vec2(0.923879, -0.382684), vec2(-0.923879, -0.382684),
+ vec2(0.707107, -0.707107), vec2(-0.707107, -0.707107),
+ vec2(0.382684, -0.923879), vec2(-0.382683, -0.923880),
+ vec2(0.000000, -1.000000),
+ /* menu arrow */
+ vec2(-0.33, 0.16), vec2(0.33, 0.16), vec2(0.0, 0.82),
+ vec2(0.0, -0.82), vec2(-0.33, -0.16), vec2(0.33, -0.16),
+ /* check mark */
+ vec2(-0.578579, 0.253369), vec2(-0.392773, 0.412794), vec2(-0.004241, -0.328551),
+ vec2(-0.003001, 0.034320), vec2(1.055313, 0.864744), vec2(0.866408, 1.026895)
+);
+
uniform mat4 ModelViewProjectionMatrix;
-uniform vec4 parameters[9];
+uniform vec4 parameters[11];
/* radi and rad per corner */
#define recti parameters[0]
#define rect parameters[1]
@@ -55,13 +83,18 @@ uniform vec4 parameters[9];
#define colorInner2 parameters[5]
#define colorEdge parameters[6]
#define colorEmboss parameters[7]
-#define shadeDir parameters[8].x
+#define colorTria parameters[8]
+#define tria1Center parameters[9].xy
+#define tria2Center parameters[9].zw
+#define tria1Size parameters[10].x
+#define tria2Size parameters[10].y
+#define shadeDir parameters[10].z
in uint vflag;
noperspective out vec4 finalColor;
-void main()
+vec2 do_widget(void)
{
uint cflag = vflag & CNR_FLAG_RANGE;
uint vofs = (vflag >> CORNER_VEC_OFS) & CORNER_VEC_RANGE;
@@ -101,6 +134,33 @@ void main()
bool is_emboss = (vflag & EMBOSS_FLAG) != 0u;
v.y -= (is_emboss) ? 1.0f : 0.0;
+ return v;
+}
+
+vec2 do_tria()
+{
+ uint vofs = vflag & TRIA_VEC_RANGE;
+
+ vec2 v = triavec[vofs];
+
+ finalColor = colorTria;
+
+ bool is_tria_first = (vflag & TRIA_FIRST) != 0u;
+
+ if (is_tria_first)
+ v = v * tria1Size + tria1Center;
+ else
+ v = v * tria2Size + tria2Center;
+
+ return v;
+}
+
+void main()
+{
+ bool is_tria = (vflag & TRIA_FLAG) != 0u;
+
+ vec2 v = (is_tria) ? do_tria() : do_widget();
+
/* Antialiasing offset */
v += jit[(vflag >> JIT_OFS) & JIT_RANGE];