summaryrefslogtreecommitdiff
path: root/rtl/legacy_gfx/gfx_raster_fine.sv
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/legacy_gfx/gfx_raster_fine.sv')
-rw-r--r--rtl/legacy_gfx/gfx_raster_fine.sv49
1 files changed, 49 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_raster_fine.sv b/rtl/legacy_gfx/gfx_raster_fine.sv
new file mode 100644
index 0000000..da11b6f
--- /dev/null
+++ b/rtl/legacy_gfx/gfx_raster_fine.sv
@@ -0,0 +1,49 @@
+`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 fixed_tri barys,
+ 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
+ barys <= edges;
+ paint <= signs == 0;
+
+ fragment <= fragment_hold;
+ fragment_hold.x <= {prec.x.sign, prec.x.coarse, fine_x};
+ fragment_hold.y <= {prec.y.sign, prec.y.coarse, fine_y};
+
+ for (integer i = 0; i < 3; ++i)
+ edges[i] <= corners[i] + per_edge_offsets[i];
+ end
+
+endmodule