This commit is contained in:
twinaphex 2020-07-17 20:35:11 +02:00
parent 9f9d59f2be
commit 8cfbe3b8d4
3 changed files with 79 additions and 76 deletions

View File

@ -41,15 +41,15 @@
#define HAVE_OSMESA_CREATE_CONTEXT_EXT 1 #define HAVE_OSMESA_CREATE_CONTEXT_EXT 1
#endif #endif
#define OSMESA_DEFAULT_FORMAT OSMESA_RGBA
#define OSMESA_BPP 4
#define OSMESA_FIFO_PATH "/tmp/osmesa-retroarch.sock"
/* TODO/FIXME - static globals */ /* TODO/FIXME - static globals */
static bool g_osmesa_profile = OSMESA_COMPAT_PROFILE; static bool g_osmesa_profile = OSMESA_COMPAT_PROFILE;
static int g_osmesa_major = 2; static int g_osmesa_major = 2;
static int g_osmesa_minor = 1; static int g_osmesa_minor = 1;
static const int g_osmesa_format = OSMESA_RGBA;
static const int g_osmesa_bpp = 4;
static const char *g_osmesa_fifo = "/tmp/osmesa-retroarch.sock";
typedef struct gfx_osmesa_ctx_data typedef struct gfx_osmesa_ctx_data
{ {
uint8_t *screen; uint8_t *screen;
@ -77,11 +77,12 @@ static void osmesa_fifo_open(gfx_ctx_osmesa_data_t *osmesa)
saun.sun_family = AF_UNIX; saun.sun_family = AF_UNIX;
strlcpy(saun.sun_path, g_osmesa_fifo, sizeof(saun.sun_path)); strlcpy(saun.sun_path, OSMESA_FIFO_PATH, sizeof(saun.sun_path));
unlink(g_osmesa_fifo); unlink(OSMESA_FIFO_PATH);
if (bind(osmesa->socket, &saun, sizeof(saun.sun_family) + sizeof(saun.sun_path)) < 0) if (bind(osmesa->socket,
&saun, sizeof(saun.sun_family) + sizeof(saun.sun_path)) < 0)
{ {
perror("[osmesa] bind()"); perror("[osmesa] bind()");
close(osmesa->socket); close(osmesa->socket);
@ -95,8 +96,10 @@ static void osmesa_fifo_open(gfx_ctx_osmesa_data_t *osmesa)
return; return;
} }
RARCH_ERR("[osmesa] Frame size is %ix%ix%i\n", osmesa->width, osmesa->height, osmesa->pixsize); RARCH_ERR("[osmesa] Frame size is %ix%ix%i\n",
RARCH_ERR("[osmesa] Please connect to unix:%s\n", g_osmesa_fifo); osmesa->width, osmesa->height, osmesa->pixsize);
RARCH_ERR("[osmesa] Please connect to unix:%s\n",
OSMESA_FIFO_PATH);
} }
static void osmesa_fifo_accept(gfx_ctx_osmesa_data_t *osmesa) static void osmesa_fifo_accept(gfx_ctx_osmesa_data_t *osmesa)
@ -146,7 +149,7 @@ static void *osmesa_ctx_init(void *video_driver)
{ {
#ifdef HAVE_OSMESA_CREATE_CONTEXT_ATTRIBS #ifdef HAVE_OSMESA_CREATE_CONTEXT_ATTRIBS
const int attribs[] = { const int attribs[] = {
OSMESA_FORMAT, g_osmesa_format, OSMESA_FORMAT, OSMESA_DEFAULT_FORMAT,
OSMESA_DEPTH_BITS, 0, OSMESA_DEPTH_BITS, 0,
OSMESA_STENCIL_BITS, 0, OSMESA_STENCIL_BITS, 0,
OSMESA_ACCUM_BITS, 0, OSMESA_ACCUM_BITS, 0,
@ -168,7 +171,7 @@ static void *osmesa_ctx_init(void *video_driver)
#ifdef HAVE_OSMESA_CREATE_CONTEXT_EXT #ifdef HAVE_OSMESA_CREATE_CONTEXT_EXT
if (!osmesa->ctx) if (!osmesa->ctx)
osmesa->ctx = OSMesaCreateContextExt(g_osmesa_format, 0, 0, 0, NULL); osmesa->ctx = OSMesaCreateContextExt(OSMESA_DEFAULT_FORMAT, 0, 0, 0, NULL);
#endif #endif
if (!osmesa->ctx) if (!osmesa->ctx)
@ -176,13 +179,13 @@ static void *osmesa_ctx_init(void *video_driver)
#if defined(HAVE_OSMESA_CREATE_CONTEXT_ATTRIBS) || defined(HAVE_OSMESA_CREATE_CONTEXT_EXT) #if defined(HAVE_OSMESA_CREATE_CONTEXT_ATTRIBS) || defined(HAVE_OSMESA_CREATE_CONTEXT_EXT)
RARCH_WARN("[osmesa]: Falling back to standard context creation.\n"); RARCH_WARN("[osmesa]: Falling back to standard context creation.\n");
#endif #endif
osmesa->ctx = OSMesaCreateContext(g_osmesa_format, NULL); osmesa->ctx = OSMesaCreateContext(OSMESA_DEFAULT_FORMAT, NULL);
} }
if (!osmesa->ctx) if (!osmesa->ctx)
goto error; goto error;
osmesa->pixsize = g_osmesa_bpp; osmesa->pixsize = OSMESA_BPP;
return osmesa; return osmesa;

View File

@ -34,19 +34,19 @@
typedef struct gfx_ctx_sdl_data typedef struct gfx_ctx_sdl_data
{ {
int g_width; int width;
int g_height; int height;
int g_new_width; int new_width;
int g_new_height; int new_height;
bool g_full; bool full;
bool g_resized; bool resized;
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
SDL_Window *g_win; SDL_Window *win;
SDL_GLContext g_ctx; SDL_GLContext ctx;
#else #else
SDL_Surface *g_win; SDL_Surface *win;
#endif #endif
} gfx_ctx_sdl_data_t; } gfx_ctx_sdl_data_t;
@ -59,18 +59,18 @@ static void sdl_ctx_destroy_resources(gfx_ctx_sdl_data_t *sdl)
return; return;
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
if (sdl->g_ctx) if (sdl->ctx)
SDL_GL_DeleteContext(sdl->g_ctx); SDL_GL_DeleteContext(sdl->ctx);
if (sdl->g_win) if (sdl->win)
SDL_DestroyWindow(sdl->g_win); SDL_DestroyWindow(sdl->win);
sdl->g_ctx = NULL; sdl->ctx = NULL;
#else #else
if (sdl->g_win) if (sdl->win)
SDL_FreeSurface(sdl->g_win); SDL_FreeSurface(sdl->win);
#endif #endif
sdl->g_win = NULL; sdl->win = NULL;
SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_QuitSubSystem(SDL_INIT_VIDEO);
} }
@ -168,14 +168,14 @@ static bool sdl_ctx_set_video_mode(void *data,
unsigned width, unsigned height, unsigned width, unsigned height,
bool fullscreen) bool fullscreen)
{ {
unsigned fsflag = 0; unsigned fsflag = 0;
gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data; gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data;
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
bool windowed_fullscreen= settings->bools.video_windowed_fullscreen; bool windowed_fullscreen = settings->bools.video_windowed_fullscreen;
unsigned video_monitor_index = settings->uints.video_monitor_index; unsigned video_monitor_index = settings->uints.video_monitor_index;
sdl->g_new_width = width; sdl->new_width = width;
sdl->g_new_height = height; sdl->new_height = height;
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
@ -187,18 +187,18 @@ static bool sdl_ctx_set_video_mode(void *data,
fsflag = SDL_WINDOW_FULLSCREEN; fsflag = SDL_WINDOW_FULLSCREEN;
} }
if (sdl->g_win) if (sdl->win)
{ {
SDL_SetWindowSize(sdl->g_win, width, height); SDL_SetWindowSize(sdl->win, width, height);
if (fullscreen) if (fullscreen)
SDL_SetWindowFullscreen(sdl->g_win, fsflag); SDL_SetWindowFullscreen(sdl->win, fsflag);
} }
else else
{ {
unsigned display = video_monitor_index; unsigned display = video_monitor_index;
sdl->g_win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED_DISPLAY(display), sdl->win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
SDL_WINDOWPOS_UNDEFINED_DISPLAY(display), SDL_WINDOWPOS_UNDEFINED_DISPLAY(display),
width, height, SDL_WINDOW_OPENGL | fsflag); width, height, SDL_WINDOW_OPENGL | fsflag);
} }
@ -206,35 +206,35 @@ static bool sdl_ctx_set_video_mode(void *data,
if (fullscreen) if (fullscreen)
fsflag = SDL_FULLSCREEN; fsflag = SDL_FULLSCREEN;
sdl->g_win = SDL_SetVideoMode(width, height, 0, SDL_OPENGL | fsflag); sdl->win = SDL_SetVideoMode(width, height, 0, SDL_OPENGL | fsflag);
#endif #endif
if (!sdl->g_win) if (!sdl->win)
goto error; goto error;
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
#if defined(_WIN32) #if defined(_WIN32)
sdl2_set_handles(sdl->g_win, RARCH_DISPLAY_WIN32); sdl2_set_handles(sdl->win, RARCH_DISPLAY_WIN32);
#elif defined(HAVE_X11) #elif defined(HAVE_X11)
sdl2_set_handles(sdl->g_win, RARCH_DISPLAY_X11); sdl2_set_handles(sdl->win, RARCH_DISPLAY_X11);
#elif defined(HAVE_COCOA) #elif defined(HAVE_COCOA)
sdl2_set_handles(sdl->g_win, RARCH_DISPLAY_OSX); sdl2_set_handles(sdl->win, RARCH_DISPLAY_OSX);
#endif #endif
if (sdl->g_ctx) if (sdl->ctx)
video_driver_set_video_cache_context_ack(); video_driver_set_video_cache_context_ack();
else else
{ {
sdl->g_ctx = SDL_GL_CreateContext(sdl->g_win); sdl->ctx = SDL_GL_CreateContext(sdl->win);
if (!sdl->g_ctx) if (!sdl->ctx)
goto error; goto error;
} }
#endif #endif
sdl->g_full = fullscreen; sdl->full = fullscreen;
sdl->g_width = width; sdl->width = width;
sdl->g_height = height; sdl->height = height;
return true; return true;
@ -252,10 +252,10 @@ static void sdl_ctx_get_video_size(void *data,
if (!sdl) if (!sdl)
return; return;
*width = sdl->g_width; *width = sdl->width;
*height = sdl->g_height; *height = sdl->height;
if (!sdl->g_win) if (!sdl->win)
{ {
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
SDL_DisplayMode mode = {0}; SDL_DisplayMode mode = {0};
@ -327,15 +327,15 @@ static void sdl_ctx_check_window(void *data, bool *quit,
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_RESIZED) if (event.window.event == SDL_WINDOWEVENT_RESIZED)
{ {
sdl->g_resized = true; sdl->resized = true;
sdl->g_new_width = event.window.data1; sdl->new_width = event.window.data1;
sdl->g_new_height = event.window.data2; sdl->new_height = event.window.data2;
} }
#else #else
case SDL_VIDEORESIZE: case SDL_VIDEORESIZE:
sdl->g_resized = true; sdl->resized = true;
sdl->g_new_width = event.resize.w; sdl->new_width = event.resize.w;
sdl->g_new_height = event.resize.h; sdl->new_height = event.resize.h;
#endif #endif
break; break;
default: default:
@ -343,12 +343,12 @@ static void sdl_ctx_check_window(void *data, bool *quit,
} }
} }
if (sdl->g_resized) if (sdl->resized)
{ {
*width = sdl->g_new_width; *width = sdl->new_width;
*height = sdl->g_new_height; *height = sdl->new_height;
*resize = true; *resize = true;
sdl->g_resized = false; sdl->resized = false;
} }
} }
@ -359,7 +359,7 @@ static bool sdl_ctx_has_focus(void *data)
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data; gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data;
flags = (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS); flags = (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS);
return (SDL_GetWindowFlags(sdl->g_win) & flags) == flags; return (SDL_GetWindowFlags(sdl->win) & flags) == flags;
#else #else
flags = (SDL_APPINPUTFOCUS | SDL_APPACTIVE); flags = (SDL_APPINPUTFOCUS | SDL_APPACTIVE);
return (SDL_GetAppState() & flags) == flags; return (SDL_GetAppState() & flags) == flags;
@ -371,7 +371,7 @@ static void sdl_ctx_swap_buffers(void *data)
#ifdef HAVE_SDL2 #ifdef HAVE_SDL2
gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data; gfx_ctx_sdl_data_t *sdl = (gfx_ctx_sdl_data_t*)data;
if (sdl) if (sdl)
SDL_GL_SwapWindow(sdl->g_win); SDL_GL_SwapWindow(sdl->win);
#else #else
SDL_GL_SwapBuffers(); SDL_GL_SwapBuffers();
#endif #endif

