summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_raster_fine.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-10 01:08:39 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-10 01:48:40 -0600
commit40b59e4cd26b7a3a6d0ff14d8480c172ce3fa845 (patch)
tree0a396a366145d8ea1f09e412b6fa60a7c1e79a71 /rtl/gfx/gfx_raster_fine.sv
parent881778cc7dbe1f01d343ee1ca4eea1b59c5eda3a (diff)
rtl/gfx: rename gfx_{coarse,fine} -> gfx_raster_{coarse,fine}
Diffstat (limited to 'rtl/gfx/gfx_raster_fine.sv')
-rw-r--r--rtl/gfx/gfx_raster_fine.sv47
1 files changed, 47 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_raster_fine.sv b/rtl/gfx/gfx_raster_fine.sv
new file mode 100644
index 0000000..2cb9c6a
--- /dev/null
+++ b/rtl/gfx/gfx_raster_fine.sv
@@ -0,0 +1,47 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_raster_fine
+#(parameter X=0, Y=0)
+(
+ input logic clk,
+
+ input raster_xy pos,
+ input fixed_tri corners,
+ input raster_offsets_tri offsets,
+ input logic stall,
+
+ output frag_xy fragment,
+ output logic paint
+);
+
+ localparam INDEX = Y * `GFX_RASTER_SIZE + X;
+
+ frag_xy fragment_hold;
+ fixed_tri edges, per_edge_offsets;
+ logic[2:0] signs;
+ raster_xy_prec prec;
+ logic[`GFX_RASTER_BITS - 1:0] fine_x, fine_y;
+
+ assign prec = pos;
+ assign fine_x = X;
+ assign fine_y = Y;
+
+ always_comb
+ for (integer i = 0; i < 3; ++i) begin
+ signs[i] = edges[i][$bits(edges[0]) - 1];
+ per_edge_offsets[i] = offsets[i][INDEX];
+ end
+
+ always_ff @(posedge clk)
+ if (!stall) begin
+ paint <= signs == 0;
+
+ fragment <= fragment_hold;
+ fragment_hold.x <= {prec.x.coarse, fine_x};
+ fragment_hold.y <= {prec.y.coarse, fine_y};
+
+ for (integer i = 0; i < 3; ++i)
+ edges[i] <= corners[i] + per_edge_offsets[i];
+ end
+
+endmodule