summaryrefslogtreecommitdiff
path: root/rtl/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/gfx')
-rw-r--r--rtl/gfx/gfx_raster.sv109
1 files changed, 109 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_raster.sv b/rtl/gfx/gfx_raster.sv
new file mode 100644
index 0000000..e30ad43
--- /dev/null
+++ b/rtl/gfx/gfx_raster.sv
@@ -0,0 +1,109 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_raster
+(
+ input logic clk,
+ rst_n,
+
+ input raster_xy vertex_a,
+ vertex_b,
+ vertex_c,
+ input logic in_valid,
+ output logic in_ready,
+
+ output frag_xy_lanes fragments,
+ input logic out_ready,
+ output paint_lanes out_valid
+);
+
+ logic setup_stall, setup_valid;
+
+ gfx_pipeline_flow #(.STAGES(`GFX_SETUP_STAGES)) setup_flow
+ (
+ .stall(setup_stall),
+ .out_ready(coarse_ready),
+ .out_valid(setup_valid),
+ .*
+ );
+
+ fixed_tri coarse_x_offsets, coarse_y_offsets, coarse_test_offsets, edge_refs;
+ raster_xy pos_ref;
+ coarse_dim span_x, span_y;
+ raster_offsets_tri offsets; //TODO: fsm con esto holdeado
+
+ gfx_setup setup
+ (
+ .stall(setup_stall),
+ .*
+ );
+
+ logic coarse_ready, coarse_valid;
+ fixed_tri coarse_corners;
+ raster_xy coarse_pos;
+
+ gfx_coarse coarse
+ (
+ .in_valid(setup_valid),
+ .in_ready(coarse_ready),
+ .out_ready(fine_ready),
+ .out_valid(coarse_valid),
+ .pos(coarse_pos),
+ .corners(coarse_corners),
+ .*
+ );
+
+ logic fine_ready, fine_stall, fine_valid;
+
+ always_comb
+ for (integer i = 0; i < `GFX_FINE_LANES; ++i)
+ out_valid[i] = fine_valid && skid_paint_ij[i];
+
+ gfx_pipeline_flow #(.STAGES(`GFX_FINE_STAGES)) fine_flow
+ (
+ .stall(fine_stall),
+ .in_ready(fine_ready),
+ .in_valid(coarse_valid),
+ .out_ready(out_ready || !(|skid_paint_ij)),
+ .out_valid(fine_valid),
+ .*
+ );
+
+ frag_xy fragment_ij[`GFX_RASTER_SIZE][`GFX_RASTER_SIZE];
+ logic[`GFX_FINE_LANES - 1:0] paint_ij, skid_paint_ij;
+
+ gfx_skid_buf #(.WIDTH(`GFX_FINE_LANES)) skid_paint
+ (
+ .in(paint_ij),
+ .out(skid_paint_ij),
+ .stall(fine_stall),
+ .*
+ );
+
+ genvar i, j;
+ generate
+ for (i = 0; i < `GFX_RASTER_SIZE; ++i) begin: fine_x
+ for (j = 0; j < `GFX_RASTER_SIZE; ++j) begin: fine_y
+ gfx_fine #(.X(i), .Y(j)) fine
+ (
+ .stall(fine_stall),
+
+ .pos(coarse_pos),
+ .corners(coarse_corners),
+
+ .paint(paint_ij[j * `GFX_RASTER_SIZE + i]),
+ .fragment(fragment_ij[i][j]),
+ .*
+ );
+
+ gfx_skid_buf #(.WIDTH($bits(frag_xy))) skid_fragment
+ (
+ .in(fragment_ij[i][j]),
+ .out(fragments[j * `GFX_RASTER_SIZE + i]),
+ .stall(fine_stall),
+ .*
+ );
+ end
+ end
+ endgenerate
+
+endmodule