debian/changelog | 21 debian/control | 14 debian/libegl1-mesa-drivers.install.linux.in | 2 debian/libegl1-mesa.symbols | 1 debian/libgbm1.install.in | 2 debian/libgl1-mesa-dri.install.in | 4 debian/libopenvg1-mesa-dev.install.in | 6 debian/libopenvg1-mesa.install.in | 2 debian/patches/aarch64.diff | 12 debian/patches/egl-platform-mir.patch | 1550 +++++++++++++++++++++++++++ debian/patches/series | 3 debian/rules | 37 12 files changed, 1632 insertions(+), 22 deletions(-)
New commits: commit fdefb253e21e87ca5c4310168f454d0433e62e3c Author: Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> Date: Fri Aug 2 20:43:44 2013 +1000 Add Mir EGL platform patch diff --git a/debian/changelog b/debian/changelog index 4c58b09..a16a96b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +mesa (9.1.4-0ubuntu6) saucy; urgency=low + + * Add Mir EGL platform + + -- Christopher James Halse Rogers <r...@ubuntu.com> Fri, 02 Aug 2013 13:30:23 +1000 + mesa (9.1.4-0ubuntu5) saucy; urgency=low * Fix the build on Aarch64, disabling most of the acceleration diff --git a/debian/control b/debian/control index e6f4449..f7c2d41 100644 --- a/debian/control +++ b/debian/control @@ -33,6 +33,7 @@ Build-Depends: bison, llvm-3.2-dev (>= 1:3.2repack-7~) [amd64 i386 kfreebsd-amd64 kfreebsd-i386 armhf powerpc], libwayland-dev (>= 1.0.2) [linux-any], + libmirclient-dev [linux-any], Vcs-Git: git://git.debian.org/git/pkg-xorg/lib/mesa Vcs-Browser: http://git.debian.org/?p=pkg-xorg/lib/mesa.git Homepage: http://mesa3d.sourceforge.net/ @@ -183,6 +184,7 @@ Depends: libxcb-glx0-dev, libxcb-dri2-0-dev, libx11-xcb-dev, + libmirclient-dev [linux-any], ${misc:Depends}, Description: free implementation of the EGL API -- development files This package contains the development environment required for compiling diff --git a/debian/libegl1-mesa.symbols b/debian/libegl1-mesa.symbols index 0f89904..3af6509 100644 --- a/debian/libegl1-mesa.symbols +++ b/debian/libegl1-mesa.symbols @@ -9,6 +9,7 @@ libEGL.so.1 libegl1-mesa #MINVER# | libegl1-x11 (arch=linux-any)dri2_get_device_name_for_fd@Base 8.1~0 (arch=linux-any)dri2_get_driver_for_fd@Base 8.1~0 (arch=linux-any)dri2_initialize_drm@Base 8.1~0 + (arch=linux-any)dri2_initialize_mir@Base 9.1.4-0ubuntu6~ (arch=linux-any)dri2_initialize_wayland@Base 8.1~0 dri2_initialize_x11@Base 8.1~0 dri2_load_driver@Base 8.1~0 diff --git a/debian/patches/egl-platform-mir.patch b/debian/patches/egl-platform-mir.patch new file mode 100644 index 0000000..58c69b4 --- /dev/null +++ b/debian/patches/egl-platform-mir.patch @@ -0,0 +1,1550 @@ +Index: mesa/configure.ac +=================================================================== +--- mesa.orig/configure.ac 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/configure.ac 2013-08-02 13:52:39.893145977 +1000 +@@ -1547,7 +1547,9 @@ + + android|gdi) + ;; +- ++ mir) ++ PKG_CHECK_MODULES([MIR], [mirclient]) ++ ;; + *) + AC_MSG_ERROR([EGL platform '$plat' does not exist]) + ;; +@@ -1575,6 +1577,7 @@ + AM_CONDITIONAL(HAVE_EGL_PLATFORM_DRM, echo "$egl_platforms" | grep 'drm' >/dev/null 2>&1) + AM_CONDITIONAL(HAVE_EGL_PLATFORM_FBDEV, echo "$egl_platforms" | grep 'fbdev' >/dev/null 2>&1) + AM_CONDITIONAL(HAVE_EGL_PLATFORM_NULL, echo "$egl_platforms" | grep 'null' >/dev/null 2>&1) ++AM_CONDITIONAL(HAVE_EGL_PLATFORM_MIR, echo "$egl_platforms" | grep 'mir' >/dev/null 2>&1) + + AM_CONDITIONAL(HAVE_EGL_DRIVER_DRI2, test "x$HAVE_EGL_DRIVER_DRI2" != "x") + AM_CONDITIONAL(HAVE_EGL_DRIVER_GLX, test "x$HAVE_EGL_DRIVER_GLX" != "x") +Index: mesa/include/EGL/eglplatform.h +=================================================================== +--- mesa.orig/include/EGL/eglplatform.h 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/include/EGL/eglplatform.h 2013-08-02 13:52:39.893145977 +1000 +@@ -104,6 +104,13 @@ + typedef struct egl_native_pixmap_t *EGLNativePixmapType; + typedef void *EGLNativeDisplayType; + ++#elif defined(MIR_EGL_PLATFORM) ++ ++#include <mir_toolkit/mir_client_library.h> ++typedef MirEGLNativeDisplayType EGLNativeDisplayType; ++typedef void *EGLNativePixmapType; ++typedef MirEGLNativeWindowType EGLNativeWindowType; ++ + #elif defined(__unix__) + + #ifdef MESA_EGL_NO_X11_HEADERS +Index: mesa/include/GL/internal/dri_interface.h +=================================================================== +--- mesa.orig/include/GL/internal/dri_interface.h 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/include/GL/internal/dri_interface.h 2013-08-02 13:52:39.893145977 +1000 +@@ -766,10 +766,12 @@ + unsigned int pitch; + unsigned int cpp; + unsigned int flags; ++ unsigned int fd; /**< Only available with DRI2_LOADER_VERSION >= 4, */ ++ /**< Only valid if name == 0 */ + }; + + #define __DRI_DRI2_LOADER "DRI_DRI2Loader" +-#define __DRI_DRI2_LOADER_VERSION 3 ++#define __DRI_DRI2_LOADER_VERSION 4 + struct __DRIdri2LoaderExtensionRec { + __DRIextension base; + +@@ -1021,6 +1023,9 @@ + #define __DRI_IMAGE_ATTRIB_WIDTH 0x2004 /* available in versions 4+ */ + #define __DRI_IMAGE_ATTRIB_HEIGHT 0x2005 + #define __DRI_IMAGE_ATTRIB_COMPONENTS 0x2006 /* available in versions 5+ */ ++#define __DRI_IMAGE_ATTRIB_FD 0x2007 /* available in versions ++ * 7+. Each query will return a ++ * new fd. */ + + typedef struct __DRIimageRec __DRIimage; + typedef struct __DRIimageExtensionRec __DRIimageExtension; +Index: mesa/src/egl/drivers/dri2/Makefile.am +=================================================================== +--- mesa.orig/src/egl/drivers/dri2/Makefile.am 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/drivers/dri2/Makefile.am 2013-08-02 13:52:39.893145977 +1000 +@@ -62,3 +62,9 @@ + libegl_dri2_la_SOURCES += platform_drm.c + AM_CFLAGS += -DHAVE_DRM_PLATFORM + endif ++ ++if HAVE_EGL_PLATFORM_MIR ++libegl_dri2_la_SOURCES += platform_mir.c ++AM_CFLAGS += -DHAVE_MIR_PLATFORM ++AM_CFLAGS += $(MIR_CFLAGS) ++endif +Index: mesa/src/egl/drivers/dri2/egl_dri2.c +=================================================================== +--- mesa.orig/src/egl/drivers/dri2/egl_dri2.c 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/drivers/dri2/egl_dri2.c 2013-08-02 13:52:39.897145977 +1000 +@@ -594,6 +594,12 @@ + return EGL_TRUE; + return dri2_initialize_wayland(drv, disp); + #endif ++#ifdef HAVE_MIR_PLATFORM ++ case _EGL_PLATFORM_MIR: ++ if (disp->Options.TestOnly) ++ return EGL_TRUE; ++ return dri2_initialize_mir(drv, disp); ++#endif + #endif + #ifdef HAVE_ANDROID_PLATFORM + case _EGL_PLATFORM_ANDROID: +Index: mesa/src/egl/drivers/dri2/egl_dri2.h +=================================================================== +--- mesa.orig/src/egl/drivers/dri2/egl_dri2.h 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/drivers/dri2/egl_dri2.h 2013-08-02 13:52:39.897145977 +1000 +@@ -65,6 +65,11 @@ + + #endif /* HAVE_ANDROID_PLATFORM */ + ++#ifdef HAVE_MIR_PLATFORM ++#include <mir_toolkit/mir_client_library.h> ++#include <mir_toolkit/mesa/native_display.h> ++#endif ++ + #include "eglconfig.h" + #include "eglcontext.h" + #include "egldisplay.h" +@@ -134,6 +139,10 @@ + int formats; + #endif + ++#ifdef HAVE_MIR_PLATFORM ++ MirMesaEGLNativeDisplay *mir_disp; ++#endif ++ + int (*authenticate) (_EGLDisplay *disp, uint32_t id); + }; + +@@ -182,7 +191,9 @@ + struct gbm_dri_surface *gbm_surf; + #endif + +-#if defined(HAVE_WAYLAND_PLATFORM) || defined(HAVE_DRM_PLATFORM) ++#if defined(HAVE_WAYLAND_PLATFORM) \ ++ || defined(HAVE_DRM_PLATFORM) \ ++ || defined(HAVE_MIR_PLATFORM) + __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT]; + struct { + #ifdef HAVE_WAYLAND_PLATFORM +@@ -204,6 +215,10 @@ + /* EGL-owned buffers */ + __DRIbuffer *local_buffers[__DRI_BUFFER_COUNT]; + #endif ++ ++#ifdef HAVE_MIR_PLATFORM ++ MirMesaEGLNativeSurface *mir_surf; ++#endif + }; + + +@@ -265,6 +280,9 @@ + EGLBoolean + dri2_initialize_android(_EGLDriver *drv, _EGLDisplay *disp); + ++EGLBoolean ++dri2_initialize_mir(_EGLDriver *drv, _EGLDisplay *disp); ++ + char * + dri2_get_driver_for_fd(int fd); + char * +Index: mesa/src/egl/drivers/dri2/platform_mir.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ mesa/src/egl/drivers/dri2/platform_mir.c 2013-08-02 13:52:39.897145977 +1000 +@@ -0,0 +1,349 @@ ++/* ++ * Copyright © 2012 Canonical, Inc ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT ++ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, ++ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Authors: ++ * Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> ++ */ ++ ++#include <mir_toolkit/mesa/native_display.h> ++ ++#include "egl_dri2.h" ++ ++#include <stdlib.h> ++#include <string.h> ++ ++static __DRIbuffer * ++dri2_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; ++ struct dri2_egl_display *dri2_dpy = ++ dri2_egl_display(dri2_surf->base.Resource.Display); ++ int i; ++ ++ dri2_surf->buffer_count = 0; ++ for (i = 0; i < 2*count; i+=2) { ++ assert(attachments[i] < __DRI_BUFFER_COUNT); ++ assert(dri2_surf->buffer_count < 5); ++ ++ if (dri2_surf->dri_buffers[attachments[i]] == NULL) { ++ /* Our frame callback must keep these buffers valid */ ++ assert(attachments[i] != __DRI_BUFFER_FRONT_LEFT); ++ assert(attachments[i] != __DRI_BUFFER_BACK_LEFT); ++ ++ dri2_surf->dri_buffers[attachments[i]] = ++ dri2_dpy->dri2->allocateBuffer(dri2_dpy->dri_screen, ++ attachments[i], attachments[i+1], ++ dri2_surf->base.Width, dri2_surf->base.Height); ++ ++ if (!dri2_surf->dri_buffers[attachments[i]]) ++ continue; ++ } ++ ++ memcpy(&dri2_surf->buffers[dri2_surf->buffer_count], ++ dri2_surf->dri_buffers[attachments[i]], ++ sizeof(__DRIbuffer)); ++ ++ dri2_surf->buffer_count++; ++ } ++ ++ assert(dri2_surf->base.Type == EGL_PIXMAP_BIT || ++ dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]); ++ ++ *out_count = dri2_surf->buffer_count; ++ if (dri2_surf->buffer_count == 0) ++ return NULL; ++ ++ *width = dri2_surf->base.Width; ++ *height = dri2_surf->base.Height; ++ ++ return dri2_surf->buffers; ++} ++ ++static __DRIbuffer * ++dri2_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; ++ const unsigned int format = 32; ++ int i; ++ ++ attachments_with_format = calloc(count * 2, sizeof(unsigned int)); ++ if (!attachments_with_format) { ++ *out_count = 0; ++ return NULL; ++ } ++ ++ for (i = 0; i < count; ++i) { ++ attachments_with_format[2*i] = attachments[i]; ++ attachments_with_format[2*i + 1] = format; ++ } ++ ++ buffer = ++ dri2_get_buffers_with_format(driDrawable, ++ width, height, ++ attachments_with_format, count, ++ out_count, loaderPrivate); ++ ++ free(attachments_with_format); ++ ++ return buffer; ++} ++ ++ ++static void ++dri2_flush_front_buffer(__DRIdrawable * driDrawable, void *loaderPrivate) ++{ ++ (void) driDrawable; ++ ++ /* FIXME: Does EGL support front buffer rendering at all? */ ++ ++#if 0 ++ struct dri2_egl_surface *dri2_surf = loaderPrivate; ++ ++ dri2WaitGL(dri2_surf); ++#else ++ (void) loaderPrivate; ++#endif ++} ++ ++static EGLBoolean ++mir_advance_colour_buffer(struct dri2_egl_surface *surf) ++{ ++ MirBufferPackage buffer_package; ++ if(!surf->mir_surf->surface_advance_buffer(surf->mir_surf, &buffer_package)) ++ return EGL_FALSE; ++ ++ /* We expect no data items, and (for the moment) one PRIME fd */ ++ assert(buffer_package.data_items == 0); ++ assert(buffer_package.fd_items == 1); ++ ++ surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->name = 0; ++ surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->fd = buffer_package.fd[0]; ++ surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->pitch = buffer_package.stride; ++ return EGL_TRUE; ++} ++ ++/** ++ * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). ++ */ ++static _EGLSurface * ++dri2_create_mir_window_surface(_EGLDriver *drv, _EGLDisplay *disp, ++ _EGLConfig *conf, EGLNativeWindowType window, ++ const EGLint *attrib_list) ++{ ++ int rc; ++ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); ++ struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); ++ struct dri2_egl_surface *dri2_surf; ++ MirSurfaceParameters surf_params; ++ ++ (void) drv; ++ ++ dri2_surf = calloc(1, sizeof *dri2_surf); ++ if (!dri2_surf) { ++ _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); ++ return NULL; ++ } ++ ++ if (!_eglInitSurface(&dri2_surf->base, disp, EGL_WINDOW_BIT, conf, attrib_list)) ++ goto cleanup_surf; ++ ++ dri2_surf->mir_surf = window; ++ if (!dri2_surf->mir_surf->surface_get_parameters(dri2_surf->mir_surf, &surf_params)) ++ goto cleanup_surf; ++ ++ dri2_surf->base.Width = surf_params.width; ++ dri2_surf->base.Height = surf_params.height; ++ ++ dri2_surf->dri_buffers[__DRI_BUFFER_FRONT_LEFT] = ++ calloc(sizeof(*dri2_surf->dri_buffers[0]), 1); ++ dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT] = ++ calloc(sizeof(*dri2_surf->dri_buffers[0]), 1); ++ ++ dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->attachment = ++ __DRI_BUFFER_BACK_LEFT; ++ /* We only do ARGB 8888 for the moment */ ++ dri2_surf->dri_buffers[__DRI_BUFFER_BACK_LEFT]->cpp = 4; ++ ++ if(!mir_advance_colour_buffer(dri2_surf)) ++ goto cleanup_surf; ++ ++ dri2_surf->dri_drawable = ++ (*dri2_dpy->dri2->createNewDrawable) (dri2_dpy->dri_screen, ++ dri2_conf->dri_double_config, ++ dri2_surf); ++ ++ if (dri2_surf->dri_drawable == NULL) { ++ _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); ++ } ++ ++ return &dri2_surf->base; ++ ++cleanup_surf: ++ free(dri2_surf); ++ return NULL; ++} ++ ++static EGLBoolean ++dri2_destroy_mir_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); ++ int i; ++ ++ (void) drv; ++ ++ if (!_eglPutSurface(surf)) ++ return EGL_TRUE; ++ ++ (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); ++ ++ for (i = 0; i < __DRI_BUFFER_COUNT; ++i) { ++ if (dri2_surf->dri_buffers[i] && !((i == __DRI_BUFFER_FRONT_LEFT) || ++ (i == __DRI_BUFFER_BACK_LEFT))) { ++ dri2_dpy->dri2->releaseBuffer(dri2_dpy->dri_screen, ++ dri2_surf->dri_buffers[i]); ++ } ++ } ++ ++ free(surf); ++ ++ return EGL_TRUE; ++} ++ ++/** ++ * Called via eglSwapInterval(), drv->API.SwapInterval(). ++ */ ++static EGLBoolean ++dri2_set_swap_interval(_EGLDriver *drv, _EGLDisplay *disp, ++ _EGLSurface *surf, EGLint interval) ++{ ++ struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); ++ if(!dri2_surf->mir_surf->surface_set_swapinterval(dri2_surf->mir_surf, interval)) ++ return EGL_FALSE; ++ return EGL_TRUE; ++} ++ ++/** ++ * Called via eglSwapBuffers(), drv->API.SwapBuffers(). ++ */ ++static EGLBoolean ++dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw) ++{ ++ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); ++ struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); ++ struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); ++ ++ (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable); ++ ++ int rc = mir_advance_colour_buffer(dri2_surf); ++ ++ (*dri2_dpy->flush->invalidate)(dri2_surf->dri_drawable); ++ ++ return rc; ++} ++ ++static int ++dri2_mir_authenticate(_EGLDisplay *disp, uint32_t id) ++{ ++ return 0; ++} ++ ++EGLBoolean ++dri2_initialize_mir(_EGLDriver *drv, _EGLDisplay *disp) ++{ ++ struct dri2_egl_display *dri2_dpy; ++ MirPlatformPackage platform; ++ const __DRIconfig *config; ++ static const unsigned int argb_masks[4] = ++ { 0xff0000, 0xff00, 0xff, 0xff000000 }; ++ uint32_t types; ++ int i; ++ ++ drv->API.CreateWindowSurface = dri2_create_mir_window_surface; ++ drv->API.DestroySurface = dri2_destroy_mir_surface; ++ drv->API.SwapBuffers = dri2_swap_buffers; ++ drv->API.SwapInterval = dri2_set_swap_interval; ++/* drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; ++ drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface; ++ drv->API.CopyBuffers = dri2_copy_buffers; ++ drv->API.CreateImageKHR = dri2_x11_create_image_khr; ++*/ ++ ++ dri2_dpy = calloc(1, sizeof *dri2_dpy); ++ if (!dri2_dpy) ++ return _eglError(EGL_BAD_ALLOC, "eglInitialize"); ++ ++ disp->DriverData = (void *) dri2_dpy; ++ dri2_dpy->mir_disp = disp->PlatformDisplay; ++ dri2_dpy->mir_disp->display_get_platform(dri2_dpy->mir_disp, &platform); ++ dri2_dpy->fd = platform.fd[0]; ++ dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd); ++ dri2_dpy->device_name = dri2_get_device_name_for_fd(dri2_dpy->fd); ++ ++ if (dri2_dpy->driver_name == NULL || ++ dri2_dpy->device_name == NULL) ++ goto cleanup_dpy; ++ ++ if (!dri2_load_driver(disp)) ++ goto cleanup_dpy; ++ ++ dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER; ++ dri2_dpy->dri2_loader_extension.base.version = 4; ++ dri2_dpy->dri2_loader_extension.getBuffers = dri2_get_buffers; ++ dri2_dpy->dri2_loader_extension.flushFrontBuffer = dri2_flush_front_buffer; ++ dri2_dpy->dri2_loader_extension.getBuffersWithFormat = ++ dri2_get_buffers_with_format; ++ ++ dri2_dpy->extensions[0] = &dri2_dpy->dri2_loader_extension.base; ++ dri2_dpy->extensions[1] = &image_lookup_extension.base; ++ dri2_dpy->extensions[2] = &use_invalidate.base; ++ dri2_dpy->extensions[3] = NULL; ++ ++ if (!dri2_create_screen(disp)) ++ goto cleanup_dpy; ++ ++ types = EGL_WINDOW_BIT; ++ for (i = 0; dri2_dpy->driver_configs[i]; i++) { ++ config = dri2_dpy->driver_configs[i]; ++ dri2_add_config(disp, config, i + 1, 0, types, NULL, argb_masks); ++ } ++ ++ dri2_dpy->authenticate = dri2_mir_authenticate; ++ ++ disp->VersionMajor = 1; ++ disp->VersionMinor = 4; ++ ++ return EGL_TRUE; ++ ++ cleanup_dpy: ++ free(dri2_dpy); ++ ++ return EGL_FALSE; ++} +Index: mesa/src/egl/main/Makefile.am +=================================================================== +--- mesa.orig/src/egl/main/Makefile.am 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/main/Makefile.am 2013-08-02 13:52:39.897145977 +1000 +@@ -103,6 +103,11 @@ + AM_CFLAGS += -DHAVE_NULL_PLATFORM + endif + ++if HAVE_EGL_PLATFORM_MIR ++AM_CFLAGS += -DHAVE_MIR_PLATFORM ++AM_CFLAGS += $(MIR_CFLAGS) ++endif ++ + if HAVE_EGL_DRIVER_GLX + AM_CFLAGS += -D_EGL_BUILT_IN_DRIVER_GLX + libEGL_la_LIBADD += ../drivers/glx/libegl_glx.la +Index: mesa/src/egl/main/egldisplay.c +=================================================================== +--- mesa.orig/src/egl/main/egldisplay.c 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/main/egldisplay.c 2013-08-02 13:52:39.897145977 +1000 +@@ -59,7 +59,10 @@ + #include <sys/types.h> + #include <sys/stat.h> + #endif +- ++#ifdef HAVE_MIR_PLATFORM ++#include <dlfcn.h> ++#include <mir_toolkit/mesa/native_display.h> ++#endif + + /** + * Map --with-egl-platforms names to platform types. +@@ -74,7 +77,8 @@ + { _EGL_PLATFORM_DRM, "drm" }, + { _EGL_PLATFORM_FBDEV, "fbdev" }, + { _EGL_PLATFORM_NULL, "null" }, +- { _EGL_PLATFORM_ANDROID, "android" } ++ { _EGL_PLATFORM_ANDROID, "android" }, ++ { _EGL_PLATFORM_MIR, "mir" }, + }; + + +@@ -134,6 +138,47 @@ + #endif + } + ++#ifdef HAVE_MIR_PLATFORM ++static EGLBoolean ++_mir_display_is_valid(EGLNativeDisplayType nativeDisplay) ++{ ++ typedef int (*MirEGLNativeDisplayIsValidFunc)(MirMesaEGLNativeDisplay*); ++ ++ void *lib; ++ MirEGLNativeDisplayIsValidFunc general_check; ++ MirEGLNativeDisplayIsValidFunc client_check; ++ MirEGLNativeDisplayIsValidFunc server_check; ++ EGLBoolean is_valid = EGL_FALSE; ++ ++ lib = dlopen(NULL, RTLD_LAZY); ++ if (lib == NULL) ++ return EGL_FALSE; ++ ++ general_check = (MirEGLNativeDisplayIsValidFunc) dlsym(lib, "mir_egl_mesa_display_is_valid"); ++ client_check = (MirEGLNativeDisplayIsValidFunc) dlsym(lib, "mir_client_mesa_egl_native_display_is_valid"); ++ server_check = (MirEGLNativeDisplayIsValidFunc) dlsym(lib, "mir_server_mesa_egl_native_display_is_valid"); ++ ++ if (general_check != NULL && ++ general_check((MirMesaEGLNativeDisplay *)nativeDisplay)) ++ { ++ is_valid = EGL_TRUE; ++ } ++ else if (client_check != NULL && ++ client_check((MirMesaEGLNativeDisplay *)nativeDisplay)) ++ { ++ is_valid = EGL_TRUE; ++ } ++ else if (server_check != NULL && ++ server_check((MirMesaEGLNativeDisplay *)nativeDisplay)) ++ { ++ is_valid = EGL_TRUE; ++ } ++ ++ dlclose(lib); ++ ++ return is_valid; ++} ++#endif + + /** + * Try detecting native platform with the help of native display characteristcs. +@@ -154,6 +199,11 @@ + return _EGL_PLATFORM_FBDEV; + #endif + ++#ifdef HAVE_MIR_PLATFORM ++ if (_mir_display_is_valid(nativeDisplay)) ++ return _EGL_PLATFORM_MIR; ++#endif ++ + if (_eglPointerIsDereferencable(nativeDisplay)) { + void *first_pointer = *(void **) nativeDisplay; + +@@ -188,7 +238,7 @@ + _EGLPlatformType + _eglGetNativePlatform(EGLNativeDisplayType nativeDisplay) + { +- static _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; ++ _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; + char *detection_method = NULL; + + if (native_platform == _EGL_INVALID_PLATFORM) { +Index: mesa/src/egl/main/egldisplay.h +=================================================================== +--- mesa.orig/src/egl/main/egldisplay.h 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/main/egldisplay.h 2013-08-02 13:52:39.897145977 +1000 +@@ -46,6 +46,7 @@ + _EGL_PLATFORM_FBDEV, + _EGL_PLATFORM_NULL, + _EGL_PLATFORM_ANDROID, ++ _EGL_PLATFORM_MIR, + + _EGL_NUM_PLATFORMS, + _EGL_INVALID_PLATFORM = -1 +Index: mesa/src/egl/main/egldriver.c +=================================================================== +--- mesa.orig/src/egl/main/egldriver.c 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/egl/main/egldriver.c 2013-08-02 13:52:39.897145977 +1000 +@@ -57,7 +57,7 @@ + char *Path; + _EGLMain_t BuiltIn; + void *Handle; +- _EGLDriver *Driver; ++ _EGLDriver *Driver[_EGL_NUM_PLATFORMS]; + } _EGLModule; + + static _EGL_DECLARE_MUTEX(_eglModuleMutex); +@@ -134,7 +134,6 @@ + + #endif + +- + /** + * Open the named driver and find its bootstrap function: _eglMain(). + */ +@@ -147,8 +146,12 @@ + + assert(driverPath); + +- _eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath); +- lib = open_library(driverPath); ++ if (*handle) { ++ lib = *handle; ++ } else { ++ _eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath); ++ lib = open_library(driverPath); ++ } + + #if defined(_EGL_OS_WINDOWS) + /* XXX untested */ +@@ -194,13 +197,13 @@ + * Load a module and create the driver object. + */ + static EGLBoolean +-_eglLoadModule(_EGLModule *mod) ++_eglLoadModule(_EGLModule *mod, _EGLPlatformType plat) + { + _EGLMain_t mainFunc; +- lib_handle lib; ++ lib_handle lib = (lib_handle) mod->Handle; + _EGLDriver *drv; + +- if (mod->Driver) ++ if (mod->Driver[plat]) + return EGL_TRUE; + + if (mod->BuiltIn) { +@@ -226,7 +229,7 @@ + } + + mod->Handle = (void *) lib; +- mod->Driver = drv; ++ mod->Driver[plat] = drv; + + return EGL_TRUE; + } +@@ -240,8 +243,10 @@ + { + #if defined(_EGL_OS_UNIX) + /* destroy the driver */ +- if (mod->Driver && mod->Driver->Unload) +- mod->Driver->Unload(mod->Driver); ++ for (int plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { ++ if (mod->Driver[plat] && mod->Driver[plat]->Unload) ++ mod->Driver[plat]->Unload(mod->Driver[plat]); ++ } + + /* + * XXX At this point (atexit), the module might be the last reference to +@@ -255,7 +260,9 @@ + /* XXX Windows unloads DLLs before atexit */ + #endif + +- mod->Driver = NULL; ++ for (int plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { ++ mod->Driver[plat] = NULL; ++ } + mod->Handle = NULL; + } + +@@ -599,17 +606,17 @@ + while (i < _eglModules->Size) { + _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i]; + +- if (!_eglLoadModule(mod)) { ++ if (!_eglLoadModule(mod, dpy->Platform)) { + /* remove invalid modules */ + _eglEraseArray(_eglModules, i, _eglFreeModule); + continue; + } + +- if (mod->Driver->API.Initialize(mod->Driver, dpy)) { +- drv = mod->Driver; ++ drv = mod->Driver[dpy->Platform]; ++ if (drv->API.Initialize(drv, dpy)) + break; +- } + else { ++ drv = NULL; + i++; + } + } +@@ -661,7 +668,6 @@ + _eglGetDriverProc(const char *procname) + { + EGLint i; +- _EGLProc proc = NULL; + + if (!_eglModules) { + /* load the driver for the default display */ +@@ -673,15 +679,18 @@ + + for (i = 0; i < _eglModules->Size; i++) { + _EGLModule *mod = (_EGLModule *) _eglModules->Elements[i]; ++ _EGLProc proc; + +- if (!mod->Driver) +- break; +- proc = mod->Driver->API.GetProcAddress(mod->Driver, procname); +- if (proc) +- break; ++ for (_EGLPlatformType plat = 0; plat < _EGL_NUM_PLATFORMS; ++plat) { ++ if (!mod->Driver[plat]) ++ continue; ++ proc = mod->Driver[plat]->API.GetProcAddress(mod->Driver[plat], procname); ++ if (proc) ++ return proc; ++ } + } + +- return proc; ++ return NULL; + } + + +Index: mesa/src/gallium/drivers/nouveau/nouveau_screen.c +=================================================================== +--- mesa.orig/src/gallium/drivers/nouveau/nouveau_screen.c 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/gallium/drivers/nouveau/nouveau_screen.c 2013-08-02 13:52:39.897145977 +1000 +@@ -14,6 +14,7 @@ + #include <errno.h> + #include <stdlib.h> + ++#include <xf86drm.h> + #include <libdrm/nouveau_drm.h> + + #include "nouveau_winsys.h" +@@ -86,7 +87,18 @@ + struct nouveau_bo *bo = 0; + int ret; + +- ret = nouveau_bo_name_ref(dev, whandle->handle, &bo); ++ if (whandle->type != DRM_API_HANDLE_TYPE_SHARED && ++ whandle->type != DRM_API_HANDLE_TYPE_FD) { ++ debug_printf("%s: attempt to import unsupported handle type %d\n", ++ __FUNCTION__, whandle->type); ++ return NULL; ++ } ++ ++ if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) ++ ret = nouveau_bo_name_ref(dev, whandle->handle, &bo); ++ else ++ ret = nouveau_bo_prime_handle_ref(dev, whandle->handle, &bo); ++ + if (ret) { + debug_printf("%s: ref name 0x%08x failed with %d\n", + __FUNCTION__, whandle->handle, ret); +@@ -111,6 +123,8 @@ + } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) { + whandle->handle = bo->handle; + return TRUE; ++ } else if (whandle->type == DRM_API_HANDLE_TYPE_FD) { ++ return nouveau_bo_set_prime(bo, (int *)&whandle->handle) == 0; + } else { + return FALSE; + } +Index: mesa/src/gallium/include/state_tracker/drm_driver.h +=================================================================== +--- mesa.orig/src/gallium/include/state_tracker/drm_driver.h 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/gallium/include/state_tracker/drm_driver.h 2013-08-02 13:52:39.897145977 +1000 +@@ -10,6 +10,8 @@ + + #define DRM_API_HANDLE_TYPE_SHARED 0 + #define DRM_API_HANDLE_TYPE_KMS 1 ++#define DRM_API_HANDLE_TYPE_FD 2 ++ + + /** + * For use with pipe_screen::{texture_from_handle|texture_get_handle}. +@@ -17,9 +19,10 @@ + struct winsys_handle + { + /** +- * Unused for texture_from_handle, always +- * DRM_API_HANDLE_TYPE_SHARED. Input to texture_get_handle, +- * use TEXTURE_USAGE to select handle for kms or ipc. ++ * Input for texture_from_handle, valid values are ++ * DRM_API_HANDLE_TYPE_SHARED or DRM_API_HANDLE_TYPE_FD. ++ * Input to texture_get_handle, ++ * to select handle for kms, flink, or prime. + */ + unsigned type; + /** +Index: mesa/src/gallium/state_trackers/dri/drm/dri2.c +=================================================================== +--- mesa.orig/src/gallium/state_trackers/dri/drm/dri2.c 2013-08-02 13:52:39.909145976 +1000 ++++ mesa/src/gallium/state_trackers/dri/drm/dri2.c 2013-08-02 13:52:39.901145976 +1000 +@@ -231,7 +231,13 @@ + + templ.format = format; + templ.bind = bind; +- whandle.handle = buf->name; ++ if (buf->fd != 0) { ++ whandle.type = DRM_API_HANDLE_TYPE_FD; ++ whandle.handle = buf->fd; ++ } else { ++ whandle.type = DRM_API_HANDLE_TYPE_SHARED; ++ whandle.handle = buf->name; ++ } + whandle.stride = buf->pitch; + + drawable->textures[statt] = +@@ -452,14 +458,14 @@ + } + + static __DRIimage * +-dri2_create_image_from_name(__DRIscreen *_screen, +- int width, int height, int format, +- int name, int pitch, void *loaderPrivate) ++dri2_create_image_from_winsys(__DRIscreen *_screen, ++ int width, int height, int format, ++ struct winsys_handle *whandle, int pitch, ++ void *loaderPrivate) + { + struct dri_screen *screen = dri_screen(_screen); + __DRIimage *img; + struct pipe_resource templ; +- struct winsys_handle whandle; + unsigned tex_usage; + enum pipe_format pf; + +@@ -499,12 +505,10 @@ + templ.depth0 = 1; + templ.array_size = 1; + +- memset(&whandle, 0, sizeof(whandle)); +- whandle.handle = name; +- whandle.stride = pitch * util_format_get_blocksize(pf); ++ whandle->stride = pitch * util_format_get_blocksize(pf); + + img->texture = screen->base.screen->resource_from_handle(screen->base.screen, +- &templ, &whandle); ++ &templ, whandle); + if (!img->texture) { + FREE(img); + return NULL; +@@ -519,6 +523,39 @@ + } + + static __DRIimage * ++dri2_create_image_from_name(__DRIscreen *_screen, ++ int width, int height, int format, ++ int name, int pitch, void *loaderPrivate) ++{ ++ struct winsys_handle whandle; ++ ++ memset(&whandle, 0, sizeof(whandle)); ++ whandle.type = DRM_API_HANDLE_TYPE_SHARED; ++ whandle.handle = name; ++ ++ return dri2_create_image_from_winsys(_screen, width, height, format, ++ &whandle, pitch, loaderPrivate); ++} ++ ++static __DRIimage * ++dri2_create_image_from_fd(__DRIscreen *_screen, ++ int width, int height, int format, ++ int fd, int pitch, void *loaderPrivate) ++{ ++ struct winsys_handle whandle; ++ ++ if (fd < 0) ++ return NULL; ++ ++ memset(&whandle, 0, sizeof(whandle)); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1v5cso-0004k5...@vasks.debian.org