Commit: 3e3efae7e9420817a6fe35545d97568a69e2ce7c
Author: Campbell Barton
Date:   Thu Apr 17 15:14:07 2014 +1000
https://developer.blender.org/rB3e3efae7e9420817a6fe35545d97568a69e2ce7c

Viewport Text Drawing: replace single allocs with a memarena

- pass label strlen since in many cases its already known.
- use single linked list for cached text drawing.
- add BLI_link_utils.h for single linked list macros.

own tests give approx 22% overall speedup.

===================================================================

A       source/blender/blenlib/BLI_link_utils.h
M       source/blender/editors/include/UI_view2d.h
M       source/blender/editors/interface/view2d.c
M       source/blender/editors/space_nla/nla_draw.c
M       source/blender/editors/space_sequencer/sequencer_draw.c
M       source/blender/editors/space_view3d/drawanimviz.c
M       source/blender/editors/space_view3d/drawarmature.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_intern.h

===================================================================

diff --git a/source/blender/blenlib/BLI_link_utils.h 
b/source/blender/blenlib/BLI_link_utils.h
new file mode 100644
index 0000000..d469b10
--- /dev/null
+++ b/source/blender/blenlib/BLI_link_utils.h
@@ -0,0 +1,46 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BLI_LINK_UTILS_H__
+#define __BLI_LINK_UTILS_H__
+
+/** \file BLI_link_utils.h
+ *  \ingroup bli
+ *  \brief Single link-list utility macros. (header only api).
+ *
+ * Use this api when the structure defines its own ``next`` pointer
+ * and a double linked list such as #ListBase isnt needed.
+ */
+
+#define BLI_LINKS_PREPEND(list, link)  { \
+       CHECK_TYPE_PAIR(list, link); \
+       (link)->next = list; \
+       list = link; \
+} (void)0
+
+#define BLI_LINKS_FREE(list)  { \
+       while (list) { \
+               void *next = list->next; \
+               MEM_freeN(list); \
+               list = next; \
+       } \
+} (void)0
+
+#endif  /* __BLI_LINK_UTILS_H__ */
diff --git a/source/blender/editors/include/UI_view2d.h 
b/source/blender/editors/include/UI_view2d.h
index 1208446..b087469 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -210,8 +210,8 @@ void UI_view2d_offset(struct View2D *v2d, float xfac, float 
yfac);
 short UI_view2d_mouse_in_scrollers(const struct bContext *C, struct View2D 
*v2d, int x, int y);
 
 /* cached text drawing in v2d, to allow pixel-aligned draw as post process */
-void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, const char 
*str, const char col[4]);
-void UI_view2d_text_cache_rectf(struct View2D *v2d, const struct rctf *rect, 
const char *str, const char col[4]);
+void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, const char 
*str, size_t str_len, const char col[4]);
+void UI_view2d_text_cache_rectf(struct View2D *v2d, const struct rctf *rect, 
const char *str, size_t str_len, const char col[4]);
 void UI_view2d_text_cache_draw(struct ARegion *ar);
 
 /* operators */
diff --git a/source/blender/editors/interface/view2d.c 
b/source/blender/editors/interface/view2d.c
index f20a196..8f501e2 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -38,9 +38,13 @@
 #include "DNA_scene_types.h"
 #include "DNA_userdef_types.h"
 
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
 #include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+#include "BLI_link_utils.h"
+#include "BLI_rect.h"
+#include "BLI_linklist.h"
+#include "BLI_math.h"
+#include "BLI_memarena.h"
 #include "BLI_timecode.h"
 
 #include "BKE_context.h"
@@ -2175,56 +2179,76 @@ short UI_view2d_mouse_in_scrollers(const bContext *C, 
View2D *v2d, int x, int y)
 
 /* ******************* view2d text drawing cache ******************** */
 
-/* assumes caches are used correctly, so for time being no local storage in 
v2d */
-static ListBase strings = {NULL, NULL};
-
 typedef struct View2DString {
-       struct View2DString *next, *prev;
+       struct View2DString *next;
        union {
                unsigned char ub[4];
                int pack;
        } col;
-       int mval[2];
        rcti rect;
+       int mval[2];
 } View2DString;
 
