This commit is contained in:
twinaphex 2014-10-27 14:35:23 +01:00
parent 9214469470
commit 30ca42cb9d
10 changed files with 177 additions and 119 deletions

View File

@ -78,7 +78,7 @@ static void gfx_ctx_qnx_destroy(void *data)
eglTerminate(g_egl_dpy); eglTerminate(g_egl_dpy);
} }
// Be as careful as possible in deinit. /* Be as careful as possible in deinit. */
g_egl_ctx = NULL; g_egl_ctx = NULL;
g_egl_hw_ctx = NULL; g_egl_hw_ctx = NULL;
@ -332,7 +332,7 @@ static void gfx_ctx_qnx_check_window(void *data, bool *quit,
*resize = true; *resize = true;
} }
// Check if we are exiting. /* Check if we are exiting. */
if (g_extern.system.shutdown) if (g_extern.system.shutdown)
*quit = true; *quit = true;
} }
@ -367,7 +367,8 @@ static bool gfx_ctx_qnx_set_video_mode(void *data,
} }
static void gfx_ctx_qnx_input_driver(void *data, const input_driver_t **input, void **input_data) static void gfx_ctx_qnx_input_driver(void *data,
const input_driver_t **input, void **input_data)
{ {
(void)data; (void)data;
*input = NULL; *input = NULL;
@ -385,7 +386,8 @@ static gfx_ctx_proc_t gfx_ctx_qnx_get_proc_address(const char *symbol)
return ret; return ret;
} }
static bool gfx_ctx_qnx_bind_api(void *data, enum gfx_ctx_api api, unsigned major, unsigned minor) static bool gfx_ctx_qnx_bind_api(void *data,
enum gfx_ctx_api api, unsigned major, unsigned minor)
{ {
(void)data; (void)data;
(void)major; (void)major;
@ -411,7 +413,8 @@ static void gfx_qnx_ctx_bind_hw_render(void *data, bool enable)
(void)data; (void)data;
g_use_hw_ctx = enable; g_use_hw_ctx = enable;
if (g_egl_dpy && g_egl_surf) if (g_egl_dpy && g_egl_surf)
eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, enable ? g_egl_hw_ctx : g_egl_ctx); eglMakeCurrent(g_egl_dpy, g_egl_surf,
g_egl_surf, enable ? g_egl_hw_ctx : g_egl_ctx);
} }
const gfx_ctx_driver_t gfx_ctx_bbqnx = { const gfx_ctx_driver_t gfx_ctx_bbqnx = {

View File

@ -128,7 +128,8 @@ static void gfx_ctx_d3d_update_title(void *data)
char mem[128]; char mem[128];
MEMORYSTATUS stat; MEMORYSTATUS stat;
GlobalMemoryStatus(&stat); GlobalMemoryStatus(&stat);
snprintf(mem, sizeof(mem), "|| MEM: %.2f/%.2fMB", stat.dwAvailPhys/(1024.0f*1024.0f), stat.dwTotalPhys/(1024.0f*1024.0f)); snprintf(mem, sizeof(mem), "|| MEM: %.2f/%.2fMB",
stat.dwAvailPhys/(1024.0f*1024.0f), stat.dwTotalPhys/(1024.0f*1024.0f));
strlcat(buffer_fps, mem, sizeof(buffer_fps)); strlcat(buffer_fps, mem, sizeof(buffer_fps));
#endif #endif
msg_queue_push(g_extern.msg_queue, buffer_fps, 1, 1); msg_queue_push(g_extern.msg_queue, buffer_fps, 1, 1);
@ -160,29 +161,35 @@ void d3d_make_d3dpp(void *data, const video_info_t *info, D3DPRESENT_PARAMETERS
#else #else
d3dpp->Windowed = g_settings.video.windowed_fullscreen || !info->fullscreen; d3dpp->Windowed = g_settings.video.windowed_fullscreen || !info->fullscreen;
#endif #endif
d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
if (info->vsync) if (info->vsync)
{ {
switch (g_settings.video.swap_interval) switch (g_settings.video.swap_interval)
{ {
default: default:
case 1: d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_ONE; break; case 1:
case 2: d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_TWO; break; d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_ONE;
case 3: d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_THREE; break; break;
case 4: d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_FOUR; break; case 2:
d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_TWO;
break;
case 3:
d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_THREE;
break;
case 4:
d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_FOUR;
break;
} }
} }
else
{
d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
}
d3dpp->SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp->SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp->BackBufferCount = 2; d3dpp->BackBufferCount = 2;
#ifdef _XBOX #ifdef _XBOX
d3dpp->BackBufferFormat = d3dpp->BackBufferFormat =
#ifdef _XBOX360 #ifdef _XBOX360
g_extern.console.screen.gamma_correction ? (D3DFORMAT)MAKESRGBFMT(info->rgb32 ? D3DFMT_X8R8G8B8 : D3DFMT_LIN_R5G6B5) : g_extern.console.screen.gamma_correction ?
(D3DFORMAT)MAKESRGBFMT(info->rgb32 ? D3DFMT_X8R8G8B8 : D3DFMT_LIN_R5G6B5) :
#endif #endif
info->rgb32 ? D3DFMT_X8R8G8B8 : D3DFMT_LIN_R5G6B5; info->rgb32 ? D3DFMT_X8R8G8B8 : D3DFMT_LIN_R5G6B5;
#else #else
@ -303,7 +310,8 @@ static bool gfx_ctx_d3d_has_windowed(void *data)
#endif #endif
} }
static bool gfx_ctx_d3d_bind_api(void *data, enum gfx_ctx_api api, unsigned major, unsigned minor) static bool gfx_ctx_d3d_bind_api(void *data,
enum gfx_ctx_api api, unsigned major, unsigned minor)
{ {
(void)data; (void)data;
(void)major; (void)major;
@ -311,7 +319,8 @@ static bool gfx_ctx_d3d_bind_api(void *data, enum gfx_ctx_api api, unsigned majo
(void)api; (void)api;
#if defined(_XBOX1) #if defined(_XBOX1)
return api == GFX_CTX_DIRECT3D8_API; return api == GFX_CTX_DIRECT3D8_API;
#else /* As long as we don't have a D3D11 implementation, we default to this */ #else
/* As long as we don't have a D3D11 implementation, we default to this */
return api == GFX_CTX_DIRECT3D9_API; return api == GFX_CTX_DIRECT3D9_API;
#endif #endif
} }
@ -328,7 +337,8 @@ static void gfx_ctx_d3d_destroy(void *data)
(void)data; (void)data;
} }
static void gfx_ctx_d3d_input_driver(void *data, const input_driver_t **input, void **input_data) static void gfx_ctx_d3d_input_driver(void *data,
const input_driver_t **input, void **input_data)
{ {
(void)data; (void)data;
#ifdef _XBOX #ifdef _XBOX
@ -342,7 +352,8 @@ static void gfx_ctx_d3d_input_driver(void *data, const input_driver_t **input, v
#endif #endif
} }
static void gfx_ctx_d3d_get_video_size(void *data, unsigned *width, unsigned *height) static void gfx_ctx_d3d_get_video_size(void *data,
unsigned *width, unsigned *height)
{ {
d3d_video_t *d3d = (d3d_video_t*)driver.video_data; d3d_video_t *d3d = (d3d_video_t*)driver.video_data;
#ifdef _XBOX #ifdef _XBOX
@ -438,12 +449,11 @@ static void gfx_ctx_d3d_swap_interval(void *data, unsigned interval)
{ {
d3d_video_t *d3d = (d3d_video_t*)data; d3d_video_t *d3d = (d3d_video_t*)data;
#ifdef _XBOX #ifdef _XBOX
LPDIRECT3DDEVICE d3dr = d3d->dev; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev;
unsigned d3d_interval = interval ?
D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
if (interval) d3dr->SetRenderState(XBOX_PRESENTATIONINTERVAL, d3d_interval);
d3dr->SetRenderState(XBOX_PRESENTATIONINTERVAL, D3DPRESENT_INTERVAL_ONE);
else
d3dr->SetRenderState(XBOX_PRESENTATIONINTERVAL, D3DPRESENT_INTERVAL_IMMEDIATE);
#else #else
d3d_restore(d3d); d3d_restore(d3d);
#endif #endif

View File

@ -637,6 +637,14 @@ static EGLint *egl_fill_attribs(EGLint *attr)
return attr; return attr;
} }
#define DRM_EGL_ATTRIBS_BASE \
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \
EGL_RED_SIZE, 1, \
EGL_GREEN_SIZE, 1, \
EGL_BLUE_SIZE, 1, \
EGL_ALPHA_SIZE, 0, \
EGL_DEPTH_SIZE, 0
static bool gfx_ctx_drm_egl_set_video_mode(void *data, static bool gfx_ctx_drm_egl_set_video_mode(void *data,
unsigned width, unsigned height, unsigned width, unsigned height,
bool fullscreen) bool fullscreen)
@ -644,7 +652,8 @@ static bool gfx_ctx_drm_egl_set_video_mode(void *data,
int i, ret = 0; int i, ret = 0;
struct sigaction sa = {{0}}; struct sigaction sa = {{0}};
struct drm_fb *fb = NULL; struct drm_fb *fb = NULL;
gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)driver.video_context_data; gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)
driver.video_context_data;
if (!drm) if (!drm)
return false; return false;
@ -655,36 +664,29 @@ static bool gfx_ctx_drm_egl_set_video_mode(void *data,
sigaction(SIGINT, &sa, NULL); sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL); sigaction(SIGTERM, &sa, NULL);
#define EGL_ATTRIBS_BASE \
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \
EGL_RED_SIZE, 1, \
EGL_GREEN_SIZE, 1, \
EGL_BLUE_SIZE, 1, \
EGL_ALPHA_SIZE, 0, \
EGL_DEPTH_SIZE, 0
static const EGLint egl_attribs_gl[] = { static const EGLint egl_attribs_gl[] = {
EGL_ATTRIBS_BASE, DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE, EGL_NONE,
}; };
static const EGLint egl_attribs_gles[] = { static const EGLint egl_attribs_gles[] = {
EGL_ATTRIBS_BASE, DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE, EGL_NONE,
}; };
#ifdef EGL_KHR_create_context #ifdef EGL_KHR_create_context
static const EGLint egl_attribs_gles3[] = { static const EGLint egl_attribs_gles3[] = {
EGL_ATTRIBS_BASE, DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_NONE, EGL_NONE,
}; };
#endif #endif
static const EGLint egl_attribs_vg[] = { static const EGLint egl_attribs_vg[] = {
EGL_ATTRIBS_BASE, DRM_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
EGL_NONE, EGL_NONE,
}; };
@ -836,7 +838,8 @@ error:
static void gfx_ctx_drm_egl_destroy(void *data) static void gfx_ctx_drm_egl_destroy(void *data)
{ {
gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)driver.video_context_data; gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)
driver.video_context_data;
if (!drm) if (!drm)
return; return;
@ -860,7 +863,8 @@ static void gfx_ctx_drm_egl_input_driver(void *data,
static bool gfx_ctx_drm_egl_has_focus(void *data) static bool gfx_ctx_drm_egl_has_focus(void *data)
{ {
gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)driver.video_context_data; gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)
driver.video_context_data;
(void)data; (void)data;
if (drm) if (drm)
@ -909,7 +913,8 @@ static bool gfx_ctx_drm_egl_bind_api(void *data,
static void gfx_ctx_drm_egl_bind_hw_render(void *data, bool enable) static void gfx_ctx_drm_egl_bind_hw_render(void *data, bool enable)
{ {
gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)driver.video_context_data; gfx_ctx_drm_egl_data_t *drm = (gfx_ctx_drm_egl_data_t*)
driver.video_context_data;
if (!drm) if (!drm)
return; return;
@ -919,7 +924,8 @@ static void gfx_ctx_drm_egl_bind_hw_render(void *data, bool enable)
drm->g_use_hw_ctx = enable; drm->g_use_hw_ctx = enable;
if (drm->g_egl_dpy && drm->g_egl_surf) if (drm->g_egl_dpy && drm->g_egl_surf)
eglMakeCurrent(drm->g_egl_dpy, drm->g_egl_surf, eglMakeCurrent(drm->g_egl_dpy, drm->g_egl_surf,
drm->g_egl_surf, enable ? drm->g_egl_hw_ctx : drm->g_egl_ctx); drm->g_egl_surf,
enable ? drm->g_egl_hw_ctx : drm->g_egl_ctx);
} }
const gfx_ctx_driver_t gfx_ctx_drm_egl = { const gfx_ctx_driver_t gfx_ctx_drm_egl = {

View File

@ -14,8 +14,6 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
// VideoCore context, for Rasperry Pi.
#include "../../driver.h" #include "../../driver.h"
#include "../gfx_context.h" #include "../gfx_context.h"
#include "../gl_common.h" #include "../gl_common.h"
@ -136,30 +134,30 @@ static bool gfx_ctx_emscripten_init(void *data)
EGL_NONE EGL_NONE
}; };
// get an EGL display connection /* Get an EGL display connection. */
g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (!g_egl_dpy) if (!g_egl_dpy)
goto error; goto error;
// initialize the EGL display connection /* Initialize the EGL display connection. */
if (!eglInitialize(g_egl_dpy, NULL, NULL)) if (!eglInitialize(g_egl_dpy, NULL, NULL))
goto error; goto error;
// get an appropriate EGL frame buffer configuration /* Get an appropriate EGL frame buffer configuration. */
if (!eglChooseConfig(g_egl_dpy, attribute_list, &g_config, 1, &num_config)) if (!eglChooseConfig(g_egl_dpy, attribute_list, &g_config, 1, &num_config))
goto error; goto error;
// create an EGL rendering context /* Create an EGL rendering context. */
g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, context_attributes); g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, context_attributes);
if (!g_egl_ctx) if (!g_egl_ctx)
goto error; goto error;
// create an EGL window surface /* create an EGL window surface. */
g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_config, 0, NULL); g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_config, 0, NULL);
if (!g_egl_surf) if (!g_egl_surf)
goto error; goto error;
// connect the context to the surface /* Connect the context to the surface. */
if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx)) if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx))
goto error; goto error;
@ -208,7 +206,8 @@ static void gfx_ctx_emscripten_destroy(void *data)
(void)data; (void)data;
if (g_egl_dpy) if (g_egl_dpy)
{ {
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE,
EGL_NO_SURFACE, EGL_NO_CONTEXT);
if (g_egl_ctx) if (g_egl_ctx)
eglDestroyContext(g_egl_dpy, g_egl_ctx); eglDestroyContext(g_egl_dpy, g_egl_ctx);

View File

@ -14,7 +14,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
// VideoCore context, for Rasperry Pi. /* VideoCore context, for Rasperry Pi. */
#include "../../driver.h" #include "../../driver.h"
#include "../gfx_context.h" #include "../gfx_context.h"
@ -81,9 +81,13 @@ static void sighandler(int sig)
static void gfx_ctx_vc_swap_interval(void *data, unsigned interval) static void gfx_ctx_vc_swap_interval(void *data, unsigned interval)
{ {
(void)data; (void)data;
// Can be called before initialization.
// Some contexts require that swap interval is known at startup time. /* Can be called before initialization.
* Some contexts require that swap interval
* is known at startup time.
*/
g_interval = interval; g_interval = interval;
if (g_egl_dpy) if (g_egl_dpy)
eglSwapInterval(g_egl_dpy, interval); eglSwapInterval(g_egl_dpy, interval);
} }
@ -171,20 +175,20 @@ static bool gfx_ctx_vc_init(void *data)
bcm_host_init(); bcm_host_init();
// get an EGL display connection /* Get an EGL display connection. */
g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (!g_egl_dpy) if (!g_egl_dpy)
goto error; goto error;
// initialize the EGL display connection /* Initialize the EGL display connection. */
if (!eglInitialize(g_egl_dpy, NULL, NULL)) if (!eglInitialize(g_egl_dpy, NULL, NULL))
goto error; goto error;
// get an appropriate EGL frame buffer configuration /* Get an appropriate EGL frame buffer configuration. */
if (!eglChooseConfig(g_egl_dpy, attribute_list, &g_config, 1, &num_config)) if (!eglChooseConfig(g_egl_dpy, attribute_list, &g_config, 1, &num_config))
goto error; goto error;
// create an EGL rendering context /* Create an EGL rendering context. */
g_egl_ctx = eglCreateContext( g_egl_ctx = eglCreateContext(
g_egl_dpy, g_config, EGL_NO_CONTEXT, g_egl_dpy, g_config, EGL_NO_CONTEXT,
(g_api == GFX_CTX_OPENGL_ES_API) ? context_attributes : NULL); (g_api == GFX_CTX_OPENGL_ES_API) ? context_attributes : NULL);
@ -201,7 +205,7 @@ static bool gfx_ctx_vc_init(void *data)
goto error; goto error;
} }
// create an EGL window surface /* Create an EGL window surface. */
if (graphics_get_display_size(0 /* LCD */, &g_fb_width, &g_fb_height) < 0) if (graphics_get_display_size(0 /* LCD */, &g_fb_width, &g_fb_height) < 0)
goto error; goto error;
@ -237,7 +241,7 @@ static bool gfx_ctx_vc_init(void *data)
if (!g_egl_surf) if (!g_egl_surf)
goto error; goto error;
// connect the context to the surface /* Connect the context to the surface. */
if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx)) if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx))
goto error; goto error;
@ -299,14 +303,16 @@ static void gfx_ctx_vc_destroy(void *data)
if (eglBuffer[i] && peglDestroyImageKHR) if (eglBuffer[i] && peglDestroyImageKHR)
{ {
eglBindAPI(EGL_OPENVG_API); eglBindAPI(EGL_OPENVG_API);
eglMakeCurrent(g_egl_dpy, g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx); eglMakeCurrent(g_egl_dpy,
g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx);
peglDestroyImageKHR(g_egl_dpy, eglBuffer[i]); peglDestroyImageKHR(g_egl_dpy, eglBuffer[i]);
} }
if (g_egl_vgimage[i]) if (g_egl_vgimage[i])
{ {
eglBindAPI(EGL_OPENVG_API); eglBindAPI(EGL_OPENVG_API);
eglMakeCurrent(g_egl_dpy, g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx); eglMakeCurrent(g_egl_dpy,
g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx);
vgDestroyImage(g_egl_vgimage[i]); vgDestroyImage(g_egl_vgimage[i]);
} }
} }
@ -314,7 +320,8 @@ static void gfx_ctx_vc_destroy(void *data)
if (g_egl_ctx) if (g_egl_ctx)
{ {
gfx_ctx_vc_bind_api(data, g_api, 0, 0); gfx_ctx_vc_bind_api(data, g_api, 0, 0);
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(g_egl_dpy, g_egl_ctx); eglDestroyContext(g_egl_dpy, g_egl_ctx);
} }
@ -324,7 +331,8 @@ static void gfx_ctx_vc_destroy(void *data)
if (g_eglimage_ctx) if (g_eglimage_ctx)
{ {
eglBindAPI(EGL_OPENVG_API); eglBindAPI(EGL_OPENVG_API);
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(g_egl_dpy, g_eglimage_ctx); eglDestroyContext(g_egl_dpy, g_eglimage_ctx);
} }
@ -341,9 +349,11 @@ static void gfx_ctx_vc_destroy(void *data)
} }
eglBindAPI(EGL_OPENVG_API); eglBindAPI(EGL_OPENVG_API);
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
gfx_ctx_vc_bind_api(data, g_api, 0, 0); gfx_ctx_vc_bind_api(data, g_api, 0, 0);
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglTerminate(g_egl_dpy); eglTerminate(g_egl_dpy);
} }
@ -392,7 +402,8 @@ static float gfx_ctx_vc_translate_aspect(void *data,
unsigned width, unsigned height) unsigned width, unsigned height)
{ {
(void)data; (void)data;
// check for SD televisions: they should always be 4:3.
/* Check for SD televisions: they should always be 4:3. */
if ((width == 640 || width == 720) && (height == 480 || height == 576)) if ((width == 640 || width == 720) && (height == 480 || height == 576))
return 4.0f / 3.0f; return 4.0f / 3.0f;
else else
@ -441,7 +452,7 @@ static bool gfx_ctx_vc_init_egl_image_buffer(void *data,
goto fail; goto fail;
} }
// test to make sure we can switch context /* Test to make sure we can switch context. */
result = eglMakeCurrent(g_egl_dpy, g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx); result = eglMakeCurrent(g_egl_dpy, g_pbuff_surf, g_pbuff_surf, g_eglimage_ctx);
if (result == EGL_FALSE) if (result == EGL_FALSE)
{ {

View File

@ -102,8 +102,10 @@ static bool gfx_ctx_vivante_init(void *data)
sigaction(SIGTERM, &sa, NULL); sigaction(SIGTERM, &sa, NULL);
static const EGLint attribs[] = { static const EGLint attribs[] = {
//EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, #if 0
//EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
#endif
EGL_BLUE_SIZE, 5, EGL_BLUE_SIZE, 5,
EGL_GREEN_SIZE, 6, EGL_GREEN_SIZE, 6,
EGL_RED_SIZE, 5, EGL_RED_SIZE, 5,
@ -129,7 +131,8 @@ static bool gfx_ctx_vivante_init(void *data)
goto error; goto error;
} }
RARCH_LOG("[Vivante fbdev]: EGL version: %d.%d\n", egl_version_major, egl_version_minor); RARCH_LOG("[Vivante fbdev]: EGL version: %d.%d\n",
egl_version_major, egl_version_minor);
if (!eglChooseConfig(g_egl_dpy, attribs, &g_config, 1, &num_config)) if (!eglChooseConfig(g_egl_dpy, attribs, &g_config, 1, &num_config))
@ -192,7 +195,7 @@ static bool gfx_ctx_vivante_set_video_mode(void *data,
unsigned width, unsigned height, unsigned width, unsigned height,
bool fullscreen) bool fullscreen)
{ {
// Pick some arbitrary default. /* Pick some arbitrary default. */
if (!width || !fullscreen) if (!width || !fullscreen)
width = 1280; width = 1280;
if (!height || !fullscreen) if (!height || !fullscreen)
@ -202,7 +205,7 @@ static bool gfx_ctx_vivante_set_video_mode(void *data,
g_height = height; g_height = height;
static const EGLint attribs[] = { static const EGLint attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2, // Use version 2, even for GLES3. EGL_CONTEXT_CLIENT_VERSION, 2, /* Use version 2, even for GLES3. */
EGL_NONE EGL_NONE
}; };

View File

@ -68,7 +68,7 @@ static void sighandler(int sig)
g_quit = 1; g_quit = 1;
} }
// Shell surface callbacks /* Shell surface callbacks. */
static void shell_surface_handle_ping(void *data, static void shell_surface_handle_ping(void *data,
struct wl_shell_surface *shell_surface, struct wl_shell_surface *shell_surface,
uint32_t serial) uint32_t serial)
@ -108,7 +108,7 @@ static const struct wl_shell_surface_listener shell_surface_listener = {
shell_surface_handle_popup_done, shell_surface_handle_popup_done,
}; };
// Registry callbacks /* Registry callbacks. */
static void registry_handle_global(void *data, struct wl_registry *reg, static void registry_handle_global(void *data, struct wl_registry *reg,
uint32_t id, const char *interface, uint32_t version) uint32_t id, const char *interface, uint32_t version)
{ {
@ -352,7 +352,7 @@ static void gfx_ctx_wl_get_video_size(void *data,
#define DEFAULT_WINDOWED_WIDTH 640 #define DEFAULT_WINDOWED_WIDTH 640
#define DEFAULT_WINDOWED_HEIGHT 480 #define DEFAULT_WINDOWED_HEIGHT 480
#define EGL_ATTRIBS_BASE \ #define WL_EGL_ATTRIBS_BASE \
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \
EGL_RED_SIZE, 1, \ EGL_RED_SIZE, 1, \
EGL_GREEN_SIZE, 1, \ EGL_GREEN_SIZE, 1, \
@ -365,27 +365,27 @@ static bool gfx_ctx_wl_init(void *data)
(void)data; (void)data;
static const EGLint egl_attribs_gl[] = { static const EGLint egl_attribs_gl[] = {
EGL_ATTRIBS_BASE, WL_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE, EGL_NONE,
}; };
static const EGLint egl_attribs_gles[] = { static const EGLint egl_attribs_gles[] = {
EGL_ATTRIBS_BASE, WL_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE, EGL_NONE,
}; };
#ifdef EGL_KHR_create_context #ifdef EGL_KHR_create_context
static const EGLint egl_attribs_gles3[] = { static const EGLint egl_attribs_gles3[] = {
EGL_ATTRIBS_BASE, WL_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_NONE, EGL_NONE,
}; };
#endif #endif
static const EGLint egl_attribs_vg[] = { static const EGLint egl_attribs_vg[] = {
EGL_ATTRIBS_BASE, WL_EGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
EGL_NONE, EGL_NONE,
}; };

View File

@ -114,7 +114,9 @@ static void create_gl_context(HWND hwnd)
if (!g_hrc) if (!g_hrc)
{ {
g_hrc = wglCreateContext(g_hdc); g_hrc = wglCreateContext(g_hdc);
if (g_hrc && !core_context && !debug) // We'll create shared context later if not.
/* We'll create shared context later if not. */
if (g_hrc && !core_context && !debug)
{ {
g_hw_hrc = wglCreateContext(g_hdc); g_hw_hrc = wglCreateContext(g_hdc);
if (g_hw_hrc) if (g_hw_hrc)
@ -160,8 +162,10 @@ static void create_gl_context(HWND hwnd)
*aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB; *aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB;
*aptr++ = g_minor; *aptr++ = g_minor;
// Technically, we don't have core/compat until 3.2. /* Technically, we don't have core/compat until 3.2.
// Version 3.1 is either compat or not depending on GL_ARB_compatibility. * Version 3.1 is either compat or not depending
* on GL_ARB_compatibility.
*/
if ((g_major * 1000 + g_minor) >= 3002) if ((g_major * 1000 + g_minor) >= 3002)
{ {
*aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB; *aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB;
@ -178,7 +182,8 @@ static void create_gl_context(HWND hwnd)
*aptr = 0; *aptr = 0;
if (!pcreate_context) if (!pcreate_context)
pcreate_context = (wglCreateContextAttribsProc)wglGetProcAddress("wglCreateContextAttribsARB"); pcreate_context = (wglCreateContextAttribsProc)
wglGetProcAddress("wglCreateContextAttribsARB");
if (pcreate_context) if (pcreate_context)
{ {
@ -352,7 +357,8 @@ static void gfx_ctx_wgl_get_video_size(void *data, unsigned *width, unsigned *he
} }
} }
static BOOL CALLBACK monitor_enum_proc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) static BOOL CALLBACK monitor_enum_proc(HMONITOR hMonitor,
HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{ {
g_all_hms[g_num_mons++] = hMonitor; g_all_hms[g_num_mons++] = hMonitor;
return TRUE; return TRUE;
@ -378,7 +384,8 @@ static bool gfx_ctx_wgl_init(void *data)
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.lpszClassName = "RetroArch"; wndclass.lpszClassName = "RetroArch";
wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON)); wndclass.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON));
wndclass.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0); wndclass.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);
if (!RegisterClassEx(&wndclass)) if (!RegisterClassEx(&wndclass))
return false; return false;

View File

@ -179,6 +179,7 @@ bool x11_enter_fullscreen(Display *dpy, unsigned width,
unsigned height, XF86VidModeModeInfo *desktop_mode) unsigned height, XF86VidModeModeInfo *desktop_mode)
{ {
XF86VidModeModeInfo mode; XF86VidModeModeInfo mode;
if (get_video_mode(dpy, width, height, &mode, desktop_mode)) if (get_video_mode(dpy, width, height, &mode, desktop_mode))
{ {
if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), &mode)) if (XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), &mode))
@ -186,10 +187,8 @@ bool x11_enter_fullscreen(Display *dpy, unsigned width,
XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), 0, 0); XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), 0, 0);
return true; return true;
} }
else
return false;
} }
else
return false; return false;
} }

