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-08-23 23:29:29 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-08-23 23:29:45 +0300
commit34b3d6e2f88c275032cfec5aacd036cb65d20dc3 (patch)
tree591bbf8f3008fe418ac0c185fafb614a579d670b /source/blender/gpu
parentfb7fc3be194ba324b84eaa1c538bf3f8b74c726e (diff)
UI: Optimize the area border drawing
It is was not really a bottleneck but it was triggering my OCD when 1/3rd of the drawcalls in a normal scene were basically only caused by this.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/CMakeLists.txt1
-rw-r--r--source/blender/gpu/GPU_shader.h1
-rw-r--r--source/blender/gpu/intern/gpu_shader.c3
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl42
4 files changed, 47 insertions, 0 deletions
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 1765be552e5..d232d3fab93 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -141,6 +141,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_flat_id_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_2D_area_borders_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)
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index d761ffc6a6d..7cb841c421a 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -351,6 +351,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_GPENCIL_STROKE,
GPU_SHADER_GPENCIL_FILL,
/* specialized for widget drawing */
+ GPU_SHADER_2D_AREA_EDGES,
GPU_SHADER_2D_WIDGET_BASE,
GPU_SHADER_2D_WIDGET_BASE_INST,
GPU_SHADER_2D_WIDGET_SHADOW,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 62e6427a738..daea96df008 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -63,6 +63,7 @@ extern char datatoc_gpu_shader_simple_lighting_smooth_color_alpha_frag_glsl[];
extern char datatoc_gpu_shader_flat_color_frag_glsl[];
extern char datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl[];
extern char datatoc_gpu_shader_flat_id_frag_glsl[];
+extern char datatoc_gpu_shader_2D_area_borders_vert_glsl[];
extern char datatoc_gpu_shader_2D_vert_glsl[];
extern char datatoc_gpu_shader_2D_flat_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_smooth_color_uniform_alpha_vert_glsl[];
@@ -878,6 +879,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
datatoc_gpu_shader_flat_color_frag_glsl,
datatoc_gpu_shader_instance_edges_variying_color_geom_glsl},
+ [GPU_SHADER_2D_AREA_EDGES] = { datatoc_gpu_shader_2D_area_borders_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl},
[GPU_SHADER_2D_WIDGET_BASE] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
datatoc_gpu_shader_2D_widget_base_frag_glsl},
[GPU_SHADER_2D_WIDGET_BASE_INST] = { datatoc_gpu_shader_2D_widget_base_vert_glsl,
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl
new file mode 100644
index 00000000000..5326076e269
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl
@@ -0,0 +1,42 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+uniform vec4 rect;
+uniform int cornerLen;
+uniform float scale;
+
+in vec2 pos;
+
+const vec2 jitter_ofs[8] = vec2[8](
+ vec2( 0.468813, -0.481430), vec2(-0.155755, -0.352820),
+ vec2( 0.219306, -0.238501), vec2(-0.393286, -0.110949),
+ vec2(-0.024699, 0.013908), vec2( 0.343805, 0.147431),
+ vec2(-0.272855, 0.269918), vec2( 0.095909, 0.388710)
+);
+
+void main()
+{
+ int corner_id = (gl_VertexID / cornerLen) % 4;
+ int jitter_id = gl_VertexID / (cornerLen * 4) % 8;
+
+ vec2 final_pos = pos * scale;
+
+ if (corner_id == 0)
+ final_pos += rect.yw; /* top right */
+ else if (corner_id == 1)
+ final_pos += rect.xw; /* top left */
+ else if (corner_id == 2)
+ final_pos += rect.xz; /* bottom left */
+ else
+ final_pos += rect.yz; /* bottom right */
+
+ /* Only jitter verts inside the corner (not the one shared with the edges). */
+ if ((gl_VertexID % cornerLen) % (cornerLen - 2) != 0) {
+ /* Only jitter intern verts not boundaries. */
+ if ((gl_VertexID % 2) == 0) {
+ final_pos += jitter_ofs[jitter_id];
+ }
+ }
+
+ gl_Position = (ModelViewProjectionMatrix * vec4(final_pos, 0.0, 1.0));
+}