+/* assumes caches are used correctly, so for time being no local storage in 
v2d */
+static MemArena     *g_v2d_strings_arena = NULL;
+static View2DString *g_v2d_strings = NULL;
 
-void UI_view2d_text_cache_add(View2D *v2d, float x, float y, const char *str, 
const char col[4])
+void UI_view2d_text_cache_add(View2D *v2d, float x, float y, const char *str, 
size_t str_len, const char col[4])
 {
        int mval[2];
        
+       BLI_assert(str_len == strlen(str));
+
        UI_view2d_view_to_region(v2d, x, y, mval, mval + 1);
        
        if (mval[0] != V2D_IS_CLIPPED && mval[1] != V2D_IS_CLIPPED) {
-               int len = strlen(str) + 1;
-               /* use calloc, rect has to be zeroe'd */
-               View2DString *v2s = MEM_callocN(sizeof(View2DString) + len, 
"View2DString");
-               char *v2s_str = (char *)(v2s + 1);
-               memcpy(v2s_str, str, len);
+               int alloc_len = str_len + 1;
+               View2DString *v2s;
+
+               if (g_v2d_strings_arena == NULL) {
+                       g_v2d_strings_arena = 
BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 14), __func__);
+               }
+
+               v2s = BLI_memarena_alloc(g_v2d_strings_arena, 
sizeof(View2DString) + alloc_len);
+
+               BLI_LINKS_PREPEND(g_v2d_strings, v2s);
 
-               BLI_addtail(&strings, v2s);
                v2s->col.pack = *((int *)col);
+
+               memset(&v2s->rect, 0, sizeof(v2s->rect));
+
                v2s->mval[0] = mval[0];
                v2s->mval[1] = mval[1];
+
+               memcpy(v2s + 1, str, alloc_len);
        }
 }
 
 /* no clip (yet) */
-void UI_view2d_text_cache_rectf(View2D *v2d, const rctf *rect, const char 
*str, const char col[4])
+void UI_view2d_text_cache_rectf(View2D *v2d, const rctf *rect, const char 
*str, size_t str_len, const char col[4])
 {
-       int len = strlen(str) + 1;
-       View2DString *v2s = MEM_callocN(sizeof(View2DString) + len, 
"View2DString");
-       char *v2s_str = (char *)(v2s + 1);
-       memcpy(v2s_str, str, len);
+       int alloc_len = str_len;
+       View2DString *v2s;
+
+       BLI_assert(str_len == strlen(str));
+
+       if (g_v2d_strings_arena == NULL) {
+               g_v2d_strings_arena = BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 
14), __func__);
+       }
+
+       v2s = BLI_memarena_alloc(g_v2d_strings_arena, sizeof(View2DString) + 
alloc_len);
+
+       BLI_LINKS_PREPEND(g_v2d_strings, v2s);
+
+       v2s->col.pack = *((int *)col);
 
        UI_view2d_to_region_no_clip(v2d, rect->xmin, rect->ymin, 
&v2s->rect.xmin, &v2s->rect.ymin);
        UI_view2d_to_region_no_clip(v2d, rect->xmax, rect->ymax, 
&v2s->rect.xmax, &v2s->rect.ymax);
 
-       v2s->col.pack = *((int *)col);
        v2s->mval[0] = v2s->rect.xmin;
        v2s->mval[1] = v2s->rect.ymin;
 
-       BLI_addtail(&strings, v2s);
+       memcpy(v2s + 1, str, alloc_len);
 }
 
 
@@ -2234,7 +2258,7 @@ void UI_view2d_text_cache_draw(ARegion *ar)
        int col_pack_prev = 0;
 
        /* investigate using BLF_ascender() */
-       const float default_height = strings.first ? BLF_height_default("28", 
3) : 0.0f;
+       const float default_height = g_v2d_strings ? BLF_height_default("28", 
3) : 0.0f;
        
        // glMatrixMode(GL_PROJECTION);
        // glPushMatrix();
@@ -2242,7 +2266,7 @@ void UI_view2d_text_cache_draw(ARegion *ar)
        // glPushMatrix();
        ED_region_pixelspace(ar);
 
