summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_raster_coarse.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_coarse.sv
parent881778cc7dbe1f01d343ee1ca4eea1b59c5eda3a (diff)
rtl/gfx: rename gfx_{coarse,fine} -> gfx_raster_{coarse,fine}
Diffstat (limited to 'rtl/gfx/gfx_raster_coarse.sv')
-rw-r--r--rtl/gfx/gfx_raster_coarse.sv122
1 files changed, 122 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_raster_coarse.sv b/rtl/gfx/gfx_raster_coarse.sv
new file mode 100644
index 0000000..7a047ee
--- /dev/null
+++ b/rtl/gfx/gfx_raster_coarse.sv
@@ -0,0 +1,122 @@
+`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 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
+);
+
+ 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;
+
+ struct packed
+ {
+ raster_xy pos;
+ fixed_tri corners;
+ } out, skid_out;
+
+ assign pos = skid_out.pos;
+ assign corners = skid_out.corners;
+
+ 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_valid(send),
+ .in_ready(skid_ready),
+ .*
+ );
+
+ always_comb
+ for (integer i = 0; i < 3; ++i) begin
+ edge_tests[i] = edge_fns[i] + coarse_test_offsets[i];
+ edge_vert_next[i] = edge_vert[i] + 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;
+
+ 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;
+ end
+
+ for (integer i = 0; i < 3; ++i) begin
+ edge_fns[i] <= edge_fns[i] + 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