summaryrefslogtreecommitdiff
path: root/rtl/legacy_gfx/gfx_raster_coarse.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-05-05 17:34:22 -0600
committerAlejandro Soto <alejandro@34project.org>2024-05-05 17:38:27 -0600
commit081a8a3ba8bfe036f31da53f9c041a2caa30fce2 (patch)
tree7d712b67d3dc1ad3d37041562774ba3c4e5a7f49 /rtl/legacy_gfx/gfx_raster_coarse.sv
parente5b64ea353678baabd16d245fcfaa3384e1acf8f (diff)
rtl/legacy_gfx: rename gfx -> legacy_gfx
Diffstat (limited to 'rtl/legacy_gfx/gfx_raster_coarse.sv')
-rw-r--r--rtl/legacy_gfx/gfx_raster_coarse.sv135
1 files changed, 135 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_raster_coarse.sv b/rtl/legacy_gfx/gfx_raster_coarse.sv
new file mode 100644
index 0000000..8db3fe9
--- /dev/null
+++ b/rtl/legacy_gfx/gfx_raster_coarse.sv
@@ -0,0 +1,135 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_raster_coarse
+(
+ input logic clk,
+ rst_n,
+
+ input raster_xy pos_ref,
+ input coarse_dim span_x,
+ span_y,
+ input raster_offsets_tri offsets,
+ input fixed_tri edge_refs,
+ coarse_x_offsets,
+ coarse_y_offsets,
+ coarse_test_offsets,
+
+ input logic in_valid,
+ output logic in_ready,
+
+ input logic out_ready,
+ output logic out_valid,
+
+ output raster_xy pos,
+ output fixed_tri corners,
+ output raster_offsets_tri fine_offsets
+);
+
+ fixed reference_x;
+ logic end_x, end_y, running, send, send_valid, skid_ready, stall;
+ raster_xy next_pos;
+ fixed_tri edge_fns, edge_tests, edge_vert, edge_vert_next;
+ coarse_dim stride_x, stride_y, width;
+ logic[2:0] edge_signs;
+ raster_offsets_tri hold_offsets;
+
+ fixed_tri hold_coarse_x_offsets, hold_coarse_y_offsets, hold_coarse_test_offsets;
+
+ struct packed
+ {
+ raster_xy pos;
+ fixed_tri corners;
+ raster_offsets_tri fine_offsets;
+ } out, skid_out;
+
+ assign pos = skid_out.pos;
+ assign corners = skid_out.corners;
+ assign fine_offsets = skid_out.fine_offsets;
+
+ assign end_x = stride_x == 0;
+ assign end_y = stride_y == 0;
+
+ assign send = &edge_signs && send_valid;
+ assign in_ready = skid_ready && !running;
+
+ gfx_skid_buf #(.WIDTH($bits(out))) skid_buf
+ (
+ .in(out),
+ .out(skid_out),
+ .*
+ );
+
+ gfx_skid_flow skid_flow
+ (
+ .in_ready(skid_ready),
+ .in_valid(send),
+ .*
+ );
+
+ always_comb
+ for (integer i = 0; i < 3; ++i) begin
+ edge_tests[i] = edge_fns[i] + hold_coarse_test_offsets[i];
+ edge_vert_next[i] = edge_vert[i] + hold_coarse_y_offsets[i];
+ end
+
+ always_ff @(posedge clk or negedge rst_n)
+ if (!rst_n) begin
+ running <= 0;
+ send_valid <= 0;
+ end else if (!stall) begin
+ if (running)
+ running <= !end_x || !end_y;
+ else
+ running <= in_ready && in_valid;
+
+ send_valid <= running;
+ end
+
+ always_ff @(posedge clk)
+ if (!stall) begin
+ out.pos <= next_pos;
+ out.corners <= edge_fns;
+ out.fine_offsets <= hold_offsets;
+
+ stride_x <= stride_x - 1;
+ next_pos.x <= next_pos.x + (1 << (`FIXED_FRAC + `GFX_RASTER_BITS));
+
+ if (end_x) begin
+ next_pos.x <= reference_x;
+ next_pos.y <= next_pos.y + (1 << (`FIXED_FRAC + `GFX_RASTER_BITS));
+
+ stride_x <= width;
+ stride_y <= stride_y - 1;
+ end
+
+ if (in_ready && in_valid) begin
+ next_pos <= pos_ref;
+ reference_x <= pos_ref.x;
+
+ width <= span_x;
+ stride_x <= span_x;
+ stride_y <= span_y;
+
+ hold_offsets <= offsets;
+ hold_coarse_x_offsets <= coarse_x_offsets;
+ hold_coarse_y_offsets <= coarse_y_offsets;
+ hold_coarse_test_offsets <= coarse_test_offsets;
+ end
+
+ for (integer i = 0; i < 3; ++i) begin
+ edge_fns[i] <= edge_fns[i] + hold_coarse_x_offsets[i];
+ if (end_x) begin
+ edge_fns[i] <= edge_vert_next[i];
+ edge_vert[i] <= edge_vert_next[i];
+ end
+
+ if (in_ready && in_valid) begin
+ edge_fns[i] <= edge_refs[i];
+ edge_vert[i] <= edge_refs[i];
+ end
+
+ edge_signs[i] <= !edge_tests[i][$bits(fixed) - 1];
+ end
+ end
+
+endmodule