-       for (v2s = strings.first; v2s; v2s = v2s->next) {
+       for (v2s = g_v2d_strings; v2s; v2s = v2s->next) {
                const char *str = (const char *)(v2s + 1);
                int xofs = 0, yofs;
 
@@ -2263,14 +2287,17 @@ void UI_view2d_text_cache_draw(ARegion *ar)
                        BLF_disable_default(BLF_CLIPPING);
                }
        }
-       
+       g_v2d_strings = NULL;
+
+       if (g_v2d_strings_arena) {
+               BLI_memarena_free(g_v2d_strings_arena);
+               g_v2d_strings_arena = NULL;
+       }
+
        // glMatrixMode(GL_PROJECTION);
        // glPopMatrix();
        // glMatrixMode(GL_MODELVIEW);
        // glPopMatrix();
-       
-       if (strings.first) 
-               BLI_freelistN(&strings);
 }
 
 
diff --git a/source/blender/editors/space_nla/nla_draw.c 
b/source/blender/editors/space_nla/nla_draw.c
index cf01ebd..46fd325 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -428,16 +428,17 @@ static void nla_draw_strip_text(AnimData *adt, NlaTrack 
*nlt, NlaStrip *strip, i
 {
        short notSolo = ((adt && (adt->flag & ADT_NLA_SOLO_TRACK)) && 
(nlt->flag & NLATRACK_SOLO) == 0);
        char str[256];
+       size_t str_len;
        char col[4];
        float xofs;
        rctf rect;
        
        /* just print the name and the range */
        if (strip->flag & NLASTRIP_FLAG_TEMP_META) {
-               BLI_snprintf(str, sizeof(str), "%d) Temp-Meta", index);
+               str_len = BLI_snprintf(str, sizeof(str), "%d) Temp-Meta", 
index);
        }
        else {
-               BLI_strncpy(str, strip->name, sizeof(str));
+               str_len = BLI_strncpy_rlen(str, strip->name, sizeof(str));
        }
        
        /* set text color - if colors (see above) are light, draw black text, 
otherwise draw white */
@@ -470,7 +471,7 @@ static void nla_draw_strip_text(AnimData *adt, NlaTrack 
*nlt, NlaStrip *strip, i
        rect.ymax = ymaxc;
        
        /* add this string to the cache of texts to draw */
-       UI_view2d_text_cache_rectf(v2d, &rect, str, col);
+       UI_view2d_text_cache_rectf(v2d, &rect, str, str_len, col);
 }
 
 /* add frame extents to cache of text-strings to draw in pixelspace
@@ -480,7 +481,8 @@ static void nla_draw_strip_frames_text(NlaTrack 
*UNUSED(nlt), NlaStrip *strip, V
 {
        const float ytol = 1.0f; /* small offset to vertical positioning of 
text, for legibility */
        const char col[4] = {220, 220, 220, 255}; /* light gray */
-       char numstr[32] = "";
+       char numstr[32];
+       size_t numstr_len;
        
        
        /* Always draw times above the strip, whereas sequencer drew below + 
above.
@@ -490,12 +492,12 @@ static void nla_draw_strip_frames_text(NlaTrack 
*UNUSED(nlt), NlaStrip *strip, V
         *        while also preserving some accuracy, since we do use floats
         */
        /* start frame */
-       BLI_snprintf(numstr, sizeof(numstr), "%.1f", strip->start);
-       UI_view2d_text_cache_add(v2d, strip->start - 1.0f, ymaxc + ytol, 
numstr, col);
+       numstr_len = BLI_snprintf(numstr, sizeof(numstr), "%.1f", strip->start);
+       UI_view2d_text_cache_add(v2d, strip->start - 1.0f, ymaxc + ytol, 
numstr, numstr_len, col);
        
        /* end frame */
-       BLI_snprintf(numstr, sizeof(numstr), "%.1f", strip->end);
-       UI_view2d_text_cache_add(v2d, strip->end, ymaxc + ytol, numstr, col);
+       numstr_len = BLI_snprintf(numstr, sizeof(numstr), "%.1f", strip->end);
+       UI_view2d_text_cache_add(v2d, strip->end, ymaxc + ytol, numstr, 
numstr_len, col);
 }
 
 /* ---------------------- */
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c 
b/source/blender/editors/space_sequencer/sequencer_draw.c
index fe900b6..a4390d5 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to