summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_clear.sv
blob: ae9a20c628917fe5dbd7e0e8d2125b502d2c9bea (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
`include "gfx/gfx_defs.sv"

module gfx_clear
(
	input  logic        clk,
	                    rst_n,

	input  logic        start_clear,

	input  linear_coord rop_mask_addr,
	input  logic        rop_mask_assert,
	output logic        frag_wait,

	output logic        frag_mask_set,
	                    frag_mask_write,
	output linear_coord frag_mask_write_addr
);

	enum int unsigned
	{
		FRAG,
		CLEAR
	} state;

	logic end_clear;

	assign end_clear = frag_mask_write_addr == `GFX_LINEAR_RES - 1;

	always_comb
		unique case (state)
			FRAG:  frag_wait = start_clear;
			CLEAR: frag_wait = 1;
		endcase

	always_ff @(posedge clk or negedge rst_n)
		if (!rst_n) begin
			state <= FRAG;
			frag_mask_write <= 0;
		end else unique case (state)
			FRAG: begin
				frag_mask_write <= rop_mask_assert;

				if (start_clear) begin
					state <= CLEAR;
					frag_mask_write <= 1;
				end
			end

			CLEAR:
				if (end_clear) begin
					state <= FRAG;
					frag_mask_write <= 0;
				end
		endcase

	always_ff @(posedge clk)
		unique case (state)
			FRAG: begin
				frag_mask_set <= !start_clear;
				frag_mask_write_addr <= rop_mask_addr;

				if (start_clear)
					frag_mask_write_addr <= 0;
			end

			CLEAR:
				frag_mask_write_addr <= frag_mask_write_addr + 1;
		endcase

endmodule