From: Jean-Philippe Bruyère Date: Sun, 12 Dec 2021 04:20:38 +0000 (+0100) Subject: test draw batch index count during very long path X-Git-Tag: v0.2.0~31 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=b32873f8978bfbac8d79e51700eec8ac87450254;p=jp%2Fvkvg.git test draw batch index count during very long path --- diff --git a/src/vkvg_context.c b/src/vkvg_context.c index d87c41a..b074472 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -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; diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index 8241be1..7d4485b 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -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) { diff --git a/src/vkvg_context_internal.h b/src/vkvg_context_internal.h index 734e44a..6a192d9 100644 --- a/src/vkvg_context_internal.h +++ b/src/vkvg_context_internal.h @@ -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);