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-07 00:54:24 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-04-07 00:54:39 +0300
commit2d618974d14672e6ec38612e76aca70e619f7242 (patch)
tree4d670fd5d6e6b55c6fe75ac27c5bd030f9906667 /source/blender/gpu
parent3e998b886080d3cd11137327356d1c861ae7ddb4 (diff)
UI: Perf: Port color widgets to batch.
This is more for completeness than perf. Shader is tiny bit more complex but we get less overdraw and drawcalls.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/CMakeLists.txt1
-rw-r--r--source/blender/gpu/intern/gpu_shader.c5
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl34
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl14
4 files changed, 51 insertions, 3 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index e6c6e6c0eb4..bf0e6ea3368 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -133,6 +133,7 @@ data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_flat_color_alpha_test_0_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_widget_base_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_widget_base_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_widget_shadow_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_widget_shadow_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_nodelink_frag.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 7c7297e90fb..db5c2d1bcb5 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -68,6 +68,7 @@ extern char datatoc_gpu_shader_2D_image_vert_glsl[];
extern char datatoc_gpu_shader_2D_image_rect_vert_glsl[];
extern char datatoc_gpu_shader_2D_image_multi_rect_vert_glsl[];
extern char datatoc_gpu_shader_2D_widget_base_vert_glsl[];
+extern char datatoc_gpu_shader_2D_widget_base_frag_glsl[];
extern char datatoc_gpu_shader_2D_widget_shadow_vert_glsl[];
extern char datatoc_gpu_shader_2D_widget_shadow_frag_glsl[];
extern char datatoc_gpu_shader_2D_nodelink_frag_glsl[];
@@ -802,9 +803,9 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
datatoc_gpu_shader_instance_edges_variying_color_geom_glsl},
[GPU_SHADER_2D_WIDGET_BASE] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
- datatoc_gpu_shader_2D_smooth_color_frag_glsl},
+ datatoc_gpu_shader_2D_widget_base_frag_glsl},
[GPU_SHADER_2D_WIDGET_BASE_INST] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
- datatoc_gpu_shader_2D_smooth_color_frag_glsl},
+ datatoc_gpu_shader_2D_widget_base_frag_glsl},
[GPU_SHADER_2D_WIDGET_SHADOW] = { datatoc_gpu_shader_2D_widget_shadow_vert_glsl,
datatoc_gpu_shader_2D_widget_shadow_frag_glsl },
[GPU_SHADER_2D_NODELINK] = { datatoc_gpu_shader_2D_nodelink_vert_glsl,
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl
new file mode 100644
index 00000000000..929674ab446
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl
@@ -0,0 +1,34 @@
+uniform vec3 checkerColorAndSize;
+
+noperspective in vec4 finalColor;
+noperspective in float butCo;
+
+out vec4 fragColor;
+
+vec4 do_checkerboard()
+{
+ float size = checkerColorAndSize.z;
+ vec2 phase = mod(gl_FragCoord.xy, size * 2.0);
+
+ if ((phase.x > size && phase.y < size) ||
+ (phase.x < size && phase.y > size))
+ {
+ return vec4(checkerColorAndSize.xxx, 1.0);
+ }
+ else {
+ return vec4(checkerColorAndSize.yyy, 1.0);
+ }
+}
+
+void main()
+{
+ fragColor = finalColor;
+
+ if (butCo > 0.5) {
+ fragColor = mix(do_checkerboard(), fragColor, fragColor.a);
+ }
+
+ if (butCo > 0.0) {
+ fragColor.a = 1.0;
+ }
+} \ No newline at end of file
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 f4dafd7de16..9f28d9bb3a3 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
@@ -95,10 +95,12 @@ uniform vec4 parameters[11];
#define tria1Size parameters[gl_InstanceID * 11 + 10].x
#define tria2Size parameters[gl_InstanceID * 11 + 10].y
#define shadeDir parameters[gl_InstanceID * 11 + 10].z
+#define doAlphaCheck parameters[gl_InstanceID * 11 + 10].w
in uint vflag;
noperspective out vec4 finalColor;
+noperspective out float butCo;
vec2 do_widget(void)
{
@@ -128,13 +130,22 @@ vec2 do_widget(void)
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);
+ if (doAlphaCheck != 0.0) {
+ finalColor = colorInner1;
+ butCo = uv.x;
+ }
+ else {
+ finalColor = mix(colorInner2, colorInner1, fac);
+ butCo = -1.0;
+ }
}
else if (color_id == COLOR_EDGE) {
finalColor = colorEdge;
+ butCo = -1.0;
}
else /* (color_id == COLOR_EMBOSS) */ {
finalColor = colorEmboss;
+ butCo = -1.0;
}
bool is_emboss = (vflag & EMBOSS_FLAG) != 0u;
@@ -150,6 +161,7 @@ vec2 do_tria()
vec2 v = triavec[vofs];
finalColor = colorTria;
+ butCo = -1.0;
bool is_tria_first = (vflag & TRIA_FIRST) != 0u;