summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-10 01:00:50 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-10 01:43:02 -0600
commit39294ed7dbf2331651cd8fcca887e088bdcd2cfc (patch)
tree0f6c3d590b1f1400f6c1f6ca98be1d0e15631312
parentd5783a6ebde5d38fe72dd19293d9144827c35c56 (diff)
rtl/gfx: use packed arrays in module interfaces
-rw-r--r--rtl/gfx/gfx_defs.sv56
-rw-r--r--rtl/gfx/gfx_fine.sv57
-rw-r--r--rtl/gfx/gfx_setup_offsets.sv14
3 files changed, 87 insertions, 40 deletions
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv
index 45e1a63..60962e1 100644
--- a/rtl/gfx/gfx_defs.sv
+++ b/rtl/gfx/gfx_defs.sv
@@ -28,8 +28,9 @@ typedef logic[1:0] index4;
`define INDEX4_MIN 2'b00
`define INDEX4_MAX 2'b11
-typedef logic[9:0] y_coord;
typedef logic[8:0] x_coord;
+typedef logic[9:0] y_coord;
+typedef logic[9:0] xy_coord;
typedef logic[18:0] linear_coord;
typedef logic[19:0] half_coord;
@@ -53,18 +54,65 @@ typedef struct packed
`define FIXED_FMA_DOT_STAGES (2 * `FIXED_FMA_STAGES)
typedef logic signed[31:0] fixed;
+typedef fixed[2:0] fixed_tri;
typedef struct packed
{
fixed x, y;
} raster_xy;
+typedef logic[7:0] coarse_dim;
+
`define GFX_MASK_SRAM_STAGES 3
`define GFX_MASK_STAGES (1 + `GFX_MASK_SRAM_STAGES + 1)
`define GFX_SCAN_STAGES 3 // Ajustable
-`define GFX_RASTER_BITS 2
-`define GFX_RASTER_SIZE (1 << GFX_RASTER_BITS)
-`define GFX_RASTER_OFFSETS (1 << (2 * GFX_RASTER_BITS))
+`define GFX_SETUP_BOUNDS_STAGES 3
+`define GFX_SETUP_EDGE_STAGES (1 + `FIXED_FMA_DOT_STAGES)
+`define GFX_SETUP_OFFSETS_STAGES 2
+`define GFX_SETUP_STAGES (`GFX_SETUP_BOUNDS_STAGES \
+ + `GFX_SETUP_EDGE_STAGES \
+ + `GFX_SETUP_OFFSETS_STAGES)
+
+`define GFX_FINE_STAGES 2
+
+`define GFX_RASTER_BITS 2
+`define GFX_RASTER_SUB_BITS 4
+`define GFX_RASTER_PAD_BITS ($bits(fixed) - $bits(coarse_dim) - `FIXED_FRAC - `GFX_RASTER_BITS - 1)
+`define GFX_RASTER_SIZE (1 << `GFX_RASTER_BITS)
+`define GFX_RASTER_OFFSETS (1 << (2 * `GFX_RASTER_BITS))
+
+typedef struct packed
+{
+ logic[`GFX_RASTER_SUB_BITS - 1:0] num;
+ logic[`FIXED_FRAC - `GFX_RASTER_SUB_BITS - 1:0] prec;
+} raster_sub;
+
+typedef struct packed
+{
+ logic sign;
+ logic[`GFX_RASTER_PAD_BITS - 1:0] padding;
+ coarse_dim coarse;
+ logic[`GFX_RASTER_BITS - 1:0] fine;
+ raster_sub sub;
+} raster_prec;
+
+typedef struct packed
+{
+ raster_prec x, y;
+} raster_xy_prec;
+
+typedef fixed[`GFX_RASTER_OFFSETS - 1:0] raster_offsets;
+typedef raster_offsets[2:0] raster_offsets_tri;
+
+`define GFX_FINE_LANES (`GFX_RASTER_SIZE * `GFX_RASTER_SIZE)
+
+typedef struct packed
+{
+ xy_coord x, y;
+} frag_xy;
+
+typedef frag_xy[`GFX_FINE_LANES - 1:0] frag_xy_lanes;
+typedef logic[`GFX_FINE_LANES - 1:0] paint_lanes;
`endif
diff --git a/rtl/gfx/gfx_fine.sv b/rtl/gfx/gfx_fine.sv
index 21292f2..6238025 100644
--- a/rtl/gfx/gfx_fine.sv
+++ b/rtl/gfx/gfx_fine.sv
@@ -3,46 +3,45 @@
module gfx_fine
#(parameter X=0, Y=0)
(
- input logic clk,
-
- input raster_xy pos,
- input fixed corner_a,
- corner_b,
- corner_c,
- input fixed offsets_a[`GFX_RASTER_OFFSETS],
- offsets_b[`GFX_RASTER_OFFSETS],
- offsets_c[`GFX_RASTER_OFFSETS],
- input logic stall,
-
- output frag_xy fragment,
- output logic paint
+ input logic clk,
+
+ input raster_xy pos,
+ input fixed_tri corners,
+ input raster_offsets_tri offsets,
+ input logic stall,
+
+ output frag_xy fragment,
+ output logic paint
);
localparam INDEX = Y * `GFX_RASTER_SIZE + X;
- fixed edge_a, edge_b, edge_c, offset_a, offset_b, offset_c;
- logic sign_a, sign_b, sign_c;
frag_xy fragment_hold;
-
- assign offset_a = offsets_a[INDEX];
- assign offset_b = offsets_b[INDEX];
- assign offset_c = offsets_c[INDEX];
-
- assign sign_a = edge_a[$bits(edge_a) - 1];
- assign sign_b = edge_b[$bits(edge_b) - 1];
- assign sign_c = edge_c[$bits(edge_c) - 1];
+ 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
- paint <= !sign_a && !sign_b && !sign_c;
+ paint <= signs == 0;
fragment <= fragment_hold;
- fragment_hold.x <= pos.x.frag.num;
- fragment_hold.y <= pos.y.frag.num;
+ fragment_hold.x <= {prec.x.coarse, fine_x};
+ fragment_hold.y <= {prec.y.coarse, fine_y};
- edge_a <= corner_a + offset_a;
- edge_b <= corner_b + offset_b;
- edge_c <= corner_c + offset_c;
+ for (integer i = 0; i < 3; ++i)
+ edges[i] <= corners[i] + per_edge_offsets[i];
end
endmodule
diff --git a/rtl/gfx/gfx_setup_offsets.sv b/rtl/gfx/gfx_setup_offsets.sv
index 3b615d5..a2a9415 100644
--- a/rtl/gfx/gfx_setup_offsets.sv
+++ b/rtl/gfx/gfx_setup_offsets.sv
@@ -2,13 +2,13 @@
module gfx_setup_offsets
(
- input logic clk,
+ input logic clk,
- input fixed inc_x,
- inc_y,
- input logic stall,
+ input fixed inc_x,
+ inc_y,
+ input logic stall,
- output fixed offsets[`GFX_RASTER_OFFSETS]
+ output raster_offsets offsets
);
fixed x_hold[`GFX_RASTER_SIZE], y_hold[`GFX_RASTER_SIZE],
@@ -21,8 +21,8 @@ module gfx_setup_offsets
assign y_multiples[1] = inc_y;
assign x_multiples[2] = inc_x << 1;
assign y_multiples[2] = inc_y << 1;
- assign x_multiples[3] = (inc_x << 1) + a;
- assign y_multiples[3] = (inc_y << 1) + b;
+ assign x_multiples[3] = (inc_x << 1) + inc_x;
+ assign y_multiples[3] = (inc_y << 1) + inc_y;
genvar i;
generate