compile fixes

bind API before initializing context
This commit is contained in:
Toad King 2012-09-24 20:47:48 -04:00
parent d0e220bbf1
commit df77bbd0bd
6 changed files with 41 additions and 26 deletions

View File

@ -164,7 +164,7 @@ ifeq ($(HAVE_SDL), 1)
# videocore's libs set later
endif
ifeq ($(HAVE_X11), 1)
ifeq ($(HAVE_XVIDEO), 1)
ifeq ($(HAVE_EGL), 1)
OBJ += gfx/context/xegl_ctx.o
DEFINES += $(EGL_CFLAGS)

View File

@ -442,7 +442,7 @@ static bool gfx_ctx_set_video_mode(
if (!eglChooseConfig(g_egl_dpy, config_attribs, &g_config, 1, &n) || n != 1)
goto error;
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (driver.video == &video_gl) ? context_attribs : NULL);
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (g_api == GFX_CTX_OPENGL_ES_API) ? context_attribs : NULL);
if (!g_egl_ctx)
goto error;

View File

@ -43,7 +43,7 @@ static EGLConfig g_config;
static volatile sig_atomic_t g_quit;
static bool g_inited;
static gfx_ctx_api g_api;
static enum gfx_ctx_api g_api;
static unsigned g_fb_width; // Just use something for now.
static unsigned g_fb_height;
@ -60,7 +60,7 @@ static void sighandler(int sig)
g_quit = 1;
}
static void gfx_ctx_set_swap_interval(unsigned interval, bool inited)
static void gfx_ctx_swap_interval(unsigned interval)
{
eglSwapInterval(g_egl_dpy, interval);
}
@ -100,6 +100,7 @@ static void gfx_ctx_get_video_size(unsigned *width, unsigned *height)
static bool gfx_ctx_init(void)
{
RARCH_LOG("[VC/EGL]: Initializing...\n");
if (g_inited)
{
RARCH_ERR("[VC/EGL]: Attempted to re-initialize driver.\n");
@ -150,7 +151,7 @@ static bool gfx_ctx_init(void)
rarch_assert(result != EGL_FALSE);
// create an EGL rendering context
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (driver.video == &video_gl) ? context_attributes : NULL);
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (g_api == GFX_CTX_OPENGL_ES_API) ? context_attributes : NULL);
rarch_assert(g_egl_ctx != EGL_NO_CONTEXT);
// create an EGL window surface
@ -238,7 +239,7 @@ static void gfx_ctx_input_driver(const input_driver_t **input, void **input_data
*input_data = linuxinput;
}
static bool gfx_ctx_window_has_focus(void)
static bool gfx_ctx_has_focus(void)
{
return g_inited;
}

View File

@ -307,7 +307,7 @@ static bool gfx_ctx_set_video_mode(
CWBorderPixel | CWColormap | CWEventMask, &swa);
XSetWindowBackground(g_dpy, g_win, 0);
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (driver.video == &video_gl) ? egl_ctx_attribs : NULL);
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, (g_api == GFX_CTX_OPENGL_ES_API) ? egl_ctx_attribs : NULL);
if (!g_egl_ctx)
goto error;

View File

