diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-03-29 17:35:45 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-03-29 17:36:01 +0300 |
commit | d93e7e643031448dad7f407ccb285c3b9cf91034 (patch) | |
tree | 1f0e484a380459cf2ac0cc001fff962243109be5 /source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl | |
parent | 26b9c502edced5142e4c2e0151566b31b524bbab (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.glsl | 62 |
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 */ |