diff --git a/Makefile b/Makefile
index 277bfdbb5f..4060c77936 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
diff --git a/gfx/context/drm_egl_ctx.c b/gfx/context/drm_egl_ctx.c
index cf4980d420..6b3988b8c4 100644
--- a/gfx/context/drm_egl_ctx.c
+++ b/gfx/context/drm_egl_ctx.c
@@ -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;
 
diff --git a/gfx/context/vc_egl_ctx.c b/gfx/context/vc_egl_ctx.c
index 901b79b6d0..2350141ec3 100644
--- a/gfx/context/vc_egl_ctx.c
+++ b/gfx/context/vc_egl_ctx.c
@@ -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;
 }
diff --git a/gfx/context/xegl_ctx.c b/gfx/context/xegl_ctx.c
index 5266cb7a92..a14523f086 100644
--- a/gfx/context/xegl_ctx.c
+++ b/gfx/context/xegl_ctx.c
@@ -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;
 
diff --git a/gfx/gfx_context.c b/gfx/gfx_context.c
index 0341e48a2c..b128ea080f 100644
--- a/gfx/gfx_context.c
+++ b/gfx/gfx_context.c
@@ -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;
 }
-
diff --git a/gfx/vg.c b/gfx/vg.c
index ba2539bbb7..51332c57b3 100644
--- a/gfx/vg.c
+++ b/gfx/vg.c
@@ -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 = {