diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-05 17:34:22 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-05 17:38:27 -0600 |
| commit | 081a8a3ba8bfe036f31da53f9c041a2caa30fce2 (patch) | |
| tree | 7d712b67d3dc1ad3d37041562774ba3c4e5a7f49 /rtl/legacy_gfx/gfx_setup_bounds.sv | |
| parent | e5b64ea353678baabd16d245fcfaa3384e1acf8f (diff) | |
rtl/legacy_gfx: rename gfx -> legacy_gfx
Diffstat (limited to 'rtl/legacy_gfx/gfx_setup_bounds.sv')
| -rw-r--r-- | rtl/legacy_gfx/gfx_setup_bounds.sv | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/rtl/legacy_gfx/gfx_setup_bounds.sv b/rtl/legacy_gfx/gfx_setup_bounds.sv new file mode 100644 index 0000000..b110438 --- /dev/null +++ b/rtl/legacy_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.padding = {`GFX_RASTER_PAD_BITS{ref_x[$bits(ref_x) - 1]}}; + assign {ref_prec.x.sign, ref_prec.x.coarse} = ref_x; + + assign ref_prec.y.sub = 0; + assign ref_prec.y.fine = 0; + assign ref_prec.y.padding = {`GFX_RASTER_PAD_BITS{ref_y[$bits(ref_y) - 1]}}; + assign {ref_prec.y.sign, ref_prec.y.coarse} = ref_y; + + 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.sign, min_prec.x.coarse}; + ref_y <= {min_prec.y.sign, min_prec.y.coarse}; + + span_x <= {max_prec.x.sign, max_prec.x.coarse} - {min_prec.x.sign, min_prec.x.coarse}; + span_y <= {max_prec.y.sign, max_prec.y.coarse} - {min_prec.y.sign, min_prec.y.coarse}; + end + +endmodule |
