]> O.S.I.I.S - jp/vkvg.git/commitdiff
test draw batch index count during very long path
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 12 Dec 2021 04:20:38 +0000 (05:20 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 12 Dec 2021 04:20:38 +0000 (05:20 +0100)
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_context_internal.h

index d87c41ab272ee5cb4ffc7db56038791f0aa6c120..b074472cb1e3e95079d55f17cb52d411e6ed0e08 100644 (file)
@@ -703,7 +703,7 @@ void vkvg_stroke_preserve (VkvgContext ctx)
                        lastSegmentPointIdx = str.cp + (ctx->pathes[ptrPath+ptrSegment]&PATH_ELT_MASK)-1;
                }
 
-               VKVG_IBO_INDEX_TYPE firstIdx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
+               str.firstIdx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
 
                //LOG(VKVG_LOG_INFO_PATH, "\tPATH: start=%d end=%d", ctx->pathes[ptrPath]&PATH_ELT_MASK, ctx->pathes[ptrPath+1]&PATH_ELT_MASK);
                LOG(VKVG_LOG_INFO_PATH, "end = %d\n", lastPathPointIdx);
@@ -773,7 +773,7 @@ void vkvg_stroke_preserve (VkvgContext ctx)
                        float cross = _build_vb_step (ctx, hw, &str, false);
 
                        VKVG_IBO_INDEX_TYPE* inds = &ctx->indexCache [ctx->indCount-6];
-                       VKVG_IBO_INDEX_TYPE ii = firstIdx;
+                       VKVG_IBO_INDEX_TYPE ii = str.firstIdx;
                        if (cross < 0 && ctx->lineJoin != VKVG_LINE_JOIN_MITER){
                                inds[1] = ii+1;
                                inds[4] = ii+1;
index 8241be12f1313de73a2d892ecc1f7280d1ca4b81..7d4485b3f047161bc9dc2f3e967a41fed4b01592 100644 (file)
@@ -1021,6 +1021,16 @@ void _draw_segment (VkvgContext ctx, float hw, stroke_context_t* str, dash_conte
        else
                _build_vb_step (ctx, hw, str, isCurve);
        str->iL = str->cp++;
+       if (ctx->vertCount - ctx->curVertOffset > VKVG_IBO_MAX / 3) {
+               Vertex v0 = ctx->vertexCache[ctx->curVertOffset + str->firstIdx];
+               Vertex v1 = ctx->vertexCache[ctx->curVertOffset + str->firstIdx + 1];
+               _emit_draw_cmd_undrawn_vertices(ctx);
+               //repeat first 2 vertices for closed pathes
+               str->firstIdx = (VKVG_IBO_INDEX_TYPE)(ctx->vertCount - ctx->curVertOffset);
+               _add_vertex(ctx, v0);
+               _add_vertex(ctx, v1);
+               ctx->curVertOffset = ctx->vertCount;//prevent redrawing them at the start of the batch
+       }
 }
 
 bool ptInTriangle(vec2 p, vec2 p0, vec2 p1, vec2 p2) {
index 734e44af9ad614617b545a3842d8fbad3bff4f51..6a192d9fd51b9fff8eaa35646109aecfbc0d1be8 100644 (file)
@@ -203,6 +203,7 @@ typedef struct {
        uint32_t iL;
        uint32_t iR;
        uint32_t cp;//current point
+       VKVG_IBO_INDEX_TYPE firstIdx;//save first point idx for closed path
 }stroke_context_t;
 
 void _check_vertex_cache_size(VkvgContext ctx);