diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-03-29 21:22:31 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-03-29 22:32:26 +0300 |
commit | 7144fdf28568e195dc639bea8828e614d7eb6f79 (patch) | |
tree | 837bb3094fea9bca5f6d3c0eacd8e51fa57e784d /source/blender/blenfont/intern/blf_glyph.c | |
parent | c48b6fae9ae6d06bc99fc4eea6a4c54d978d3a16 (diff) |
BLF: Perf: Divide by 6 the amount of verts sent to the GPU.
This means smaller imm buffer usage.
This does not reduce the number of drawcalls.
This uses geometry shader which is slow for the GPU but given we are really
CPU bound on this case, it should not matter.
A perfect implementation would:
- Set the glyph coord in a bufferTexture and just send the glyph ID to the
GPU to read the bufferTexture.
- Use GWN_draw_primitive and draw 2*strllen triangle and just retrieve the
glyph ID and color based on gl_VertexID / 6.
- Stream fixed size buffer that the Driver can discard quickly but this is
the same as improving IMM directly.
Diffstat (limited to 'source/blender/blenfont/intern/blf_glyph.c')
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 30 |
1 files changed, 5 insertions, 25 deletions
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 1f31a2dbd0a..5e1debf1501 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -318,31 +318,11 @@ void blf_glyph_free(GlyphBLF *g) static void blf_texture_draw(const unsigned char color[4], float uv[2][2], float dx, float y1, float dx1, float y2) { - /* First triangle. */ - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[0][1]); - immSkipAttrib(BLF_COLOR_ID); /* skip color of most vertices */ - immVertex2f(BLF_POS_ID, dx, y1); - - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[1][1]); - immSkipAttrib(BLF_COLOR_ID); - immVertex2f(BLF_POS_ID, dx, y2); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[1][1]); - immAttrib4ubv(BLF_COLOR_ID, color); /* set color of provoking vertex */ - immVertex2f(BLF_POS_ID, dx1, y2); - - /* Second triangle. */ - immAttrib2f(BLF_COORD_ID, uv[0][0], uv[0][1]); - immSkipAttrib(BLF_COLOR_ID); /* skip color of most vertices */ - immVertex2f(BLF_POS_ID, dx, y1); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[1][1]); - immSkipAttrib(BLF_COLOR_ID); - immVertex2f(BLF_POS_ID, dx1, y2); - - immAttrib2f(BLF_COORD_ID, uv[1][0], uv[0][1]); - immAttrib4ubv(BLF_COLOR_ID, color); /* set color of provoking vertex */ - immVertex2f(BLF_POS_ID, dx1, y1); + /* Only one vertex per glyph, geometry shader expand it into a quad. */ + /* TODO Get rid of Geom Shader because it's not optimal AT ALL for the GPU */ + immAttrib4ubv(BLF_COLOR_ID, color); + immAttrib4fv(BLF_COORD_ID, (float *)uv); + immVertex4f(BLF_POS_ID, dx, y1, dx1, y2); } static void blf_texture5_draw(const unsigned char color_in[4], float uv[2][2], float x1, float y1, float x2, float y2) |