Restructuring of sdlwrap.c for portability reasons -

could need a code review
This commit is contained in:
Twinaphex 2012-05-26 04:47:24 +02:00
parent f29338580b
commit 1386e2ee90
10 changed files with 118 additions and 127 deletions

View File

@ -100,7 +100,7 @@ ifeq ($(HAVE_COREAUDIO), 1)
endif
ifeq ($(HAVE_SDL), 1)
OBJ += gfx/sdl_gfx.o gfx/sdlwrap.o input/sdl_input.o audio/sdl_audio.o fifo_buffer.o
OBJ += gfx/sdl_gfx.o gfx/context/sdl_ctx.o input/sdl_input.o audio/sdl_audio.o fifo_buffer.o
DEFINES += $(SDL_CFLAGS) $(BSD_LOCAL_INC)
LIBS += $(SDL_LIBS)

View File

@ -39,7 +39,7 @@ ifeq ($(TDM_GCC),)
endif
ifeq ($(HAVE_SDL), 1)
OBJ += gfx/sdl_gfx.o gfx/gl.o gfx/sdlwrap.o input/sdl_input.o audio/sdl_audio.o fifo_buffer.o
OBJ += gfx/sdl_gfx.o gfx/gl.o gfx/context/sdl_ctx.o input/sdl_input.o audio/sdl_audio.o fifo_buffer.o
LIBS += -lSDL
DEFINES += -ISDL -DHAVE_SDL
endif

View File

