mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-22 05:27:20 +00:00
[client] wayland: add ability to create OpenGL contexts
This should allow the OpenGL backend to work.
This commit is contained in:
parent
a56e363e39
commit
af2dafbdac
@ -31,11 +31,9 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
|
|
||||||
#ifdef ENABLE_EGL
|
#include <wayland-egl.h>
|
||||||
# include <wayland-egl.h>
|
#include "egl_dynprocs.h"
|
||||||
# include "egl_dynprocs.h"
|
#include <EGL/eglext.h>
|
||||||
# include <EGL/eglext.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
@ -68,6 +66,10 @@ struct WaylandDSState
|
|||||||
struct wl_egl_window * eglWindow;
|
struct wl_egl_window * eglWindow;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
EGLDisplay glDisplay;
|
||||||
|
EGLConfig glConfig;
|
||||||
|
EGLSurface glSurface;
|
||||||
|
|
||||||
struct xdg_wm_base * xdgWmBase;
|
struct xdg_wm_base * xdgWmBase;
|
||||||
struct xdg_surface * xdgSurface;
|
struct xdg_surface * xdgSurface;
|
||||||
struct xdg_toplevel * xdgToplevel;
|
struct xdg_toplevel * xdgToplevel;
|
||||||
@ -480,6 +482,8 @@ static bool waylandProbe(void)
|
|||||||
return getenv("WAYLAND_DISPLAY") != NULL;
|
return getenv("WAYLAND_DISPLAY") != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EGLDisplay waylandGetEGLDisplay(void);
|
||||||
|
|
||||||
static bool waylandInit(const LG_DSInitParams params)
|
static bool waylandInit(const LG_DSInitParams params)
|
||||||
{
|
{
|
||||||
memset(&wm, 0, sizeof(wm));
|
memset(&wm, 0, sizeof(wm));
|
||||||
@ -555,6 +559,52 @@ static bool waylandInit(const LG_DSInitParams params)
|
|||||||
wl_surface_commit(wm.cursor);
|
wl_surface_commit(wm.cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.opengl)
|
||||||
|
{
|
||||||
|
EGLint attr[] =
|
||||||
|
{
|
||||||
|
EGL_BUFFER_SIZE , 24,
|
||||||
|
EGL_CONFORMANT , EGL_OPENGL_BIT,
|
||||||
|
EGL_RENDERABLE_TYPE , EGL_OPENGL_BIT,
|
||||||
|
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
|
||||||
|
EGL_RED_SIZE , 8,
|
||||||
|
EGL_GREEN_SIZE , 8,
|
||||||
|
EGL_BLUE_SIZE , 8,
|
||||||
|
EGL_SAMPLE_BUFFERS , 0,
|
||||||
|
EGL_SAMPLES , 0,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
wm.glDisplay = waylandGetEGLDisplay();
|
||||||
|
|
||||||
|
int maj, min;
|
||||||
|
if (!eglInitialize(wm.glDisplay, &maj, &min))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Unable to initialize EGL");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wm.glDisplay == EGL_NO_DISPLAY)
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to get EGL display (eglError: 0x%x)", eglGetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLint num_config;
|
||||||
|
if (!eglChooseConfig(wm.glDisplay, attr, &wm.glConfig, 1, &num_config))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to choose config (eglError: 0x%x)", eglGetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wm.glSurface = eglCreateWindowSurface(wm.glDisplay, wm.glConfig, wm.eglWindow, NULL);
|
||||||
|
if (wm.glSurface == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to create EGL surface (eglError: 0x%x)", eglGetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wm.width = params.w;
|
wm.width = params.w;
|
||||||
wm.height = params.h;
|
wm.height = params.h;
|
||||||
|
|
||||||
@ -569,7 +619,6 @@ static void waylandShutdown(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_EGL
|
|
||||||
static EGLDisplay waylandGetEGLDisplay(void)
|
static EGLDisplay waylandGetEGLDisplay(void)
|
||||||
{
|
{
|
||||||
EGLNativeDisplayType native = (EGLNativeDisplayType) wm.display;
|
EGLNativeDisplayType native = (EGLNativeDisplayType) wm.display;
|
||||||
@ -594,10 +643,12 @@ static EGLDisplay waylandGetEGLDisplay(void)
|
|||||||
return eglGetDisplay(native);
|
return eglGetDisplay(native);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_EGL
|
||||||
static EGLNativeWindowType waylandGetEGLNativeWindow(void)
|
static EGLNativeWindowType waylandGetEGLNativeWindow(void)
|
||||||
{
|
{
|
||||||
return (EGLNativeWindowType) wm.eglWindow;
|
return (EGLNativeWindowType) wm.eglWindow;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface)
|
static void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface)
|
||||||
{
|
{
|
||||||
@ -617,31 +668,30 @@ static void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface)
|
|||||||
wm.resizeSerial = 0;
|
wm.resizeSerial = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static LG_DSGLContext waylandGLCreateContext(void)
|
static LG_DSGLContext waylandGLCreateContext(void)
|
||||||
{
|
{
|
||||||
return NULL;
|
eglBindAPI(EGL_OPENGL_API);
|
||||||
|
return eglCreateContext(wm.glDisplay, wm.glConfig, EGL_NO_CONTEXT, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void waylandGLDeleteContext(LG_DSGLContext context)
|
static void waylandGLDeleteContext(LG_DSGLContext context)
|
||||||
{
|
{
|
||||||
// FIXME: implement.
|
eglDestroyContext(wm.glDisplay, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void waylandGLMakeCurrent(LG_DSGLContext context)
|
static void waylandGLMakeCurrent(LG_DSGLContext context)
|
||||||
{
|
{
|
||||||
// FIXME: implement.
|
eglMakeCurrent(wm.glDisplay, wm.glSurface, wm.glSurface, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void waylandGLSetSwapInterval(int interval)
|
static void waylandGLSetSwapInterval(int interval)
|
||||||
{
|
{
|
||||||
// FIXME: implement.
|
eglSwapInterval(wm.glDisplay, interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void waylandGLSwapBuffers(void)
|
static void waylandGLSwapBuffers(void)
|
||||||
{
|
{
|
||||||
// FIXME: implement.
|
waylandEGLSwapBuffers(wm.glDisplay, wm.glSurface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void waylandShowPointer(bool show)
|
static void waylandShowPointer(bool show)
|
||||||
|
Loading…
Reference in New Issue
Block a user