summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_masks.sv
blob: 86d1b78645f067c7b096de39944ea66fc03a649d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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