summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_scanout.sv
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-10-29 18:59:33 -0600
committerAlejandro Soto <alejandro@34project.org>2023-10-29 19:48:23 -0600
commiteed877444f9af85d6e4596853d8f188e61f6c4ed (patch)
tree53f54a96b006f4a3d0fa952292408e7d63f81a61 /rtl/gfx/gfx_scanout.sv
parentadabbf5f30729092a64fa1059bbc7d7b09d6b24e (diff)
rtl/gfx: implement scanout command interface
Diffstat (limited to 'rtl/gfx/gfx_scanout.sv')
-rw-r--r--rtl/gfx/gfx_scanout.sv19
1 files changed, 13 insertions, 6 deletions
diff --git a/rtl/gfx/gfx_scanout.sv b/rtl/gfx/gfx_scanout.sv
index 7d2346b..c549782 100644
--- a/rtl/gfx/gfx_scanout.sv
+++ b/rtl/gfx/gfx_scanout.sv
@@ -5,6 +5,7 @@ module gfx_scanout
input logic clk,
rst_n,
+ input logic enable_clear,
input rgb24 clear_color,
input logic mask,
@@ -20,7 +21,9 @@ module gfx_scanout
output logic scan_valid,
scan_endofpacket,
scan_startofpacket,
- output rgb30 scan_data
+ output rgb30 scan_data,
+
+ output logic vsync
);
logic[`GFX_SCAN_STAGES:0] fb_ready, fb_valid, src_ready, src_valid, src_pipes;
@@ -28,7 +31,7 @@ module gfx_scanout
logic[`GFX_MASK_STAGES - 1:0] request_valid;
logic[$clog2(`GFX_SCAN_STAGES) - 1:0] queued;
- logic foreground, foreground_valid, partial, put_fb_valid, put_src_valid,
+ logic effective_mask, foreground, foreground_valid, partial, put_fb_valid, put_src_valid,
queued_dec, queued_inc, read_half, read_valid, request_flush;
rgb24 fb_pipes[`GFX_SCAN_STAGES + 1], scan_pixel;
@@ -61,10 +64,11 @@ module gfx_scanout
assign read_half = request_pos[`GFX_MASK_STAGES - 1][0];
assign read_valid = request_valid[`GFX_MASK_STAGES - 1];
- assign request_flush = (fb_read && fb_waitrequest) || (src_valid[0] && !src_ready[0]) || queued == `GFX_SCAN_STAGES;
+ assign request_flush = (fb_read && fb_waitrequest) || (src_valid[0] && !src_ready[0]) || queued == `GFX_SCAN_STAGES || vsync;
- assign queued_inc = !request_flush && read_valid && read_half && mask;
+ assign queued_inc = !request_flush && read_valid && read_half && effective_mask;
assign queued_dec = fb_ready[`GFX_SCAN_STAGES - 1] && fb_valid[`GFX_SCAN_STAGES - 1];
+ assign effective_mask = mask || !enable_clear;
genvar i;
generate
@@ -109,6 +113,7 @@ module gfx_scanout
always_ff @(posedge clk or negedge rst_n)
if (!rst_n) begin
+ vsync <= 0;
queued <= 0;
read_pos <= 0;
@@ -146,12 +151,14 @@ module gfx_scanout
put_src_valid <= 0;
if (!request_flush) begin
- fb_read <= read_valid && mask;
+ fb_read <= read_valid && effective_mask;
put_src_valid <= read_valid && read_half;
if (read_valid)
commit_pos <= request_pos[`GFX_MASK_STAGES - 1];
end
+
+ vsync <= !vsync && !request_flush && read_valid && request_pos[`GFX_MASK_STAGES - 1] == {last_pos, 1'b1};
end
always_ff @(posedge clk) begin
@@ -159,7 +166,7 @@ module gfx_scanout
if (!request_flush) begin
fb_address <= request_pos[`GFX_MASK_STAGES - 1];
- src_pipes[0] <= mask;
+ src_pipes[0] <= effective_mask;
end
if (fb_readdatavalid) begin