Commit c3aaf60a authored by Sam Lantinga's avatar Sam Lantinga

Don't crash if freeing a hardware surface after the video mode has been

reset.  Fortunately we keep track of the video memory internally.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40103
parent 76b5d94d
...@@ -740,42 +740,44 @@ static void DGA_FreeHWSurface(_THIS, SDL_Surface *surface) ...@@ -740,42 +740,44 @@ static void DGA_FreeHWSurface(_THIS, SDL_Surface *surface)
vidmem_bucket *bucket, *freeable; vidmem_bucket *bucket, *freeable;
/* Look for the bucket in the current list */ /* Look for the bucket in the current list */
bucket = (vidmem_bucket *)surface->hwdata; for ( bucket=&surfaces; bucket; bucket=bucket->next ) {
if ( (bucket == NULL) || ! bucket->used ) { if ( bucket == (vidmem_bucket *)surface->hwdata ) {
return; break;
}
} }
if ( bucket && bucket->used ) {
/* Add the memory back to the total */ /* Add the memory back to the total */
#ifdef DGA_DEBUG #ifdef DGA_DEBUG
printf("Freeing bucket of %d bytes\n", bucket->size); printf("Freeing bucket of %d bytes\n", bucket->size);
#endif #endif
surfaces_memleft += bucket->size; surfaces_memleft += bucket->size;
/* Can we merge the space with surrounding buckets? */ /* Can we merge the space with surrounding buckets? */
bucket->used = 0; bucket->used = 0;
if ( bucket->next && ! bucket->next->used ) { if ( bucket->next && ! bucket->next->used ) {
#ifdef DGA_DEBUG #ifdef DGA_DEBUG
printf("Merging with next bucket, for %d total bytes\n", bucket->size+bucket->next->size); printf("Merging with next bucket, for %d total bytes\n", bucket->size+bucket->next->size);
#endif #endif
freeable = bucket->next; freeable = bucket->next;
bucket->size += bucket->next->size; bucket->size += bucket->next->size;
bucket->next = bucket->next->next; bucket->next = bucket->next->next;
if ( bucket->next ) { if ( bucket->next ) {
bucket->next->prev = bucket; bucket->next->prev = bucket;
}
free(freeable);
} }
free(freeable); if ( bucket->prev && ! bucket->prev->used ) {
}
if ( bucket->prev && ! bucket->prev->used ) {
#ifdef DGA_DEBUG #ifdef DGA_DEBUG
printf("Merging with previous bucket, for %d total bytes\n", bucket->prev->size+bucket->size); printf("Merging with previous bucket, for %d total bytes\n", bucket->prev->size+bucket->size);
#endif #endif
freeable = bucket; freeable = bucket;
bucket->prev->size += bucket->size; bucket->prev->size += bucket->size;
bucket->prev->next = bucket->next; bucket->prev->next = bucket->next;
if ( bucket->next ) { if ( bucket->next ) {
bucket->next->prev = bucket->prev; bucket->next->prev = bucket->prev;
}
free(freeable);
} }
free(freeable);
} }
surface->pixels = NULL; surface->pixels = NULL;
surface->hwdata = NULL; surface->hwdata = NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment