summaryrefslogtreecommitdiff
path: root/rtl/legacy_gfx/gfx_setup.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_setup.sv
parente5b64ea353678baabd16d245fcfaa3384e1acf8f (diff)
rtl/legacy_gfx: rename gfx -> legacy_gfx
Diffstat (limited to 'rtl/legacy_gfx/gfx_setup.sv')
-rw-r--r--rtl/legacy_gfx/gfx_setup.sv190
1 files changed, 190 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_setup.sv b/rtl/legacy_gfx/gfx_setup.sv
new file mode 100644
index 0000000..1213645
--- /dev/null
+++ b/rtl/legacy_gfx/gfx_setup.sv
@@ -0,0 +1,190 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_setup
+(
+ input logic clk,
+
+ input raster_xy vertex_a,
+ vertex_b,
+ vertex_c,
+ input logic stall,
+
+ output raster_xy pos_ref,
+ output coarse_dim span_x,
+ span_y,
+ output raster_offsets_tri offsets,
+ output fixed_tri edge_refs,
+ coarse_x_offsets,
+ coarse_y_offsets,
+ coarse_test_offsets
+);
+
+ // FIXME FIXME FIXME: Top-left rule
+
+ fixed_tri edge_base, edge_inc_x, edge_inc_y, out_edge_refs, x_offsets, y_offsets, test_offsets;
+
+ raster_xy bounds_ref, hold_vertex_a, hold_vertex_b, hold_vertex_c, ps[3], qs[3], out_pos_ref;
+ coarse_dim bounds_span_x, bounds_span_y, out_span_x, out_span_y;
+ raster_offsets_tri out_offsets;
+
+ struct packed
+ {
+ raster_xy pos_ref;
+ coarse_dim span_x,
+ span_y;
+ raster_offsets_tri offsets;
+ fixed_tri edge_refs,
+ coarse_x_offsets,
+ coarse_y_offsets,
+ coarse_test_offsets;
+ } out, skid_out;
+
+ gfx_skid_buf #(.WIDTH($bits(out))) skid
+ (
+ .in(out),
+ .out(skid_out),
+ .*
+ );
+
+ assign out.span_x = out_span_x;
+ assign out.span_y = out_span_y;
+ assign out.pos_ref = out_pos_ref;
+ assign out.offsets = out_offsets;
+ assign out.edge_refs = out_edge_refs;
+ assign out.coarse_x_offsets = x_offsets;
+ assign out.coarse_y_offsets = y_offsets;
+ assign out.coarse_test_offsets = test_offsets;
+
+ assign span_x = skid_out.span_x;
+ assign span_y = skid_out.span_y;
+ assign pos_ref = skid_out.pos_ref;
+ assign offsets = skid_out.offsets;
+ assign edge_refs = skid_out.edge_refs;
+ assign coarse_x_offsets = skid_out.coarse_x_offsets;
+ assign coarse_y_offsets = skid_out.coarse_y_offsets;
+ assign coarse_test_offsets = skid_out.coarse_test_offsets;
+
+ assign ps[0] = hold_vertex_a;
+ assign qs[0] = hold_vertex_b;
+
+ assign ps[1] = hold_vertex_b;
+ assign qs[1] = hold_vertex_c;
+
+ assign ps[2] = hold_vertex_c;
+ assign qs[2] = hold_vertex_a;
+
+ gfx_pipes #(.WIDTH($bits(vertex_a)), .DEPTH(`GFX_SETUP_BOUNDS_STAGES)) vertex_a_pipes
+ (
+ .in(vertex_a),
+ .out(hold_vertex_a),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(vertex_b)), .DEPTH(`GFX_SETUP_BOUNDS_STAGES)) vertex_b_pipes
+ (
+ .in(vertex_b),
+ .out(hold_vertex_b),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(vertex_c)), .DEPTH(`GFX_SETUP_BOUNDS_STAGES)) vertex_c_pipes
+ (
+ .in(vertex_c),
+ .out(hold_vertex_c),
+ .*
+ );
+
+ gfx_setup_bounds bounds
+ (
+ .span_x(bounds_span_x),
+ .span_y(bounds_span_y),
+ .reference(bounds_ref),
+ .*
+ );
+
+ localparam POST_BOUNDS_DEPTH = `GFX_SETUP_EDGE_STAGES + `GFX_SETUP_OFFSETS_STAGES;
+
+ gfx_pipes #(.WIDTH($bits(pos_ref)), .DEPTH(POST_BOUNDS_DEPTH)) ref_pipes
+ (
+ .in(bounds_ref),
+ .out(out_pos_ref),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(span_x)), .DEPTH(POST_BOUNDS_DEPTH)) span_x_pipes
+ (
+ .in(bounds_span_x),
+ .out(out_span_x),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(span_y)), .DEPTH(POST_BOUNDS_DEPTH)) span_y_pipes
+ (
+ .in(bounds_span_y),
+ .out(out_span_y),
+ .*
+ );
+
+ always_comb
+ for (integer i = 0; i < 3; ++i)
+ // Imaginárselo
+ unique case ({x_offsets[i][$bits(fixed) - 1], y_offsets[i][$bits(fixed) - 1]})
+ 2'b00:
+ test_offsets[i] = out_offsets[i][`GFX_RASTER_OFFSETS - 1];
+
+ 2'b01:
+ test_offsets[i] = out_offsets[i][`GFX_RASTER_SIZE - 1];
+
+ 2'b10:
+ test_offsets[i] = out_offsets[i][`GFX_RASTER_OFFSETS - `GFX_RASTER_SIZE - 1];
+
+ 2'b11:
+ test_offsets[i] = out_offsets[i][0];
+ endcase
+
+ genvar i;
+ generate
+ for (i = 0; i < 3; ++i) begin: edges
+ gfx_setup_edge edge_fn
+ (
+ .p(ps[i]),
+ .q(qs[i]),
+ .base(edge_base[i]),
+ .inc_x(edge_inc_x[i]),
+ .inc_y(edge_inc_y[i]),
+ .origin(bounds_ref),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(fixed)), .DEPTH(`GFX_SETUP_OFFSETS_STAGES)) base_pipes
+ (
+ .in(edge_base[i]),
+ .out(out_edge_refs[i]),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(fixed)), .DEPTH(`GFX_SETUP_OFFSETS_STAGES)) coarse_x_pipes
+ (
+ .in(edge_inc_x[i] << `GFX_RASTER_BITS),
+ .out(x_offsets[i]),
+ .*
+ );
+
+ gfx_pipes #(.WIDTH($bits(fixed)), .DEPTH(`GFX_SETUP_OFFSETS_STAGES)) coarse_y_pipes
+ (
+ .in(edge_inc_y[i] << `GFX_RASTER_BITS),
+ .out(y_offsets[i]),
+ .*
+ );
+
+ gfx_setup_offsets edge_offsets
+ (
+ .inc_x(edge_inc_x[i]),
+ .inc_y(edge_inc_y[i]),
+ .offsets(out_offsets[i]),
+ .*
+ );
+ end
+ endgenerate
+
+endmodule