shithub: libgraphics

Download patch

ref: 05c5853e74989a9b8bb733f148097e6a3c18cf68
parent: 13bdacda5e07bb8a8be83616dbce9f179dccaddb
author: rodri <rgl@antares-labs.eu>
date: Wed Mar 5 17:33:58 EST 2025

render: improve a-buffer fragment allocation (pushtoAbuf.)

--- a/graphics.h
+++ b/graphics.h
@@ -285,6 +285,7 @@
 {
 	Point p;
 	Fragment *items;
+	ulong nitems;
 	ulong size;
 	int active;
 };
--- a/render.c
+++ b/render.c
@@ -105,18 +105,20 @@
 
 	buf = &fb->abuf;
 	stk = &buf->stk[p.y*Dx(fb->r) + p.x];
-	stk->items = erealloc(stk->items, ++stk->size*sizeof(*stk->items));
-	memset(&stk->items[stk->size-1], 0, sizeof(*stk->items));
+	if(stk->nitems == stk->size){
+		stk->size += 8;
+		stk->items = erealloc(stk->items, stk->size*sizeof(*stk->items));
+		memset(&stk->items[stk->size-8], 0, 8*sizeof(*stk->items));
+	}
+	stk->nitems++;
 
-	for(i = 0; i < stk->size; i++)
+	for(i = 0; i < stk->nitems-1; i++)
 		if(z > stk->items[i].z)
 			break;
 
-	if(i < stk->size){
-		memmove(&stk->items[i+1], &stk->items[i], (stk->size-1 - i)*sizeof(*stk->items));
-		stk->items[i] = (Fragment){c, z};
-	}else
-		stk->items[stk->size-1] = (Fragment){c, z};
+	if(i < stk->nitems-1)
+		memmove(&stk->items[i+1], &stk->items[i], (stk->nitems-1 - i)*sizeof(*stk->items));
+	stk->items[i] = (Fragment){c, z};
 
 	if(!stk->active){
 		stk->active++;