shithub: libgraphics

Download patch

ref: 433b2c383b7a3a6188130948e562b4d6a1322b4d
parent: ec46c4ef5d7ebfcd08de2b7f1d336075ce4be0b2
author: rodri <rgl@antares-labs.eu>
date: Fri Apr 4 14:57:10 EDT 2025

render: take the temporary vertex and fsp out of rasterize()

instead of recreating it every time the rasterizer
calls rasterize(), keep it warm in the rasterizer
stack and pass a pointer to it.

--- a/internal.h
+++ b/internal.h
@@ -40,6 +40,7 @@
 struct Rastertask
 {
 	SUparams *params;
+	Shaderparams *fsp;
 	Rectangle wr;		/* working rect */
 	Rectangle *clipr;
 	Primitive p;
--- a/render.c
+++ b/render.c
@@ -170,8 +170,6 @@
 	SUparams *params;
 	Raster *cr, *zr;
 	Primitive *prim;
-	Vertex v;
-	Shaderparams fsp;
 	Triangle2 t;
 	Point p, dp, Δp, p0, p1;
 	Point3 bc;
@@ -183,14 +181,6 @@
 
 	params = task->params;
 	prim = &task->p;
-	memset(&fsp, 0, sizeof fsp);
-	memset(&v, 0, sizeof v);
-	fsp.su = params;
-	fsp.v = &v;
-	fsp.getuniform = sparams_getuniform;
-	fsp.getattr = sparams_getattr;
-	fsp.setattr = nil;
-	fsp.toraster = sparams_toraster;
 
 	cr = params->fb->rasters;
 	zr = cr->next;
@@ -205,9 +195,9 @@
 		if((ropts & RODepth) && z <= getdepth(zr, p))
 			break;
 
-		fsp.v = &prim->v[0];
-		fsp.p = p;
-		c = params->stab->fs(&fsp);
+		*task->fsp->v = prim->v[0];
+		task->fsp->p = p;
+		c = params->stab->fs(task->fsp);
 		if(c.a == 0)			/* discard non-colors */
 			break;
 		if(ropts & RODepth)
@@ -224,13 +214,12 @@
 			task->clipr->min = minpt(task->clipr->min, p);
 			task->clipr->max = maxpt(task->clipr->max, addpt(p, Pt(1,1)));
 		}
-		_delvattrs(fsp.v);
 		break;
 	case PLine:
 		p0 = Pt(prim->v[0].p.x, prim->v[0].p.y);
 		p1 = Pt(prim->v[1].p.x, prim->v[1].p.y);
 		/* clip it against our wr */
-		if(_rectclipline(task->wr, &p0, &p1, &prim->v[0], &prim->v[1]) < 0)
+		if(_rectclipline(task->wr, &p0, &p1, prim->v+0, prim->v+1) < 0)
 			break;
 
 		steep = 0;
@@ -244,7 +233,7 @@
 		/* make them left-to-right */
 		if(p0.x > p1.x){
 			SWAP(Point, &p0, &p1);
-			SWAP(Vertex, &prim->v[0], &prim->v[1]);
+			SWAP(Vertex, prim->v+0, prim->v+1);
 		}
 
 		dp = subpt(p1, p0);
@@ -271,10 +260,10 @@
 
 			/* perspective-correct attribute interpolation  */
 			perc *= prim->v[0].p.w * pcz;
-			_lerpvertex(fsp.v, &prim->v[0], &prim->v[1], perc);
+			_lerpvertex(task->fsp->v, prim->v+0, prim->v+1, perc);
 
-			fsp.p = p;
-			c = params->stab->fs(&fsp);
+			task->fsp->p = p;
+			c = params->stab->fs(task->fsp);
 			if(c.a == 0)			/* discard non-colors */
 				goto discard;
 			if(ropts & RODepth)
@@ -300,7 +289,6 @@
 				e -= 2*dp.x;
 			}
 		}
-		_delvattrs(fsp.v);
 		break;
 	case PTriangle:
 		t.p0 = Pt2(prim->v[0].p.x, prim->v[0].p.y, 1);
@@ -327,10 +315,10 @@
 
 			/* perspective-correct attribute interpolation  */
 			bc = mulpt3(bc, pcz);
-			_berpvertex(fsp.v, &prim->v[0], &prim->v[1], &prim->v[2], bc);
+			_berpvertex(task->fsp->v, prim->v+0, prim->v+1, prim->v+2, bc);
 
-			fsp.p = p;
-			c = params->stab->fs(&fsp);
+			task->fsp->p = p;
+			c = params->stab->fs(task->fsp);
 			if(c.a == 0)			/* discard non-colors */
 				continue;
 			if(ropts & RODepth)
@@ -348,7 +336,6 @@
 				task->clipr->max = maxpt(task->clipr->max, addpt(p, Pt(1,1)));
 			}
 		}
-		_delvattrs(fsp.v);
 		break;
 	default: sysfatal("alien primitive detected");
 	}
@@ -361,6 +348,8 @@
 	Rastertask *task;
 	SUparams *params;
 	Renderjob *job;
+	Vertex v;
+	Shaderparams fsp;
 	uvlong t0;
 	int i;
 
@@ -367,6 +356,14 @@
 	rp = arg;
 	threadsetname("rasterizer %d", rp->id);
 
+	memset(&fsp, 0, sizeof fsp);
+	memset(&v, 0, sizeof v);
+	fsp.v = &v;
+	fsp.getuniform = sparams_getuniform;
+	fsp.getattr = sparams_getattr;
+	fsp.setattr = nil;
+	fsp.toraster = sparams_toraster;
+
 	while((task = recvp(rp->taskc)) != nil){
 		t0 = nanosec();
 
@@ -405,8 +402,11 @@
 			continue;
 		}
 
+		fsp.su = params;
+		task->fsp = &fsp;
 		rasterize(task);
 
+		_delvattrs(&v);
 		for(i = 0; i < task->p.type+1; i++)
 			_delvattrs(&task->p.v[i]);
 		free(params);