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++;