From adabbf5f30729092a64fa1059bbc7d7b09d6b24e Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sun, 29 Oct 2023 15:35:42 -0600 Subject: rtl/gfx: implement double-buffered scanout --- rtl/gfx/gfx_masks.sv | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 rtl/gfx/gfx_masks.sv (limited to 'rtl/gfx/gfx_masks.sv') diff --git a/rtl/gfx/gfx_masks.sv b/rtl/gfx/gfx_masks.sv new file mode 100644 index 0000000..86d1b78 --- /dev/null +++ b/rtl/gfx/gfx_masks.sv @@ -0,0 +1,53 @@ +`include "gfx/gfx_defs.sv" + +module gfx_masks +( + input logic clk, + + input logic swap_buffers, + + input linear_coord scan_mask_addr, + output logic scan_mask, + + input logic frag_mask_write, + frag_mask_set, + input linear_coord frag_mask_read_addr, + frag_mask_write_addr, + output logic frag_mask +); + + logic mask_a, mask_b, frag_write_hold, frag_set_hold; + linear_coord scan_addr_hold, frag_write_addr_hold, frag_read_addr_hold; + + gfx_mask_sram sram_a + ( + .set(frag_set_hold), + .mask(mask_a), + .write(swap_buffers && frag_write_hold), + .read_addr(swap_buffers ? frag_read_addr_hold : scan_addr_hold), + .write_addr(frag_write_addr_hold), + .* + ); + + gfx_mask_sram sram_b + ( + .set(frag_set_hold), + .mask(mask_b), + .write(!swap_buffers && frag_write_hold), + .read_addr(swap_buffers ? scan_addr_hold : frag_read_addr_hold), + .write_addr(frag_write_addr_hold), + .* + ); + + always_ff @(posedge clk) begin + scan_mask <= swap_buffers ? mask_b : mask_a; + scan_addr_hold <= scan_mask_addr; + + frag_mask <= swap_buffers ? mask_a : mask_b; + frag_set_hold <= frag_mask_set; + frag_write_hold <= frag_mask_write; + frag_read_addr_hold <= frag_mask_read_addr; + frag_write_addr_hold <= frag_mask_write_addr; + end + +endmodule -- cgit v1.2.3