diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:48:55 +0200 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:48:55 +0200 |
commit | c5e76238315f07d5224949d4454658082db2a78f (patch) | |
tree | 7a41d245df0179552182c82ee568e3cf64ea4cfb | |
parent | 7158a8e7f622b90574bf4c08026d8f84f3b90bb9 (diff) |
Cache device register values driver-side
-rw-r--r-- | harddoomdev.c | 38 | ||||
-rw-r--r-- | private_data.h | 13 |
2 files changed, 44 insertions, 7 deletions
diff --git a/harddoomdev.c b/harddoomdev.c index 31e0def..1a818ea 100644 --- a/harddoomdev.c +++ b/harddoomdev.c @@ -85,17 +85,27 @@ void ping_sync(struct doom_data *doom_data) void set_surf_src_pt(struct doom_data *doom_data, dma_addr_t page_table) { - send_command(doom_data, HARDDOOM_CMD_SURF_SRC_PT(page_table)); + if (doom_data->surf_src_pt != page_table) { + doom_data->surf_src_pt = page_table; + send_command(doom_data, HARDDOOM_CMD_SURF_SRC_PT(page_table)); + } } void set_surf_dst_pt(struct doom_data *doom_data, dma_addr_t page_table) { - send_command(doom_data, HARDDOOM_CMD_SURF_DST_PT(page_table)); + if (doom_data->surf_dst_pt != page_table) { + doom_data->surf_dst_pt = page_table; + send_command(doom_data, HARDDOOM_CMD_SURF_DST_PT(page_table)); + } } void set_surf_dims(struct doom_data *doom_data, uint32_t width, uint32_t height) { - send_command(doom_data, HARDDOOM_CMD_SURF_DIMS(width, height)); + if (doom_data->surf_dims_w != width || doom_data->surf_dims_h != height) { + doom_data->surf_dims_w = width; + doom_data->surf_dims_h = height; + send_command(doom_data, HARDDOOM_CMD_SURF_DIMS(width, height)); + } } void set_xy_a(struct doom_data *doom_data, uint16_t x, uint16_t y) @@ -115,17 +125,28 @@ void set_fill_color(struct doom_data *doom_data, uint8_t color) void set_texture_pt(struct doom_data *doom_data, dma_addr_t page_table_dev) { - send_command(doom_data, HARDDOOM_CMD_TEXTURE_PT(page_table_dev)); + if (doom_data->texture_pt != page_table_dev) { + doom_data->texture_pt = page_table_dev; + send_command(doom_data, HARDDOOM_CMD_TEXTURE_PT(page_table_dev)); + } } void set_texture_dims(struct doom_data *doom_data, uint32_t size, uint16_t height) { - send_command(doom_data, HARDDOOM_CMD_TEXTURE_DIMS(size,height)); + if (doom_data->texture_dims_s != size || + doom_data->texture_dims_h != height) { + doom_data->texture_dims_s = size; + doom_data->texture_dims_h = height; + send_command(doom_data, HARDDOOM_CMD_TEXTURE_DIMS(size,height)); + } } void set_flat(struct doom_data *doom_data, dma_addr_t flat_dev) { - send_command(doom_data, HARDDOOM_CMD_FLAT_ADDR(flat_dev)); + if (doom_data->flat_addr != flat_dev) { + doom_data->flat_addr = flat_dev; + send_command(doom_data, HARDDOOM_CMD_FLAT_ADDR(flat_dev)); + } } void set_ustart(struct doom_data *doom_data, uint32_t ustart) @@ -150,7 +171,10 @@ void set_vstep(struct doom_data *doom_data, uint32_t vstep) void set_draw_params(struct doom_data *doom_data, uint8_t flags) { - send_command(doom_data, HARDDOOM_CMD_DRAW_PARAMS(flags)); + if (doom_data->draw_params != flags) { + doom_data->draw_params = flags; + send_command(doom_data, HARDDOOM_CMD_DRAW_PARAMS(flags)); + } } void fill_rect(struct surface_data *surface_data, struct doomdev_fill_rect rect) diff --git a/private_data.h b/private_data.h index fed5b60..f8f3057 100644 --- a/private_data.h +++ b/private_data.h @@ -15,6 +15,19 @@ struct doom_data { struct semaphore pong_async_sem; uint16_t cmd_counter; + + // cache of registers we don't want to modify when not neccessary + uint32_t surf_dst_pt; + uint32_t surf_src_pt; + uint32_t texture_pt; + uint32_t flat_addr; + uint32_t colormap_addr; + uint32_t translation_addr; + uint32_t surf_dims_w; + uint32_t surf_dims_h; + uint32_t texture_dims_s; + uint32_t texture_dims_h; + uint32_t draw_params; }; struct surface_data { |