Skip to content

Commit 14f9075

Browse files
committed
ImDrawList: remove local vs member indirection as locals were deemed better.
1 parent 255820d commit 14f9075

File tree

1 file changed

+56
-67
lines changed

1 file changed

+56
-67
lines changed

imgui_draw.cpp

+56-67
Original file line numberDiff line numberDiff line change
@@ -731,58 +731,49 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c
731731
#define IM_POLYLINE_IDX_16_BIT 0
732732
#else
733733
#define IM_POLYLINE_IDX_16_BIT 1
734-
# endif
735-
736-
// Macros that declare, load and save write pointers as local variables
737-
#if 1 // FIXME-NEWPOLYLINE: choose local or shared write pointers
738-
#define IM_POLYLINE_PRIM_VTX_WRITE vtx_write
739-
#define IM_POLYLINE_PRIM_IDX_WRITE idx_write
740-
#define IM_POLYLINE_PRIM_IDX_BASE idx_base
741-
742-
#define IM_POLYLINE_PRIM_MAKE_LOCAL() ImDrawVert* IM_POLYLINE_PRIM_VTX_WRITE = this->_VtxWritePtr; ImDrawIdx* IM_POLYLINE_PRIM_IDX_WRITE = this->_IdxWritePtr; unsigned int IM_POLYLINE_PRIM_IDX_BASE = this->_VtxCurrentIdx
743-
#define IM_POLYLINE_PRIM_LOAD_LOCAL() IM_POLYLINE_PRIM_VTX_WRITE = this->_VtxWritePtr; IM_POLYLINE_PRIM_IDX_WRITE = this->_IdxWritePtr; IM_POLYLINE_PRIM_IDX_BASE = this->_VtxCurrentIdx
744-
#define IM_POLYLINE_PRIM_SAVE_LOCAL() this->_VtxWritePtr = IM_POLYLINE_PRIM_VTX_WRITE; this->_IdxWritePtr = IM_POLYLINE_PRIM_IDX_WRITE; this->_VtxCurrentIdx = IM_POLYLINE_PRIM_IDX_BASE
745-
#else
746-
#define IM_POLYLINE_PRIM_VTX_WRITE this->_VtxWritePtr
747-
#define IM_POLYLINE_PRIM_IDX_WRITE this->_IdxWritePtr
748-
#define IM_POLYLINE_PRIM_IDX_BASE this->_VtxCurrentIdx
749-
750-
#define IM_POLYLINE_PRIM_MAKE_LOCAL() (void)0
751-
#define IM_POLYLINE_PRIM_LOAD_LOCAL() (void)0
752-
#define IM_POLYLINE_PRIM_SAVE_LOCAL() (void)0
753734
#endif
754735

755736
// Macros that commit, split and handle vertex offset overflow
756-
#define IM_POLYLINE_PRIM_RESERVE(IDX_COUNT, VTX_COUNT) this->PrimReserve((IDX_COUNT) + IM_POLYLINE_PRIM_EXTRA_IDX_COUNT, VTX_COUNT); IM_POLYLINE_PRIM_MAKE_LOCAL()
737+
#define IM_POLYLINE_PRIM_RESERVE(IDX_COUNT, VTX_COUNT) \
738+
this->PrimReserve((IDX_COUNT) + IM_POLYLINE_PRIM_EXTRA_IDX_COUNT, VTX_COUNT); \
739+
ImDrawVert* vtx_write = this->_VtxWritePtr; \
740+
ImDrawIdx* idx_write = this->_IdxWritePtr; \
741+
unsigned int idx_base = this->_VtxCurrentIdx;
742+
757743
#define IM_POLYLINE_PRIM_COMMIT() \
758-
IM_POLYLINE_PRIM_SAVE_LOCAL(); \
744+
this->_VtxWritePtr = vtx_write; this->_IdxWritePtr = idx_write; this->_VtxCurrentIdx = idx_base; \
759745
const int unused_vtx_count = (int)((this->VtxBuffer.Data + this->VtxBuffer.Size) - this->_VtxWritePtr); \
760746
const int unused_idx_count = (int)((this->IdxBuffer.Data + this->IdxBuffer.Size) - this->_IdxWritePtr); \
761747
this->PrimUnreserve(unused_idx_count, unused_vtx_count)
762748

