shithub: psxe

Download patch

ref: e5fbfaf2922430eca3b8abfde6fe3c76876f9385
parent: 8db039be28a2454321e432125a7f51fd729bb507
author: Lycoder <aurealinbox@gmail.com>
date: Tue Jun 13 10:55:22 EDT 2023

Implement dithering

Still need to implement dithering bits on control registers and commands

--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -6,6 +6,13 @@
 #include "gpu.h"
 #include "../log.h"
 
+int g_psx_gpu_dither_kernel[] = {
+    -4, +0, -3, +1,
+    +2, -2, +3, -1,
+    -3, +1, -4, +0,
+    +3, -1, +2, -2,
+};
+
 uint16_t gpu_to_bgr555(uint32_t color) {
     return ((color & 0x0000f8) >> 3) |
            ((color & 0x00f800) >> 6) |
@@ -184,9 +191,32 @@
             float z2 = EDGE((float)a, (float)b, (float)p);
 
             if ((z0 >= 0) && (z1 >= 0) && (z2 >= 0)) {
-                uint32_t cr = (z0 * ((a.c >>  0) & 0xff) + z1 * ((b.c >>  0) & 0xff) + z2 * ((c.c >>  0) & 0xff)) / area;
-                uint32_t cg = (z0 * ((a.c >>  8) & 0xff) + z1 * ((b.c >>  8) & 0xff) + z2 * ((c.c >>  8) & 0xff)) / area;
-                uint32_t cb = (z0 * ((a.c >> 16) & 0xff) + z1 * ((b.c >> 16) & 0xff) + z2 * ((c.c >> 16) & 0xff)) / area;
+                int cr = (z0 * ((a.c >>  0) & 0xff) + z1 * ((b.c >>  0) & 0xff) + z2 * ((c.c >>  0) & 0xff)) / area;
+                int cg = (z0 * ((a.c >>  8) & 0xff) + z1 * ((b.c >>  8) & 0xff) + z2 * ((c.c >>  8) & 0xff)) / area;
+                int cb = (z0 * ((a.c >> 16) & 0xff) + z1 * ((b.c >> 16) & 0xff) + z2 * ((c.c >> 16) & 0xff)) / area;
+
+                // Calculate positions within our 4x4 dither
+                // kernel
+                int dy = (y - ymin) % 4;
+                int dx = (x - xmin) % 4;
+
+                // Shift two pixels horizontally on the last
+                // two scanlines?
+                // if (dy > 1) {
+                //     dx = ((x + 2) - xmin) % 4;
+                // }
+
+                int dither = g_psx_gpu_dither_kernel[dx + (dy * 4)];
+
+                // Add to the original 8-bit color values
+                cr += dither;
+                cg += dither;
+                cb += dither;
+
+                // Saturate (clamp) to 00-ff
+                cr = (cr >= 0xff) ? 0xff : ((cr <= 0) ? 0 : cr);
+                cg = (cg >= 0xff) ? 0xff : ((cg <= 0) ? 0 : cg);
+                cb = (cb >= 0xff) ? 0xff : ((cb <= 0) ? 0 : cb);
 
                 uint32_t color = (cb << 16) | (cg << 8) | cr;
 
--