View File

@ -42,9 +42,9 @@
typedef struct gfx_ctx_x_vk_data typedef struct gfx_ctx_x_vk_data
{ {
bool g_should_reset_mode; bool should_reset_mode;
int g_interval; int interval;
gfx_ctx_vulkan_data_t vk; gfx_ctx_vulkan_data_t vk;
} gfx_ctx_x_vk_data_t; } gfx_ctx_x_vk_data_t;
@ -104,10 +104,10 @@ static void gfx_ctx_x_vk_destroy_resources(gfx_ctx_x_vk_data_t *x)
if (g_x11_dpy) if (g_x11_dpy)
{ {
if (x->g_should_reset_mode) if (x->should_reset_mode)
{ {
x11_exit_fullscreen(g_x11_dpy); x11_exit_fullscreen(g_x11_dpy);
x->g_should_reset_mode = false; x->should_reset_mode = false;
} }
if (!video_driver_is_video_cache_context()) if (!video_driver_is_video_cache_context())
@ -138,9 +138,9 @@ static void gfx_ctx_x_vk_swap_interval(void *data, int interval)
{ {
gfx_ctx_x_vk_data_t *x = (gfx_ctx_x_vk_data_t*)data; gfx_ctx_x_vk_data_t *x = (gfx_ctx_x_vk_data_t*)data;
if (x->g_interval != interval) if (x->interval != interval)
{ {
x->g_interval = interval; x->interval = interval;
if (x->vk.swapchain) if (x->vk.swapchain)
x->vk.need_new_swapchain = true; x->vk.need_new_swapchain = true;
} }
@ -171,7 +171,7 @@ static bool gfx_ctx_x_vk_set_resize(void *data,
/* FIXME/TODO - threading error here */ /* FIXME/TODO - threading error here */
if (!vulkan_create_swapchain(&x->vk, width, height, x->g_interval)) if (!vulkan_create_swapchain(&x->vk, width, height, x->interval))
{ {
RARCH_ERR("[X/Vulkan]: Failed to update swapchain.\n"); RARCH_ERR("[X/Vulkan]: Failed to update swapchain.\n");
x->vk.swapchain = VK_NULL_HANDLE; x->vk.swapchain = VK_NULL_HANDLE;
@ -270,7 +270,7 @@ static bool gfx_ctx_x_vk_set_video_mode(void *data,
{ {
if (x11_enter_fullscreen(g_x11_dpy, width, height)) if (x11_enter_fullscreen(g_x11_dpy, width, height))
{ {
x->g_should_reset_mode = true; x->should_reset_mode = true;
true_full = true; true_full = true;
} }
else else
@ -407,7 +407,7 @@ static bool gfx_ctx_x_vk_set_video_mode(void *data,
* We can obtain the XCB connection directly from X11. */ * We can obtain the XCB connection directly from X11. */
if (!vulkan_surface_create(&x->vk, VULKAN_WSI_XCB, if (!vulkan_surface_create(&x->vk, VULKAN_WSI_XCB,
g_x11_dpy, &g_x11_win, g_x11_dpy, &g_x11_win,
width, height, x->g_interval)) width, height, x->interval))
goto error; goto error;
} }
@ -415,7 +415,7 @@ static bool gfx_ctx_x_vk_set_video_mode(void *data,
x11_install_quit_atom(); x11_install_quit_atom();
gfx_ctx_x_vk_swap_interval(data, x->g_interval); gfx_ctx_x_vk_swap_interval(data, x->interval);
/* This can blow up on some drivers. /* This can blow up on some drivers.
* It's not fatal, so override errors for this call. */ * It's not fatal, so override errors for this call. */