diff options
Diffstat (limited to 'rtl')
| -rw-r--r-- | rtl/gfx/gfx_defs.sv | 5 | ||||
| -rw-r--r-- | rtl/gfx/gfx_fine.sv | 48 |
2 files changed, 53 insertions, 0 deletions
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 |