@ -29,7 +29,7 @@ static const gfx_ctx_driver_t *gfx_ctx_drivers[] = {
#if defined(HAVE_SDL) && defined(HAVE_OPENGL)
&gfx_ctx_sdl_gl,
#endif
#if defined(HAVE_X11) && defined(HAVE_EGL)
#if defined(HAVE_XVIDEO) && defined(HAVE_EGL)
&gfx_ctx_x_egl,
#endif
#if defined(HAVE_KMS)
@ -52,15 +52,12 @@ const gfx_ctx_driver_t *gfx_ctx_init_first(enum gfx_ctx_api api)
{
for (unsigned i = 0; i < sizeof(gfx_ctx_drivers) / sizeof(gfx_ctx_drivers[0]); i++)
{
if (gfx_ctx_drivers[i]->init())
if (gfx_ctx_drivers[i]->bind_api(api))
{
if (gfx_ctx_drivers[i]->bind_api(api))
if (gfx_ctx_drivers[i]->init())
return gfx_ctx_drivers[i];
else
gfx_ctx_drivers[i]->destroy();
}
}
return NULL;
}

View File

@ -30,6 +30,7 @@
typedef struct
{
const gfx_ctx_driver_t *driver;
uint32_t mScreenWidth;
uint32_t mScreenHeight;
float mScreenAspect;
@ -60,8 +61,8 @@ typedef struct
static void vg_set_nonblock_state(void *data, bool state)
{
(void)data;
gfx_ctx_set_swap_interval(state ? 0 : 1, true);
vg_t *vg = (vg_t*)data;
vg->driver->swap_interval(state ? 0 : 1);
}
static void *vg_init(const video_info_t *video, const input_driver_t **input, void **input_data)
@ -70,23 +71,39 @@ static void *vg_init(const video_info_t *video, const input_driver_t **input, vo
if (!vg)
return NULL;
if (!eglBindAPI(EGL_OPENVG_API))
return NULL;
vg->driver = gfx_ctx_init_first(GFX_CTX_OPENVG_API);
if (!gfx_ctx_init())
if (!vg->driver)
{
free(vg);
return NULL;
}
gfx_ctx_get_video_size(&vg->mScreenWidth, &vg->mScreenHeight);
vg->driver->get_video_size(&vg->mScreenWidth, &vg->mScreenHeight);
RARCH_LOG("Detecting screen resolution %ux%u.\n", vg->mScreenWidth, vg->mScreenHeight);
gfx_ctx_set_swap_interval(video->vsync ? 1 : 0, false);
vg->driver->swap_interval(video->vsync ? 1 : 0);
vg->mTexType = video->rgb32 ? VG_sABGR_8888 : VG_sARGB_1555;
vg->mKeepAspect = video->force_aspect;
unsigned win_width = video->width;
unsigned win_height = video->height;
if (video->fullscreen && (win_width == 0) && (win_height == 0))
{
win_width = vg->mScreenWidth;
win_height = vg->mScreenHeight;
}
if (!vg->driver->set_video_mode(vg->mScreenWidth, vg->mScreenHeight,
g_settings.video.force_16bit ? 15 : 0, video->fullscreen))
{
free(vg);
return NULL;
}
vg->driver->get_video_size(&vg->mScreenWidth, &vg->mScreenHeight);
// check for SD televisions: they should always be 4:3
if ((vg->mScreenWidth == 640 || vg->mScreenWidth == 720) && (vg->mScreenHeight == 480 || vg->mScreenHeight == 576))
vg->mScreenAspect = 4.0f / 3.0f;
@ -106,7 +123,7 @@ static void *vg_init(const video_info_t *video, const input_driver_t **input, vo
video->smooth ? VG_IMAGE_QUALITY_BETTER : VG_IMAGE_QUALITY_NONANTIALIASED);
vg_set_nonblock_state(vg, !video->vsync);
gfx_ctx_input_driver(input, input_data);
vg->driver->input_driver(input, input_data);
#ifdef HAVE_FREETYPE
if (g_settings.video.font_enable)
@ -157,7 +174,7 @@ static void vg_free(void *data)
}
#endif
gfx_ctx_destroy();
vg->driver->destroy();
free(vg);
}
@ -322,7 +339,7 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei
(void)msg;
#endif
gfx_ctx_swap_buffers();
vg->driver->swap_buffers();
return true;
}
@ -332,7 +349,7 @@ static bool vg_alive(void *data)
vg_t *vg = (vg_t*)data;
bool quit, resize;
gfx_ctx_check_window(&quit,
vg->driver->check_window(&quit,
&resize, &vg->mScreenWidth, &vg->mScreenHeight,
vg->frame_count);
return !quit;
@ -340,8 +357,8 @@ static bool vg_alive(void *data)
static bool vg_focus(void *data)
{
(void)data;
return gfx_ctx_window_has_focus();
vg_t *vg = (vg_t*)data;
return vg->driver->has_focus();
}
const video_driver_t video_vg = {