763-
#define IM_POLYLINE_PRIM_SPLT() IM_POLYLINE_PRIM_COMMIT(); this->PrimReserve(unused_idx_count, unused_vtx_count); IM_POLYLINE_PRIM_LOAD_LOCAL()
749+
#define IM_POLYLINE_PRIM_SPLT() \
750+
IM_POLYLINE_PRIM_COMMIT(); \
751+
this->PrimReserve(unused_idx_count, unused_vtx_count); \
752+
vtx_write = this->_VtxWritePtr; \
753+
idx_write = this->_IdxWritePtr; \
754+
idx_base = this->_VtxCurrentIdx;
764755

765756
#define IM_POLYLINE_VTX_COMMIT(N) \
766757
{ \
767-
IM_ASSERT_PARANOID((IM_POLYLINE_PRIM_VTX_WRITE + (N)) <= (this->VtxBuffer.Data + this->VtxBuffer.Size) && "IM_POLYLINE_VTX_COMMIT: VtxWritePtr moved out of bounds!"); \
768-
IM_POLYLINE_PRIM_VTX_WRITE += N; \
769-
IM_POLYLINE_PRIM_IDX_BASE += N; \
758+
IM_ASSERT_PARANOID((idx_base + (N)) <= (this->VtxBuffer.Data + this->VtxBuffer.Size) && "IM_POLYLINE_VTX_COMMIT: VtxWritePtr moved out of bounds!"); \
759+
vtx_write += N; \
760+
idx_base += N; \
770761
}
771762

772763
#if IM_POLYLINE_IDX_16_BIT
773-
#define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW(NEXT_BATCH_VTX_COUNT) if (sizeof(ImDrawIdx) == 2 && ((IM_POLYLINE_PRIM_IDX_BASE) + (NEXT_BATCH_VTX_COUNT) >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) IM_UNLIKELY { IM_POLYLINE_PRIM_SPLT(); }
764+
#define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW(NEXT_BATCH_VTX_COUNT) if (sizeof(ImDrawIdx) == 2 && (idx_base + (NEXT_BATCH_VTX_COUNT) >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) IM_UNLIKELY { IM_POLYLINE_PRIM_SPLT(); }
774765
#else
775766
#define IM_POLYLINE_PRIM_HANDLE_VTX_OFFSET_OVERFLOW(NEXT_BATCH_VTX_COUNT) (void)0
776767
#endif
777768

778769
// Macros for filling vertices
779770
#define IM_POLYLINE_VERTEX(N, X, Y, UV, C) \
780771
{ \
781-
IM_ASSERT_PARANOID((IM_POLYLINE_PRIM_VTX_WRITE + (N)) < (this->VtxBuffer.Data + this->VtxBuffer.Size) && "IM_POLYLINE_VERTEX: Writing outside of allocated buffer!"); \
782-
IM_POLYLINE_PRIM_VTX_WRITE[N].pos.x = X; \
783-
IM_POLYLINE_PRIM_VTX_WRITE[N].pos.y = Y; \
784-
IM_POLYLINE_PRIM_VTX_WRITE[N].uv = UV; \
785-
IM_POLYLINE_PRIM_VTX_WRITE[N].col = C; \
772+
IM_ASSERT_PARANOID((vtx_write + (N)) < (this->VtxBuffer.Data + this->VtxBuffer.Size) && "IM_POLYLINE_VERTEX: Writing outside of allocated buffer!"); \
773+
vtx_write[N].pos.x = X; \
774+
vtx_write[N].pos.y = Y; \
775+
vtx_write[N].uv = UV; \
776+
vtx_write[N].col = C; \
786777
}
787778