View File

@ -14,8 +14,9 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
// X/EGL context. Mostly used for testing GLES code paths. /* X/EGL context. Mostly used for testing GLES code paths.
// Should be its own file as it has lots of X11 stuff baked into it as well. * Should be its own file as it has lots of X11 stuff baked into it as well.
*/
#include "../../driver.h" #include "../../driver.h"
#include "../gfx_context.h" #include "../gfx_context.h"
@ -150,7 +151,7 @@ static void gfx_ctx_xegl_check_window(void *data, bool *quit,
XEvent event; XEvent event;
while (XPending(g_dpy)) while (XPending(g_dpy))
{ {
// Can get events from older windows. Check this. /* Can get events from older windows. Check this. */
XNextEvent(g_dpy, &event); XNextEvent(g_dpy, &event);
bool filter = XFilterEvent(&event, g_win); bool filter = XFilterEvent(&event, g_win);
@ -244,14 +245,7 @@ static void gfx_ctx_xegl_get_video_size(void *data,
} }
} }
static bool gfx_ctx_xegl_init(void *data) #define XEGL_ATTRIBS_BASE \
{
if (g_inited)
return false;
XInitThreads();
#define EGL_ATTRIBS_BASE \
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, \
EGL_RED_SIZE, 1, \ EGL_RED_SIZE, 1, \
EGL_GREEN_SIZE, 1, \ EGL_GREEN_SIZE, 1, \
@ -259,28 +253,35 @@ static bool gfx_ctx_xegl_init(void *data)
EGL_ALPHA_SIZE, 0, \ EGL_ALPHA_SIZE, 0, \
EGL_DEPTH_SIZE, 0 EGL_DEPTH_SIZE, 0
static bool gfx_ctx_xegl_init(void *data)
{
if (g_inited)
return false;
XInitThreads();
static const EGLint egl_attribs_gl[] = { static const EGLint egl_attribs_gl[] = {
EGL_ATTRIBS_BASE, XEGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE, EGL_NONE,
}; };
static const EGLint egl_attribs_gles[] = { static const EGLint egl_attribs_gles[] = {
EGL_ATTRIBS_BASE, XEGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE, EGL_NONE,
}; };
#ifdef EGL_KHR_create_context #ifdef EGL_KHR_create_context
static const EGLint egl_attribs_gles3[] = { static const EGLint egl_attribs_gles3[] = {
EGL_ATTRIBS_BASE, XEGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_NONE, EGL_NONE,
}; };
#endif #endif
static const EGLint egl_attribs_vg[] = { static const EGLint egl_attribs_vg[] = {
EGL_ATTRIBS_BASE, XEGL_ATTRIBS_BASE,
EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
EGL_NONE, EGL_NONE,
}; };
@ -308,8 +309,8 @@ static bool gfx_ctx_xegl_init(void *data)
g_quit = 0; g_quit = 0;
// Keep one g_dpy alive the entire process lifetime. /* Keep one g_dpy alive the entire process lifetime.
// This is necessary for nVidia's EGL implementation for now. * This is necessary for nVidia's EGL implementation for now. */
if (!g_dpy) if (!g_dpy)
{ {
g_dpy = XOpenDisplay(NULL); g_dpy = XOpenDisplay(NULL);
@ -376,8 +377,11 @@ static EGLint *egl_fill_attribs(EGLint *attr)
*attr++ = g_major; *attr++ = g_major;
*attr++ = EGL_CONTEXT_MINOR_VERSION_KHR; *attr++ = EGL_CONTEXT_MINOR_VERSION_KHR;
*attr++ = g_minor; *attr++ = g_minor;
// Technically, we don't have core/compat until 3.2.
// Version 3.1 is either compat or not depending on GL_ARB_compatibility. /* Technically, we don't have core/compat until 3.2.
* Version 3.1 is either compat or not depending
* on GL_ARB_compatibility.
*/
if (version >= 3002) if (version >= 3002)
{ {
*attr++ = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; *attr++ = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;
@ -396,7 +400,8 @@ static EGLint *egl_fill_attribs(EGLint *attr)
#endif #endif
case GFX_CTX_OPENGL_ES_API: case GFX_CTX_OPENGL_ES_API:
*attr++ = EGL_CONTEXT_CLIENT_VERSION; // Same as EGL_CONTEXT_MAJOR_VERSION /* Same as EGL_CONTEXT_MAJOR_VERSION. */
*attr++ = EGL_CONTEXT_CLIENT_VERSION;
*attr++ = g_major ? (EGLint)g_major : 2; *attr++ = g_major ? (EGLint)g_major : 2;
#ifdef EGL_KHR_create_context #ifdef EGL_KHR_create_context
if (g_minor > 0) if (g_minor > 0)
@ -534,21 +539,30 @@ static bool gfx_ctx_xegl_set_video_mode(void *data,
RARCH_LOG("[X/EGL]: Using true fullscreen.\n"); RARCH_LOG("[X/EGL]: Using true fullscreen.\n");
XMapRaised(g_dpy, g_win); XMapRaised(g_dpy, g_win);
} }
else if (fullscreen) // We attempted true fullscreen, but failed. Attempt using windowed fullscreen. else if (fullscreen)
{ {
/* We attempted true fullscreen, but failed.
* Attempt using windowed fullscreen. */
XMapRaised(g_dpy, g_win); XMapRaised(g_dpy, g_win);
RARCH_LOG("[X/EGL]: Using windowed fullscreen.\n"); RARCH_LOG("[X/EGL]: Using windowed fullscreen.\n");
// We have to move the window to the screen we want to go fullscreen on first.
// x_off and y_off usually get ignored in XCreateWindow(). /* We have to move the window to the screen we
* want to go fullscreen on first.
* x_off and y_off usually get ignored in XCreateWindow().
*/
x11_move_window(g_dpy, g_win, x_off, y_off, width, height); x11_move_window(g_dpy, g_win, x_off, y_off, width, height);
x11_windowed_fullscreen(g_dpy, g_win); x11_windowed_fullscreen(g_dpy, g_win);
} }
else else
{ {
XMapWindow(g_dpy, g_win); XMapWindow(g_dpy, g_win);
// If we want to map the window on a different screen, we'll have to do it by force.
// Otherwise, we should try to let the window manager sort it out. /* If we want to map the window on a different screen,
// x_off and y_off usually get ignored in XCreateWindow(). * we'll have to do it by force.
*
* Otherwise, we should try to let the window manager sort it out.
* x_off and y_off usually get ignored in XCreateWindow().
*/
if (g_screen) if (g_screen)
x11_move_window(g_dpy, g_win, x_off, y_off, width, height); x11_move_window(g_dpy, g_win, x_off, y_off, width, height);
} }
@ -562,7 +576,9 @@ static bool gfx_ctx_xegl_set_video_mode(void *data,
gfx_ctx_xegl_swap_interval(data, g_interval); gfx_ctx_xegl_swap_interval(data, g_interval);
// This can blow up on some drivers. It's not fatal, so override errors for this call. /* This can blow up on some drivers. It's not fatal,
* so override errors for this call.
*/
old_handler = XSetErrorHandler(nul_handler); old_handler = XSetErrorHandler(nul_handler);
XSetInputFocus(g_dpy, g_win, RevertToNone, CurrentTime); XSetInputFocus(g_dpy, g_win, RevertToNone, CurrentTime);
XSync(g_dpy, False); XSync(g_dpy, False);
@ -598,7 +614,8 @@ static void gfx_ctx_xegl_destroy(void *data)
{ {
if (g_egl_ctx) if (g_egl_ctx)
{ {
eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglMakeCurrent(g_egl_dpy, EGL_NO_SURFACE,
EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(g_egl_dpy, g_egl_ctx); eglDestroyContext(g_egl_dpy, g_egl_ctx);
} }
@ -618,7 +635,7 @@ static void gfx_ctx_xegl_destroy(void *data)
if (g_win) if (g_win)
{ {
// Save last used monitor for later. /* Save last used monitor for later. */
#ifdef HAVE_XINERAMA #ifdef HAVE_XINERAMA
XWindowAttributes target; XWindowAttributes target;
Window child; Window child;
@ -651,7 +668,9 @@ static void gfx_ctx_xegl_destroy(void *data)
g_should_reset_mode = false; g_should_reset_mode = false;
} }
// Do not close g_dpy. We'll keep one for the entire application lifecycle to work-around nVidia EGL limitations. /* Do not close g_dpy. We'll keep one for the entire application
* lifecycle to work-around nVidia EGL limitations.
*/
g_inited = false; g_inited = false;
} }
@ -729,7 +748,8 @@ static void gfx_ctx_xegl_bind_hw_render(void *data, bool enable)
(void)data; (void)data;
g_use_hw_ctx = enable; g_use_hw_ctx = enable;
if (g_egl_dpy && g_egl_surf) if (g_egl_dpy && g_egl_surf)
eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, enable ? g_egl_hw_ctx : g_egl_ctx); eglMakeCurrent(g_egl_dpy, g_egl_surf,
g_egl_surf, enable ? g_egl_hw_ctx : g_egl_ctx);
} }
const gfx_ctx_driver_t gfx_ctx_x_egl = { const gfx_ctx_driver_t gfx_ctx_x_egl = {