@ -13,16 +13,23 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "sdlwrap.h"
#include "SDL_syswm.h"
#include "gfx_common.h"
#include "../general.h"
// Compatibility wrapper between SDL 1.2/1.3 for OpenGL.
// Wraps functions which differ in 1.2 and 1.3.
#include "SDL.h"
#include "SDL_version.h"
#include "../gfx_context.h"
#include "../gfx_common.h"
#include "../../general.h"
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#endif
#include "sdl_ctx.h"
// SDL 1.2 is portable, sure, but you still need some platform specific workarounds ;)
// Hopefully SDL 1.3 will solve this more cleanly :D
// Welcome to #ifdef HELL. :D
@ -36,7 +43,7 @@ static SDL_GLContext g_ctx;
static bool g_fullscreen;
static unsigned g_interval;
void sdlwrap_set_swap_interval(unsigned interval, bool inited)
void gfx_ctx_set_swap_interval(unsigned interval, bool inited)
{
g_interval = interval;
@ -75,7 +82,7 @@ void sdlwrap_set_swap_interval(unsigned interval, bool inited)
RARCH_WARN("Failed to set swap interval.\n");
}
static void sdlwrap_wm_set_caption(const char *str)
static void gfx_ctx_wm_set_caption(const char *str)
{
#if SDL_MODERN
SDL_SetWindowTitle(g_window, str);
@ -84,17 +91,17 @@ static void sdlwrap_wm_set_caption(const char *str)
#endif
}
void sdlwrap_update_window_title(bool reset)
void gfx_ctx_update_window_title(bool reset)
{
if (reset)
gfx_window_title_reset();
char buf[128];
if (gfx_window_title(buf, sizeof(buf)))
sdlwrap_wm_set_caption(buf);
gfx_ctx_wm_set_caption(buf);
}
void sdlwrap_get_video_size(unsigned *width, unsigned *height)
void gfx_ctx_get_video_size(unsigned *width, unsigned *height)
{
const SDL_VideoInfo *video_info = SDL_GetVideoInfo();
rarch_assert(video_info);
@ -102,7 +109,7 @@ void sdlwrap_get_video_size(unsigned *width, unsigned *height)
*height = video_info->current_h;
}
bool sdlwrap_init(void)
bool gfx_ctx_init(void)
{
#if SDL_MODERN
bool ret = SDL_VideoInit(NULL) == 0;
@ -118,7 +125,7 @@ bool sdlwrap_init(void)
}
#if SDL_MODERN
void sdlwrap_destroy(void)
void gfx_ctx_destroy(void)
{
if (g_ctx)
SDL_GL_DeleteContext(g_ctx);
@ -130,13 +137,13 @@ void sdlwrap_destroy(void)
SDL_VideoQuit();
}
#else
void sdlwrap_destroy(void)
void gfx_ctx_destroy(void)
{
SDL_QuitSubSystem(SDL_INIT_VIDEO);
}
#endif
bool sdlwrap_set_video_mode(
bool gfx_ctx_set_video_mode(
unsigned width, unsigned height,
unsigned bits, bool fullscreen)
{
@ -195,7 +202,7 @@ bool sdlwrap_set_video_mode(
if (attr <= 0 && g_interval)
{
RARCH_WARN("SDL failed to setup VSync, attempting to recover using native calls.\n");
sdlwrap_set_swap_interval(g_interval, true);
gfx_ctx_set_swap_interval(g_interval, true);
}
#endif
@ -214,7 +221,7 @@ bool sdlwrap_set_video_mode(
// SDL 1.2 has an awkward model where you need to "confirm" window resizing.
// SDL 1.3 luckily removes this quirk.
void sdlwrap_set_resize(unsigned width, unsigned height)
void gfx_ctx_set_resize(unsigned width, unsigned height)
{
#if SDL_MODERN
(void)width;
@ -229,7 +236,7 @@ void sdlwrap_set_resize(unsigned width, unsigned height)
#endif
}
void sdlwrap_swap_buffers(void)
void gfx_ctx_swap_buffers(void)
{
#if SDL_MODERN
SDL_GL_SwapWindow(g_window);
@ -238,7 +245,7 @@ void sdlwrap_swap_buffers(void)
#endif
}
bool sdlwrap_key_pressed(int key)
bool gfx_ctx_key_pressed(int key)
{
int num_keys;
#if SDL_MODERN
@ -260,7 +267,7 @@ bool sdlwrap_key_pressed(int key)
// 1.2 specific workaround for tiling WMs. In 1.3 we call GetSize directly, so we don't need to rely on
// proper event handling (I hope).
#if !defined(__APPLE__) && !defined(_WIN32) && !SDL_MODERN && !defined(XENON)
static void sdlwrap_get_window_size(unsigned *width, unsigned *height)
static void gfx_ctx_get_window_size(unsigned *width, unsigned *height)
{
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
@ -277,7 +284,7 @@ static void sdlwrap_get_window_size(unsigned *width, unsigned *height)
}
#endif
void sdlwrap_check_window(bool *quit,
void gfx_ctx_check_window(bool *quit,
bool *resize, unsigned *width, unsigned *height, unsigned frame_count)
{
*quit = false;
@ -342,7 +349,7 @@ void sdlwrap_check_window(bool *quit,
if (!*resize && !g_fullscreen)
{
unsigned new_width, new_height;
sdlwrap_get_window_size(&new_width, &new_height);
gfx_ctx_get_window_size(&new_width, &new_height);
if ((new_width != *width || new_height != *height) || (frame_count == 10)) // Ugly hack :D
{
*resize = true;
@ -355,7 +362,7 @@ void sdlwrap_check_window(bool *quit,
#endif
}
bool sdlwrap_get_wm_info(SDL_SysWMinfo *info)
bool gfx_ctx_get_wm_info(SDL_SysWMinfo *info)
{
#ifdef XENON
(void)info;
@ -370,7 +377,7 @@ bool sdlwrap_get_wm_info(SDL_SysWMinfo *info)
#endif
}
bool sdlwrap_window_has_focus(void)
bool gfx_ctx_window_has_focus(void)
{
#if SDL_MODERN
Uint32 flags = SDL_GetWindowFlags(g_window);
@ -381,7 +388,7 @@ bool sdlwrap_window_has_focus(void)
#endif
}
void sdlwrap_input_driver(const input_driver_t **input, void **input_data)
void gfx_ctx_input_driver(const input_driver_t **input, void **input_data)
{
void *sdl_input = input_sdl.init();
if (sdl_input)

View File

@ -22,7 +22,6 @@
#include <stdint.h>
#include "../dynamic.h"
#include "../general.h"
#include "sdlwrap.h"
#include "gfx_common.h"
#ifdef HAVE_FREETYPE

62
gfx/gfx_context.h Normal file
View File

@ -0,0 +1,62 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
*
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GFX_CONTEXT_H
#define __GFX_CONTEXT_H
#include "../boolean.h"
#include "../driver.h"
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#ifdef HAVE_SDL
#include "SDL_syswm.h"
#endif
void gfx_ctx_set_swap_interval(unsigned interval, bool inited);
bool gfx_ctx_set_video_mode(
unsigned width, unsigned height,
unsigned bits, bool fullscreen);
bool gfx_ctx_init(void);
void gfx_ctx_destroy(void);
void gfx_ctx_get_video_size(unsigned *width, unsigned *height);
void gfx_ctx_update_window_title(bool reset);
void gfx_ctx_swap_buffers(void);
bool gfx_ctx_key_pressed(int key);
void gfx_ctx_check_window(bool *quit,
bool *resize, unsigned *width, unsigned *height, unsigned frame_count);
void gfx_ctx_set_resize(unsigned width, unsigned height);
#ifdef HAVE_SDL
bool gfx_ctx_get_wm_info(SDL_SysWMinfo *info);
#endif
bool gfx_ctx_window_has_focus(void);
void gfx_ctx_input_driver(const input_driver_t **input, void **input_data);
#endif

View File

@ -29,7 +29,7 @@
#include "gl_common.h"
#include "gfx_common.h"
#include "sdlwrap.h"
#include "gfx_context.h"
#include "../compat/strl.h"
#ifdef HAVE_SDL
@ -865,7 +865,7 @@ static void check_window(gl_t *gl)
{
bool quit, resize;
sdlwrap_check_window(&quit,
gfx_ctx_check_window(&quit,
&resize, &gl->win_width, &gl->win_height,
gl->frame_count);
@ -1141,7 +1141,7 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
if (gl->should_resize)
{
gl->should_resize = false;
sdlwrap_set_resize(gl->win_width, gl->win_height);
gfx_ctx_set_resize(gl->win_width, gl->win_height);
// On resize, we might have to recreate our FBOs due to "Viewport" scale, and set a new viewport.
gl_update_resize(gl);
@ -1179,8 +1179,8 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
if (msg)
gl_render_msg(gl, msg);
sdlwrap_update_window_title(false);
sdlwrap_swap_buffers();
gfx_ctx_update_window_title(false);
gfx_ctx_swap_buffers();
return true;
}
@ -1200,7 +1200,7 @@ static void gl_free(void *data)
gl_deinit_fbo(gl);
#endif
sdlwrap_destroy();
gfx_ctx_destroy();
if (gl->empty_buf)
free(gl->empty_buf);
@ -1214,7 +1214,7 @@ static void gl_set_nonblock_state(void *data, bool state)
if (gl->vsync)
{
RARCH_LOG("GL VSync => %s\n", state ? "off" : "on");
sdlwrap_set_swap_interval(state ? 0 : 1, true);
gfx_ctx_set_swap_interval(state ? 0 : 1, true);
}
}
@ -1224,14 +1224,14 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gfx_set_dwm();
#endif
if (!sdlwrap_init())
if (!gfx_ctx_init())
return NULL;
unsigned full_x = 0, full_y = 0;
sdlwrap_get_video_size(&full_x, &full_y);
gfx_ctx_get_video_size(&full_x, &full_y);
RARCH_LOG("Detecting desktop resolution %ux%u.\n", full_x, full_y);
sdlwrap_set_swap_interval(video->vsync ? 1 : 0, false);
gfx_ctx_set_swap_interval(video->vsync ? 1 : 0, false);
unsigned win_width = video->width;
unsigned win_height = video->height;
@ -1241,11 +1241,11 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
win_height = full_y;
}
if (!sdlwrap_set_video_mode(win_width, win_height,
if (!gfx_ctx_set_video_mode(win_width, win_height,
g_settings.video.force_16bit ? 15 : 0, video->fullscreen))
return NULL;
sdlwrap_update_window_title(true);
gfx_ctx_update_window_title(true);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -1254,7 +1254,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
// Need to load dynamically :(
if (!load_gl_proc())
{
sdlwrap_destroy();
gfx_ctx_destroy();
return NULL;
}
#endif
@ -1262,7 +1262,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t));
if (!gl)
{
sdlwrap_destroy();
gfx_ctx_destroy();
return NULL;
}
@ -1279,7 +1279,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
if (!gl_shader_init())
{
RARCH_ERR("Shader init failed.\n");
sdlwrap_destroy();
gfx_ctx_destroy();
free(gl);
return NULL;
}
@ -1375,12 +1375,12 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
memcpy(gl->prev_info[i].coord, tex_coords, sizeof(tex_coords));
}
sdlwrap_input_driver(input, input_data);
gfx_ctx_input_driver(input, input_data);
gl_init_font(gl, g_settings.video.font_path, g_settings.video.font_size);
if (!gl_check_error())
{
sdlwrap_destroy();
gfx_ctx_destroy();
free(gl);
return NULL;
}
@ -1398,7 +1398,7 @@ static bool gl_alive(void *data)
static bool gl_focus(void *data)
{
(void)data;
return sdlwrap_window_has_focus();
return gfx_ctx_window_has_focus();
}
#ifdef HAVE_XML

View File

@ -1,78 +0,0 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
*
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
// Compatibility wrapper between SDL 1.2/1.3 for OpenGL.
// Wraps functions which differ in 1.2 and 1.3.
#ifndef __SDLWRAP_H
#define __SDLWRAP_H
#include "../boolean.h"
#include "../driver.h"
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif
#ifdef HAVE_SDL
#include "SDL.h"
#include "SDL_version.h"
#include "SDL_syswm.h"
#if SDL_VERSION_ATLEAST(1, 3, 0)
#define SDL_MODERN 1
#else
#define SDL_MODERN 0
#endif
// Not legal to cast (void*) to fn-pointer. Need workaround to be compliant.
#define SDL_SYM_WRAP(sym, symbol) { \
rarch_assert(sizeof(void*) == sizeof(void (*)(void))); \
void *sym__ = SDL_GL_GetProcAddress(symbol); \
memcpy(&(sym), &sym__, sizeof(void*)); \
}
#endif
void sdlwrap_set_swap_interval(unsigned interval, bool inited);
bool sdlwrap_set_video_mode(
unsigned width, unsigned height,
unsigned bits, bool fullscreen);
bool sdlwrap_init(void);
void sdlwrap_destroy(void);
void sdlwrap_get_video_size(unsigned *width, unsigned *height);
void sdlwrap_update_window_title(bool reset);
void sdlwrap_swap_buffers(void);
bool sdlwrap_key_pressed(int key);
void sdlwrap_check_window(bool *quit,
bool *resize, unsigned *width, unsigned *height, unsigned frame_count);
void sdlwrap_set_resize(unsigned width, unsigned height);
bool sdlwrap_get_wm_info(SDL_SysWMinfo *info);
bool sdlwrap_window_has_focus(void);
void sdlwrap_input_driver(const input_driver_t **input, void **input_data);
#endif

View File

@ -32,7 +32,8 @@
#define NO_SDL_GLEXT
#include "sdlwrap.h"
#include "gfx_context.h"
#include "context/sdl_ctx.h"
#include "SDL_opengl.h"
#include <stdlib.h>

View File

@ -20,7 +20,7 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "../gfx/sdlwrap.h"
#include "../gfx/gfx_context.h"
void sdl_dinput_free(sdl_dinput_t *di)
{
@ -108,7 +108,7 @@ sdl_dinput_t* sdl_dinput_init(void)
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
if (!sdlwrap_get_wm_info(&info))
if (!gfx_ctx_get_wm_info(&info))
{
RARCH_ERR("Failed to get SysWM info.\n");
goto error;

View File

@ -15,7 +15,7 @@
#include "../driver.h"
#include "../gfx/sdlwrap.h"
#include "../gfx/gfx_context.h"
#include "../boolean.h"
#include "../general.h"
#include <stdint.h>
@ -183,7 +183,7 @@ static void *sdl_input_init(void)
static bool sdl_key_pressed(int key)
{
return sdlwrap_key_pressed(keysym_lut[key]);
return gfx_ctx_key_pressed(keysym_lut[key]);
}
#ifndef HAVE_DINPUT