788779
// Macros for filling indices
@@ -811,7 +802,7 @@ IM_STATIC_ASSERT(2 * sizeof(ImDrawIdx) == sizeof(ImU64)); // assumption: ImU64 m
811802
I[(N) * 3 + 2] = (ImDrawIdx)(Z + C)
812803
#endif
813804

814-
#define IM_POLYLINE_TRIANGLE(N, A, B, C) (void)(N); IM_POLYLINE_TRIANGLE_EX(IM_POLYLINE_PRIM_IDX_WRITE, N, IM_POLYLINE_PRIM_IDX_BASE, A, B, C)
805+
#define IM_POLYLINE_TRIANGLE(N, A, B, C) (void)(N); IM_POLYLINE_TRIANGLE_EX(idx_write, N, idx_base, A, B, C)
815806

816807
// Extra indices to allocate for primitives
817808
#ifndef IM_POLYLINE_PRIM_EXTRA_IDX_COUNT
@@ -1020,17 +1011,17 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
10201011
const float d_x = n0.x * t; \
10211012
const float d_y = n0.y * t; \
10221013
\
1023-
IM_POLYLINE_PRIM_VTX_WRITE[0].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[0].pos.y += d_x; \
1024-
IM_POLYLINE_PRIM_VTX_WRITE[1].pos.x += d_y; IM_POLYLINE_PRIM_VTX_WRITE[1].pos.y -= d_x; \
1025-
IM_POLYLINE_PRIM_VTX_WRITE[2].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[2].pos.y += d_x; \
1014+
vtx_write[0].pos.x -= d_y; vtx_write[0].pos.y += d_x; \
1015+
vtx_write[1].pos.x += d_y; vtx_write[1].pos.y -= d_x; \
1016+
vtx_write[2].pos.x -= d_y; vtx_write[2].pos.y += d_x; \
10261017
} \
10271018
else IM_UNLIKELY \
10281019
{ \
10291020
const float d_x = n0.x * half_thickness * scale; \
10301021
const float d_y = n0.y * half_thickness * scale; \
10311022
\
1032-
IM_POLYLINE_PRIM_VTX_WRITE[0].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[0].pos.y += d_x; \
1033-
IM_POLYLINE_PRIM_VTX_WRITE[2].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[2].pos.y += d_x; \
1023+
vtx_write[0].pos.x -= d_y; vtx_write[0].pos.y += d_x; \
1024+
vtx_write[2].pos.x -= d_y; vtx_write[2].pos.y += d_x; \
10341025
} \
10351026
\
10361027
IM_POLYLINE_TRIANGLE_BEGIN(3); \
@@ -1367,10 +1358,10 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
13671358
//
13681359
// 1 join triangles
13691360
//
1370-
IM_POLYLINE_PRIM_VTX_WRITE[6].pos.x -= n1.y * polyline.fringe_width;
1371-
IM_POLYLINE_PRIM_VTX_WRITE[6].pos.y += n1.x * polyline.fringe_width;
1372-
IM_POLYLINE_PRIM_VTX_WRITE[8].pos.x -= n1.y * polyline.fringe_width;
1373-
IM_POLYLINE_PRIM_VTX_WRITE[8].pos.y += n1.x * polyline.fringe_width;
1361+
vtx_write[6].pos.x -= n1.y * polyline.fringe_width;
1362+
vtx_write[6].pos.y += n1.x * polyline.fringe_width;
1363+
vtx_write[8].pos.x -= n1.y * polyline.fringe_width;
1364+
vtx_write[8].pos.y += n1.x * polyline.fringe_width;
13741365

