mirror of https://github.com/mgba-emu/mgba.git
Start porting sw-main to SDL2
This commit is contained in:
parent
82f3a45888
commit
7e90eb2631
|
@ -22,6 +22,13 @@ struct SoftwareRenderer {
|
||||||
struct GBAVideoSoftwareRenderer d;
|
struct GBAVideoSoftwareRenderer d;
|
||||||
struct GBASDLAudio audio;
|
struct GBASDLAudio audio;
|
||||||
struct GBASDLEvents events;
|
struct GBASDLEvents events;
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_Window* window;
|
||||||
|
SDL_Texture* tex;
|
||||||
|
SDL_Renderer* sdlRenderer;
|
||||||
|
int viewportWidth;
|
||||||
|
int viewportHeight;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static int _GBASDLInit(struct SoftwareRenderer* renderer);
|
static int _GBASDLInit(struct SoftwareRenderer* renderer);
|
||||||
|
@ -57,6 +64,31 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
GBAMapOptionsToContext(&opts, &context);
|
GBAMapOptionsToContext(&opts, &context);
|
||||||
|
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
renderer.viewportWidth = opts.width;
|
||||||
|
renderer.viewportHeight = opts.height;
|
||||||
|
renderer.window = SDL_CreateWindow("GBAc", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, renderer.viewportWidth, renderer.viewportHeight, SDL_WINDOW_OPENGL | (SDL_WINDOW_FULLSCREEN_DESKTOP * renderer.events.fullscreen));
|
||||||
|
SDL_GetWindowSize(renderer.window, &renderer.viewportWidth, &renderer.viewportHeight);
|
||||||
|
renderer.events.window = renderer.window;
|
||||||
|
renderer.events.fullscreen = 0;
|
||||||
|
renderer.sdlRenderer = SDL_CreateRenderer(renderer.window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
||||||
|
#ifdef COLOR_16_BIT
|
||||||
|
#ifdef COLOR_5_6_5
|
||||||
|
renderer.tex = SDL_CreateTexture(renderer.sdlRenderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
|
||||||
|
#else
|
||||||
|
renderer.tex = SDL_CreateTexture(renderer.sdlRenderer, SDL_PIXELFORMAT_ABGR1555, SDL_TEXTUREACCESS_STREAMING, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
renderer.tex = SDL_CreateTexture(renderer.sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SDL_LockTexture(renderer.tex, 0, &renderer.d.outputBuffer, &renderer.d.outputBufferStride);
|
||||||
|
#ifdef COLOR_16_BIT
|
||||||
|
renderer.d.outputBufferStride /= 2;
|
||||||
|
#else
|
||||||
|
renderer.d.outputBufferStride /= 4;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
SDL_Surface* surface = SDL_GetVideoSurface();
|
SDL_Surface* surface = SDL_GetVideoSurface();
|
||||||
SDL_LockSurface(surface);
|
SDL_LockSurface(surface);
|
||||||
renderer.d.outputBuffer = surface->pixels;
|
renderer.d.outputBuffer = surface->pixels;
|
||||||
|
@ -64,13 +96,16 @@ int main(int argc, char** argv) {
|
||||||
renderer.d.outputBufferStride = surface->pitch / 2;
|
renderer.d.outputBufferStride = surface->pitch / 2;
|
||||||
#else
|
#else
|
||||||
renderer.d.outputBufferStride = surface->pitch / 4;
|
renderer.d.outputBufferStride = surface->pitch / 4;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GBAThreadStart(&context);
|
GBAThreadStart(&context);
|
||||||
|
|
||||||
_GBASDLRunloop(&context, &renderer);
|
_GBASDLRunloop(&context, &renderer);
|
||||||
|
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
SDL_UnlockSurface(surface);
|
SDL_UnlockSurface(surface);
|
||||||
|
#endif
|
||||||
GBAThreadJoin(&context);
|
GBAThreadJoin(&context);
|
||||||
close(opts.fd);
|
close(opts.fd);
|
||||||
if (opts.biosFd >= 0) {
|
if (opts.biosFd >= 0) {
|
||||||
|
@ -91,10 +126,12 @@ static int _GBASDLInit(struct SoftwareRenderer* renderer) {
|
||||||
GBASDLInitEvents(&renderer->events);
|
GBASDLInitEvents(&renderer->events);
|
||||||
GBASDLInitAudio(&renderer->audio);
|
GBASDLInitAudio(&renderer->audio);
|
||||||
|
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
#ifdef COLOR_16_BIT
|
#ifdef COLOR_16_BIT
|
||||||
SDL_SetVideoMode(240, 160, 16, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
SDL_SetVideoMode(240, 160, 16, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
||||||
#else
|
#else
|
||||||
SDL_SetVideoMode(240, 160, 32, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
SDL_SetVideoMode(240, 160, 32, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -102,13 +139,27 @@ static int _GBASDLInit(struct SoftwareRenderer* renderer) {
|
||||||
|
|
||||||
static void _GBASDLRunloop(struct GBAThread* context, struct SoftwareRenderer* renderer) {
|
static void _GBASDLRunloop(struct GBAThread* context, struct SoftwareRenderer* renderer) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
SDL_Surface* surface = SDL_GetVideoSurface();
|
SDL_Surface* surface = SDL_GetVideoSurface();
|
||||||
|
#endif
|
||||||
|
|
||||||
while (context->state < THREAD_EXITING) {
|
while (context->state < THREAD_EXITING) {
|
||||||
if (GBASyncWaitFrameStart(&context->sync, context->frameskip)) {
|
if (GBASyncWaitFrameStart(&context->sync, context->frameskip)) {
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_UnlockTexture(renderer->tex);
|
||||||
|
SDL_RenderCopy(renderer->sdlRenderer, renderer->tex, 0, 0);
|
||||||
|
SDL_RenderPresent(renderer->sdlRenderer);
|
||||||
|
SDL_LockTexture(renderer->tex, 0, &renderer->d.outputBuffer, &renderer->d.outputBufferStride);
|
||||||
|
#ifdef COLOR_16_BIT
|
||||||
|
renderer->d.outputBufferStride /= 2;
|
||||||
|
#else
|
||||||
|
renderer->d.outputBufferStride /= 4;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
SDL_UnlockSurface(surface);
|
SDL_UnlockSurface(surface);
|
||||||
SDL_Flip(surface);
|
SDL_Flip(surface);
|
||||||
SDL_LockSurface(surface);
|
SDL_LockSurface(surface);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
GBASyncWaitFrameEnd(&context->sync);
|
GBASyncWaitFrameEnd(&context->sync);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue