summaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rtl/gfx/gfx_cmd.sv60
-rw-r--r--rtl/gfx/gfx_defs.sv5
2 files changed, 50 insertions, 15 deletions
diff --git a/rtl/gfx/gfx_cmd.sv b/rtl/gfx/gfx_cmd.sv
index 28fd4b1..40e2ccb 100644
--- a/rtl/gfx/gfx_cmd.sv
+++ b/rtl/gfx/gfx_cmd.sv
@@ -16,9 +16,16 @@ module gfx_cmd
output logic swap_buffers,
enable_clear,
start_clear,
- output rgb24 clear_color
+ output rgb24 clear_color,
+
+ output logic program_start,
+ output cmd_word program_header_base,
+ program_header_size
);
+ rgb24 next_clear_color;
+ logic do_start_clear, next_start_clear, next_enable_clear, next_swap_buffers;
+
struct packed
{
logic[4:0] mbz;
@@ -28,17 +35,15 @@ module gfx_cmd
rgb24 clear_color;
} readdata_scan, writedata_scan;
- assign readdata_scan.clear_color = clear_color;
+ assign cmd_readdata = readdata_scan;
+
+ assign writedata_scan = cmd_writedata;
assign readdata_scan.mbz = 0;
+ assign readdata_scan.clear_color = clear_color;
assign readdata_scan.enable_clear = enable_clear;
assign readdata_scan.swap_buffers = swap_buffers;
- assign writedata_scan = cmd_writedata;
-
- assign cmd_readdata = readdata_scan;
-
- rgb24 next_clear_color;
- logic next_start_clear, next_enable_clear, next_swap_buffers;
+ assign do_start_clear = writedata_scan.start_frame && writedata_scan.enable_clear;
always_ff @(posedge clk or negedge rst_n)
if (!rst_n) begin
@@ -49,21 +54,35 @@ module gfx_cmd
next_start_clear <= 0;
next_enable_clear <= 0;
next_swap_buffers <= 0;
+
+ program_start <= 0;
end else begin
start_clear <= 0;
+ program_start <= 0;
+
if (vsync) begin
start_clear <= next_start_clear;
enable_clear <= next_enable_clear;
swap_buffers <= next_swap_buffers;
end
- if (cmd_write) begin
- next_enable_clear <= writedata_scan.enable_clear;
- next_swap_buffers <= writedata_scan.swap_buffers;
+ if (cmd_write)
+ unique case (cmd_address[1:0])
+ `GFX_CMD_REG_ID: ;
- if (!next_start_clear)
- next_start_clear <= writedata_scan.start_frame && writedata_scan.enable_clear;
- end
+ `GFX_CMD_REG_SCAN: begin
+ next_enable_clear <= writedata_scan.enable_clear;
+ next_swap_buffers <= writedata_scan.swap_buffers;
+
+ if (!next_start_clear)
+ next_start_clear <= do_start_clear;
+ end
+
+ `GFX_CMD_REG_HEADER_BASE: ;
+
+ `GFX_CMD_REG_HEADER_SIZE:
+ program_start <= 1;
+ endcase
end
always_ff @(posedge clk) begin
@@ -71,7 +90,18 @@ module gfx_cmd
clear_color <= next_clear_color;
if (cmd_write)
- next_clear_color <= writedata_scan.clear_color;
+ unique case (cmd_address[1:0])
+ `GFX_CMD_REG_ID: ;
+
+ `GFX_CMD_REG_SCAN:
+ next_clear_color <= writedata_scan.clear_color;
+
+ `GFX_CMD_REG_HEADER_BASE:
+ program_header_base <= cmd_writedata;
+
+ `GFX_CMD_REG_HEADER_SIZE:
+ program_header_size <= cmd_writedata;
+ endcase
end
endmodule
diff --git a/rtl/gfx/gfx_defs.sv b/rtl/gfx/gfx_defs.sv
index 20102a4..fa297e6 100644
--- a/rtl/gfx/gfx_defs.sv
+++ b/rtl/gfx/gfx_defs.sv
@@ -188,6 +188,11 @@ typedef logic[`GFX_LANE_ADDR_BITS - 1:0] vram_lane_addr;
typedef logic[5:0] cmd_addr;
typedef logic[31:0] cmd_word;
+`define GFX_CMD_REG_ID 2'b00
+`define GFX_CMD_REG_SCAN 2'b01
+`define GFX_CMD_REG_HEADER_BASE 2'b10
+`define GFX_CMD_REG_HEADER_SIZE 2'b11
+
typedef struct packed
{
logic[$bits(cmd_word) - $bits(vram_insn_addr) - `GFX_INSN_SUBWORD_BITS - 1:0] pad;