13751366
IM_POLYLINE_TRIANGLE_BEGIN(3);
13761367
IM_POLYLINE_TRIANGLE(0, 6, 8, 7);
@@ -1399,9 +1390,9 @@ void ImDrawList::_PolylineThinAntiAliased(const ImDrawListPolyline& polyline)
13991390
{
14001391
ImDrawVert* vtx_start = this->VtxBuffer.Data + vtx_start_idx;
14011392

1402-
vtx_start[0].pos = IM_POLYLINE_PRIM_VTX_WRITE[0].pos;
1403-
vtx_start[1].pos = IM_POLYLINE_PRIM_VTX_WRITE[1].pos;
1404-
vtx_start[2].pos = IM_POLYLINE_PRIM_VTX_WRITE[2].pos;
1393+
vtx_start[0].pos = vtx_write[0].pos;
1394+
vtx_start[1].pos = vtx_write[1].pos;
1395+
vtx_start[2].pos = vtx_write[2].pos;
14051396
}
14061397
else IM_UNLIKELY
14071398
{
@@ -1466,10 +1457,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
14661457
const float d_x = n0.x * t; \
14671458
const float d_y = n0.y * t; \
14681459
\
1469-
IM_POLYLINE_PRIM_VTX_WRITE[0].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[0].pos.y += d_x; \
1470-
IM_POLYLINE_PRIM_VTX_WRITE[1].pos.x += d_y; IM_POLYLINE_PRIM_VTX_WRITE[1].pos.y -= d_x; \
1471-
IM_POLYLINE_PRIM_VTX_WRITE[2].pos.x += d_y; IM_POLYLINE_PRIM_VTX_WRITE[2].pos.y -= d_x; \
1472-
IM_POLYLINE_PRIM_VTX_WRITE[3].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[3].pos.y += d_x; \
1460+
vtx_write[0].pos.x -= d_y; vtx_write[0].pos.y += d_x; \
1461+
vtx_write[1].pos.x += d_y; vtx_write[1].pos.y -= d_x; \
1462+
vtx_write[2].pos.x += d_y; vtx_write[2].pos.y -= d_x; \
1463+
vtx_write[3].pos.x -= d_y; vtx_write[3].pos.y += d_x; \
14731464
} \
14741465
else \
14751466
{ \
@@ -1478,10 +1469,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
14781469
const float d_outer_x = n0.x * half_fringe_thickness * scale; \
14791470
const float d_outer_y = n0.y * half_fringe_thickness * scale; \
14801471
\
1481-
IM_POLYLINE_PRIM_VTX_WRITE[0].pos.x -= d_outer_y; IM_POLYLINE_PRIM_VTX_WRITE[0].pos.y += d_outer_x; \
1482-
IM_POLYLINE_PRIM_VTX_WRITE[1].pos.x -= d_inner_y; IM_POLYLINE_PRIM_VTX_WRITE[1].pos.y += d_inner_x; \
1483-
IM_POLYLINE_PRIM_VTX_WRITE[2].pos.x -= d_inner_y; IM_POLYLINE_PRIM_VTX_WRITE[2].pos.y += d_inner_x; \
1484-
IM_POLYLINE_PRIM_VTX_WRITE[3].pos.x -= d_outer_y; IM_POLYLINE_PRIM_VTX_WRITE[3].pos.y += d_outer_x; \
1472+
vtx_write[0].pos.x -= d_outer_y; vtx_write[0].pos.y += d_outer_x; \
1473+
vtx_write[1].pos.x -= d_inner_y; vtx_write[1].pos.y += d_inner_x; \
1474+
vtx_write[2].pos.x -= d_inner_y; vtx_write[2].pos.y += d_inner_x; \
1475+
vtx_write[3].pos.x -= d_outer_y; vtx_write[3].pos.y += d_outer_x; \
14851476
} \
14861477
\
14871478
IM_POLYLINE_TRIANGLE_BEGIN(6); \
@@ -2085,10 +2076,10 @@ void ImDrawList::_PolylineThickAntiAliased(const ImDrawListPolyline& polyline)
20852076
{
20862077
ImDrawVert* vtx_start = this->VtxBuffer.Data + vtx_start_idx;
20872078

2088-
vtx_start[0].pos = IM_POLYLINE_PRIM_VTX_WRITE[0].pos;
2089-
vtx_start[1].pos = IM_POLYLINE_PRIM_VTX_WRITE[1].pos;
2090-
vtx_start[2].pos = IM_POLYLINE_PRIM_VTX_WRITE[2].pos;
2091-
vtx_start[3].pos = IM_POLYLINE_PRIM_VTX_WRITE[3].pos;
2079+
vtx_start[0].pos = vtx_write[0].pos;
2080+
vtx_start[1].pos = vtx_write[1].pos;
2081+
vtx_start[2].pos = vtx_write[2].pos;
2082+
vtx_start[3].pos = vtx_write[3].pos;
20922083
}
20932084
else IM_UNLIKELY
20942085
{
@@ -2142,8 +2133,8 @@ void ImDrawList::_PolylineAliased(const ImDrawListPolyline& polyline)
21422133
const float d_x = n0.x * half_thickness * scale; \
21432134
const float d_y = n0.y * half_thickness * scale; \
21442135
\
2145-
IM_POLYLINE_PRIM_VTX_WRITE[0].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[0].pos.y += d_x; \
2146-
IM_POLYLINE_PRIM_VTX_WRITE[1].pos.x -= d_y; IM_POLYLINE_PRIM_VTX_WRITE[1].pos.y += d_x; \
2136+
vtx_write[0].pos.x -= d_y; vtx_write[0].pos.y += d_x; \
2137+
vtx_write[1].pos.x -= d_y; vtx_write[1].pos.y += d_x; \
21472138
} \
21482139
else if (polyline.cap == ImDrawFlags_CapRound) IM_UNLIKELY \
21492140
{ \
@@ -2555,8 +2546,8 @@ void ImDrawList::_PolylineAliased(const ImDrawListPolyline& polyline)
25552546
{
25562547
ImDrawVert* vtx_start = this->VtxBuffer.Data + vtx_start_idx;
25572548

2558-
vtx_start[0].pos = IM_POLYLINE_PRIM_VTX_WRITE[0].pos;
2559-
vtx_start[1].pos = IM_POLYLINE_PRIM_VTX_WRITE[1].pos;
2549+
vtx_start[0].pos = vtx_write[0].pos;
2550+
vtx_start[1].pos = vtx_write[1].pos;
25602551
}
25612552
else IM_UNLIKELY
25622553
{
@@ -3656,7 +3647,7 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
36563647
uv, path_colors[j]); \
36573648
} \
36583649
\
3659-
IM_POLYLINE_PRIM_VTX_WRITE += path_count; \
3650+
vtx_write += path_count; \
36603651
} \
36613652
\
36623653
path_size += arc_size; \
@@ -3668,7 +3659,7 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
36683659
IM_POLYLINE_VERTEX(j, X X_SIGN path_offsets[j].x, Y Y_SIGN path_offsets[j].y, uv, path_colors[j]); \
36693660
} \
36703661
\
3671-
IM_POLYLINE_PRIM_VTX_WRITE += path_count; \
3662+
vtx_write += path_count; \
36723663
++path_size; \
36733664
}
36743665

@@ -3691,13 +3682,11 @@ void ImDrawList::_RectRounded(const ImVec2& a, const ImVec2& b, ImU32 col, floa
36913682
}
36923683
IM_POLYLINE_TRIANGLE_END(path_size * strip_count * 2 * 3);
36933684

3694-
IM_POLYLINE_PRIM_IDX_BASE += vtx_count;
3685+
idx_base += vtx_count;
36953686

36963687
for (int j = 0; j < (path_count - 1) * 6; j++)
3697-
{
3698-
if (IM_POLYLINE_PRIM_IDX_WRITE[-j - 1] >= IM_POLYLINE_PRIM_IDX_BASE)
3699-
IM_POLYLINE_PRIM_IDX_WRITE[-j - 1] -= (ImDrawIdx)vtx_count;
3700-
}
3688+
if (idx_write[-j - 1] >= idx_base)
3689+
idx_write[-j - 1] -= (ImDrawIdx)vtx_count;
37013690

37023691
IM_POLYLINE_PRIM_COMMIT();
37033692
}

0 commit comments

Comments
 (0)