summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_setup_bounds.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-10 01:01:29 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-10 01:43:24 -0600
commit6765d18bb9d1d83367afe76694749893eb88fbbd (patch)
tree8cd335d281d0958fe9852caeeebf2228f24afd6c /rtl/gfx/gfx_setup_bounds.sv
parent39294ed7dbf2331651cd8fcca887e088bdcd2cfc (diff)
rtl/gfx: implement triangle setup
Diffstat (limited to 'rtl/gfx/gfx_setup_bounds.sv')
-rw-r--r--rtl/gfx/gfx_setup_bounds.sv73
1 files changed, 73 insertions, 0 deletions
diff --git a/rtl/gfx/gfx_setup_bounds.sv b/rtl/gfx/gfx_setup_bounds.sv
new file mode 100644
index 0000000..6a93db2
--- /dev/null
+++ b/rtl/gfx/gfx_setup_bounds.sv
@@ -0,0 +1,73 @@
+`include "gfx/gfx_defs.sv"
+
+module gfx_setup_bounds
+(
+ input logic clk,
+
+ input raster_xy vertex_a,
+ vertex_b,
+ vertex_c,
+ input logic stall,
+
+ output raster_xy reference,
+ output coarse_dim span_x,
+ span_y
+);
+
+ logic x_a_lt_b, x_a_lt_c, x_b_lt_c, y_a_lt_b, y_a_lt_c, y_b_lt_c;
+ raster_xy min, max, hold_a, hold_b, hold_c;
+ coarse_dim ref_x, ref_y;
+ raster_xy_prec min_prec, max_prec, ref_prec;
+
+ assign min_prec = min;
+ assign max_prec = max;
+ assign reference = ref_prec;
+
+ assign ref_prec.x.sub = 0;
+ assign ref_prec.x.fine = 0;
+ assign ref_prec.x.coarse = ref_x;
+ assign ref_prec.x.padding = 0;
+
+ assign ref_prec.y.sub = 0;
+ assign ref_prec.y.fine = 0;
+ assign ref_prec.y.coarse = ref_y;
+ assign ref_prec.y.padding = 0;
+
+ always_ff @(posedge clk)
+ if (!stall) begin
+ hold_a <= vertex_a;
+ hold_b <= vertex_b;
+ hold_c <= vertex_c;
+
+ x_a_lt_b <= vertex_a.x < vertex_b.x;
+ x_a_lt_c <= vertex_a.x < vertex_c.x;
+ x_b_lt_c <= vertex_b.x < vertex_c.x;
+
+ y_a_lt_b <= vertex_a.y < vertex_b.y;
+ y_a_lt_c <= vertex_a.y < vertex_c.y;
+ y_b_lt_c <= vertex_b.y < vertex_c.y;
+
+ if (x_a_lt_b) begin
+ min.x <= x_a_lt_c ? hold_a.x : hold_c.x;
+ max.x <= x_b_lt_c ? hold_c.x : hold_b.x;
+ end else begin
+ min.x <= x_b_lt_c ? hold_b.x : hold_c.x;
+ max.x <= x_a_lt_c ? hold_c.x : hold_a.x;
+ end
+
+ if (y_a_lt_b) begin
+ min.y <= y_a_lt_c ? hold_a.y : hold_c.y;
+ max.y <= y_b_lt_c ? hold_c.y : hold_b.y;
+ end else begin
+ min.y <= y_b_lt_c ? hold_b.y : hold_c.y;
+ max.y <= y_a_lt_c ? hold_c.y : hold_a.y;
+ end
+
+ ref_x <= min_prec.x.coarse;
+ ref_y <= min_prec.y.coarse;
+
+ span_x <= max_prec.x.coarse - min_prec.x.coarse;
+ span_y <= max_prec.y.coarse - min_prec.y.coarse;
+ end
+
+endmodule