#include <xf86drm.h>
#include "egl_dri2.h"
+#include "egl_dri2_fallbacks.h"
+#include "loader.h"
#include <wayland-client.h>
#include "wayland-drm-client-protocol.h"
HAS_RGB565 = 4,
};
+static EGLBoolean
+dri2_wl_swap_interval(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
+ EGLint interval);
+
static void
sync_callback(void *data, struct wl_callback *callback, uint32_t serial)
{
* Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
*/
static _EGLSurface *
-dri2_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
- _EGLConfig *conf, EGLNativeWindowType window,
- const EGLint *attrib_list)
+dri2_wl_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
+ _EGLConfig *conf, EGLNativeWindowType window,
+ const EGLint *attrib_list)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
* Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface().
*/
static _EGLSurface *
-dri2_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
- _EGLConfig *conf, EGLNativeWindowType window,
- const EGLint *attrib_list)
+dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp,
+ _EGLConfig *conf, EGLNativeWindowType window,
+ const EGLint *attrib_list)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
_EGLSurface *surf;
- surf = dri2_create_surface(drv, disp, EGL_WINDOW_BIT, conf,
- window, attrib_list);
+ surf = dri2_wl_create_surface(drv, disp, EGL_WINDOW_BIT, conf,
+ window, attrib_list);
if (surf != NULL)
- drv->API.SwapInterval(drv, disp, surf, dri2_dpy->default_swap_interval);
+ dri2_wl_swap_interval(drv, disp, surf, dri2_dpy->default_swap_interval);
return surf;
}
* Called via eglDestroySurface(), drv->API.DestroySurface().
*/
static EGLBoolean
-dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
+dri2_wl_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
}
static void
-dri2_release_buffers(struct dri2_egl_surface *dri2_surf)
+dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
{
struct dri2_egl_display *dri2_dpy =
dri2_egl_display(dri2_surf->base.Resource.Display);
(dri2_surf->base.Width != dri2_surf->wl_win->width ||
dri2_surf->base.Height != dri2_surf->wl_win->height)) {
- dri2_release_buffers(dri2_surf);
+ dri2_wl_release_buffers(dri2_surf);
dri2_surf->base.Width = dri2_surf->wl_win->width;
dri2_surf->base.Height = dri2_surf->wl_win->height;
}
static __DRIbuffer *
-dri2_get_buffers_with_format(__DRIdrawable * driDrawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *out_count, void *loaderPrivate)
+dri2_wl_get_buffers_with_format(__DRIdrawable * driDrawable,
+ int *width, int *height,
+ unsigned int *attachments, int count,
+ int *out_count, void *loaderPrivate)
{
struct dri2_egl_surface *dri2_surf = loaderPrivate;
int i, j;
}
static __DRIbuffer *
-dri2_get_buffers(__DRIdrawable * driDrawable,
- int *width, int *height,
- unsigned int *attachments, int count,
- int *out_count, void *loaderPrivate)
+dri2_wl_get_buffers(__DRIdrawable * driDrawable,
+ int *width, int *height,
+ unsigned int *attachments, int count,
+ int *out_count, void *loaderPrivate)
{
unsigned int *attachments_with_format;
__DRIbuffer *buffer;
}
buffer =
- dri2_get_buffers_with_format(driDrawable,
- width, height,
- attachments_with_format, count,
- out_count, loaderPrivate);
+ dri2_wl_get_buffers_with_format(driDrawable,
+ width, height,
+ attachments_with_format, count,
+ out_count, loaderPrivate);
free(attachments_with_format);
}
static void
-dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
+dri2_wl_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate)
{
(void) driDrawable;
(void) loaderPrivate;
}
static const __DRIimageLoaderExtension image_loader_extension = {
- { __DRI_IMAGE_LOADER, 1 },
- image_get_buffers,
- dri2_flush_front_buffer
+ .base = { __DRI_IMAGE_LOADER, 1 },
+
+ .getBuffers = image_get_buffers,
+ .flushFrontBuffer = dri2_wl_flush_front_buffer,
};
static void
* Called via eglSwapBuffers(), drv->API.SwapBuffers().
*/
static EGLBoolean
-dri2_swap_buffers_with_damage(_EGLDriver *drv,
- _EGLDisplay *disp,
- _EGLSurface *draw,
- const EGLint *rects,
- EGLint n_rects)
+dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
+ _EGLDisplay *disp,
+ _EGLSurface *draw,
+ const EGLint *rects,
+ EGLint n_rects)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
}
static EGLint
-dri2_query_buffer_age(_EGLDriver *drv,
- _EGLDisplay *disp, _EGLSurface *surface)
+dri2_wl_query_buffer_age(_EGLDriver *drv,
+ _EGLDisplay *disp, _EGLSurface *surface)
{
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
}
static EGLBoolean
-dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
+dri2_wl_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
{
- return dri2_swap_buffers_with_damage (drv, disp, draw, NULL, 0);
+ return dri2_wl_swap_buffers_with_damage (drv, disp, draw, NULL, 0);
}
static struct wl_buffer *
-dri2_create_wayland_buffer_from_image_wl(_EGLDriver *drv,
- _EGLDisplay *disp,
- _EGLImage *img)
+dri2_wl_create_wayland_buffer_from_image_wl(_EGLDriver *drv,
+ _EGLDisplay *disp,
+ _EGLImage *img)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_image *dri2_img = dri2_egl_image(img);
}
static int
-dri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id)
+dri2_wl_authenticate(_EGLDisplay *disp, uint32_t id)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
int ret = 0;
* Called via eglTerminate(), drv->API.Terminate().
*/
static EGLBoolean
-dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
+dri2_wl_terminate(_EGLDriver *drv, _EGLDisplay *disp)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
};
static EGLBoolean
-dri2_swap_interval(_EGLDriver *drv,
+dri2_wl_swap_interval(_EGLDriver *drv,
_EGLDisplay *disp,
_EGLSurface *surf,
EGLint interval)
}
static void
-dri2_setup_swap_interval(struct dri2_egl_display *dri2_dpy)
+dri2_wl_setup_swap_interval(struct dri2_egl_display *dri2_dpy)
{
GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1;
}
}
+static struct dri2_egl_display_vtbl dri2_wl_display_vtbl = {
+ .authenticate = dri2_wl_authenticate,
+ .create_window_surface = dri2_wl_create_window_surface,
+ .create_pixmap_surface = dri2_fallback_create_pixmap_surface,
+ .create_pbuffer_surface = dri2_fallback_create_pbuffer_surface,
+ .destroy_surface = dri2_wl_destroy_surface,
+ .swap_interval = dri2_wl_swap_interval,
+ .swap_buffers = dri2_wl_swap_buffers,
+ .swap_buffers_with_damage = dri2_wl_swap_buffers_with_damage,
+ .swap_buffers_region = dri2_fallback_swap_buffers_region,
+ .copy_buffers = dri2_fallback_copy_buffers,
+ .query_buffer_age = dri2_wl_query_buffer_age,
+};
+
EGLBoolean
dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
{
static const unsigned int rgb_masks[4] = { 0xff0000, 0xff00, 0xff, 0 };
static const unsigned int rgb565_masks[4] = { 0xf800, 0x07e0, 0x001f, 0 };
- drv->API.CreateWindowSurface = dri2_create_window_surface;
- drv->API.DestroySurface = dri2_destroy_surface;
- drv->API.SwapBuffers = dri2_swap_buffers;
- drv->API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage;
- drv->API.SwapInterval = dri2_swap_interval;
- drv->API.Terminate = dri2_terminate;
- drv->API.QueryBufferAge = dri2_query_buffer_age;
+ loader_set_logger(_eglLog);
+
+ drv->API.Terminate = dri2_wl_terminate;
drv->API.CreateWaylandBufferFromImageWL =
- dri2_create_wayland_buffer_from_image_wl;
+ dri2_wl_create_wayland_buffer_from_image_wl;
dri2_dpy = calloc(1, sizeof *dri2_dpy);
if (!dri2_dpy)
if (roundtrip(dri2_dpy) < 0 || !dri2_dpy->authenticated)
goto cleanup_fd;
- dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd);
+ dri2_dpy->driver_name = loader_get_driver_for_fd(dri2_dpy->fd, 0);
if (dri2_dpy->driver_name == NULL) {
_eglError(EGL_BAD_ALLOC, "DRI2: failed to get driver name");
goto cleanup_fd;
dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
dri2_dpy->dri2_loader_extension.base.version = 3;
- dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers;
- dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer;
+ dri2_dpy->dri2_loader_extension.getBuffers = dri2_wl_get_buffers;
+ dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_wl_flush_front_buffer;
dri2_dpy->dri2_loader_extension.getBuffersWithFormat =
- dri2_get_buffers_with_format;
+ dri2_wl_get_buffers_with_format;
dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base;
dri2_dpy->extensions[1] = &image_loader_extension.base;
if (!dri2_create_screen(disp))
goto cleanup_driver;
- dri2_setup_swap_interval(dri2_dpy);
+ dri2_wl_setup_swap_interval(dri2_dpy);
/* The server shouldn't advertise WL_DRM_CAPABILITY_PRIME if the driver
* doesn't have createImageFromFds, since we're using the same driver on
disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
disp->Extensions.WL_create_wayland_buffer_from_image = EGL_TRUE;
disp->Extensions.EXT_buffer_age = EGL_TRUE;
- dri2_dpy->authenticate = dri2_wayland_authenticate;
disp->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
disp->VersionMajor = 1;
disp->VersionMinor = 4;
+ /* Fill vtbl last to prevent accidentally calling virtual function during
+ * initialization.
+ */
+ dri2_dpy->vtbl = &dri2_wl_display_vtbl;
+
return EGL_TRUE;
cleanup_driver: