ref: 58d74cc4fa8f2a0e01e80dd58dec11f2135b0e8d
parent: ed02080b55b8691090583aa01993bbb5e95c7ab2
author: rodri <rgl@antares-labs.eu>
date: Tue Apr 22 13:46:25 EDT 2025
render: only track time when profiling
--- a/graphics.h
+++ b/graphics.h
@@ -237,6 +237,7 @@
Renderjob *job;
Camera *camera;
Entity *entity;
+ int op;
Primitive *eb, *ee;
};
--- a/internal.h
+++ b/internal.h
@@ -1,6 +1,13 @@
enum {
ε1 = 1e-5,
ε2 = 1e-6,
+
+ /* shader unit operations */
+ OP_ENTITY = 0,
+ OP_PRIMS,
+ OP_RASTER,
+ OP_SYNC,
+ OP_END,
};
typedef struct Polygon Polygon;
--- a/render.c
+++ b/render.c
@@ -472,8 +472,7 @@
Renderjob *job;
Vertex v;
Shaderparams fsp;
- uvlong t0;
- int i;
+ int i, off, stride;
rp = arg;
threadsetname("rasterizer %d", rp->id);
@@ -487,15 +486,25 @@
fsp.toraster = sparams_toraster;
while((task = recvp(rp->taskc)) != nil){
- t0 = nanosec();
-
params = task->params;
job = params->job;
if(job->rctl->doprof && job->times.Rn[rp->id].t0 == 0)
- job->times.Rn[rp->id].t0 = t0;
+ job->times.Rn[rp->id].t0 = nanosec();
- /* end of job */
- if(params->entity == nil){
+ if(params->op == OP_END){
+// if(job->camera->rendopts & ROAbuff){
+// stride = job->fb->abuf.nact / job->rctl->nprocs;
+// if(rp->id < job->fb->abuf.nact % job->rctl->nprocs)
+// stride++;
+// if(stride > 0){
+// off = 0;
+// for(i = 0; i < rp->id; i++)
+// off += i < job->fb->abuf.nact % job->rctl->nprocs?
+// stride+1 : stride;
+// squashAbuf(job->fb, off, stride, job->camera->rendopts & ROBlend);
+// }
+// }
+
if(decref(job) < 1){
if(job->camera->rendopts & ROAbuff)
squashAbuf(job->fb, job->camera->rendopts & ROBlend);
@@ -549,7 +558,6 @@
Channel **taskchans;
ulong Δy, nproc;
int i, np;
- uvlong t0;
tp = arg;
threadsetname("tiler %d", tp->id);
@@ -566,16 +574,31 @@
vsp.toraster = nil;
while((params = recvp(tp->paramsc)) != nil){
- t0 = nanosec();
- if(params->job->rctl->doprof &&
- params->job->times.Tn[tp->id].t0 == 0)
- params->job->times.Tn[tp->id].t0 = t0;
+ if(params->job->rctl->doprof
+ && params->job->times.Tn[tp->id].t0 == 0)
+ params->job->times.Tn[tp->id].t0 = nanosec();
- /* end of job */
- if(params->entity == nil){
+ if(params->op == OP_END){
if(params->job->rctl->doprof)
params->job->times.Tn[tp->id].t1 = nanosec();
if(decref(params->job) < 1){
+// /*
+// * make sure the rasterizers are done before signalling ending.
+// * this way they have the correct number of active stacks in the
+// * a-buffer and can organize themselves to squash it.
+// */
+// if(params->job->camera->rendopts & ROAbuff){
+// for(i = 0; i < nproc; i++){
+// task = _emalloc(sizeof *task);
+// memset(task, 0, sizeof *task);
+// params->op = OP_SYNC;
+// task->params = params;
+// /* TODO the channel is buffered, find another way to sync */
+// sendp(taskchans[i], task);
+// }
+// params->op = OP_END;
+// }
+
params->job->ref = nproc;
for(i = 0; i < nproc; i++){
task = _emalloc(sizeof *task);
@@ -625,6 +648,7 @@
if(rectXrect(bbox, wr[i])){
newparams = _emalloc(sizeof *newparams);
*newparams = *params;
+ newparams->op = OP_RASTER;
task = _emalloc(sizeof *task);
task->params = newparams;
task->clipr = ¶ms->job->cliprects[i];
@@ -668,6 +692,7 @@
if(rectXrect(bbox, wr[i])){
newparams = _emalloc(sizeof *newparams);
*newparams = *params;
+ newparams->op = OP_RASTER;
task = _emalloc(sizeof *task);
task->params = newparams;
task->wr = wr[i];
@@ -727,6 +752,7 @@
if(rectXrect(bbox, wr[i])){
newparams = _emalloc(sizeof *newparams);
*newparams = *params;
+ newparams->op = OP_RASTER;
task = _emalloc(sizeof *task);
task->params = newparams;
task->wr = bbox;
@@ -762,7 +788,6 @@
Primitive *eb, *ee;
ulong stride, nprims, nproc, nworkers;
int i;
- uvlong t0;
threadsetname("entityproc");
@@ -792,9 +817,8 @@
}
while((params = recvp(paramsin)) != nil){
- t0 = nanosec();
if(params->job->rctl->doprof && params->job->times.E.t0 == 0)
- params->job->times.E.t0 = t0;
+ params->job->times.E.t0 = nanosec();
/* prof: initialize timing slots for the next stages */
if(params->job->rctl->doprof && params->job->times.Tn == nil){
@@ -805,8 +829,7 @@
memset(params->job->times.Rn, 0, nproc*sizeof(Rendertime));
}
- /* end of job */
- if(params->entity == nil){
+ if(params->op == OP_END){
params->job->ref = nproc;
for(i = 0; i < nproc; i++)
sendp(paramsout[i], params);
@@ -839,6 +862,7 @@
for(i = 0; i < nworkers; i++){
newparams = _emalloc(sizeof *newparams);
*newparams = *params;
+ newparams->op = OP_PRIMS;
newparams->eb = eb + i*stride;
newparams->ee = i == nworkers-1? ee: newparams->eb + stride;
sendp(paramsout[i], newparams);
@@ -856,7 +880,7 @@
Entity *ent;
SUparams *params;
Entityparam *ep;
- uvlong time, lastid;
+ uvlong lastid;
threadsetname("renderer");
@@ -869,8 +893,9 @@
proccreate(entityproc, ep, mainstacksize);
while((job = recvp(rctl->jobq)) != nil){
- time = nanosec();
- if(job->rctl->doprof) job->times.R.t0 = time;
+ if(job->rctl->doprof)
+ job->times.R.t0 = nanosec();
+
job->id = lastid++;
sc = job->camera->scene;
if(sc->nents < 1){
@@ -878,7 +903,7 @@
continue;
}
- if((job->camera->rendopts & ROAbuff))
+ if(job->camera->rendopts & ROAbuff)
initAbuf(job->fb);
for(ent = sc->ents.next; ent != &sc->ents; ent = ent->next){
@@ -889,12 +914,14 @@
params->job = job;
params->camera = job->camera;
params->entity = ent;
+ params->op = OP_ENTITY;
sendp(ep->paramsc, params);
}
+
/* mark end of job */
params = _emalloc(sizeof *params);
- memset(params, 0, sizeof *params);
params->job = job;
+ params->op = OP_END;
sendp(ep->paramsc, params);
if(job->rctl->doprof) job->times.R.t1 = nanosec();
--
⑨