diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-08-23 23:29:29 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-08-23 23:29:45 +0300 |
commit | 34b3d6e2f88c275032cfec5aacd036cb65d20dc3 (patch) | |
tree | 591bbf8f3008fe418ac0c185fafb614a579d670b /source/blender/gpu | |
parent | fb7fc3be194ba324b84eaa1c538bf3f8b74c726e (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.txt | 1 | ||||
-rw-r--r-- | source/blender/gpu/GPU_shader.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 3 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl | 42 |
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)); +} |