summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-11-02 22:05:48 -0600
committerAlejandro Soto <alejandro@34project.org>2023-11-10 01:43:02 -0600
commit09fcdbe01553385658fe437dcb1777008c0ceb39 (patch)
tree2907e9650db7ff8e61611b9011b33309ef21b500
parent3417651da0ffebfbfb00a3228ef11e21fe7dfaa1 (diff)
rtl/gfx: implement fine rasterization
-rw-r--r--gfx_hw.tcl1
-rw-r--r--rtl/gfx/gfx_defs.sv5
-rw-r--r--rtl/gfx/gfx_fine.sv48
3 files changed, 54 insertions, 0 deletions
diff --git a/gfx_hw.tcl b/gfx_hw.tcl
index 4e0cc36..3ba4029 100644
--- a/gfx_hw.tcl
+++ b/gfx_hw.tcl
@@ -58,6 +58,7 @@ add_fileset_file gfx_scanout.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_scanout.sv
add_fileset_file gfx_masks.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_masks.sv
add_fileset_file gfx_mask_sram.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_mask_sram.sv
add_fileset_file gfx_setup_offsets.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_setup_offsets.sv
+add_fileset_file gfx_fine.sv SYSTEM_VERILOG PATH rtl/gfx/gfx_fine.sv
#
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv
index 17ed7c0..1d2bd68 100644
--- a/rtl/gfx/gfx_defs.sv
+++ b/rtl/gfx/gfx_defs.sv
@@ -52,6 +52,11 @@ typedef logic signed[31:0] fixed;
`define FIXED_FRAC 16
+typedef struct packed
+{
+ fixed x, y;
+} raster_xy;
+
`define GFX_MASK_SRAM_STAGES 3
`define GFX_MASK_STAGES (1 + `GFX_MASK_SRAM_STAGES + 1)
`define GFX_SCAN_STAGES 3 // Ajustable
diff --git a/rtl/gfx/gfx_fine.sv b/rtl/gfx/gfx_fine.sv
new file mode 100644
index 0000000..21292f2
--- /dev/null
+++ b/rtl/gfx/gfx_fine.sv
@@ -0,0 +1,48 @@
+`include "gfx/gfx_defs.sv"
+
+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
+);
+
+ 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];
+
+ always_ff @(posedge clk)
+ if (!stall) begin
+ paint <= !sign_a && !sign_b && !sign_c;
+
+ fragment <= fragment_hold;
+ fragment_hold.x <= pos.x.frag.num;
+ fragment_hold.y <= pos.y.frag.num;
+
+ edge_a <= corner_a + offset_a;
+ edge_b <= corner_b + offset_b;
+ edge_c <= corner_c + offset_c;
+ end
+
+endmodule