ref: 743500008b9294a8cd876b638b054625f0122ceb
parent: 58e800db464a07249f70905a13c8f3fceafcb3d1
author: rodri <rgl@antares-labs.eu>
date: Sun Jun 29 18:42:09 EDT 2025
embed SUparams into Rastertask this cleans up the rasterizer a little bit and reduces the number of mallocs and frees.
--- a/internal.h
+++ b/internal.h
@@ -58,7 +58,7 @@
struct Rastertask
{
- SUparams *params;
+ SUparams;
Shaderparams *fsp;
Rectangle wr; /* working rect */
Rectangle *clipr;
--- a/render.c
+++ b/render.c
@@ -174,7 +174,6 @@
static void
rasterizept(Rastertask *task)
{
- SUparams *params;
Raster *cr, *zr;
BPrimitive *prim;
Point p;
@@ -182,13 +181,12 @@
float z;
uint ropts;
- params = task->params;
prim = &task->p;
- cr = params->fb->rasters;
+ cr = task->fb->rasters;
zr = cr->next;
- ropts = params->camera->rendopts;
+ ropts = task->camera->rendopts;
p = (Point){prim->v[0].p.x, prim->v[0].p.y};
@@ -198,13 +196,13 @@
*task->fsp->v = prim->v[0];
task->fsp->p = p;
- c = params->stab->fs(task->fsp);
+ c = task->stab->fs(task->fsp);
if(c.a == 0) /* discard non-colors */
return;
if(ropts & RODepth)
putdepth(zr, p, z);
if(ropts & ROAbuff)
- pushtoAbuf(params->fb, p, c, z);
+ pushtoAbuf(task->fb, p, c, z);
else
pixel(cr, p, c, ropts & ROBlend);
@@ -220,7 +218,6 @@
static void
rasterizeline(Rastertask *task)
{
- SUparams *params;
Raster *cr, *zr;
BPrimitive *prim;
Point p, dp, Δp, p0, p1;
@@ -230,13 +227,12 @@
uint ropts;
int steep, Δe, e, Δy;
- params = task->params;
prim = &task->p;
- cr = params->fb->rasters;
+ cr = task->fb->rasters;
zr = cr->next;
- ropts = params->camera->rendopts;
+ ropts = task->camera->rendopts;
p0 = (Point){prim->v[0].p.x, prim->v[0].p.y};
p1 = (Point){prim->v[1].p.x, prim->v[1].p.y};
@@ -272,7 +268,7 @@
z = flerp(prim->v[0].p.z, prim->v[1].p.z, perc);
/* TODO get rid of the bounds check and make sure the clipping doesn't overflow */
- if(!ptinrect(p, params->fb->r) ||
+ if(!ptinrect(p, task->fb->r) ||
((ropts & RODepth) && z <= getdepth(zr, p)))
goto discard;
@@ -285,13 +281,13 @@
_lerpvertex(task->fsp->v, prim->v+0, prim->v+1, perc);
task->fsp->p = p;
- c = params->stab->fs(task->fsp);
+ c = task->stab->fs(task->fsp);
if(c.a == 0) /* discard non-colors */
goto discard;
if(ropts & RODepth)
putdepth(zr, p, z);
if(ropts & ROAbuff)
- pushtoAbuf(params->fb, p, c, z);
+ pushtoAbuf(task->fb, p, c, z);
else
pixel(cr, p, c, ropts & ROBlend);
@@ -332,7 +328,6 @@
static void
rasterizetri(Rastertask *task)
{
- SUparams *params;
Raster *cr, *zr;
BPrimitive *prim;
pGradient ∇bc;
@@ -346,13 +341,12 @@
float z, pcz;
uint ropts;
- params = task->params;
prim = &task->p;
- cr = params->fb->rasters;
+ cr = task->fb->rasters;
zr = cr->next;
- ropts = params->camera->rendopts;
+ ropts = task->camera->rendopts;
// memset(&v, 0, sizeof v);
// vp = &v;
@@ -425,7 +419,7 @@
// SWAP(BVertex*, &vp, &task->fsp->v);
task->fsp->p = p;
- c = params->stab->fs(task->fsp);
+ c = task->stab->fs(task->fsp);
// SWAP(BVertex*, &vp, &task->fsp->v);
if(c.a == 0) /* discard non-colors */
goto discard;
@@ -432,7 +426,7 @@
if(ropts & RODepth)
putdepth(zr, p, z);
if(ropts & ROAbuff)
- pushtoAbuf(params->fb, p, c, z);
+ pushtoAbuf(task->fb, p, c, z);
else
pixel(cr, p, c, ropts & ROBlend);
@@ -470,7 +464,6 @@
};
Rasterparam *rp;
Rastertask *task;
- SUparams *params;
Renderjob *job;
BVertex v;
Shaderparams fsp;
@@ -488,12 +481,11 @@
fsp.toraster = sparams_toraster;
while((task = recvp(rp->taskc)) != nil){
- params = task->params;
- job = params->job;
+ job = task->job;
if(job->rctl->doprof && job->times.Rn[rp->id].t0 == 0)
job->times.Rn[rp->id].t0 = nanosec();
- if(params->op == OP_END){
+ if(task->op == OP_END){
if(job->camera->rendopts & ROAbuff)
squashAbuf(job->fb, &task->wr, job->camera->rendopts & ROBlend);
@@ -515,7 +507,6 @@
job->times.Rn[rp->id].t1 = nanosec();
nbsend(job->donec, nil);
- free(params);
}else if(job->rctl->doprof)
job->times.Rn[rp->id].t1 = nanosec();
free(task);
@@ -522,7 +513,7 @@
continue;
}
- fsp.su = params;
+ fsp.su = &task->SUparams;
task->fsp = &fsp;
(*rasterfn[task->p.type])(task);
@@ -530,7 +521,6 @@
if(task->p.type != PPoint)
for(i = 0; i < task->p.type+1; i++)
_delvattrs(&task->p.v[i]);
- free(params);
free(task);
}
}
@@ -572,7 +562,7 @@
tiler(void *arg)
{
Tilerparam *tp;
- SUparams *params, *newparams;
+ SUparams *params;
Rastertask *task;
Shaderparams vsp;
Primitive *ep; /* primitives to raster */
@@ -612,11 +602,12 @@
params->job->ref = nproc;
for(i = 0; i < nproc; i++){
task = _emalloc(sizeof *task);
- task->params = params;
+ task->SUparams = *params;
if(params->job->camera->rendopts & ROAbuff)
task->wr = wr[i];
sendp(taskchans[i], task);
}
+ free(params);
}
continue;
}
@@ -647,16 +638,12 @@
bbox.min.x = p->v[0].p.x;
bbox.min.y = p->v[0].p.y;
- bbox.max.x = p->v[0].p.x+1;
- bbox.max.y = p->v[0].p.y+1;
for(i = 0; i < nproc; i++)
- if(rectXrect(bbox, wr[i])){
- newparams = _emalloc(sizeof *newparams);
- *newparams = *params;
- newparams->op = OP_RASTER;
+ if(ptinrect(bbox.min, wr[i])){
task = _emalloc(sizeof *task);
- task->params = newparams;
+ task->SUparams = *params;
+ task->op = OP_RASTER;
task->clipr = ¶ms->job->cliprects[i];
task->p = *p;
task->p.v[0] = _dupvertex(&p->v[0]);
@@ -696,11 +683,9 @@
for(i = 0; i < nproc; i++)
if(rectXrect(bbox, wr[i])){
- newparams = _emalloc(sizeof *newparams);
- *newparams = *params;
- newparams->op = OP_RASTER;
task = _emalloc(sizeof *task);
- task->params = newparams;
+ task->SUparams = *params;
+ task->op = OP_RASTER;
task->wr = wr[i];
task->clipr = ¶ms->job->cliprects[i];
task->p = *p;
@@ -749,11 +734,9 @@
for(i = 0; i < nproc; i++)
if(rectXrect(bbox, wr[i])){
- newparams = _emalloc(sizeof *newparams);
- *newparams = *params;
- newparams->op = OP_RASTER;
task = _emalloc(sizeof *task);
- task->params = newparams;
+ task->SUparams = *params;
+ task->op = OP_RASTER;
task->wr = bbox;
rectclip(&task->wr, wr[i]);
task->clipr = ¶ms->job->cliprects[i];
--
⑨