winewayland.drv: Implement wglDescribePixelFormat.
Create an array of supported EGLConfigs, and use this information to populate the PIXELFORMATDESCRIPTOR.
This commit is contained in:
parent
d47220a23c
commit
825ec8c597
1 changed files with 120 additions and 0 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "waylanddrv.h"
|
#include "waylanddrv.h"
|
||||||
|
@ -45,12 +46,16 @@ static void *egl_handle;
|
||||||
static struct opengl_funcs opengl_funcs;
|
static struct opengl_funcs opengl_funcs;
|
||||||
static EGLDisplay egl_display;
|
static EGLDisplay egl_display;
|
||||||
static char wgl_extensions[4096];
|
static char wgl_extensions[4096];
|
||||||
|
static EGLConfig *egl_configs;
|
||||||
|
static int num_egl_configs;
|
||||||
|
|
||||||
#define USE_GL_FUNC(name) #name,
|
#define USE_GL_FUNC(name) #name,
|
||||||
static const char *opengl_func_names[] = { ALL_WGL_FUNCS };
|
static const char *opengl_func_names[] = { ALL_WGL_FUNCS };
|
||||||
#undef USE_GL_FUNC
|
#undef USE_GL_FUNC
|
||||||
|
|
||||||
#define DECL_FUNCPTR(f) static typeof(f) * p_##f
|
#define DECL_FUNCPTR(f) static typeof(f) * p_##f
|
||||||
|
DECL_FUNCPTR(eglChooseConfig);
|
||||||
|
DECL_FUNCPTR(eglGetConfigAttrib);
|
||||||
DECL_FUNCPTR(eglGetError);
|
DECL_FUNCPTR(eglGetError);
|
||||||
DECL_FUNCPTR(eglGetPlatformDisplay);
|
DECL_FUNCPTR(eglGetPlatformDisplay);
|
||||||
DECL_FUNCPTR(eglGetProcAddress);
|
DECL_FUNCPTR(eglGetProcAddress);
|
||||||
|
@ -58,6 +63,63 @@ DECL_FUNCPTR(eglInitialize);
|
||||||
DECL_FUNCPTR(eglQueryString);
|
DECL_FUNCPTR(eglQueryString);
|
||||||
#undef DECL_FUNCPTR
|
#undef DECL_FUNCPTR
|
||||||
|
|
||||||
|
static BOOL has_opengl(void);
|
||||||
|
|
||||||
|
static int wayland_wglDescribePixelFormat(HDC hdc, int fmt, UINT size,
|
||||||
|
PIXELFORMATDESCRIPTOR *pfd)
|
||||||
|
{
|
||||||
|
EGLint val;
|
||||||
|
EGLConfig config;
|
||||||
|
|
||||||
|
if (!has_opengl()) return 0;
|
||||||
|
if (!pfd) return num_egl_configs;
|
||||||
|
if (size < sizeof(*pfd)) return 0;
|
||||||
|
if (fmt <= 0 || fmt > num_egl_configs) return 0;
|
||||||
|
|
||||||
|
config = egl_configs[fmt - 1];
|
||||||
|
|
||||||
|
memset(pfd, 0, sizeof(*pfd));
|
||||||
|
pfd->nSize = sizeof(*pfd);
|
||||||
|
pfd->nVersion = 1;
|
||||||
|
pfd->dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER |
|
||||||
|
PFD_SUPPORT_COMPOSITION;
|
||||||
|
pfd->iPixelType = PFD_TYPE_RGBA;
|
||||||
|
pfd->iLayerType = PFD_MAIN_PLANE;
|
||||||
|
|
||||||
|
/* Although the documentation describes cColorBits as excluding alpha, real
|
||||||
|
* drivers tend to return the full pixel size, so do the same. */
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_BUFFER_SIZE, &val);
|
||||||
|
pfd->cColorBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_RED_SIZE, &val);
|
||||||
|
pfd->cRedBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_GREEN_SIZE, &val);
|
||||||
|
pfd->cGreenBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_BLUE_SIZE, &val);
|
||||||
|
pfd->cBlueBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_ALPHA_SIZE, &val);
|
||||||
|
pfd->cAlphaBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_DEPTH_SIZE, &val);
|
||||||
|
pfd->cDepthBits = val;
|
||||||
|
p_eglGetConfigAttrib(egl_display, config, EGL_STENCIL_SIZE, &val);
|
||||||
|
pfd->cStencilBits = val;
|
||||||
|
|
||||||
|
/* Although we don't get information from EGL about the component shifts
|
||||||
|
* or the native format, the 0xARGB order is the most common. */
|
||||||
|
pfd->cBlueShift = 0;
|
||||||
|
pfd->cGreenShift = pfd->cBlueBits;
|
||||||
|
pfd->cRedShift = pfd->cGreenBits + pfd->cBlueBits;
|
||||||
|
if (pfd->cAlphaBits)
|
||||||
|
pfd->cAlphaShift = pfd->cRedBits + pfd->cGreenBits + pfd->cBlueBits;
|
||||||
|
else
|
||||||
|
pfd->cAlphaShift = 0;
|
||||||
|
|
||||||
|
TRACE("fmt %u color %u %u/%u/%u/%u depth %u stencil %u\n",
|
||||||
|
fmt, pfd->cColorBits, pfd->cRedBits, pfd->cGreenBits, pfd->cBlueBits,
|
||||||
|
pfd->cAlphaBits, pfd->cDepthBits, pfd->cStencilBits);
|
||||||
|
|
||||||
|
return num_egl_configs;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *wayland_wglGetExtensionsStringARB(HDC hdc)
|
static const char *wayland_wglGetExtensionsStringARB(HDC hdc)
|
||||||
{
|
{
|
||||||
TRACE("() returning \"%s\"\n", wgl_extensions);
|
TRACE("() returning \"%s\"\n", wgl_extensions);
|
||||||
|
@ -120,6 +182,60 @@ static BOOL init_opengl_funcs(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL init_egl_configs(void)
|
||||||
|
{
|
||||||
|
EGLint i;
|
||||||
|
const EGLint attribs[] =
|
||||||
|
{
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
p_eglChooseConfig(egl_display, attribs, NULL, 0, &num_egl_configs);
|
||||||
|
if (!(egl_configs = malloc(num_egl_configs * sizeof(*egl_configs))))
|
||||||
|
{
|
||||||
|
ERR("Failed to allocate memory for EGL configs\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!p_eglChooseConfig(egl_display, attribs, egl_configs, num_egl_configs,
|
||||||
|
&num_egl_configs) ||
|
||||||
|
!num_egl_configs)
|
||||||
|
{
|
||||||
|
free(egl_configs);
|
||||||
|
egl_configs = NULL;
|
||||||
|
num_egl_configs = 0;
|
||||||
|
ERR("Failed to get any configs from eglChooseConfig\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TRACE_ON(waylanddrv))
|
||||||
|
{
|
||||||
|
for (i = 0; i < num_egl_configs; i++)
|
||||||
|
{
|
||||||
|
EGLint id, type, visual_id, native, render, color, r, g, b, a, d, s;
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_VISUAL_ID, &visual_id);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_SURFACE_TYPE, &type);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RENDERABLE_TYPE, &render);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_CONFIG_ID, &id);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_NATIVE_RENDERABLE, &native);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_COLOR_BUFFER_TYPE, &color);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_RED_SIZE, &r);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_GREEN_SIZE, &g);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_BLUE_SIZE, &b);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_ALPHA_SIZE, &a);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_DEPTH_SIZE, &d);
|
||||||
|
p_eglGetConfigAttrib(egl_display, egl_configs[i], EGL_STENCIL_SIZE, &s);
|
||||||
|
TRACE("%u: config %d id %d type %x visual %d native %d render %x "
|
||||||
|
"colortype %d rgba %d,%d,%d,%d depth %u stencil %d\n",
|
||||||
|
num_egl_configs, i, id, type, visual_id, native, render,
|
||||||
|
color, r, g, b, a, d, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void init_opengl(void)
|
static void init_opengl(void)
|
||||||
{
|
{
|
||||||
EGLint egl_version[2];
|
EGLint egl_version[2];
|
||||||
|
@ -156,6 +272,8 @@ static void init_opengl(void)
|
||||||
if (!(p_##func = (void *)p_eglGetProcAddress(#func))) \
|
if (!(p_##func = (void *)p_eglGetProcAddress(#func))) \
|
||||||
{ ERR("Failed to load symbol %s\n", #func); goto err; } \
|
{ ERR("Failed to load symbol %s\n", #func); goto err; } \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
LOAD_FUNCPTR_EGL(eglChooseConfig);
|
||||||
|
LOAD_FUNCPTR_EGL(eglGetConfigAttrib);
|
||||||
LOAD_FUNCPTR_EGL(eglGetError);
|
LOAD_FUNCPTR_EGL(eglGetError);
|
||||||
LOAD_FUNCPTR_EGL(eglGetPlatformDisplay);
|
LOAD_FUNCPTR_EGL(eglGetPlatformDisplay);
|
||||||
LOAD_FUNCPTR_EGL(eglInitialize);
|
LOAD_FUNCPTR_EGL(eglInitialize);
|
||||||
|
@ -177,6 +295,7 @@ static void init_opengl(void)
|
||||||
TRACE("EGL version %u.%u\n", egl_version[0], egl_version[1]);
|
TRACE("EGL version %u.%u\n", egl_version[0], egl_version[1]);
|
||||||
|
|
||||||
if (!init_opengl_funcs()) goto err;
|
if (!init_opengl_funcs()) goto err;
|
||||||
|
if (!init_egl_configs()) goto err;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -196,6 +315,7 @@ static struct opengl_funcs opengl_funcs =
|
||||||
{
|
{
|
||||||
.wgl =
|
.wgl =
|
||||||
{
|
{
|
||||||
|
.p_wglDescribePixelFormat = wayland_wglDescribePixelFormat,
|
||||||
.p_wglGetProcAddress = wayland_wglGetProcAddress,
|
.p_wglGetProcAddress = wayland_wglGetProcAddress,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue