fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

macplus: Track writes to video memory, only draw when dirty

When we're idle and nothing is happening on screen, we can save some
host CPU by not having to constantly iterate through the video
memory buffer and send it through SDL just to redraw the same thing
over and over.

+48
+22
src/arch/macplus/macplus.c
··· 258 258 } 259 259 260 260 static 261 + void mac_ram_write (void *ext, uint32_t addr, unsigned size) 262 + { 263 + macplus_t *sim = ext; 264 + 265 + if (sim->video == NULL) { 266 + return; 267 + } 268 + 269 + if ((addr + size) > sim->video->vbuf_addr && 270 + addr < (sim->video->vbuf_addr + sim->video->vbuf_size)) { 271 + mac_video_set_dirty (sim->video); 272 + } 273 + } 274 + 275 + static 261 276 void mac_set_vbuf (macplus_t *sim, unsigned long addr) 262 277 { 263 278 unsigned char *vbuf; 279 + unsigned long vbuf_size; 264 280 mem_blk_t *blk; 281 + 282 + vbuf_size = ((unsigned long)(sim->video->w + 7) / 8) * sim->video->h; 265 283 266 284 if (addr < mem_blk_get_size (sim->ram)) { 267 285 vbuf = mem_blk_get_data (sim->ram) + addr; ··· 271 289 272 290 if (blk == NULL) { 273 291 mac_video_set_vbuf (sim->video, NULL); 292 + mac_video_set_vbuf_addr (sim->video, 0, 0); 274 293 return; 275 294 } 276 295 ··· 279 298 } 280 299 281 300 mac_video_set_vbuf (sim->video, vbuf); 301 + mac_video_set_vbuf_addr (sim->video, addr, vbuf_size); 282 302 } 283 303 284 304 static ··· 1394 1414 mac_setup_sound (sim, ini); 1395 1415 mac_setup_terminal (sim, ini); 1396 1416 mac_setup_video (sim, ini); 1417 + 1418 + e68_set_ram_write_fct (sim->cpu, sim, mac_ram_write); 1397 1419 1398 1420 pce_load_mem_ini (sim->mem, ini); 1399 1421
+20
src/arch/macplus/video.c
··· 33 33 int mac_video_init (mac_video_t *mv, unsigned w, unsigned h) 34 34 { 35 35 mv->vbuf = NULL; 36 + mv->vbuf_addr = 0; 37 + mv->vbuf_size = 0; 38 + mv->dirty = 1; 36 39 mv->trm = NULL; 37 40 38 41 mv->w = w; ··· 121 124 mv->vbuf = vbuf; 122 125 } 123 126 127 + void mac_video_set_vbuf_addr (mac_video_t *mv, unsigned long addr, unsigned long size) 128 + { 129 + mv->vbuf_addr = addr; 130 + mv->vbuf_size = size; 131 + mv->dirty = 1; 132 + } 133 + 134 + void mac_video_set_dirty (mac_video_t *mv) 135 + { 136 + mv->dirty = 1; 137 + } 138 + 124 139 void mac_video_set_terminal (mac_video_t *mv, terminal_t *trm) 125 140 { 126 141 mv->trm = trm; ··· 186 201 return; 187 202 } 188 203 204 + if (!mv->dirty && !mv->force) { 205 + return; 206 + } 207 + 189 208 for (i = 0; i < 3; i++) { 190 209 col0[i] = (mv->brightness * mv->col0[i]) / 255; 191 210 col1[i] = (mv->brightness * mv->col1[i]) / 255; ··· 236 255 } 237 256 238 257 mv->force = 0; 258 + mv->dirty = 0; 239 259 240 260 trm_update (mv->trm); 241 261 }
+6
src/arch/macplus/video.h
··· 30 30 typedef struct { 31 31 const unsigned char *vbuf; 32 32 33 + unsigned long vbuf_addr; 34 + unsigned long vbuf_size; 35 + char dirty; 36 + 33 37 unsigned w; 34 38 unsigned h; 35 39 ··· 69 73 void mac_video_set_vbi_fct (mac_video_t *mv, void *ext, void *fct); 70 74 71 75 void mac_video_set_vbuf (mac_video_t *mv, const unsigned char *vbuf); 76 + void mac_video_set_vbuf_addr (mac_video_t *mv, unsigned long addr, unsigned long size); 77 + void mac_video_set_dirty (mac_video_t *mv); 72 78 void mac_video_set_terminal (mac_video_t *mv, terminal_t *trm); 73 79 74 80 /*****************************************************************************