shithub: libgraphics

Download patch

ref: 7739f20ce8608c0613552e430f31008705050bf1
parent: e2e203e6fa64a9e57c8d4ba4cea4deec89d8f0c1
author: rodri <rgl@antares-labs.eu>
date: Thu May 23 17:08:55 EDT 2024

replace the Framebufctl's Lock with a QLock.

this provides fair scheduling, minimizing contention.

--- a/fb.c
+++ b/fb.c
@@ -13,10 +13,10 @@
 {
 	Framebuf *fb;
 
-	lock(ctl);
+	qlock(ctl);
 	fb = ctl->getfb(ctl);
 	loadimage(dst, rectaddpt(fb->r, dst->r.min), byteaddr(fb->cb, fb->r.min), bytesperline(fb->r, fb->cb->depth)*Dy(fb->r));
-	unlock(ctl);
+	qunlock(ctl);
 }
 
 static void
@@ -24,18 +24,18 @@
 {
 	Framebuf *fb;
 
-	lock(ctl);
+	qlock(ctl);
 	fb = ctl->getfb(ctl);
 	memimagedraw(dst, dst->r, fb->cb, ZP, nil, ZP, SoverD);
-	unlock(ctl);
+	qunlock(ctl);
 }
 
 static void
 framebufctl_swap(Framebufctl *ctl)
 {
-	lock(ctl);
+	qlock(ctl);
 	ctl->idx ^= 1;
-	unlock(ctl);
+	qunlock(ctl);
 }
 
 static void
--- a/graphics.h
+++ b/graphics.h
@@ -217,7 +217,7 @@
 
 struct Framebufctl
 {
-	Lock;
+	QLock;
 	Framebuf *fb[2];	/* double buffering */
 	uint idx;		/* front buffer index */
 
--- a/render.c
+++ b/render.c
@@ -123,6 +123,7 @@
 
 			z = flerp(prim.v[0].p.z, prim.v[1].p.z, perc);
 			depth = fclamp(z, 0, 1);
+			/* TODO get rid of the bounds check and make sure the clipping doesn't overflow */
 			if(!ptinrect(p, params->fb->r) || depth <= params->fb->zb[p.x + p.y*Dx(params->fb->r)])
 				goto discard;
 			params->fb->zb[p.x + p.y*Dx(params->fb->r)] = depth;