mirror of https://github.com/mgba-emu/mgba.git
GB Video: Fix memory leak when reseting SGB games
This commit is contained in:
parent
37c4e08ba5
commit
9d3b4459ee
1
CHANGES
1
CHANGES
|
@ -15,6 +15,7 @@ Emulation fixes:
|
||||||
- GBA SIO: Fix SI value for unattached MULTI mode
|
- GBA SIO: Fix SI value for unattached MULTI mode
|
||||||
Other fixes:
|
Other fixes:
|
||||||
- Core: Don't attempt to restore rewind diffs past start of rewind
|
- Core: Don't attempt to restore rewind diffs past start of rewind
|
||||||
|
- GB Video: Fix memory leak when reseting SGB games
|
||||||
- GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB
|
- GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB
|
||||||
Misc:
|
Misc:
|
||||||
- Core: Suspend runloop when a core crashes
|
- Core: Suspend runloop when a core crashes
|
||||||
|
|
|
@ -87,20 +87,53 @@ void GBVideoReset(struct GBVideo* video) {
|
||||||
memset(&video->palette, 0, sizeof(video->palette));
|
memset(&video->palette, 0, sizeof(video->palette));
|
||||||
|
|
||||||
if (video->p->model & GB_MODEL_SGB) {
|
if (video->p->model & GB_MODEL_SGB) {
|
||||||
video->renderer->sgbCharRam = anonymousMemoryMap(SGB_SIZE_CHAR_RAM);
|
if (video->renderer->sgbCharRam) {
|
||||||
video->renderer->sgbMapRam = anonymousMemoryMap(SGB_SIZE_MAP_RAM);
|
memset(video->renderer->sgbCharRam, 0, SGB_SIZE_CHAR_RAM);
|
||||||
video->renderer->sgbPalRam = anonymousMemoryMap(SGB_SIZE_PAL_RAM);
|
} else {
|
||||||
video->renderer->sgbAttributeFiles = anonymousMemoryMap(SGB_SIZE_ATF_RAM);
|
video->renderer->sgbCharRam = anonymousMemoryMap(SGB_SIZE_CHAR_RAM);
|
||||||
video->renderer->sgbAttributes = malloc(90 * 45);
|
}
|
||||||
|
if (video->renderer->sgbMapRam) {
|
||||||
|
memset(video->renderer->sgbMapRam, 0, SGB_SIZE_MAP_RAM);
|
||||||
|
} else {
|
||||||
|
video->renderer->sgbMapRam = anonymousMemoryMap(SGB_SIZE_MAP_RAM);
|
||||||
|
}
|
||||||
|
if (video->renderer->sgbPalRam) {
|
||||||
|
memset(video->renderer->sgbPalRam, 0, SGB_SIZE_PAL_RAM);
|
||||||
|
} else {
|
||||||
|
video->renderer->sgbPalRam = anonymousMemoryMap(SGB_SIZE_PAL_RAM);
|
||||||
|
}
|
||||||
|
if (video->renderer->sgbAttributeFiles) {
|
||||||
|
memset(video->renderer->sgbAttributeFiles, 0, SGB_SIZE_ATF_RAM);
|
||||||
|
} else {
|
||||||
|
video->renderer->sgbAttributeFiles = anonymousMemoryMap(SGB_SIZE_ATF_RAM);
|
||||||
|
}
|
||||||
|
if (!video->renderer->sgbAttributes) {
|
||||||
|
video->renderer->sgbAttributes = malloc(90 * 45);
|
||||||
|
}
|
||||||
memset(video->renderer->sgbAttributes, 0, 90 * 45);
|
memset(video->renderer->sgbAttributes, 0, 90 * 45);
|
||||||
video->sgbCommandHeader = 0;
|
video->sgbCommandHeader = 0;
|
||||||
video->sgbBufferIndex = 0;
|
video->sgbBufferIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
video->renderer->sgbCharRam = NULL;
|
if (video->renderer->sgbCharRam) {
|
||||||
video->renderer->sgbMapRam = NULL;
|
mappedMemoryFree(video->renderer->sgbCharRam, SGB_SIZE_CHAR_RAM);
|
||||||
video->renderer->sgbPalRam = NULL;
|
video->renderer->sgbCharRam = NULL;
|
||||||
video->renderer->sgbAttributes = NULL;
|
}
|
||||||
video->renderer->sgbAttributeFiles = NULL;
|
if (video->renderer->sgbMapRam) {
|
||||||
|
mappedMemoryFree(video->renderer->sgbMapRam, SGB_SIZE_MAP_RAM);
|
||||||
|
video->renderer->sgbMapRam = NULL;
|
||||||
|
}
|
||||||
|
if (video->renderer->sgbPalRam) {
|
||||||
|
mappedMemoryFree(video->renderer->sgbPalRam, SGB_SIZE_PAL_RAM);
|
||||||
|
video->renderer->sgbPalRam = NULL;
|
||||||
|
}
|
||||||
|
if (video->renderer->sgbAttributeFiles) {
|
||||||
|
mappedMemoryFree(video->renderer->sgbAttributeFiles, SGB_SIZE_ATF_RAM);
|
||||||
|
video->renderer->sgbAttributeFiles = NULL;
|
||||||
|
}
|
||||||
|
if (video->renderer->sgbAttributes) {
|
||||||
|
free(video->renderer->sgbAttributes);
|
||||||
|
video->renderer->sgbAttributes = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
video->palette[0] = video->dmgPalette[0];
|
video->palette[0] = video->dmgPalette[0];
|
||||||
|
|
Loading…
Reference in New Issue