diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-10-29 15:35:42 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-10-29 16:12:33 -0600 |
| commit | adabbf5f30729092a64fa1059bbc7d7b09d6b24e (patch) | |
| tree | 4a4db581d233bcfda18d5e8f2e5606365d52852c /rtl/gfx/gfx_masks.sv | |
| parent | 98d493f9c80f356cdbc2669150d772e451c3b80e (diff) | |
rtl/gfx: implement double-buffered scanout
Diffstat (limited to 'rtl/gfx/gfx_masks.sv')
| -rw-r--r-- | rtl/gfx/gfx_masks.sv | 53 |
1 files changed, 53 insertions, 0 deletions
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 |
