summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_masks.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-10-29 15:35:42 -0600
committerAlejandro Soto <alejandro@34project.org>2023-10-29 16:12:33 -0600
commitadabbf5f30729092a64fa1059bbc7d7b09d6b24e (patch)
tree4a4db581d233bcfda18d5e8f2e5606365d52852c /rtl/gfx/gfx_masks.sv
parent98d493f9c80f356cdbc2669150d772e451c3b80e (diff)
rtl/gfx: implement double-buffered scanout
Diffstat (limited to 'rtl/gfx/gfx_masks.sv')
-rw-r--r--rtl/gfx/gfx_masks.sv53
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