aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/text.h2
-rw-r--r--src/uxn/devices/ppu.c25
3 files changed, 17 insertions, 12 deletions
diff --git a/Makefile b/Makefile
index 07b662b..89f64a2 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,7 @@ CFLAGS += -mcpu=arm7tdmi -mtune=arm7tdmi $(ARCH)
37CFLAGS += -I$(LIBGBA_SRC) 37CFLAGS += -I$(LIBGBA_SRC)
38LDFLAGS := $(ARCH) $(SPECS) 38LDFLAGS := $(ARCH) $(SPECS)
39LDLIBS := $(LIBGBA) 39LDLIBS := $(LIBGBA)
40RELEASE_CFLAGS := -DNDEBUG -O2 -g 40RELEASE_CFLAGS := -DNDEBUG -O2
41DEBUG_CFLAGS := -DDEBUG -O2 -g 41DEBUG_CFLAGS := -DDEBUG -O2 -g
42 42
43.PHONY: clean run 43.PHONY: clean run
diff --git a/src/text.h b/src/text.h
index b90c160..0b318bb 100644
--- a/src/text.h
+++ b/src/text.h
@@ -133,7 +133,7 @@ txt_putc_hybrid(char c) {
133 int y = text_engine.cursor_y; 133 int y = text_engine.cursor_y;
134 Tile *buf = text_engine.memory; 134 Tile *buf = text_engine.memory;
135 buf[x + y * 30] = tile; 135 buf[x + y * 30] = tile;
136 dirty_tiles[y][x] = 1; 136 dirty_tiles[y] |= 1 << x;
137 text_engine.cursor_x += 1; 137 text_engine.cursor_x += 1;
138 if (text_engine.cursor_x >= 30) { 138 if (text_engine.cursor_x >= 30) {
139 text_engine.cursor_x = 0; 139 text_engine.cursor_x = 0;
diff --git a/src/uxn/devices/ppu.c b/src/uxn/devices/ppu.c
index 3865e95..0935329 100644
--- a/src/uxn/devices/ppu.c
+++ b/src/uxn/devices/ppu.c
@@ -144,7 +144,7 @@ static Uint32 unpack_icon_lut_flipx[256] = {
144 144
145u32 *backbuffer_bg0; 145u32 *backbuffer_bg0;
146u32 *backbuffer_bg1; 146u32 *backbuffer_bg1;
147static u8 dirty_tiles[20][30] = {0}; 147static u32 dirty_tiles[20] = {0};
148 148
149void 149void
150putcolors(Ppu *p, Uint8 *addr) { 150putcolors(Ppu *p, Uint8 *addr) {
@@ -170,7 +170,7 @@ putpixel(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 color) {
170 Uint32 pos = (start_row + ((tile_x + tile_y * 30) * 8)); 170 Uint32 pos = (start_row + ((tile_x + tile_y * 30) * 8));
171 Uint32 shift = start_col * 4; 171 Uint32 shift = start_col * 4;
172 layer[pos] = (layer[pos] & (~(0xF << shift))) | (color << shift); 172 layer[pos] = (layer[pos] & (~(0xF << shift))) | (color << shift);
173 dirty_tiles[tile_y][tile_x] = 1; 173 dirty_tiles[tile_y] |= 1 << tile_x;
174} 174}
175 175
176void 176void
@@ -198,7 +198,7 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color,
198 for (size_t i = 0; i < 8; ++i) { 198 for (size_t i = 0; i < 8; ++i) {
199 layer_ptr[i] = lut[sprite[i ^ flipy]] * color; 199 layer_ptr[i] = lut[sprite[i ^ flipy]] * color;
200 } 200 }
201 dirty_tiles[tile_y][tile_x] = 1; 201 dirty_tiles[tile_y] |= 1 << tile_x;
202 } else { 202 } else {
203 u32 row_mask = 0xFFFFFFFF << shift_left; 203 u32 row_mask = 0xFFFFFFFF << shift_left;
204 for (size_t i = 0; i < (8 - start_row); ++i) { 204 for (size_t i = 0; i < (8 - start_row); ++i) {
@@ -214,10 +214,10 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color,
214 layer_ptr[8] = (layer_ptr[8] & row_mask) | (sprite_row >> shift_right); 214 layer_ptr[8] = (layer_ptr[8] & row_mask) | (sprite_row >> shift_right);
215 layer_ptr++; 215 layer_ptr++;
216 } 216 }
217 dirty_tiles[tile_y][tile_x] = 1; 217 dirty_tiles[tile_y] |= 1 << tile_x;
218 dirty_tiles[tile_y][tile_x + 1] = 1; 218 dirty_tiles[tile_y] |= 1 << (tile_x + 1);
219 dirty_tiles[tile_y + 1][tile_x] = 1; 219 dirty_tiles[tile_y + 1] |= 1 << tile_x;
220 dirty_tiles[tile_y + 1][tile_x + 1] = 1; 220 dirty_tiles[tile_y + 1] |= 1 << (tile_x + 1);
221 } 221 }
222} 222}
223 223
@@ -242,15 +242,20 @@ flipbuf(Ppu *p) {
242 Tile *mem_fg = &TILE_MEM[0]; 242 Tile *mem_fg = &TILE_MEM[0];
243 Tile *mem_bg = &TILE_MEM[2]; 243 Tile *mem_bg = &TILE_MEM[2];
244 for (size_t j = 0; j < 20; ++j) { 244 for (size_t j = 0; j < 20; ++j) {
245 for (size_t i = 0; i < 30; ++i) { 245 if (dirty_tiles[j] == 0) {
246 if (dirty_tiles[j][i] != 0) { 246 continue;
247 }
248
249 size_t k = 1;
250 for (size_t i = 0; i < 30; ++i, k <<= 1) {
251 if (dirty_tiles[j] & k) {
247 Tile *tile_fg = p->fg; 252 Tile *tile_fg = p->fg;
248 Tile *tile_bg = p->bg; 253 Tile *tile_bg = p->bg;
249 mem_fg[i + j * 30] = tile_fg[i + j * 30]; 254 mem_fg[i + j * 30] = tile_fg[i + j * 30];
250 mem_bg[i + j * 30] = tile_bg[i + j * 30]; 255 mem_bg[i + j * 30] = tile_bg[i + j * 30];
251 dirty_tiles[j][i] = 0;
252 } 256 }
253 } 257 }
258 dirty_tiles[j] = 0;
254 } 259 }
255} 260}
256 261