mirror of https://github.com/mgba-emu/mgba.git
SDL: Merge egl-main
This commit is contained in:
parent
d5b8fdf81c
commit
25f5520b0b
|
@ -26,16 +26,18 @@ file(GLOB PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/sdl-*.c)
|
||||||
set(PLATFORM_LIBRARY ${SDL_LIBRARY} ${SDLMAIN_LIBRARY})
|
set(PLATFORM_LIBRARY ${SDL_LIBRARY} ${SDLMAIN_LIBRARY})
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/src/platform/sdl ${SDL_INCLUDE_DIR})
|
include_directories(${CMAKE_SOURCE_DIR}/src/platform/sdl ${SDL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
set(MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/main.c)
|
||||||
|
|
||||||
if(BUILD_RASPI)
|
if(BUILD_RASPI)
|
||||||
add_definitions(-DBUILD_RASPI)
|
add_definitions(-DBUILD_RASPI)
|
||||||
set(EGL_MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/egl-main.c)
|
set(EGL_MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/egl-sdl.c)
|
||||||
set(EGL_LIBRARY "-lEGL -lGLESv2 -lbcm_host")
|
set(EGL_LIBRARY "-lEGL -lGLESv2 -lbcm_host")
|
||||||
add_executable(${BINARY_NAME}-rpi ${PLATFORM_SRC} ${EGL_MAIN_SRC})
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fgnu89-inline")
|
||||||
|
add_executable(${BINARY_NAME}-rpi ${PLATFORM_SRC} ${MAIN_SRC} ${EGL_MAIN_SRC})
|
||||||
target_link_libraries(${BINARY_NAME}-rpi ${BINARY_NAME} ${PLATFORM_LIBRARY} ${EGL_LIBRARY})
|
target_link_libraries(${BINARY_NAME}-rpi ${BINARY_NAME} ${PLATFORM_LIBRARY} ${EGL_LIBRARY})
|
||||||
install(TARGETS ${BINARY_NAME}-rpi DESTINATION bin)
|
install(TARGETS ${BINARY_NAME}-rpi DESTINATION bin)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/main.c)
|
|
||||||
if(BUILD_BBB OR BUILD_RASPI OR NOT BUILD_GL)
|
if(BUILD_BBB OR BUILD_RASPI OR NOT BUILD_GL)
|
||||||
list(APPEND MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/sw-sdl.c)
|
list(APPEND MAIN_SRC ${CMAKE_SOURCE_DIR}/src/platform/sdl/sw-sdl.c)
|
||||||
else()
|
else()
|
||||||
|
|
|
@ -1,39 +1,4 @@
|
||||||
#include "debugger/debugger.h"
|
#include "main.h"
|
||||||
#include "gba-thread.h"
|
|
||||||
#include "gba.h"
|
|
||||||
#include "renderers/video-software.h"
|
|
||||||
#include "sdl-audio.h"
|
|
||||||
#include "sdl-events.h"
|
|
||||||
|
|
||||||
#include <SDL/SDL.h>
|
|
||||||
#include <GLES2/gl2.h>
|
|
||||||
#include <EGL/egl.h>
|
|
||||||
|
|
||||||
#include <bcm_host.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
struct GBAVideoEGLRenderer {
|
|
||||||
struct GBAVideoSoftwareRenderer d;
|
|
||||||
struct GBASDLAudio audio;
|
|
||||||
struct GBASDLEvents events;
|
|
||||||
|
|
||||||
EGLDisplay display;
|
|
||||||
EGLSurface surface;
|
|
||||||
EGLContext context;
|
|
||||||
EGL_DISPMANX_WINDOW_T window;
|
|
||||||
GLuint tex;
|
|
||||||
GLuint fragmentShader;
|
|
||||||
GLuint vertexShader;
|
|
||||||
GLuint program;
|
|
||||||
GLuint bufferObject;
|
|
||||||
GLuint texLocation;
|
|
||||||
GLuint positionLocation;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* _vertexShader =
|
static const char* _vertexShader =
|
||||||
"attribute vec4 position;\n"
|
"attribute vec4 position;\n"
|
||||||
|
@ -61,75 +26,18 @@ static const GLfloat _vertices[] = {
|
||||||
1.f, -1.f,
|
1.f, -1.f,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int _GBAEGLInit(struct GBAVideoEGLRenderer* renderer);
|
bool GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
static void _GBAEGLDeinit(struct GBAVideoEGLRenderer* renderer);
|
|
||||||
static void _GBAEGLRunloop(struct GBAThread* context, struct GBAVideoEGLRenderer* renderer);
|
|
||||||
static void _GBASDLStart(struct GBAThread* context);
|
|
||||||
static void _GBASDLClean(struct GBAThread* context);
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
struct GBAVideoEGLRenderer renderer;
|
|
||||||
|
|
||||||
struct StartupOptions opts;
|
|
||||||
if (!parseCommandArgs(&opts, argc, argv, 0)) {
|
|
||||||
usage(argv[0], 0);
|
|
||||||
freeOptions(&opts);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_GBAEGLInit(&renderer)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
GBAVideoSoftwareRendererCreate(&renderer.d);
|
|
||||||
|
|
||||||
struct GBAThread context = {
|
|
||||||
.renderer = &renderer.d.d,
|
|
||||||
.sync.videoFrameWait = 0,
|
|
||||||
.sync.audioWait = 1,
|
|
||||||
.startCallback = _GBASDLStart,
|
|
||||||
.cleanCallback = _GBASDLClean,
|
|
||||||
.userData = &renderer
|
|
||||||
};
|
|
||||||
|
|
||||||
context.debugger = createDebugger(&opts);
|
|
||||||
|
|
||||||
GBAMapOptionsToContext(&opts, &context);
|
|
||||||
|
|
||||||
renderer.audio.samples = context.audioBuffers;
|
|
||||||
GBASDLInitAudio(&renderer.audio);
|
|
||||||
|
|
||||||
renderer.events.bindings = &context.inputMap;
|
|
||||||
GBASDLInitEvents(&renderer.events);
|
|
||||||
|
|
||||||
GBAThreadStart(&context);
|
|
||||||
|
|
||||||
_GBAEGLRunloop(&context, &renderer);
|
|
||||||
|
|
||||||
GBAThreadJoin(&context);
|
|
||||||
freeOptions(&opts);
|
|
||||||
free(context.debugger);
|
|
||||||
|
|
||||||
_GBAEGLDeinit(&renderer);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _GBAEGLInit(struct GBAVideoEGLRenderer* renderer) {
|
|
||||||
if (SDL_Init(SDL_INIT_JOYSTICK) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bcm_host_init();
|
bcm_host_init();
|
||||||
renderer->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
renderer->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||||
int major, minor;
|
int major, minor;
|
||||||
if (EGL_FALSE == eglInitialize(renderer->display, &major, &minor)) {
|
if (EGL_FALSE == eglInitialize(renderer->display, &major, &minor)) {
|
||||||
printf("Failed to initialize EGL");
|
printf("Failed to initialize EGL");
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EGL_FALSE == eglBindAPI(EGL_OPENGL_ES_API)) {
|
if (EGL_FALSE == eglBindAPI(EGL_OPENGL_ES_API)) {
|
||||||
printf("Failed to get GLES API");
|
printf("Failed to get GLES API");
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EGLint requestConfig[] = {
|
const EGLint requestConfig[] = {
|
||||||
|
@ -146,7 +54,7 @@ static int _GBAEGLInit(struct GBAVideoEGLRenderer* renderer) {
|
||||||
|
|
||||||
if (EGL_FALSE == eglChooseConfig(renderer->display, requestConfig, &config, 1, &numConfigs)) {
|
if (EGL_FALSE == eglChooseConfig(renderer->display, requestConfig, &config, 1, &numConfigs)) {
|
||||||
printf("Failed to choose EGL config\n");
|
printf("Failed to choose EGL config\n");
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const EGLint contextAttributes[] = {
|
const EGLint contextAttributes[] = {
|
||||||
|
@ -185,7 +93,7 @@ static int _GBAEGLInit(struct GBAVideoEGLRenderer* renderer) {
|
||||||
|
|
||||||
renderer->surface = eglCreateWindowSurface(renderer->display, config, &renderer->window, 0);
|
renderer->surface = eglCreateWindowSurface(renderer->display, config, &renderer->window, 0);
|
||||||
if (EGL_FALSE == eglMakeCurrent(renderer->display, renderer->surface, renderer->surface, renderer->context)) {
|
if (EGL_FALSE == eglMakeCurrent(renderer->display, renderer->surface, renderer->surface, renderer->context)) {
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->d.outputBuffer = memalign(16, 256 * 256 * 4);
|
renderer->d.outputBuffer = memalign(16, 256 * 256 * 4);
|
||||||
|
@ -216,10 +124,9 @@ static int _GBAEGLInit(struct GBAVideoEGLRenderer* renderer) {
|
||||||
renderer->texLocation = glGetUniformLocation(renderer->program, "tex");
|
renderer->texLocation = glGetUniformLocation(renderer->program, "tex");
|
||||||
renderer->positionLocation = glGetAttribLocation(renderer->program, "position");
|
renderer->positionLocation = glGetAttribLocation(renderer->program, "position");
|
||||||
glClearColor(1.f, 0.f, 0.f, 1.f);
|
glClearColor(1.f, 0.f, 0.f, 1.f);
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBAEGLRunloop(struct GBAThread* context, struct GBAVideoEGLRenderer* renderer) {
|
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
||||||
while (context->state < THREAD_EXITING) {
|
while (context->state < THREAD_EXITING) {
|
||||||
|
@ -245,26 +152,10 @@ static void _GBAEGLRunloop(struct GBAThread* context, struct GBAVideoEGLRenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBAEGLDeinit(struct GBAVideoEGLRenderer* renderer) {
|
void GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
||||||
eglMakeCurrent(renderer->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
eglMakeCurrent(renderer->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
eglDestroySurface(renderer->display, renderer->surface);
|
eglDestroySurface(renderer->display, renderer->surface);
|
||||||
eglDestroyContext(renderer->display, renderer->context);
|
eglDestroyContext(renderer->display, renderer->context);
|
||||||
eglTerminate(renderer->display);
|
eglTerminate(renderer->display);
|
||||||
|
|
||||||
GBASDLDeinitEvents(&renderer->events);
|
|
||||||
GBASDLDeinitAudio(&renderer->audio);
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
bcm_host_deinit();
|
bcm_host_deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLStart(struct GBAThread* threadContext) {
|
|
||||||
struct GBAVideoEGLRenderer* renderer = threadContext->userData;
|
|
||||||
renderer->audio.audio = &threadContext->gba->audio;
|
|
||||||
renderer->audio.thread = threadContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _GBASDLClean(struct GBAThread* threadContext) {
|
|
||||||
struct GBAVideoEGLRenderer* renderer = threadContext->userData;
|
|
||||||
renderer->audio.audio = 0;
|
|
||||||
}
|
|
|
@ -24,7 +24,7 @@ static const GLint _glTexCoords[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
bool GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
#ifndef COLOR_16_BIT
|
#ifndef COLOR_16_BIT
|
||||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
||||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
||||||
|
@ -67,6 +67,8 @@ void GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glViewport(0, 0, renderer->viewportWidth, renderer->viewportHeight);
|
glViewport(0, 0, renderer->viewportWidth, renderer->viewportHeight);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer) {
|
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer) {
|
||||||
|
@ -117,3 +119,7 @@ void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* render
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
||||||
|
UNUSED(renderer);
|
||||||
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#define PORT "sdl"
|
#define PORT "sdl"
|
||||||
|
|
||||||
static int _GBASDLInit(struct SDLSoftwareRenderer* renderer);
|
static bool _GBASDLInit(struct SDLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLDeinit(struct SDLSoftwareRenderer* renderer);
|
static void _GBASDLDeinit(struct SDLSoftwareRenderer* renderer);
|
||||||
static void _GBASDLStart(struct GBAThread* context);
|
static void _GBASDLStart(struct GBAThread* context);
|
||||||
static void _GBASDLClean(struct GBAThread* context);
|
static void _GBASDLClean(struct GBAThread* context);
|
||||||
|
@ -107,14 +107,12 @@ int main(int argc, char** argv) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
static bool _GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||||
return 0;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
GBASDLInit(renderer);
|
return GBASDLInit(renderer);
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
static void _GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
||||||
|
@ -125,7 +123,11 @@ static void _GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
||||||
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
SDL_DestroyWindow(renderer->window);
|
SDL_DestroyWindow(renderer->window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GBASDLDeinit(renderer);
|
||||||
|
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBASDLStart(struct GBAThread* threadContext) {
|
static void _GBASDLStart(struct GBAThread* threadContext) {
|
||||||
|
|
|
@ -14,6 +14,18 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BUILD_RASPI
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
|
#include <bcm_host.h>
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
struct SDLSoftwareRenderer {
|
struct SDLSoftwareRenderer {
|
||||||
struct GBAVideoSoftwareRenderer d;
|
struct GBAVideoSoftwareRenderer d;
|
||||||
struct GBASDLAudio audio;
|
struct GBASDLAudio audio;
|
||||||
|
@ -34,9 +46,24 @@ struct SDLSoftwareRenderer {
|
||||||
#ifdef BUILD_GL
|
#ifdef BUILD_GL
|
||||||
GLuint tex;
|
GLuint tex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BUILD_RASPI
|
||||||
|
EGLDisplay display;
|
||||||
|
EGLSurface surface;
|
||||||
|
EGLContext context;
|
||||||
|
EGL_DISPMANX_WINDOW_T window;
|
||||||
|
GLuint tex;
|
||||||
|
GLuint fragmentShader;
|
||||||
|
GLuint vertexShader;
|
||||||
|
GLuint program;
|
||||||
|
GLuint bufferObject;
|
||||||
|
GLuint texLocation;
|
||||||
|
GLuint positionLocation;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void GBASDLInit(struct SDLSoftwareRenderer* renderer);
|
bool GBASDLInit(struct SDLSoftwareRenderer* renderer);
|
||||||
|
void GBASDLDeinit(struct SDLSoftwareRenderer* renderer);
|
||||||
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer);
|
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,7 +7,7 @@ void _neon2x(void* dest, void* src, int width, int height);
|
||||||
void _neon4x(void* dest, void* src, int width, int height);
|
void _neon4x(void* dest, void* src, int width, int height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
bool GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
#ifdef COLOR_16_BIT
|
#ifdef COLOR_16_BIT
|
||||||
SDL_SetVideoMode(renderer->viewportWidth, renderer->viewportHeight, 16, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
SDL_SetVideoMode(renderer->viewportWidth, renderer->viewportHeight, 16, SDL_DOUBLEBUF | SDL_HWSURFACE);
|
||||||
|
@ -49,6 +49,8 @@ void GBASDLInit(struct SDLSoftwareRenderer* renderer) {
|
||||||
renderer->d.outputBufferStride = 240;
|
renderer->d.outputBufferStride = 240;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer) {
|
void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* renderer) {
|
||||||
|
@ -92,3 +94,7 @@ void GBASDLRunloop(struct GBAThread* context, struct SDLSoftwareRenderer* render
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GBASDLDeinit(struct SDLSoftwareRenderer* renderer) {
|
||||||
|
UNUSED(renderer);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue