VIDEO: Fix vid_draw to copy drawing data before returning when drawing is deferred.

Using SDL2 the draw operations are performed in a separate thread and thus the data must be cached while the request is passed to the separate thread while control returns to the caller.
This commit is contained in:
Mark Pizzolato 2015-09-20 13:38:11 -07:00
parent 324839cee9
commit 13bb3356f5

View file

@ -389,6 +389,7 @@ for (i = 0; i < h; i++)
#else #else
SDL_Event user_event; SDL_Event user_event;
SDL_Rect *vid_dst; SDL_Rect *vid_dst;
uint32 *vid_data;
sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_draw(%d, %d, %d, %d)\n", x, y, w, h); sim_debug (SIM_VID_DBG_VIDEO, vid_dev, "vid_draw(%d, %d, %d, %d)\n", x, y, w, h);
@ -397,11 +398,17 @@ vid_dst->x = x;
vid_dst->y = y; vid_dst->y = y;
vid_dst->w = w; vid_dst->w = w;
vid_dst->h = h; vid_dst->h = h;
vid_data = (uint32 *)malloc (w*h*sizeof(*buf));
memcpy (vid_data, buf, w*h*sizeof(*buf));
user_event.type = SDL_USEREVENT; user_event.type = SDL_USEREVENT;
user_event.user.code = EVENT_DRAW; user_event.user.code = EVENT_DRAW;
user_event.user.data1 = (void *)vid_dst; user_event.user.data1 = (void *)vid_dst;
user_event.user.data2 = (void *)buf; user_event.user.data2 = (void *)vid_data;
SDL_PushEvent (&user_event); if (SDL_PushEvent (&user_event) < 0) {
sim_printf ("%s: vid_draw() SDL_PushEvent error: %s\n", sim_dname(vid_dev), SDL_GetError());
free (vid_dst);
free (vid_data);
}
#endif #endif
} }
@ -432,8 +439,10 @@ user_event.user.code = EVENT_CURSOR;
user_event.user.data1 = cursor; user_event.user.data1 = cursor;
user_event.user.data2 = (void *)((size_t)visible); user_event.user.data2 = (void *)((size_t)visible);
if (SDL_PushEvent (&user_event) < 0) if (SDL_PushEvent (&user_event) < 0) {
sim_printf ("%s: vid_set_cursor() SDL_PushEvent error: %s\n", sim_dname(vid_dev), SDL_GetError()); sim_printf ("%s: vid_set_cursor() SDL_PushEvent error: %s\n", sim_dname(vid_dev), SDL_GetError());
SDL_FreeCursor (cursor);
}
return SCPE_OK; return SCPE_OK;
} }
@ -1146,6 +1155,7 @@ if (SDL_UpdateTexture(vid_texture, vid_dst, buf, vid_dst->w*sizeof(*buf)))
sim_printf ("%s: vid_draw() - SDL_UpdateTexture error: %s\n", sim_dname(vid_dev), SDL_GetError()); sim_printf ("%s: vid_draw() - SDL_UpdateTexture error: %s\n", sim_dname(vid_dev), SDL_GetError());
free (vid_dst); free (vid_dst);
free (buf);
event->data1 = NULL; event->data1 = NULL;
} }
#endif #endif