You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
(10) |
Apr
(28) |
May
(41) |
Jun
(91) |
Jul
(63) |
Aug
(45) |
Sep
(37) |
Oct
(80) |
Nov
(91) |
Dec
(47) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(48) |
Feb
(121) |
Mar
(126) |
Apr
(16) |
May
(85) |
Jun
(84) |
Jul
(115) |
Aug
(71) |
Sep
(27) |
Oct
(33) |
Nov
(15) |
Dec
(71) |
2002 |
Jan
(73) |
Feb
(34) |
Mar
(39) |
Apr
(135) |
May
(59) |
Jun
(116) |
Jul
(93) |
Aug
(40) |
Sep
(50) |
Oct
(87) |
Nov
(90) |
Dec
(32) |
2003 |
Jan
(181) |
Feb
(101) |
Mar
(231) |
Apr
(240) |
May
(148) |
Jun
(228) |
Jul
(156) |
Aug
(49) |
Sep
(173) |
Oct
(169) |
Nov
(137) |
Dec
(163) |
2004 |
Jan
(243) |
Feb
(141) |
Mar
(183) |
Apr
(364) |
May
(369) |
Jun
(251) |
Jul
(194) |
Aug
(140) |
Sep
(154) |
Oct
(167) |
Nov
(86) |
Dec
(109) |
2005 |
Jan
(176) |
Feb
(140) |
Mar
(112) |
Apr
(158) |
May
(140) |
Jun
(201) |
Jul
(123) |
Aug
(196) |
Sep
(143) |
Oct
(165) |
Nov
(158) |
Dec
(79) |
2006 |
Jan
(90) |
Feb
(156) |
Mar
(125) |
Apr
(146) |
May
(169) |
Jun
(146) |
Jul
(150) |
Aug
(176) |
Sep
(156) |
Oct
(237) |
Nov
(179) |
Dec
(140) |
2007 |
Jan
(144) |
Feb
(116) |
Mar
(261) |
Apr
(279) |
May
(222) |
Jun
(103) |
Jul
(237) |
Aug
(191) |
Sep
(113) |
Oct
(129) |
Nov
(141) |
Dec
(165) |
2008 |
Jan
(152) |
Feb
(195) |
Mar
(242) |
Apr
(146) |
May
(151) |
Jun
(172) |
Jul
(123) |
Aug
(195) |
Sep
(195) |
Oct
(138) |
Nov
(183) |
Dec
(125) |
2009 |
Jan
(268) |
Feb
(281) |
Mar
(295) |
Apr
(293) |
May
(273) |
Jun
(265) |
Jul
(406) |
Aug
(679) |
Sep
(434) |
Oct
(357) |
Nov
(306) |
Dec
(478) |
2010 |
Jan
(856) |
Feb
(668) |
Mar
(927) |
Apr
(269) |
May
(12) |
Jun
(13) |
Jul
(6) |
Aug
(8) |
Sep
(23) |
Oct
(4) |
Nov
(8) |
Dec
(11) |
2011 |
Jan
(4) |
Feb
(2) |
Mar
(3) |
Apr
(9) |
May
(6) |
Jun
|
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2013 |
Jan
(2) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(7) |
Nov
(1) |
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Chris W. <ch...@ch...> - 2014-06-04 17:08:34
|
On Wed, Jun 04, 2014 at 06:37:44PM +0200, Sedat Dilek wrote: > > DRI2 or DRI3 running here? > > > > I did some more testing and played with UXA/SNA for intel-ddx. > > $ egrep -i 'dri2|dri3|present|sna|uxa' Xorg.0.log_UXA > [ 8471.151] (II) intel(0): DRI2: Enabled > [ 8471.151] (II) intel(0): DRI3: Enabled > [ 8471.194] (II) GLX: Initialized DRI2 GL provider for screen 0 > > $ egrep -i 'dri2|dri3|present|sna|uxa' Xorg.0.log_SNA > [ 8574.658] (II) intel(0): direct rendering: DRI2 DRI3 enabled > [ 8574.658] (II) intel(0): hardware support for Present enabled > [ 8574.666] (II) GLX: Initialized DRI2 GL provider for screen 0 > > Still unsure if I had success. Yes, the DDX is ready. Try enabling LIBGL_DEBUG to check that mesa is using DRI3. -Chris -- Chris Wilson, Intel Open Source Technology Centre |
From: Dee S. <dem...@ne...> - 2014-04-17 16:46:33
|
Hi! http://www.satservise.lviv.ua/_topic.forum?jnimefuv=2487909&akyljbon=611538 |
From: Ian R. <id...@fr...> - 2013-11-04 22:00:20
|
On 10/31/2013 04:13 PM, Keith Packard wrote: > Instead of assuming that the size will be height * pitch, have the caller pass > in the size explicitly. > > Signed-off-by: Keith Packard <ke...@ke...> One nit below. With that changed, Reviewed-by: Ian Romanick <ian...@in...> > --- > src/mesa/drivers/dri/i915/intel_regions.c | 4 ++-- > src/mesa/drivers/dri/i915/intel_regions.h | 2 +- > src/mesa/drivers/dri/i915/intel_screen.c | 2 +- > src/mesa/drivers/dri/i965/intel_regions.c | 4 ++-- > src/mesa/drivers/dri/i965/intel_regions.h | 1 + > src/mesa/drivers/dri/i965/intel_screen.c | 2 +- > 6 files changed, 8 insertions(+), 7 deletions(-) > > diff --git a/src/mesa/drivers/dri/i915/intel_regions.c b/src/mesa/drivers/dri/i915/intel_regions.c > index 44f7030..9f5b89e 100644 > --- a/src/mesa/drivers/dri/i915/intel_regions.c > +++ b/src/mesa/drivers/dri/i915/intel_regions.c > @@ -209,6 +209,7 @@ struct intel_region * > intel_region_alloc_for_fd(struct intel_screen *screen, > GLuint cpp, > GLuint width, GLuint height, GLuint pitch, > + GLuint size, > int fd, const char *name) > { > struct intel_region *region; > @@ -216,8 +217,7 @@ intel_region_alloc_for_fd(struct intel_screen *screen, > int ret; > uint32_t bit_6_swizzle, tiling; > > - buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, > - fd, height * pitch); > + buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, fd, size); > if (buffer == NULL) > return NULL; > ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); > diff --git a/src/mesa/drivers/dri/i915/intel_regions.h b/src/mesa/drivers/dri/i915/intel_regions.h > index 5c612a9..6bc4a42 100644 > --- a/src/mesa/drivers/dri/i915/intel_regions.h > +++ b/src/mesa/drivers/dri/i915/intel_regions.h > @@ -91,7 +91,7 @@ struct intel_region * > intel_region_alloc_for_fd(struct intel_screen *screen, > GLuint cpp, > GLuint width, GLuint height, GLuint pitch, > - int fd, const char *name); > + GLuint size, int fd, const char *name); > > bool > intel_region_flink(struct intel_region *region, uint32_t *name); > diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c > index 3f54752..085e894 100644 > --- a/src/mesa/drivers/dri/i915/intel_screen.c > +++ b/src/mesa/drivers/dri/i915/intel_screen.c > @@ -653,7 +653,7 @@ intel_create_image_from_fds(__DRIscreen *screen, > return NULL; > > image->region = intel_region_alloc_for_fd(intelScreen, > - 1, width, height, > + 1, width, height, height * strides[0], > strides[0], fds[0], "image"); > if (image->region == NULL) { > free(image); > diff --git a/src/mesa/drivers/dri/i965/intel_regions.c b/src/mesa/drivers/dri/i965/intel_regions.c > index a6b80fd..3920f4f 100644 > --- a/src/mesa/drivers/dri/i965/intel_regions.c > +++ b/src/mesa/drivers/dri/i965/intel_regions.c > @@ -209,6 +209,7 @@ struct intel_region * > intel_region_alloc_for_fd(struct intel_screen *screen, > GLuint cpp, > GLuint width, GLuint height, GLuint pitch, > + GLuint size, > int fd, const char *name) > { > struct intel_region *region; > @@ -216,8 +217,7 @@ intel_region_alloc_for_fd(struct intel_screen *screen, > int ret; > uint32_t bit_6_swizzle, tiling; > > - buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, > - fd, height * pitch); > + buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, fd, size); > if (buffer == NULL) > return NULL; > ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); > diff --git a/src/mesa/drivers/dri/i965/intel_regions.h b/src/mesa/drivers/dri/i965/intel_regions.h > index f08a113..05dfef3 100644 > --- a/src/mesa/drivers/dri/i965/intel_regions.h > +++ b/src/mesa/drivers/dri/i965/intel_regions.h > @@ -92,6 +92,7 @@ struct intel_region * > intel_region_alloc_for_fd(struct intel_screen *screen, > GLuint cpp, > GLuint width, GLuint height, GLuint pitch, > + GLuint size, Since this isn't exposed to the GL API, use either unsigned or size_t. > int fd, const char *name); > > bool > diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c > index eafafa2..0bd0789 100644 > --- a/src/mesa/drivers/dri/i965/intel_screen.c > +++ b/src/mesa/drivers/dri/i965/intel_screen.c > @@ -712,7 +712,7 @@ intel_create_image_from_fds(__DRIscreen *screen, > return NULL; > > image->region = intel_region_alloc_for_fd(intelScreen, > - 1, width, height, > + 1, width, height, height * strides[0], > strides[0], fds[0], "image"); > if (image->region == NULL) { > free(image); > |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:19
|
This hooks DRI3 support into the GLX layer, the DRI common layer and the Intel driver. Signed-off-by: Keith Packard <ke...@ke...> --- configure.ac | 10 +- include/GL/internal/dri_interface.h | 158 +++ src/glx/Makefile.am | 2 + src/glx/dri3_common.c | 146 +++ src/glx/dri3_glx.c | 1539 +++++++++++++++++++++++++ src/glx/dri3_priv.h | 128 ++ src/glx/glxclient.h | 2 + src/glx/glxext.c | 6 +- src/mesa/drivers/dri/common/dri_util.c | 163 ++- src/mesa/drivers/dri/common/dri_util.h | 23 + src/mesa/drivers/dri/i915/intel_context.c | 109 +- src/mesa/drivers/dri/i915/intel_mipmap_tree.c | 33 + src/mesa/drivers/dri/i915/intel_mipmap_tree.h | 8 + src/mesa/drivers/dri/i965/brw_context.c | 110 +- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 61 + src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 8 + src/mesa/drivers/dri/i965/intel_screen.c | 107 +- 17 files changed, 2594 insertions(+), 19 deletions(-) create mode 100644 src/glx/dri3_common.c create mode 100644 src/glx/dri3_glx.c create mode 100644 src/glx/dri3_priv.h diff --git a/configure.ac b/configure.ac index f94c9b9..b6158d9 100644 --- a/configure.ac +++ b/configure.ac @@ -38,6 +38,8 @@ LIBDRM_NVVIEUX_REQUIRED=2.4.33 LIBDRM_NOUVEAU_REQUIRED="2.4.33 libdrm >= 2.4.41" LIBDRM_FREEDRENO_REQUIRED=2.4.39 DRI2PROTO_REQUIRED=2.6 +DRI3PROTO_REQUIRED=1.0 +LIBUDEV_REQUIRED=151 GLPROTO_REQUIRED=1.4.14 LIBDRM_XORG_REQUIRED=2.4.24 LIBKMS_XORG_REQUIRED=1.0.0 @@ -820,10 +822,12 @@ xyesno) fi PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= $DRI2PROTO_REQUIRED]) GL_PC_REQ_PRIV="$GL_PC_REQ_PRIV libdrm >= $LIBDRM_REQUIRED" + PKG_CHECK_MODULES([DRI3PROTO], [dri3proto >= $DRI3PROTO_REQUIRED]) + PKG_CHECK_MODULES([LIBUDEV], [libudev >= $LIBUDEV_REQUIRED]) fi # find the DRI deps for libGL - dri_modules="x11 xext xdamage xfixes x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8" + dri_modules="x11 xext xdamage xfixes x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8 xcb-dri3 xcb-sync xshmfence" # add xf86vidmode if available PKG_CHECK_MODULES([XF86VIDMODE], [xxf86vm], HAVE_XF86VIDMODE=yes, HAVE_XF86VIDMODE=no) @@ -833,8 +837,8 @@ xyesno) PKG_CHECK_MODULES([DRIGL], [$dri_modules]) GL_PC_REQ_PRIV="$GL_PC_REQ_PRIV $dri_modules" - X11_INCLUDES="$X11_INCLUDES $DRIGL_CFLAGS" - GL_LIB_DEPS="$DRIGL_LIBS" + X11_INCLUDES="$X11_INCLUDES $DRIGL_CFLAGS $LIBUDEV_CFLAGS" + GL_LIB_DEPS="$DRIGL_LIBS $LIBUDEV_LIBS" # need DRM libs, $PTHREAD_LIBS, etc. GL_LIB_DEPS="$GL_LIB_DEPS $LIBDRM_LIBS -lm $PTHREAD_LIBS $DLOPEN_LIBS" diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 48993b9..b06ad8d 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -86,6 +86,11 @@ typedef struct __DRIdri2LoaderExtensionRec __DRIdri2LoaderExtension; typedef struct __DRI2flushExtensionRec __DRI2flushExtension; typedef struct __DRI2throttleExtensionRec __DRI2throttleExtension; + +typedef struct __DRIdri3BufferRec __DRIdri3Buffer; +typedef struct __DRIdri3ExtensionRec __DRIdri3Extension; +typedef struct __DRIdri3LoaderExtensionRec __DRIdri3LoaderExtension; + /*@}*/ @@ -966,6 +971,159 @@ struct __DRIdri2ExtensionRec { /** + * DRI3 Loader extension. + */ + +#define __DRI3_DRIVER_EXTENSIONS "__dri3DriverExtensions" + +enum __DRI3bufferType { + __DRI3_BUFFER_BACK = 0, + __DRI3_BUFFER_FRONT = 1 +}; + +struct __DRIdri3BufferRec { + unsigned int size; + unsigned int pitch; + unsigned int cpp; + unsigned int flags; + unsigned int width, height; + enum __DRI3bufferType buffer_type; + uint32_t pixmap; + uint32_t sync_fence; + int32_t *shm_fence; + void *driverPrivate; +}; + +#define __DRI_DRI3_LOADER "DRI_DRI3Loader" +#define __DRI_DRI3_LOADER_VERSION 1 + +struct __DRIdri3LoaderExtensionRec { + __DRIextension base; + + int (*getBuffers)(__DRIdrawable *driDrawable, + int *width, int *height, + unsigned int format, + void *loaderPrivate, + int need_front, + int need_back, + __DRIdri3Buffer **front, + __DRIdri3Buffer **back); + + /** + * Flush pending front-buffer rendering + * + * Any rendering that has been performed to the + * \c __DRI3_BUFFER_FAKE_FRONT_LEFT will be flushed to the + * \c __DRI3_BUFFER_FRONT_LEFT. + * + * \param driDrawable Drawable whose front-buffer is to be flushed + * \param loaderPrivate Loader's private data that was previously passed + * into __DRIdri2ExtensionRec::createNewDrawable + */ + void (*flushFrontBuffer)(__DRIdrawable *driDrawable, void *loaderPrivate); +}; + +/** + * DRI3 extension. + */ + +struct gl_context; +struct dd_function_table; + +typedef __DRIscreen * +(*__DRIcreateNewScreen2)(int screen, int fd, + const __DRIextension **extensions, + const __DRIextension **driver_extensions, + const __DRIconfig ***driver_configs, + void *loaderPrivate); + +typedef __DRIdrawable * +(*__DRIcreateNewDrawable)(__DRIscreen *screen, + const __DRIconfig *config, + void *loaderPrivate); + +typedef __DRIcontext * +(*__DRIcreateNewContext)(__DRIscreen *screen, + const __DRIconfig *config, + __DRIcontext *shared, + void *loaderPrivate); + +typedef __DRIcontext * +(*__DRIcreateContextAttribs)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error, + void *loaderPrivate); + +typedef unsigned int +(*__DRIgetAPIMask)(__DRIscreen *screen); + +typedef __DRIdri3Buffer * +(*__DRIdri3AllocateBuffer)(__DRIscreen *screen, + unsigned int bpp, + int width, + int height); + +typedef void +(*__DRIdri3ReleaseBuffer)(__DRIscreen *screen, + __DRIdri3Buffer *buffer); + +typedef int +(*__DRIdri3BufferToFd)(__DRIscreen *screen, + __DRIdri3Buffer *buffer); + +typedef __DRIdri3Buffer * +(*__DRIdri3FdToBuffer)(__DRIscreen *screen, + int fd, unsigned int bpp, + int width, int height, int stride, + unsigned int size); + +typedef uint32_t * +(*__DRIdri3Stamp)(__DRIdrawable *drawable); + +#define __DRI_DRI3 "DRI_DRI3" +#define __DRI_DRI3_VERSION 1 + +struct __DRIdri3ExtensionRec { + __DRIextension base; + + /* Common DRI functions, shared with DRI2 */ + __DRIcreateNewScreen2 createNewScreen2; + __DRIcreateNewDrawable createNewDrawable; + __DRIcreateNewContext createNewContext; + __DRIcreateContextAttribs createContextAttribs; + __DRIgetAPIMask getAPIMask; + + /* DRI3-specific functions*/ + + /* Allocate color buffer for front/back of windows and pixmaps + */ + __DRIdri3AllocateBuffer allocateBuffer; + + /* Release color buffer + */ + __DRIdri3ReleaseBuffer releaseBuffer; + + /* Given a buffer, wrap it in a DMA-BUF file descriptor + */ + __DRIdri3BufferToFd bufferToFd; + + /* Given a DMA-BUF file descriptor, construct a suitable + * color buffer + */ + __DRIdri3FdToBuffer fdToBuffer; + + /* Ask the driver for a pointer to an integer which + * can be incremented when the drawable needs to be + * revalidated + */ + __DRIdri3Stamp stamp; +}; + +/** * This extension provides functionality to enable various EGLImage * extensions. */ diff --git a/src/glx/Makefile.am b/src/glx/Makefile.am index f01709b..854025d 100644 --- a/src/glx/Makefile.am +++ b/src/glx/Makefile.am @@ -92,6 +92,8 @@ libglx_la_SOURCES = \ glxhash.c \ dri2_glx.c \ dri2.c \ + dri3_glx.c \ + dri3_common.c \ applegl_glx.c GL_LIBS = \ diff --git a/src/glx/dri3_common.c b/src/glx/dri3_common.c new file mode 100644 index 0000000..c758f96 --- /dev/null +++ b/src/glx/dri3_common.c @@ -0,0 +1,146 @@ +/* + * Copyright © 2013 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * This code is derived from src/egl/drivers/dri2/common.c which + * carries the following copyright: + * + * Copyright © 2011 Intel Corporation + * + * 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: + * Kristian Høgsberg <kr...@bi...> + * Benjamin Franzke <ben...@go...> + */ + +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <GL/gl.h> +#include "glapi.h" +#include "glxclient.h" +#include "xf86dri.h" +#include <dlfcn.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/time.h> +#include "xf86drm.h" +#include "dri_common.h" +#include "dri3_priv.h" + +#define DRIVER_MAP_DRI3_ONLY +#include "pci_ids/pci_id_driver_map.h" + +#include <libudev.h> + +static struct udev_device * +dri3_udev_device_new_from_fd(struct udev *udev, int fd) +{ + struct udev_device *device; + struct stat buf; + + if (fstat(fd, &buf) < 0) { + ErrorMessageF("DRI3: failed to stat fd %d", fd); + return NULL; + } + + device = udev_device_new_from_devnum(udev, 'c', buf.st_rdev); + if (device == NULL) { + ErrorMessageF("DRI3: could not create udev device for fd %d", fd); + return NULL; + } + + return device; +} + +char * +dri3_get_driver_for_fd(int fd) +{ + struct udev *udev; + struct udev_device *device, *parent; + const char *pci_id; + char *driver = NULL; + int vendor_id, chip_id, i, j; + + udev = udev_new(); + device = dri3_udev_device_new_from_fd(udev, fd); + if (device == NULL) + return NULL; + + parent = udev_device_get_parent(device); + if (parent == NULL) { + ErrorMessageF("DRI3: could not get parent device"); + goto out; + } + + pci_id = udev_device_get_property_value(parent, "PCI_ID"); + if (pci_id == NULL || + sscanf(pci_id, "%x:%x", &vendor_id, &chip_id) != 2) { + ErrorMessageF("DRI3: malformed or no PCI ID"); + goto out; + } + + for (i = 0; driver_map[i].driver; i++) { + if (vendor_id != driver_map[i].vendor_id) + continue; + if (driver_map[i].num_chips_ids == -1) { + driver = strdup(driver_map[i].driver); + goto out; + } + + for (j = 0; j < driver_map[i].num_chips_ids; j++) + if (driver_map[i].chip_ids[j] == chip_id) { + driver = strdup(driver_map[i].driver); + goto out; + } + } + +out: + udev_device_unref(device); + udev_unref(udev); + + return driver; +} diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c new file mode 100644 index 0000000..4d275f2 --- /dev/null +++ b/src/glx/dri3_glx.c @@ -0,0 +1,1539 @@ +/* + * Copyright © 2013 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Portions of this code were adapted from dri2_glx.c which carries the + * following copyright: + * + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Soft- + * ware"), to deal in the Software without restriction, including without + * limitation the rights to use, copy, modify, merge, publish, distribute, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, provided that the above copyright + * notice(s) and this permission notice appear in all copies of the Soft- + * ware and that both the above copyright notice(s) and this permission + * notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- + * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY + * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN + * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE- + * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR- + * MANCE OF THIS SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or + * other dealings in this Software without prior written authorization of + * the copyright holder. + * + * Authors: + * Kristian Høgsberg (kr...@re...) + */ + +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + +#include <X11/Xlib.h> +#include <X11/extensions/Xfixes.h> +#include <X11/Xlib-xcb.h> +#include <X11/xshmfence.h> +#include <xcb/xcb.h> +#include <xcb/dri3.h> +#include <xcb/present.h> +#include <GL/gl.h> +#include "glapi.h" +#include "glxclient.h" +#include "xf86dri.h" +#include <dlfcn.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/mman.h> +#include <sys/time.h> +#include "xf86drm.h" +#include "dri_common.h" +#include "dri3_priv.h" + +static const struct glx_context_vtable dri3_context_vtable; + +#define HAS_SBC 0 + +#if HAS_SBC + +/* For XCB's handling of ust/msc/sbc counters, we have to hand it the high and + * low halves separately. This helps you split them. + */ +static void +split_counter(uint64_t counter, uint32_t *hi, uint32_t *lo) +{ + *hi = (counter >> 32); + *lo = counter & 0xffffffff; +} + +static uint64_t +merge_counter(uint32_t hi, uint32_t lo) +{ + return ((uint64_t)hi << 32) | lo; +} +#endif /* HAS_SBC */ + +static inline void +dri3_fence_reset(xcb_connection_t *c, __DRIdri3Buffer *buffer) { + xshmfence_reset(buffer->shm_fence); +} + +static inline void +dri3_fence_trigger(xcb_connection_t *c, __DRIdri3Buffer *buffer) { + xcb_sync_trigger_fence(c, buffer->sync_fence); +} + +static inline void +dri3_fence_await(xcb_connection_t *c, __DRIdri3Buffer *buffer) { + xcb_flush(c); + xshmfence_await(buffer->shm_fence); +} + +static void +dri3_destroy_context(struct glx_context *context) +{ + struct dri3_context *pcp = (struct dri3_context *) context; + struct dri3_screen *psc = (struct dri3_screen *) context->psc; + + driReleaseDrawables(&pcp->base); + + free((char *) context->extensions); + + (*psc->core->destroyContext) (pcp->driContext); + + free(pcp); +} + +static Bool +dri3_bind_context(struct glx_context *context, struct glx_context *old, + GLXDrawable draw, GLXDrawable read) +{ + struct dri3_context *pcp = (struct dri3_context *) context; + struct dri3_screen *psc = (struct dri3_screen *) pcp->base.psc; + struct dri3_drawable *pdraw, *pread; + + pdraw = (struct dri3_drawable *) driFetchDrawable(context, draw); + pread = (struct dri3_drawable *) driFetchDrawable(context, read); + + driReleaseDrawables(&pcp->base); + + if (pdraw == NULL || pread == NULL) + return GLXBadDrawable; + + if (!(*psc->core->bindContext) (pcp->driContext, + pdraw->driDrawable, pread->driDrawable)) + return GLXBadContext; + + return Success; +} + +static void +dri3_unbind_context(struct glx_context *context, struct glx_context *new) +{ + struct dri3_context *pcp = (struct dri3_context *) context; + struct dri3_screen *psc = (struct dri3_screen *) pcp->base.psc; + + (*psc->core->unbindContext) (pcp->driContext); +} + +static struct glx_context * +dri3_create_context(struct glx_screen *base, + struct glx_config *config_base, + struct glx_context *shareList, int renderType) +{ + struct dri3_context *pcp, *pcp_shared; + struct dri3_screen *psc = (struct dri3_screen *) base; + __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; + __DRIcontext *shared = NULL; + + if (shareList) { + /* If the shareList context is not a DRI3 context, we cannot possibly + * create a DRI3 context that shares it. + */ + if (shareList->vtable->destroy != dri3_destroy_context) { + return NULL; + } + + pcp_shared = (struct dri3_context *) shareList; + shared = pcp_shared->driContext; + } + + pcp = calloc(1, sizeof *pcp); + if (pcp == NULL) + return NULL; + + if (!glx_context_init(&pcp->base, &psc->base, &config->base)) { + free(pcp); + return NULL; + } + + pcp->driContext = + (*psc->dri3->createNewContext) (psc->driScreen, + config->driConfig, shared, pcp); + + if (pcp->driContext == NULL) { + free(pcp); + return NULL; + } + + pcp->base.vtable = &dri3_context_vtable; + + return &pcp->base; +} + +static struct glx_context * +dri3_create_context_attribs(struct glx_screen *base, + struct glx_config *config_base, + struct glx_context *shareList, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error) +{ + struct dri3_context *pcp = NULL; + struct dri3_context *pcp_shared = NULL; + struct dri3_screen *psc = (struct dri3_screen *) base; + __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; + __DRIcontext *shared = NULL; + + uint32_t minor_ver = 1; + uint32_t major_ver = 2; + uint32_t flags = 0; + unsigned api; + int reset = __DRI_CTX_RESET_NO_NOTIFICATION; + uint32_t ctx_attribs[2 * 5]; + unsigned num_ctx_attribs = 0; + uint32_t render_type; + + /* Remap the GLX tokens to DRI2 tokens. + */ + if (!dri2_convert_glx_attribs(num_attribs, attribs, + &major_ver, &minor_ver, + &render_type, &flags, &api, + &reset, error)) + goto error_exit; + + /* Check the renderType value */ + if (!validate_renderType_against_config(config_base, render_type)) + goto error_exit; + + if (shareList) { + pcp_shared = (struct dri3_context *) shareList; + shared = pcp_shared->driContext; + } + + pcp = calloc(1, sizeof *pcp); + if (pcp == NULL) { + *error = __DRI_CTX_ERROR_NO_MEMORY; + goto error_exit; + } + + if (!glx_context_init(&pcp->base, &psc->base, &config->base)) + goto error_exit; + + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; + ctx_attribs[num_ctx_attribs++] = major_ver; + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION; + ctx_attribs[num_ctx_attribs++] = minor_ver; + + /* Only send a value when the non-default value is requested. By doing + * this we don't have to check the driver's DRI3 version before sending the + * default value. + */ + if (reset != __DRI_CTX_RESET_NO_NOTIFICATION) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_RESET_STRATEGY; + ctx_attribs[num_ctx_attribs++] = reset; + } + + if (flags != 0) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; + + /* The current __DRI_CTX_FLAG_* values are identical to the + * GLX_CONTEXT_*_BIT values. + */ + ctx_attribs[num_ctx_attribs++] = flags; + } + + pcp->driContext = + (*psc->dri3->createContextAttribs) (psc->driScreen, + api, + config->driConfig, + shared, + num_ctx_attribs / 2, + ctx_attribs, + error, + pcp); + + if (pcp->driContext == NULL) + goto error_exit; + + pcp->base.vtable = &dri3_context_vtable; + + return &pcp->base; + +error_exit: + free(pcp); + + return NULL; +} + +static void +dri3_destroy_drawable(__GLXDRIdrawable *base) +{ + struct dri3_screen *psc = (struct dri3_screen *) base->psc; + struct dri3_drawable *pdraw = (struct dri3_drawable *) base; + + (*psc->core->destroyDrawable) (pdraw->driDrawable); + + free(pdraw); +} + +static __GLXDRIdrawable * +dri3_create_drawable(struct glx_screen *base, XID xDrawable, + GLXDrawable drawable, struct glx_config *config_base) +{ + struct dri3_drawable *pdraw; + struct dri3_screen *psc = (struct dri3_screen *) base; + __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base; + GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; + + pdraw = calloc(1, sizeof(*pdraw)); + if (!pdraw) + return NULL; + + pdraw->base.destroyDrawable = dri3_destroy_drawable; + pdraw->base.xDrawable = xDrawable; + pdraw->base.drawable = drawable; + pdraw->base.psc = &psc->base; +// pdraw->bufferCount = 0; + pdraw->swap_interval = 1; /* default may be overridden below */ + pdraw->have_back = 0; + pdraw->have_fake_front = 0; + + if (psc->config) + psc->config->configQueryi(psc->driScreen, + "vblank_mode", &vblank_mode); + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + case DRI_CONF_VBLANK_DEF_INTERVAL_0: + pdraw->swap_interval = 0; + break; + case DRI_CONF_VBLANK_DEF_INTERVAL_1: + case DRI_CONF_VBLANK_ALWAYS_SYNC: + default: + pdraw->swap_interval = 1; + break; + } + + (void) __glXInitialize(psc->base.dpy); + + /* Create a new drawable */ + pdraw->driDrawable = + (*psc->dri3->createNewDrawable) (psc->driScreen, + config->driConfig, pdraw); + + if (!pdraw->driDrawable) { + free(pdraw); + return NULL; + } + + /* + * Make sure server has the same swap interval we do for the new + * drawable. + */ + if (psc->vtable.setSwapInterval) + psc->vtable.setSwapInterval(&pdraw->base, pdraw->swap_interval); + + return &pdraw->base; +} + +#if HAS_SBC +static int +dri3_drawable_get_msc(struct glx_screen *psc, __GLXDRIdrawable *pdraw, + int64_t *ust, int64_t *msc, int64_t *sbc) +{ + xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); + xcb_dri2_get_msc_cookie_t get_msc_cookie; + xcb_dri2_get_msc_reply_t *get_msc_reply; + + get_msc_cookie = xcb_dri2_get_msc_unchecked(c, pdraw->xDrawable); + get_msc_reply = xcb_dri2_get_msc_reply(c, get_msc_cookie, NULL); + + if (!get_msc_reply) + return 0; + + *ust = merge_counter(get_msc_reply->ust_hi, get_msc_reply->ust_lo); + *msc = merge_counter(get_msc_reply->msc_hi, get_msc_reply->msc_lo); + *sbc = merge_counter(get_msc_reply->sbc_hi, get_msc_reply->sbc_lo); + free(get_msc_reply); + + return 1; +} + +static int +dri3_wait_for_msc(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, + int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) +{ + xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); + xcb_dri2_wait_msc_cookie_t wait_msc_cookie; + xcb_dri2_wait_msc_reply_t *wait_msc_reply; + uint32_t target_msc_hi, target_msc_lo; + uint32_t divisor_hi, divisor_lo; + uint32_t remainder_hi, remainder_lo; + + split_counter(target_msc, &target_msc_hi, &target_msc_lo); + split_counter(divisor, &divisor_hi, &divisor_lo); + split_counter(remainder, &remainder_hi, &remainder_lo); + + wait_msc_cookie = xcb_dri2_wait_msc_unchecked(c, pdraw->xDrawable, + target_msc_hi, target_msc_lo, + divisor_hi, divisor_lo, + remainder_hi, remainder_lo); + wait_msc_reply = xcb_dri2_wait_msc_reply(c, wait_msc_cookie, NULL); + + if (!wait_msc_reply) + return 0; + + *ust = merge_counter(wait_msc_reply->ust_hi, wait_msc_reply->ust_lo); + *msc = merge_counter(wait_msc_reply->msc_hi, wait_msc_reply->msc_lo); + *sbc = merge_counter(wait_msc_reply->sbc_hi, wait_msc_reply->sbc_lo); + free(wait_msc_reply); + + return 1; +} + +static int +dri3_wait_for_sbc(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, + int64_t *msc, int64_t *sbc) +{ + xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); + xcb_dri2_wait_sbc_cookie_t wait_sbc_cookie; + xcb_dri2_wait_sbc_reply_t *wait_sbc_reply; + uint32_t target_sbc_hi, target_sbc_lo; + + split_counter(target_sbc, &target_sbc_hi, &target_sbc_lo); + + wait_sbc_cookie = xcb_dri2_wait_sbc_unchecked(c, pdraw->xDrawable, + target_sbc_hi, target_sbc_lo); + wait_sbc_reply = xcb_dri2_wait_sbc_reply(c, wait_sbc_cookie, NULL); + + if (!wait_sbc_reply) + return 0; + + *ust = merge_counter(wait_sbc_reply->ust_hi, wait_sbc_reply->ust_lo); + *msc = merge_counter(wait_sbc_reply->msc_hi, wait_sbc_reply->msc_lo); + *sbc = merge_counter(wait_sbc_reply->sbc_hi, wait_sbc_reply->sbc_lo); + free(wait_sbc_reply); + + return 1; +} +#endif /* HAS_SBC */ + +static __DRIcontext * +dri3_get_current_context(void) +{ + struct glx_context *gc = __glXGetCurrentContext(); + struct dri3_context *dri3Ctx = (struct dri3_context *)gc; + + return dri3Ctx ? dri3Ctx->driContext : NULL; +} + +/** + * dri3Throttle - Request driver throttling + * + * This function uses the DRI2 throttle extension to give the + * driver the opportunity to throttle on flush front, copysubbuffer + * and swapbuffers. + */ +static void +dri3_throttle(struct dri3_screen *psc, + struct dri3_drawable *draw, + enum __DRI2throttleReason reason) +{ + if (psc->throttle) { + __DRIcontext *ctx = dri3_get_current_context(); + + psc->throttle->throttle(ctx, draw->driDrawable, reason); + } +} + +/** + * Asks the driver to flush any queued work necessary for serializing with the + * X command stream, and optionally the slightly more strict requirement of + * glFlush() equivalence (which would require flushing even if nothing had + * been drawn to a window system framebuffer, for example). + */ +static void +dri3_flush(struct dri3_screen *psc, + __DRIcontext *ctx, + struct dri3_drawable *draw, + unsigned flags, + enum __DRI2throttleReason throttle_reason) +{ + if (ctx && psc->f && psc->f->base.version >= 4) { + psc->f->flush_with_flags(ctx, draw->driDrawable, flags, throttle_reason); + } else { + if (flags & __DRI2_FLUSH_CONTEXT) + glFlush(); + + if (psc->f) + psc->f->flush(draw->driDrawable); + + dri3_throttle(psc, draw, throttle_reason); + } +} + +static xcb_gcontext_t +dri3_drawable_gc(struct dri3_drawable *priv) +{ + if (!priv->gc) { + uint32_t v; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + + v = 0; + xcb_create_gc(c, + (priv->gc = xcb_generate_id(c)), + priv->base.xDrawable, + XCB_GC_GRAPHICS_EXPOSURES, + &v); + } + return priv->gc; +} + +static __DRIdri3Buffer * +dri3_back_buffer(struct dri3_drawable *priv) +{ + return priv->buffers[__DRI3_BUFFER_BACK]; +} + +static __DRIdri3Buffer * +dri3_fake_front_buffer(struct dri3_drawable *priv) +{ + return priv->buffers[__DRI3_BUFFER_FRONT]; +} + +static void +dri3_copy_area (xcb_connection_t *c /**< */, + xcb_drawable_t src_drawable /**< */, + xcb_drawable_t dst_drawable /**< */, + xcb_gcontext_t gc /**< */, + int16_t src_x /**< */, + int16_t src_y /**< */, + int16_t dst_x /**< */, + int16_t dst_y /**< */, + uint16_t width /**< */, + uint16_t height /**< */) +{ + xcb_void_cookie_t cookie; + + cookie = xcb_copy_area_checked(c, + src_drawable, + dst_drawable, + gc, + src_x, + src_y, + dst_x, + dst_y, + width, + height); + xcb_discard_reply(c, cookie.sequence); +} + +static void +_dri3_copy_sub_buffer(__GLXDRIdrawable *pdraw, int x, int y, + int width, int height, + enum __DRI2throttleReason reason, Bool flush) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + struct dri3_screen *psc = (struct dri3_screen *) pdraw->psc; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + __DRIcontext *ctx = dri3_get_current_context(); + __DRIdri3Buffer *back = dri3_back_buffer(priv); + + unsigned flags; + + /* Check we have the right attachments */ + if (!priv->have_back || priv->is_pixmap) + return; + + flags = __DRI2_FLUSH_DRAWABLE; + if (flush) + flags |= __DRI2_FLUSH_CONTEXT; + dri3_flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER); + + y = priv->height - y - height; + + dri3_fence_reset(c, back); + dri3_copy_area(c, + dri3_back_buffer(priv)->pixmap, + priv->base.xDrawable, + dri3_drawable_gc(priv), + x, y, x, y, width, height); + dri3_fence_trigger(c, back); + /* Refresh the fake front (if present) after we just damaged the real + * front. + */ + if (priv->have_fake_front) { + dri3_fence_reset(c, dri3_fake_front_buffer(priv)); + dri3_copy_area(c, + dri3_back_buffer(priv)->pixmap, + dri3_fake_front_buffer(priv)->pixmap, + dri3_drawable_gc(priv), + x, y, x, y, width, height); + dri3_fence_trigger(c, dri3_fake_front_buffer(priv)); + dri3_fence_await(c, dri3_fake_front_buffer(priv)); + } + dri3_fence_await(c, back); +} + +static void +dri3_copy_sub_buffer(__GLXDRIdrawable *pdraw, int x, int y, + int width, int height, Bool flush) +{ + _dri3_copy_sub_buffer(pdraw, x, y, width, height, + __DRI2_THROTTLE_COPYSUBBUFFER, flush); +} + + +static void +dri3_copy_drawable(struct dri3_drawable *priv, Drawable dest, Drawable src) +{ + struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + + if (psc->f) + (*psc->f->flush) (priv->driDrawable); + + dri3_copy_area(c, + src, dest, + dri3_drawable_gc(priv), + 0, 0, 0, 0, priv->width, priv->height); +} + +static void +dri3_wait_x(struct glx_context *gc) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) + GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); + + if (priv == NULL || !priv->have_fake_front) + return; + + dri3_copy_drawable(priv, dri3_fake_front_buffer(priv)->pixmap, priv->base.xDrawable); +} + +static void +dri3_wait_gl(struct glx_context *gc) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) + GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable); + + if (priv == NULL || !priv->have_fake_front) + return; + + dri3_copy_drawable(priv, priv->base.xDrawable, dri3_fake_front_buffer(priv)->pixmap); +} + +/** + * Called by the driver when it needs to update the real front buffer with the + * contents of its fake front buffer. + */ +static void +dri3_flush_front_buffer(__DRIdrawable *driDrawable, void *loaderPrivate) +{ + struct glx_context *gc; + struct dri3_drawable *pdraw = loaderPrivate; + struct dri3_screen *psc; + + if (!pdraw) + return; + + if (!pdraw->base.psc) + return; + + psc = (struct dri3_screen *) pdraw->base.psc; + + (void) __glXInitialize(psc->base.dpy); + + gc = __glXGetCurrentContext(); + + dri3_throttle(psc, pdraw, __DRI2_THROTTLE_FLUSHFRONT); + + dri3_wait_gl(gc); +} + +static __DRIdri3Buffer * +dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, unsigned int format, int width, int height, int depth) +{ + struct dri3_screen *psc = (struct dri3_screen *) glx_screen; + Display *dpy = glx_screen->dpy; + __DRIdri3Buffer *buffer; + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_pixmap_t pixmap; + xcb_sync_fence_t sync_fence; + int32_t *shm_fence; + int buffer_fd, fence_fd; + + fence_fd = xshmfence_alloc_shm(); + if (fence_fd < 0) + return NULL; + shm_fence = xshmfence_map_shm(fence_fd); + if (shm_fence == NULL) + goto no_shm_fence; + + buffer = (*psc->dri3->allocateBuffer) (psc->driScreen, + format, + width, + height); + if (buffer == NULL) + goto no_buffer; + + buffer_fd = (*psc->dri3->bufferToFd)(psc->driScreen, buffer); + if (buffer_fd < 0) + goto no_buffer_fd; + + xcb_dri3_pixmap_from_buffer(c, + (pixmap = xcb_generate_id(c)), + draw, + buffer->size, + width, height, buffer->pitch, + depth, buffer->cpp * 8, + buffer_fd); + + xcb_dri3_fence_from_fd(c, + pixmap, + (sync_fence = xcb_generate_id(c)), + false, + fence_fd); + + buffer->pixmap = pixmap; + buffer->sync_fence = sync_fence; + buffer->shm_fence = shm_fence; + buffer->width = width; + buffer->height = height; + return buffer; + +no_buffer_fd: + (*psc->dri3->releaseBuffer)(psc->driScreen, buffer); +no_buffer: + xshmfence_unmap_shm(shm_fence); +no_shm_fence: + close(fence_fd); + return NULL; +} + +static void +dri3_free_render_buffer(struct dri3_drawable *pdraw, __DRIdri3Buffer *buffer) +{ + struct dri3_screen *psc = (struct dri3_screen *) pdraw->base.psc; + xcb_connection_t *c = XGetXCBConnection(pdraw->base.psc->dpy); + + xcb_free_pixmap(c, buffer->pixmap); + xcb_sync_destroy_fence(c, buffer->sync_fence); + xshmfence_unmap_shm(buffer->shm_fence); + (*psc->dri3->releaseBuffer)(psc->driScreen, buffer); +} + +static int +dri3_update_drawable(__DRIdrawable *driDrawable, void *loaderPrivate) +{ + struct dri3_drawable *priv = loaderPrivate; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + + /* First time through, go get the current drawable geometry + */ + if (priv->width == 0 || priv->height == 0 || priv->depth == 0) { + xcb_get_geometry_cookie_t geom_cookie; + xcb_get_geometry_reply_t *geom_reply; + struct dri3_screen *psc; + xcb_void_cookie_t cookie; + xcb_generic_error_t *error; + + cookie = xcb_present_select_input_checked(c, + (priv->eid = xcb_generate_id(c)), + priv->base.xDrawable, + XCB_PRESENT_EVENT_MASK_CONFIGURE_NOTIFY| + XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY); + + if (!priv->present_extension) { + priv->present_extension = xcb_get_extension_data(c, &xcb_present_id); + if (!priv->present_extension) + return false; + } + + psc = (struct dri3_screen *) priv->base.psc; + priv->special_event = xcb_register_for_special_event(c, + priv->present_extension->major_opcode, + priv->eid, + psc->dri3->stamp(driDrawable)); + + geom_cookie = xcb_get_geometry(c, priv->base.xDrawable); + + geom_reply = xcb_get_geometry_reply(c, geom_cookie, NULL); + + if (!geom_reply) + return false; + + priv->width = geom_reply->width; + priv->height = geom_reply->height; + priv->depth = geom_reply->depth; + priv->is_pixmap = false; + + free(geom_reply); + + error = xcb_request_check(c, cookie); + + if (error) { + if (error->error_code != BadWindow) { + free(error); + return false; + } + priv->is_pixmap = true; + xcb_unregister_for_special_event(c, priv->special_event); + priv->special_event = NULL; + } + } + + /* Check to see if any configuration changes have occurred + * since we were last invoked + */ + if (priv->special_event) { + xcb_generic_event_t *ev; + + while ((ev = xcb_check_for_special_event(c, priv->special_event)) != NULL) { + xcb_present_generic_event_t *pe = (void *) ev; + + switch (pe->evtype) { + case XCB_PRESENT_EVENT_CONFIGURE_NOTIFY: { + xcb_configure_notify_event_t *ce = (void *) ev; + + priv->width = ce->width; + priv->height = ce->height; + break; + } + case XCB_PRESENT_EVENT_IDLE_NOTIFY: + break; + } + free(ev); + } + } + return true; +} + +static __DRIdri3Buffer * +dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, + unsigned int format, + enum __DRI3bufferType buffer_type, + void *loaderPrivate) +{ + struct dri3_drawable *pdraw = loaderPrivate; + __DRIdri3Buffer *buffer = pdraw->buffers[buffer_type]; + Pixmap pixmap; + xcb_dri3_buffer_from_pixmap_cookie_t bp_cookie; + xcb_dri3_buffer_from_pixmap_reply_t *bp_reply; + int *fds; + int buffer_fd; + Display *dpy; + struct dri3_screen *psc; + xcb_connection_t *c; + xcb_sync_fence_t sync_fence; + int32_t *shm_fence; + int fence_fd; + + if (buffer) + return buffer; + + pixmap = pdraw->base.xDrawable; + psc = (struct dri3_screen *) pdraw->base.psc; + dpy = psc->base.dpy; + c = XGetXCBConnection(dpy); + + fence_fd = xshmfence_alloc_shm(); + if (fence_fd < 0) + return NULL; + shm_fence = xshmfence_map_shm(fence_fd); + if (shm_fence == NULL) { + close (fence_fd); + return NULL; + } + + xcb_dri3_fence_from_fd(c, + pixmap, + (sync_fence = xcb_generate_id(c)), + false, + fence_fd); + + bp_cookie = xcb_dri3_buffer_from_pixmap(c, pixmap); + bp_reply = xcb_dri3_buffer_from_pixmap_reply(c, bp_cookie, NULL); + if (!bp_reply) + goto no_pixmap; + fds = xcb_dri3_buffer_from_pixmap_reply_fds(c, bp_reply); + buffer_fd = fds[0]; + buffer = (*psc->dri3->fdToBuffer)(psc->driScreen, + buffer_fd, + format, + bp_reply->width, + bp_reply->height, + bp_reply->stride, + bp_reply->size); + close(buffer_fd); + if (!buffer) + goto no_pixmap; + + buffer->pixmap = pixmap; + buffer->width = bp_reply->width; + buffer->height = bp_reply->height; + buffer->buffer_type = buffer_type; + buffer->shm_fence = shm_fence; + buffer->sync_fence = sync_fence; + + pdraw->buffers[buffer_type] = buffer; + return buffer; + +no_pixmap: + xcb_sync_destroy_fence(c, sync_fence); + xshmfence_unmap_shm(shm_fence); + return NULL; +} + +static __DRIdri3Buffer * +dri3_get_buffer(__DRIdrawable *driDrawable, + unsigned int format, + enum __DRI3bufferType buffer_type, + void *loaderPrivate) +{ + struct dri3_drawable *priv = loaderPrivate; + __DRIdri3Buffer *buffer = priv->buffers[buffer_type]; + + if (!buffer || buffer->width != priv->width || buffer->height != priv->height) { + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + __DRIdri3Buffer *new_buffer; + + /* Allocate the new buffers + */ + new_buffer = dri3_alloc_render_buffer(priv->base.psc, + priv->base.xDrawable, + format, priv->width, priv->height, priv->depth); + if (!new_buffer) + return NULL; + switch (buffer_type) { + case __DRI3_BUFFER_BACK: + if (buffer) { + dri3_fence_reset(c, new_buffer); + dri3_fence_await(c, buffer); + dri3_copy_area(c, + buffer->pixmap, + new_buffer->pixmap, + dri3_drawable_gc(priv), + 0, 0, 0, 0, priv->width, priv->height); + dri3_fence_trigger(c, new_buffer); + dri3_free_render_buffer(priv, buffer); + dri3_fence_await(c, new_buffer); + } + break; + case __DRI3_BUFFER_FRONT: + dri3_fence_reset(c, new_buffer); + dri3_copy_area(c, + priv->base.xDrawable, + new_buffer->pixmap, + dri3_drawable_gc(priv), + 0, 0, 0, 0, priv->width, priv->height); + dri3_fence_trigger(c, new_buffer); + dri3_fence_await(c, new_buffer); + break; + } + buffer = new_buffer; + buffer->buffer_type = buffer_type; + priv->buffers[buffer_type] = buffer; + } + + /* Return the requested buffer */ + return buffer; +} + +static void +dri3_free_buffer(__DRIdrawable *driDrawable, + enum __DRI3bufferType buffer_type, + void *loaderPrivate) +{ + struct dri3_drawable *priv = loaderPrivate; + __DRIdri3Buffer *buffer = priv->buffers[buffer_type]; + + if (buffer) { + dri3_free_render_buffer(priv, buffer); + priv->buffers[buffer_type] = NULL; + } +} + +static int +dri3_get_buffers(__DRIdrawable *driDrawable, + int *width, int *height, + unsigned int format, + void *loaderPrivate, + int need_front, + int need_back, + __DRIdri3Buffer **front, + __DRIdri3Buffer **back) +{ + struct dri3_drawable *priv = loaderPrivate; + + *front = NULL; + *back = NULL; + + if (!dri3_update_drawable(driDrawable, loaderPrivate)) + return false; + + if (priv->is_pixmap) + need_front = 1; + + if (need_front) { + if (priv->is_pixmap) + *front = dri3_get_pixmap_buffer(driDrawable, + format, + __DRI3_BUFFER_FRONT, + loaderPrivate); + else + *front = dri3_get_buffer(driDrawable, + format, + __DRI3_BUFFER_FRONT, + loaderPrivate); + + if (!*front) + return false; + priv->have_fake_front = !priv->is_pixmap; + } else { + dri3_free_buffer(driDrawable, __DRI3_BUFFER_FRONT, loaderPrivate); + priv->have_fake_front = 0; + } + + if (need_back) { + *back = dri3_get_buffer(driDrawable, + format, + __DRI3_BUFFER_BACK, + loaderPrivate); + if (!*back) + return false; + priv->have_back = 1; + } else { + dri3_free_buffer(driDrawable, __DRI3_BUFFER_BACK, loaderPrivate); + priv->have_back = 0; + } + + /* Report back current geometry */ + *width = priv->width; + *height = priv->height; + return true; +} + +static int64_t +dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, + int64_t remainder, Bool flush) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + int64_t ret = 0; + + __DRIcontext *ctx = dri3_get_current_context(); + unsigned flags = __DRI2_FLUSH_DRAWABLE; + if (flush) + flags |= __DRI2_FLUSH_CONTEXT; + dri3_flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER); + + if (priv->buffers[0] && !priv->is_pixmap) { + dri3_fence_reset(c, priv->buffers[0]); + dri3_copy_area(c, + priv->buffers[0]->pixmap, + priv->base.xDrawable, + dri3_drawable_gc(priv), + 0, 0, 0, 0, priv->width, priv->height); + dri3_fence_trigger(c, priv->buffers[0]); + if (priv->have_fake_front) { + dri3_fence_reset(c, priv->buffers[1]); + dri3_copy_area(c, + priv->buffers[0]->pixmap, + priv->buffers[1]->pixmap, + dri3_drawable_gc(priv), + 0, 0, 0, 0, priv->width, priv->height); + dri3_fence_trigger(c, priv->buffers[1]); + } + dri3_fence_await(c, priv->buffers[0]); + if (priv->have_fake_front) + dri3_fence_await(c, priv->buffers[1]); + } + + return ret; +} + +static int +dri3_query_version(Display *dpy, int *major, int *minor) +{ + xcb_dri3_query_version_cookie_t cookie; + xcb_dri3_query_version_reply_t *reply; + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_generic_error_t *error; + + cookie = xcb_dri3_query_version(c, + XCB_DRI3_MAJOR_VERSION, + XCB_DRI3_MINOR_VERSION); + reply = xcb_dri3_query_version_reply(c, cookie, &error); + if (!reply) { + if (error) { + free(error); + } + return 0; + } + *major = reply->major_version; + *minor = reply->minor_version; + free(reply); + return 1; +} + +static int +dri3_open(Display *dpy, + Window root, + CARD32 provider) +{ + xcb_dri3_open_cookie_t cookie; + xcb_dri3_open_reply_t *reply; + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_generic_error_t *error; + int fd; + + cookie = xcb_dri3_open(c, + root, + provider); + + reply = xcb_dri3_open_reply(c, cookie, &error); + if (!reply) + return -1; + + if (reply->nfd != 1) { + free(reply); + return -1; + } + + fd = xcb_dri3_open_reply_fds(c, reply)[0]; + fcntl(fd, F_SETFD, FD_CLOEXEC); + + return fd; +} + + +static void +dri3_destroy_screen(struct glx_screen *base) +{ + struct dri3_screen *psc = (struct dri3_screen *) base; + + /* Free the direct rendering per screen data */ + (*psc->core->destroyScreen) (psc->driScreen); + driDestroyConfigs(psc->driver_configs); + close(psc->fd); + free(psc); +} + +#if HAS_SBC +static int +dri3_set_swap_interval(__GLXDRIdrawable *pdraw, int interval) +{ + xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; + struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; + + if (psc->config) + psc->config->configQueryi(psc->driScreen, + "vblank_mode", &vblank_mode); + + switch (vblank_mode) { + case DRI_CONF_VBLANK_NEVER: + if (interval != 0) + return GLX_BAD_VALUE; + break; + case DRI_CONF_VBLANK_ALWAYS_SYNC: + if (interval <= 0) + return GLX_BAD_VALUE; + break; + default: + break; + } + + xcb_dri2_swap_interval(c, priv->base.xDrawable, interval); + priv->swap_interval = interval; + + return 0; +} + +static int +dri3_get_swap_interval(__GLXDRIdrawable *pdraw) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + + return priv->swap_interval; +} +#endif + +static const __DRIdri3LoaderExtension dri3LoaderExtension = { + {__DRI_DRI3_LOADER, __DRI_DRI3_LOADER_VERSION}, + .getBuffers = dri3_get_buffers, + .flushFrontBuffer = dri3_flush_front_buffer, +}; + +static void +dri3_bind_tex_image(Display * dpy, + GLXDrawable drawable, + int buffer, const int *attrib_list) +{ + struct glx_context *gc = __glXGetCurrentContext(); + struct dri3_context *pcp = (struct dri3_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct dri3_drawable *pdraw = (struct dri3_drawable *) base; + struct dri3_screen *psc; + + if (pdraw != NULL) { + psc = (struct dri3_screen *) base->psc; + + if (psc->f && + psc->f->base.version >= 3 && psc->f->invalidate) + psc->f->invalidate(pdraw->driDrawable); + + XSync(dpy, false); + if (psc->texBuffer->base.version >= 2 && + psc->texBuffer->setTexBuffer2 != NULL) { + (*psc->texBuffer->setTexBuffer2) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->base.textureFormat, + pdraw->driDrawable); + } + else { + (*psc->texBuffer->setTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +} + +static void +dri3_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer) +{ +#if __DRI_TEX_BUFFER_VERSION >= 3 + struct glx_context *gc = __glXGetCurrentContext(); + struct dri3_context *pcp = (struct dri3_context *) gc; + __GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable); + struct glx_display *dpyPriv = __glXInitialize(dpy); + struct dri3_drawable *pdraw = (struct dri3_drawable *) base; + struct dri3_display *pdp = + (struct dri3_display *) dpyPriv->dri3Display; + struct dri3_screen *psc; + + if (pdraw != NULL) { + psc = (struct dri3_screen *) base->psc; + + if (psc->texBuffer->base.version >= 3 && + psc->texBuffer->releaseTexBuffer != NULL) { + (*psc->texBuffer->releaseTexBuffer) (pcp->driContext, + pdraw->base.textureTarget, + pdraw->driDrawable); + } + } +#endif +} + +static const struct glx_context_vtable dri3_context_vtable = { + dri3_destroy_context, + dri3_bind_context, + dri3_unbind_context, + dri3_wait_gl, + dri3_wait_x, + DRI_glXUseXFont, + dri3_bind_tex_image, + dri3_release_tex_image, + NULL, /* get_proc_address */ +}; + +static void +dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, + const char *driverName) +{ +// const struct dri3_display *const pdp = (struct dri3_display *) priv->dri3Display; + const __DRIextension **extensions; + unsigned mask; + int i; + + extensions = psc->core->getExtensions(psc->driScreen); + + __glXEnableDirectExtension(&psc->base, "GLX_SGI_video_sync"); + __glXEnableDirectExtension(&psc->base, "GLX_SGI_swap_control"); + __glXEnableDirectExtension(&psc->base, "GLX_MESA_swap_control"); + __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read"); + + /* + * GLX_INTEL_swap_event is broken on the server side, where it's + * currently unconditionally enabled. This completely breaks + * systems running on drivers which don't support that extension. + * There's no way to test for its presence on this side, so instead + * of disabling it unconditionally, just disable it for drivers + * which are known to not support it, or for DDX drivers supporting + * only an older (pre-ScheduleSwap) version of DRI2. + * + * This is a hack which is required until: + * http://lists.x.org/archives/xorg-devel/2013-February/035449.html + * is merged and updated xserver makes it's way into distros: + */ +// if (pdp->swapAvailable && strcmp(driverName, "vmwgfx") != 0) { +// __glXEnableDirectExtension(&psc->base, "GLX_INTEL_swap_event"); +// } + + mask = psc->dri3->getAPIMask(psc->driScreen); + + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); + + if ((mask & (1 << __DRI_API_GLES2)) != 0) + __glXEnableDirectExtension(&psc->base, + "GLX_EXT_create_context_es2_profile"); + + for (i = 0; extensions[i]; i++) { + if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) { + psc->texBuffer = (__DRItexBufferExtension *) extensions[i]; + __glXEnableDirectExtension(&psc->base, "GLX_EXT_texture_from_pixmap"); + } + + if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) { + psc->f = (__DRI2flushExtension *) extensions[i]; + /* internal driver extension, no GL extension exposed */ + } + + if ((strcmp(extensions[i]->name, __DRI2_CONFIG_QUERY) == 0)) + psc->config = (__DRI2configQueryExtension *) extensions[i]; + + if (((strcmp(extensions[i]->name, __DRI2_THROTTLE) == 0))) + psc->throttle = (__DRI2throttleExtension *) extensions[i]; + + if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0) + __glXEnableDirectExtension(&psc->base, + "GLX_ARB_create_context_robustness"); + } +} + +static const struct glx_screen_vtable dri3_screen_vtable = { + dri3_create_context, + dri3_create_context_attribs +}; + +static struct glx_screen * +dri3_create_screen(int screen, struct glx_display * priv) +{ + const __DRIconfig **driver_configs; + const __DRIextension **extensions; + const struct dri3_display *const pdp = (struct dri3_display *) + priv->dri3Display; + struct dri3_screen *psc; + __GLXDRIscreen *psp; + struct glx_config *configs = NULL, *visuals = NULL; + char *driverName, *deviceName, *tmp; + int i; + + psc = calloc(1, sizeof *psc); + if (psc == NULL) + return NULL; + + psc->fd = -1; + + if (!glx_screen_init(&psc->base, screen, priv)) { + free(psc); + return NULL; + } + + psc->fd = dri3_open(priv->dpy, RootWindow(priv->dpy, screen), None); + if (psc->fd < 0) { + glx_screen_cleanup(&psc->base); + free(psc); + InfoMessageF("screen %d does not appear to be DRI3 capable\n", screen); + return NULL; + } + deviceName = NULL; + + driverName = dri3_get_driver_for_fd(psc->fd); + if (!driverName) { + ErrorMessageF("No driver found\n"); + goto handle_error; + } + + psc->driver = driOpenDriver(driverName); + if (psc->driver == NULL) { + ErrorMessageF("driver pointer missing\n"); + goto handle_error; + } + + extensions = driGetDriverExtensions(psc->driver, driverName); + if (extensions == NULL) + goto handle_error; + + for (i = 0; extensions[i]; i++) { + if (strcmp(extensions[i]->name, __DRI_CORE) == 0) + psc->core = (__DRIcoreExtension *) extensions[i]; + if (strcmp(extensions[i]->name, __DRI_DRI3) == 0) + psc->dri3 = (__DRIdri3Extension *) extensions[i]; + } + + if (psc->core == NULL || psc->dri3 == NULL) { + ErrorMessageF("core dri or dri3 extension not found\n"); + goto handle_error; + } + + psc->driScreen = + psc->dri3->createNewScreen2(screen, psc->fd, + (const __DRIextension **) + &pdp->loader_extensions[0], + extensions, + &driver_configs, psc); + + if (psc->driScreen == NULL) { + ErrorMessageF("failed to create dri screen\n"); + goto handle_error; + } + + dri3_bind_extensions(psc, priv, driverName); + + configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs); + visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs); + + if (!configs || !visuals) + goto handle_error; + + glx_config_destroy_list(psc->base.configs); + psc->base.configs = configs; + glx_config_destroy_list(psc->base.visuals); + psc->base.visuals = visuals; + + psc->driver_configs = driver_configs; + + psc->base.vtable = &dri3_screen_vtable; + psp = &psc->vtable; + psc->base.driScreen = psp; + psp->destroyScreen = dri3_destroy_screen; + psp->createDrawable = dri3_create_drawable; + psp->swapBuffers = dri3_swap_buffers; + psp->getDrawableMSC = NULL; + psp->waitForMSC = NULL; + psp->waitForSBC = NULL; + psp->setSwapInterval = NULL; + psp->getSwapInterval = NULL; + +#if HAS_SBC + if (pdp->driMinor >= 2) { + psp->getDrawableMSC = dri3DrawableGetMSC; + psp->waitForMSC = dri3WaitForMSC; + psp->waitForSBC = dri3WaitForSBC; + psp->setSwapInterval = dri3SetSwapInterval; + psp->getSwapInterval = dri3GetSwapInterval; + __glXEnableDirectExten... [truncated message content] |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:14
|
This just renames them so that they can be used with the DRI3 extension without causing too much confusion. Signed-off-by: Keith Packard <ke...@ke...> --- src/mesa/drivers/dri/common/dri_util.c | 50 +++++++++++++++++----------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index c28b0fc..539fb4b 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -291,13 +291,13 @@ validate_context_version(__DRIscreen *screen, /*@{*/ static __DRIcontext * -dri2CreateContextAttribs(__DRIscreen *screen, int api, - const __DRIconfig *config, - __DRIcontext *shared, - unsigned num_attribs, - const uint32_t *attribs, - unsigned *error, - void *data) +driCreateContextAttribs(__DRIscreen *screen, int api, + const __DRIconfig *config, + __DRIcontext *shared, + unsigned num_attribs, + const uint32_t *attribs, + unsigned *error, + void *data) { __DRIcontext *context; const struct gl_config *modes = (config != NULL) ? &config->modes : NULL; @@ -442,22 +442,22 @@ dri2CreateContextAttribs(__DRIscreen *screen, int api, } static __DRIcontext * -dri2CreateNewContextForAPI(__DRIscreen *screen, int api, - const __DRIconfig *config, - __DRIcontext *shared, void *data) +driCreateNewContextForAPI(__DRIscreen *screen, int api, + const __DRIconfig *config, + __DRIcontext *shared, void *data) { unsigned error; - return dri2CreateContextAttribs(screen, api, config, shared, 0, NULL, - &error, data); + return driCreateContextAttribs(screen, api, config, shared, 0, NULL, + &error, data); } static __DRIcontext * -dri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config, - __DRIcontext *shared, void *data) +driCreateNewContext(__DRIscreen *screen, const __DRIconfig *config, + __DRIcontext *shared, void *data) { - return dri2CreateNewContextForAPI(screen, __DRI_API_OPENGL, - config, shared, data); + return driCreateNewContextForAPI(screen, __DRI_API_OPENGL, + config, shared, data); } /** @@ -609,9 +609,9 @@ static void dri_put_drawable(__DRIdrawable *pdp) } static __DRIdrawable * -dri2CreateNewDrawable(__DRIscreen *screen, - const __DRIconfig *config, - void *data) +driCreateNewDrawable(__DRIscreen *screen, + const __DRIconfig *config, + void *data) { __DRIdrawable *pdraw; @@ -698,7 +698,7 @@ dri2ConfigQueryf(__DRIscreen *screen, const char *var, GLfloat *val) } static unsigned int -dri2GetAPIMask(__DRIscreen *screen) +driGetAPIMask(__DRIscreen *screen) { return screen->api_mask; } @@ -741,13 +741,13 @@ const __DRIdri2Extension driDRI2Extension = { .base = { __DRI_DRI2, 4 }, .createNewScreen = dri2CreateNewScreen, - .createNewDrawable = dri2CreateNewDrawable, - .createNewContext = dri2CreateNewContext, - .getAPIMask = dri2GetAPIMask, - .createNewContextForAPI = dri2CreateNewContextForAPI, + .createNewDrawable = driCreateNewDrawable, + .createNewContext = driCreateNewContext, + .getAPIMask = driGetAPIMask, + .createNewContextForAPI = driCreateNewContextForAPI, .allocateBuffer = dri2AllocateBuffer, .releaseBuffer = dri2ReleaseBuffer, - .createContextAttribs = dri2CreateContextAttribs, + .createContextAttribs = driCreateContextAttribs .createNewScreen2 = dri2CreateNewScreen2, }; -- 1.8.4.2 |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:07
|
The first four patches prepare the library for DRI3, then the final two patches add DRI3 and Present support. Minor changes: [PATCH 1/6] drivers/dri/common: A few dri2 functions are not actually [PATCH 2/6] dri/intel: Split out DRI2 buffer update code to separate [PATCH 3/6] dri/intel: Add explicit size parameter to [PATCH 4/6] dri/intel: Add intel_fd_for_region New code: [PATCH 5/6] dri3: Add DRI3 support to GLX, DRI common and Intel [PATCH 6/6] Make GLX/dri3 use the Present extension when available |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:07
|
Make an easy place to splice in a DRI3 version of this function Signed-off-by: Keith Packard <ke...@ke...> --- src/mesa/drivers/dri/i915/intel_context.c | 90 +++++++++++++++++-------------- src/mesa/drivers/dri/i965/brw_context.c | 22 ++++++-- 2 files changed, 68 insertions(+), 44 deletions(-) diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index 2748514..1798bc7 100644 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -133,15 +133,58 @@ intel_process_dri2_buffer(struct intel_context *intel, struct intel_renderbuffer *rb, const char *buffer_name); -void -intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) +static void +intel_update_dri2_buffers(struct intel_context *intel, __DRIdrawable *drawable) { - struct gl_framebuffer *fb = drawable->driverPrivate; - struct intel_renderbuffer *rb; - struct intel_context *intel = context->driverPrivate; __DRIbuffer *buffers = NULL; int i, count; const char *region_name; + struct intel_renderbuffer *rb; + struct gl_framebuffer *fb = drawable->driverPrivate; + + intel_query_dri2_buffers(intel, drawable, &buffers, &count); + + if (buffers == NULL) + return; + + for (i = 0; i < count; i++) { + switch (buffers[i].attachment) { + case __DRI_BUFFER_FRONT_LEFT: + rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); + region_name = "dri2 front buffer"; + break; + + case __DRI_BUFFER_FAKE_FRONT_LEFT: + rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); + region_name = "dri2 fake front buffer"; + break; + + case __DRI_BUFFER_BACK_LEFT: + rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); + region_name = "dri2 back buffer"; + break; + + case __DRI_BUFFER_DEPTH: + case __DRI_BUFFER_HIZ: + case __DRI_BUFFER_DEPTH_STENCIL: + case __DRI_BUFFER_STENCIL: + case __DRI_BUFFER_ACCUM: + default: + fprintf(stderr, + "unhandled buffer attach event, attachment type %d\n", + buffers[i].attachment); + return; + } + + intel_process_dri2_buffer(intel, drawable, &buffers[i], rb, region_name); + } +} + +void +intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) +{ + struct intel_context *intel = context->driverPrivate; + __DRIscreen *screen = intel->intelScreen->driScrnPriv; /* Set this up front, so that in case our buffers get invalidated * while we're getting new buffers, we don't clobber the stamp and @@ -151,42 +194,7 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) if (unlikely(INTEL_DEBUG & DEBUG_DRI)) fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable); - intel_query_dri2_buffers(intel, drawable, &buffers, &count); - - if (buffers == NULL) - return; - - for (i = 0; i < count; i++) { - switch (buffers[i].attachment) { - case __DRI_BUFFER_FRONT_LEFT: - rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); - region_name = "dri2 front buffer"; - break; - - case __DRI_BUFFER_FAKE_FRONT_LEFT: - rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); - region_name = "dri2 fake front buffer"; - break; - - case __DRI_BUFFER_BACK_LEFT: - rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); - region_name = "dri2 back buffer"; - break; - - case __DRI_BUFFER_DEPTH: - case __DRI_BUFFER_HIZ: - case __DRI_BUFFER_DEPTH_STENCIL: - case __DRI_BUFFER_STENCIL: - case __DRI_BUFFER_ACCUM: - default: - fprintf(stderr, - "unhandled buffer attach event, attachment type %d\n", - buffers[i].attachment); - return; - } - - intel_process_dri2_buffer(intel, drawable, &buffers[i], rb, region_name); - } + intel_update_dri2_buffers(intel, drawable); driUpdateFramebufferSize(&intel->ctx, drawable); } diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 38147e9..c213b31 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -929,12 +929,11 @@ intel_process_dri2_buffer(struct brw_context *brw, struct intel_renderbuffer *rb, const char *buffer_name); -void -intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) +static void +intel_update_dri2_buffers(struct brw_context *brw, __DRIdrawable *drawable) { struct gl_framebuffer *fb = drawable->driverPrivate; struct intel_renderbuffer *rb; - struct brw_context *brw = context->driverPrivate; __DRIbuffer *buffers = NULL; int i, count; const char *region_name; @@ -984,6 +983,23 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) intel_process_dri2_buffer(brw, drawable, &buffers[i], rb, region_name); } +} + +void +intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) +{ + struct brw_context *brw = context->driverPrivate; + + /* Set this up front, so that in case our buffers get invalidated + * while we're getting new buffers, we don't clobber the stamp and + * thus ignore the invalidate. */ + drawable->lastStamp = drawable->dri2.stamp; + + if (unlikely(INTEL_DEBUG & DEBUG_DRI)) + fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable); + + intel_update_dri2_buffers(brw, drawable); + driUpdateFramebufferSize(&brw->ctx, drawable); } -- 1.8.4.2 |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:07
|
Returns a prime file descriptor for the specified region. Signed-off-by: Keith Packard <ke...@ke...> --- src/mesa/drivers/dri/i915/intel_regions.c | 13 +++++++++++++ src/mesa/drivers/dri/i915/intel_regions.h | 4 ++++ src/mesa/drivers/dri/i965/intel_regions.c | 13 +++++++++++++ src/mesa/drivers/dri/i965/intel_regions.h | 4 ++++ 4 files changed, 34 insertions(+) diff --git a/src/mesa/drivers/dri/i915/intel_regions.c b/src/mesa/drivers/dri/i915/intel_regions.c index 9f5b89e..bac997d 100644 --- a/src/mesa/drivers/dri/i915/intel_regions.c +++ b/src/mesa/drivers/dri/i915/intel_regions.c @@ -238,6 +238,19 @@ intel_region_alloc_for_fd(struct intel_screen *screen, return region; } +int +intel_fd_for_region(struct intel_screen *screen, + struct intel_region *region) +{ + int fd; + int ret; + + ret = drm_intel_bo_gem_export_to_prime(region->bo, &fd); + if (ret < 0) + return ret; + return fd; +} + void intel_region_reference(struct intel_region **dst, struct intel_region *src) { diff --git a/src/mesa/drivers/dri/i915/intel_regions.h b/src/mesa/drivers/dri/i915/intel_regions.h index 6bc4a42..84c013a 100644 --- a/src/mesa/drivers/dri/i915/intel_regions.h +++ b/src/mesa/drivers/dri/i915/intel_regions.h @@ -93,6 +93,10 @@ intel_region_alloc_for_fd(struct intel_screen *screen, GLuint width, GLuint height, GLuint pitch, GLuint size, int fd, const char *name); +int +intel_fd_for_region(struct intel_screen *screen, + struct intel_region *region); + bool intel_region_flink(struct intel_region *region, uint32_t *name); diff --git a/src/mesa/drivers/dri/i965/intel_regions.c b/src/mesa/drivers/dri/i965/intel_regions.c index 3920f4f..2e70326 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.c +++ b/src/mesa/drivers/dri/i965/intel_regions.c @@ -238,6 +238,19 @@ intel_region_alloc_for_fd(struct intel_screen *screen, return region; } +int +intel_fd_for_region(struct intel_screen *screen, + struct intel_region *region) +{ + int fd; + int ret; + + ret = drm_intel_bo_gem_export_to_prime(region->bo, &fd); + if (ret < 0) + return ret; + return fd; +} + void intel_region_reference(struct intel_region **dst, struct intel_region *src) { diff --git a/src/mesa/drivers/dri/i965/intel_regions.h b/src/mesa/drivers/dri/i965/intel_regions.h index 05dfef3..f471b94 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.h +++ b/src/mesa/drivers/dri/i965/intel_regions.h @@ -95,6 +95,10 @@ intel_region_alloc_for_fd(struct intel_screen *screen, GLuint size, int fd, const char *name); +int +intel_fd_for_region(struct intel_screen *screen, + struct intel_region *region); + bool intel_region_flink(struct intel_region *region, uint32_t *name); -- 1.8.4.2 |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:07
|
Instead of assuming that the size will be height * pitch, have the caller pass in the size explicitly. Signed-off-by: Keith Packard <ke...@ke...> --- src/mesa/drivers/dri/i915/intel_regions.c | 4 ++-- src/mesa/drivers/dri/i915/intel_regions.h | 2 +- src/mesa/drivers/dri/i915/intel_screen.c | 2 +- src/mesa/drivers/dri/i965/intel_regions.c | 4 ++-- src/mesa/drivers/dri/i965/intel_regions.h | 1 + src/mesa/drivers/dri/i965/intel_screen.c | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i915/intel_regions.c b/src/mesa/drivers/dri/i915/intel_regions.c index 44f7030..9f5b89e 100644 --- a/src/mesa/drivers/dri/i915/intel_regions.c +++ b/src/mesa/drivers/dri/i915/intel_regions.c @@ -209,6 +209,7 @@ struct intel_region * intel_region_alloc_for_fd(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, + GLuint size, int fd, const char *name) { struct intel_region *region; @@ -216,8 +217,7 @@ intel_region_alloc_for_fd(struct intel_screen *screen, int ret; uint32_t bit_6_swizzle, tiling; - buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, - fd, height * pitch); + buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, fd, size); if (buffer == NULL) return NULL; ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); diff --git a/src/mesa/drivers/dri/i915/intel_regions.h b/src/mesa/drivers/dri/i915/intel_regions.h index 5c612a9..6bc4a42 100644 --- a/src/mesa/drivers/dri/i915/intel_regions.h +++ b/src/mesa/drivers/dri/i915/intel_regions.h @@ -91,7 +91,7 @@ struct intel_region * intel_region_alloc_for_fd(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, - int fd, const char *name); + GLuint size, int fd, const char *name); bool intel_region_flink(struct intel_region *region, uint32_t *name); diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 3f54752..085e894 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -653,7 +653,7 @@ intel_create_image_from_fds(__DRIscreen *screen, return NULL; image->region = intel_region_alloc_for_fd(intelScreen, - 1, width, height, + 1, width, height, height * strides[0], strides[0], fds[0], "image"); if (image->region == NULL) { free(image); diff --git a/src/mesa/drivers/dri/i965/intel_regions.c b/src/mesa/drivers/dri/i965/intel_regions.c index a6b80fd..3920f4f 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.c +++ b/src/mesa/drivers/dri/i965/intel_regions.c @@ -209,6 +209,7 @@ struct intel_region * intel_region_alloc_for_fd(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, + GLuint size, int fd, const char *name) { struct intel_region *region; @@ -216,8 +217,7 @@ intel_region_alloc_for_fd(struct intel_screen *screen, int ret; uint32_t bit_6_swizzle, tiling; - buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, - fd, height * pitch); + buffer = drm_intel_bo_gem_create_from_prime(screen->bufmgr, fd, size); if (buffer == NULL) return NULL; ret = drm_intel_bo_get_tiling(buffer, &tiling, &bit_6_swizzle); diff --git a/src/mesa/drivers/dri/i965/intel_regions.h b/src/mesa/drivers/dri/i965/intel_regions.h index f08a113..05dfef3 100644 --- a/src/mesa/drivers/dri/i965/intel_regions.h +++ b/src/mesa/drivers/dri/i965/intel_regions.h @@ -92,6 +92,7 @@ struct intel_region * intel_region_alloc_for_fd(struct intel_screen *screen, GLuint cpp, GLuint width, GLuint height, GLuint pitch, + GLuint size, int fd, const char *name); bool diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index eafafa2..0bd0789 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -712,7 +712,7 @@ intel_create_image_from_fds(__DRIscreen *screen, return NULL; image->region = intel_region_alloc_for_fd(intelScreen, - 1, width, height, + 1, width, height, height * strides[0], strides[0], fds[0], "image"); if (image->region == NULL) { free(image); -- 1.8.4.2 |
From: Keith P. <ke...@ke...> - 2013-10-31 23:31:07
|
This uses the Present extension with DRI3, which includes OML_Sync extension support. Signed-off-by: Keith Packard <ke...@ke...> --- configure.ac | 4 +- include/GL/internal/dri_interface.h | 1 + src/glx/dri3_glx.c | 421 ++++++++++++++++++++++-------------- src/glx/dri3_priv.h | 50 ++++- 4 files changed, 313 insertions(+), 163 deletions(-) diff --git a/configure.ac b/configure.ac index b6158d9..c91f031 100644 --- a/configure.ac +++ b/configure.ac @@ -39,6 +39,7 @@ LIBDRM_NOUVEAU_REQUIRED="2.4.33 libdrm >= 2.4.41" LIBDRM_FREEDRENO_REQUIRED=2.4.39 DRI2PROTO_REQUIRED=2.6 DRI3PROTO_REQUIRED=1.0 +PRESENTPROTO_REQUIRED=1.0 LIBUDEV_REQUIRED=151 GLPROTO_REQUIRED=1.4.14 LIBDRM_XORG_REQUIRED=2.4.24 @@ -823,11 +824,12 @@ xyesno) PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= $DRI2PROTO_REQUIRED]) GL_PC_REQ_PRIV="$GL_PC_REQ_PRIV libdrm >= $LIBDRM_REQUIRED" PKG_CHECK_MODULES([DRI3PROTO], [dri3proto >= $DRI3PROTO_REQUIRED]) + PKG_CHECK_MODULES([PRESENTPROTO], [presentproto >= $PRESENTPROTO_REQUIRED]) PKG_CHECK_MODULES([LIBUDEV], [libudev >= $LIBUDEV_REQUIRED]) fi # find the DRI deps for libGL - dri_modules="x11 xext xdamage xfixes x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8 xcb-dri3 xcb-sync xshmfence" + dri_modules="x11 xext xdamage xfixes x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8 xcb-dri3 xcb-present xcb-sync xshmfence" # add xf86vidmode if available PKG_CHECK_MODULES([XF86VIDMODE], [xxf86vm], HAVE_XF86VIDMODE=yes, HAVE_XF86VIDMODE=no) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index b06ad8d..b508a18 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -991,6 +991,7 @@ struct __DRIdri3BufferRec { uint32_t pixmap; uint32_t sync_fence; int32_t *shm_fence; + GLboolean busy; void *driverPrivate; }; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 4d275f2..6db984a 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -74,39 +74,24 @@ #include <sys/types.h> #include <sys/mman.h> #include <sys/time.h> + #include "xf86drm.h" #include "dri_common.h" #include "dri3_priv.h" static const struct glx_context_vtable dri3_context_vtable; -#define HAS_SBC 0 - -#if HAS_SBC - -/* For XCB's handling of ust/msc/sbc counters, we have to hand it the high and - * low halves separately. This helps you split them. - */ -static void -split_counter(uint64_t counter, uint32_t *hi, uint32_t *lo) -{ - *hi = (counter >> 32); - *lo = counter & 0xffffffff; -} - -static uint64_t -merge_counter(uint32_t hi, uint32_t lo) -{ - return ((uint64_t)hi << 32) | lo; -} -#endif /* HAS_SBC */ - static inline void dri3_fence_reset(xcb_connection_t *c, __DRIdri3Buffer *buffer) { xshmfence_reset(buffer->shm_fence); } static inline void +dri3_fence_set(__DRIdri3Buffer *buffer) { + xshmfence_trigger(buffer->shm_fence); +} + +static inline void dri3_fence_trigger(xcb_connection_t *c, __DRIdri3Buffer *buffer) { xcb_sync_trigger_fence(c, buffer->sync_fence); } @@ -117,6 +102,11 @@ dri3_fence_await(xcb_connection_t *c, __DRIdri3Buffer *buffer) { xshmfence_await(buffer->shm_fence); } +static inline Bool +dri3_fence_triggered(__DRIdri3Buffer *buffer) { + return xshmfence_query(buffer->shm_fence); +} + static void dri3_destroy_context(struct glx_context *context) { @@ -375,27 +365,44 @@ dri3_create_drawable(struct glx_screen *base, XID xDrawable, return &pdraw->base; } -#if HAS_SBC -static int -dri3_drawable_get_msc(struct glx_screen *psc, __GLXDRIdrawable *pdraw, - int64_t *ust, int64_t *msc, int64_t *sbc) +static void +present_handle_special_event(struct dri3_drawable *priv, xcb_present_generic_event_t *ge) { - xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); - xcb_dri2_get_msc_cookie_t get_msc_cookie; - xcb_dri2_get_msc_reply_t *get_msc_reply; + switch (ge->evtype) { + case XCB_PRESENT_CONFIGURE_NOTIFY: { + xcb_present_configure_notify_event_t *ce = (void *) ge; - get_msc_cookie = xcb_dri2_get_msc_unchecked(c, pdraw->xDrawable); - get_msc_reply = xcb_dri2_get_msc_reply(c, get_msc_cookie, NULL); + priv->width = ce->width; + priv->height = ce->height; + break; + } + case XCB_PRESENT_COMPLETE_NOTIFY: { + xcb_present_complete_notify_event_t *ce = (void *) ge; - if (!get_msc_reply) - return 0; + if (ce->kind == XCB_PRESENT_COMPLETE_KIND_PIXMAP) + priv->present_event_serial = ce->serial; + else + priv->present_msc_event_serial = ce->serial; + priv->ust = ce->ust; + priv->msc = ce->msc; + break; + } + case XCB_PRESENT_EVENT_IDLE_NOTIFY: { + xcb_present_idle_notify_event_t *ie = (void *) ge; + int b; - *ust = merge_counter(get_msc_reply->ust_hi, get_msc_reply->ust_lo); - *msc = merge_counter(get_msc_reply->msc_hi, get_msc_reply->msc_lo); - *sbc = merge_counter(get_msc_reply->sbc_hi, get_msc_reply->sbc_lo); - free(get_msc_reply); + for (b = 0; b < sizeof (priv->buffers) / sizeof (priv->buffers[0]); b++) { + __DRIdri3Buffer *buf = priv->buffers[b]; - return 1; + if (buf && buf->pixmap == ie->pixmap) { + buf->busy = 0; + break; + } + } + break; + } + } + free(ge); } static int @@ -403,59 +410,58 @@ dri3_wait_for_msc(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc) { xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); - xcb_dri2_wait_msc_cookie_t wait_msc_cookie; - xcb_dri2_wait_msc_reply_t *wait_msc_reply; - uint32_t target_msc_hi, target_msc_lo; - uint32_t divisor_hi, divisor_lo; - uint32_t remainder_hi, remainder_lo; - - split_counter(target_msc, &target_msc_hi, &target_msc_lo); - split_counter(divisor, &divisor_hi, &divisor_lo); - split_counter(remainder, &remainder_hi, &remainder_lo); - - wait_msc_cookie = xcb_dri2_wait_msc_unchecked(c, pdraw->xDrawable, - target_msc_hi, target_msc_lo, - divisor_hi, divisor_lo, - remainder_hi, remainder_lo); - wait_msc_reply = xcb_dri2_wait_msc_reply(c, wait_msc_cookie, NULL); - - if (!wait_msc_reply) - return 0; + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + xcb_generic_event_t *ev; + xcb_present_generic_event_t *ge; + + /* Ask for the an event for the target MSC */ + ++priv->present_msc_request_serial; + xcb_present_notify_msc(c, + priv->base.xDrawable, + priv->present_msc_request_serial, + target_msc, + divisor, + remainder); - *ust = merge_counter(wait_msc_reply->ust_hi, wait_msc_reply->ust_lo); - *msc = merge_counter(wait_msc_reply->msc_hi, wait_msc_reply->msc_lo); - *sbc = merge_counter(wait_msc_reply->sbc_hi, wait_msc_reply->sbc_lo); - free(wait_msc_reply); + xcb_flush(c); + + /* Wait for the event */ + if (priv->special_event) { + while (priv->present_msc_request_serial != priv->present_msc_event_serial) { + ev = xcb_wait_for_special_event(c, priv->special_event); + if (!ev) + break; + ge = (void *) ev; + present_handle_special_event(priv, ge); + } + } + + *ust = priv->ust; + *msc = priv->msc; + + *sbc = priv->sbc; return 1; } static int +dri3_drawable_get_msc(struct glx_screen *psc, __GLXDRIdrawable *pdraw, + int64_t *ust, int64_t *msc, int64_t *sbc) +{ + return dri3_wait_for_msc(pdraw, 0, 0, 0, ust, msc,sbc); +} + +static int dri3_wait_for_sbc(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc) { - xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); - xcb_dri2_wait_sbc_cookie_t wait_sbc_cookie; - xcb_dri2_wait_sbc_reply_t *wait_sbc_reply; - uint32_t target_sbc_hi, target_sbc_lo; - - split_counter(target_sbc, &target_sbc_hi, &target_sbc_lo); - - wait_sbc_cookie = xcb_dri2_wait_sbc_unchecked(c, pdraw->xDrawable, - target_sbc_hi, target_sbc_lo); - wait_sbc_reply = xcb_dri2_wait_sbc_reply(c, wait_sbc_cookie, NULL); - - if (!wait_sbc_reply) - return 0; - - *ust = merge_counter(wait_sbc_reply->ust_hi, wait_sbc_reply->ust_lo); - *msc = merge_counter(wait_sbc_reply->msc_hi, wait_sbc_reply->msc_lo); - *sbc = merge_counter(wait_sbc_reply->sbc_hi, wait_sbc_reply->sbc_lo); - free(wait_sbc_reply); + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; - return 1; + while (priv->sbc < target_sbc) { + sleep(1); + } + return dri3_wait_for_msc(pdraw, 0, 0, 0, ust, msc, sbc); } -#endif /* HAS_SBC */ static __DRIcontext * dri3_get_current_context(void) @@ -531,13 +537,13 @@ dri3_drawable_gc(struct dri3_drawable *priv) static __DRIdri3Buffer * dri3_back_buffer(struct dri3_drawable *priv) { - return priv->buffers[__DRI3_BUFFER_BACK]; + return priv->buffers[DRI3_BACK_ID(priv->cur_back)]; } static __DRIdri3Buffer * dri3_fake_front_buffer(struct dri3_drawable *priv) { - return priv->buffers[__DRI3_BUFFER_FRONT]; + return priv->buffers[DRI3_FRONT_ID]; } static void @@ -739,6 +745,10 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw, unsigned buffer->shm_fence = shm_fence; buffer->width = width; buffer->height = height; + + /* Mark the buffer as idle */ + dri3_fence_set(buffer); + return buffer; no_buffer_fd: @@ -762,6 +772,26 @@ dri3_free_render_buffer(struct dri3_drawable *pdraw, __DRIdri3Buffer *buffer) (*psc->dri3->releaseBuffer)(psc->driScreen, buffer); } + + +static void +present_flush_events(struct dri3_drawable *priv) +{ + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + + /* Check to see if any configuration changes have occurred + * since we were last invoked + */ + if (priv->special_event) { + xcb_generic_event_t *ev; + + while ((ev = xcb_check_for_special_event(c, priv->special_event)) != NULL) { + xcb_present_generic_event_t *ge = (void *) ev; + present_handle_special_event(priv, ge); + } + } +} + static int dri3_update_drawable(__DRIdrawable *driDrawable, void *loaderPrivate) { @@ -781,6 +811,7 @@ dri3_update_drawable(__DRIdrawable *driDrawable, void *loaderPrivate) (priv->eid = xcb_generate_id(c)), priv->base.xDrawable, XCB_PRESENT_EVENT_MASK_CONFIGURE_NOTIFY| + XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY| XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY); if (!priv->present_extension) { @@ -821,30 +852,7 @@ dri3_update_drawable(__DRIdrawable *driDrawable, void *loaderPrivate) priv->special_event = NULL; } } - - /* Check to see if any configuration changes have occurred - * since we were last invoked - */ - if (priv->special_event) { - xcb_generic_event_t *ev; - - while ((ev = xcb_check_for_special_event(c, priv->special_event)) != NULL) { - xcb_present_generic_event_t *pe = (void *) ev; - - switch (pe->evtype) { - case XCB_PRESENT_EVENT_CONFIGURE_NOTIFY: { - xcb_configure_notify_event_t *ce = (void *) ev; - - priv->width = ce->width; - priv->height = ce->height; - break; - } - case XCB_PRESENT_EVENT_IDLE_NOTIFY: - break; - } - free(ev); - } - } + present_flush_events(priv); return true; } @@ -855,7 +863,8 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, void *loaderPrivate) { struct dri3_drawable *pdraw = loaderPrivate; - __DRIdri3Buffer *buffer = pdraw->buffers[buffer_type]; + int buf_id = buffer_type == dri3_pixmap_buf_id(buffer_type); + __DRIdri3Buffer *buffer = pdraw->buffers[buf_id]; Pixmap pixmap; xcb_dri3_buffer_from_pixmap_cookie_t bp_cookie; xcb_dri3_buffer_from_pixmap_reply_t *bp_reply; @@ -915,7 +924,7 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable, buffer->shm_fence = shm_fence; buffer->sync_fence = sync_fence; - pdraw->buffers[buffer_type] = buffer; + pdraw->buffers[buf_id] = buffer; return buffer; no_pixmap: @@ -924,6 +933,32 @@ no_pixmap: return NULL; } +static int +dri3_find_back(xcb_connection_t *c, struct dri3_drawable *priv) +{ + int b; + xcb_generic_event_t *ev; + xcb_present_generic_event_t *ge; + + for (;;) { + + for (b = 0; b < DRI3_MAX_BACK; b++) { + int id = DRI3_BACK_ID(b); + __DRIdri3Buffer *buffer = priv->buffers[id]; + + if (!buffer) + return b; + if (!buffer->busy) + return b; + } + ev = xcb_wait_for_special_event(c, priv->special_event); + if (!ev) + return -1; + ge = (void *) ev; + present_handle_special_event(priv, ge); + } +} + static __DRIdri3Buffer * dri3_get_buffer(__DRIdrawable *driDrawable, unsigned int format, @@ -931,10 +966,24 @@ dri3_get_buffer(__DRIdrawable *driDrawable, void *loaderPrivate) { struct dri3_drawable *priv = loaderPrivate; - __DRIdri3Buffer *buffer = priv->buffers[buffer_type]; + xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + __DRIdri3Buffer *buffer; + int buf_id; + + if (buffer_type == __DRI3_BUFFER_BACK) { + int back = dri3_find_back(c, priv); + + if (back < 0) + return NULL; + priv->cur_back = back; + buf_id = DRI3_BACK_ID(priv->cur_back); + } else { + buf_id = DRI3_FRONT_ID; + } + + buffer = priv->buffers[buf_id]; if (!buffer || buffer->width != priv->width || buffer->height != priv->height) { - xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); __DRIdri3Buffer *new_buffer; /* Allocate the new buffers @@ -956,7 +1005,6 @@ dri3_get_buffer(__DRIdrawable *driDrawable, 0, 0, 0, 0, priv->width, priv->height); dri3_fence_trigger(c, new_buffer); dri3_free_render_buffer(priv, buffer); - dri3_fence_await(c, new_buffer); } break; case __DRI3_BUFFER_FRONT: @@ -967,29 +1015,45 @@ dri3_get_buffer(__DRIdrawable *driDrawable, dri3_drawable_gc(priv), 0, 0, 0, 0, priv->width, priv->height); dri3_fence_trigger(c, new_buffer); - dri3_fence_await(c, new_buffer); break; } buffer = new_buffer; buffer->buffer_type = buffer_type; - priv->buffers[buffer_type] = buffer; - } + priv->buffers[buf_id] = buffer; + } + dri3_fence_await(c, buffer); /* Return the requested buffer */ return buffer; } static void -dri3_free_buffer(__DRIdrawable *driDrawable, +dri3_free_buffers(__DRIdrawable *driDrawable, enum __DRI3bufferType buffer_type, void *loaderPrivate) { struct dri3_drawable *priv = loaderPrivate; - __DRIdri3Buffer *buffer = priv->buffers[buffer_type]; + __DRIdri3Buffer *buffer; + int first_id; + int n_id; + int buf_id; + + switch (buffer_type) { + case __DRI3_BUFFER_BACK: + first_id = DRI3_BACK_ID(0); + n_id = DRI3_MAX_BACK; + break; + case __DRI3_BUFFER_FRONT: + first_id = DRI3_FRONT_ID; + n_id = 1; + } - if (buffer) { - dri3_free_render_buffer(priv, buffer); - priv->buffers[buffer_type] = NULL; + for (buf_id = first_id; buf_id < first_id + n_id; buf_id++) { + buffer = priv->buffers[buf_id]; + if (buffer) { + dri3_free_render_buffer(priv, buffer); + priv->buffers[buf_id] = NULL; + } } } @@ -1030,7 +1094,7 @@ dri3_get_buffers(__DRIdrawable *driDrawable, return false; priv->have_fake_front = !priv->is_pixmap; } else { - dri3_free_buffer(driDrawable, __DRI3_BUFFER_FRONT, loaderPrivate); + dri3_free_buffers(driDrawable, __DRI3_BUFFER_FRONT, loaderPrivate); priv->have_fake_front = 0; } @@ -1043,7 +1107,7 @@ dri3_get_buffers(__DRIdrawable *driDrawable, return false; priv->have_back = 1; } else { - dri3_free_buffer(driDrawable, __DRI3_BUFFER_BACK, loaderPrivate); + dri3_free_buffers(driDrawable, __DRI3_BUFFER_BACK, loaderPrivate); priv->have_back = 0; } @@ -1059,7 +1123,9 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, { struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; - xcb_connection_t *c = XGetXCBConnection(priv->base.psc->dpy); + Display *dpy = priv->base.psc->dpy; + xcb_connection_t *c = XGetXCBConnection(dpy); + int buf_id = DRI3_BACK_ID(priv->cur_back); int64_t ret = 0; __DRIcontext *ctx = dri3_get_current_context(); @@ -1068,26 +1134,46 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, flags |= __DRI2_FLUSH_CONTEXT; dri3_flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER); - if (priv->buffers[0] && !priv->is_pixmap) { - dri3_fence_reset(c, priv->buffers[0]); - dri3_copy_area(c, - priv->buffers[0]->pixmap, - priv->base.xDrawable, - dri3_drawable_gc(priv), - 0, 0, 0, 0, priv->width, priv->height); - dri3_fence_trigger(c, priv->buffers[0]); + present_flush_events(priv); + + if (priv->buffers[buf_id] && !priv->is_pixmap) { + dri3_fence_reset(c, priv->buffers[buf_id]); + + /* Compute when we want the frame shown by taking the last known successful + * MSC and adding in a swap interval for each outstanding swap request + */ + ++priv->present_request_serial; + if (target_msc == 0) + target_msc = priv->msc + priv->swap_interval * (priv->present_request_serial - priv->present_event_serial); + + priv->buffers[buf_id]->busy = 1; + xcb_present_pixmap(c, + priv->base.xDrawable, + priv->buffers[buf_id]->pixmap, + priv->present_request_serial, + 0, /* valid */ + 0, /* update */ + 0, /* x_off */ + 0, /* y_off */ + None, /* target_crtc */ + None, + priv->buffers[buf_id]->sync_fence, + XCB_PRESENT_OPTION_NONE, + target_msc, + divisor, + remainder, 0, NULL); + ret = ++priv->sbc; if (priv->have_fake_front) { - dri3_fence_reset(c, priv->buffers[1]); + dri3_fence_reset(c, priv->buffers[DRI3_FRONT_ID]); dri3_copy_area(c, - priv->buffers[0]->pixmap, - priv->buffers[1]->pixmap, + priv->buffers[buf_id]->pixmap, + priv->buffers[DRI3_FRONT_ID]->pixmap, dri3_drawable_gc(priv), 0, 0, 0, 0, priv->width, priv->height); - dri3_fence_trigger(c, priv->buffers[1]); + dri3_fence_trigger(c, priv->buffers[DRI3_FRONT_ID]); } - dri3_fence_await(c, priv->buffers[0]); - if (priv->have_fake_front) - dri3_fence_await(c, priv->buffers[1]); + xcb_flush(c); + ++ (*psc->dri3->stamp(priv->driDrawable)); } return ret; @@ -1118,6 +1204,30 @@ dri3_query_version(Display *dpy, int *major, int *minor) } static int +present_query_version(Display *dpy, int *major, int *minor) +{ + xcb_present_query_version_cookie_t cookie; + xcb_present_query_version_reply_t *reply; + xcb_connection_t *c = XGetXCBConnection(dpy); + xcb_generic_error_t *error; + + cookie = xcb_present_query_version(c, + XCB_PRESENT_MAJOR_VERSION, + XCB_PRESENT_MINOR_VERSION); + reply = xcb_present_query_version_reply(c, cookie, &error); + if (!reply) { + if (error) { + free(error); + } + return 0; + } + *major = reply->major_version; + *minor = reply->minor_version; + free(reply); + return 1; +} + +static int dri3_open(Display *dpy, Window root, CARD32 provider) @@ -1160,11 +1270,9 @@ dri3_destroy_screen(struct glx_screen *base) free(psc); } -#if HAS_SBC static int dri3_set_swap_interval(__GLXDRIdrawable *pdraw, int interval) { - xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy); struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1; struct dri3_screen *psc = (struct dri3_screen *) priv->base.psc; @@ -1186,7 +1294,6 @@ dri3_set_swap_interval(__GLXDRIdrawable *pdraw, int interval) break; } - xcb_dri2_swap_interval(c, priv->base.xDrawable, interval); priv->swap_interval = interval; return 0; @@ -1199,7 +1306,6 @@ dri3_get_swap_interval(__GLXDRIdrawable *pdraw) return priv->swap_interval; } -#endif static const __DRIdri3LoaderExtension dri3LoaderExtension = { {__DRI_DRI3_LOADER, __DRI_DRI3_LOADER_VERSION}, @@ -1443,22 +1549,13 @@ dri3_create_screen(int screen, struct glx_display * priv) psp->destroyScreen = dri3_destroy_screen; psp->createDrawable = dri3_create_drawable; psp->swapBuffers = dri3_swap_buffers; - psp->getDrawableMSC = NULL; - psp->waitForMSC = NULL; - psp->waitForSBC = NULL; - psp->setSwapInterval = NULL; - psp->getSwapInterval = NULL; - -#if HAS_SBC - if (pdp->driMinor >= 2) { - psp->getDrawableMSC = dri3DrawableGetMSC; - psp->waitForMSC = dri3WaitForMSC; - psp->waitForSBC = dri3WaitForSBC; - psp->setSwapInterval = dri3SetSwapInterval; - psp->getSwapInterval = dri3GetSwapInterval; - __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); - } -#endif + + psp->getDrawableMSC = dri3_drawable_get_msc; + psp->waitForMSC = dri3_wait_for_msc; + psp->waitForSBC = dri3_wait_for_sbc; + psp->setSwapInterval = dri3_set_swap_interval; + psp->getSwapInterval = dri3_get_swap_interval; + __glXEnableDirectExtension(&psc->base, "GLX_OML_sync_control"); psp->copySubBuffer = dri3_copy_sub_buffer; __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); @@ -1517,10 +1614,11 @@ dri3_create_display(Display * dpy) if (pdp == NULL) return NULL; - if (!dri3_query_version(dpy, &pdp->dri3Major, &pdp->dri3Minor)) { - free(pdp); - return NULL; - } + if (!dri3_query_version(dpy, &pdp->dri3Major, &pdp->dri3Minor)) + goto no_extension; + + if (!present_query_version(dpy, &pdp->presentMajor, &pdp->presentMinor)) + goto no_extension; pdp->base.destroyDisplay = dri3_destroy_display; pdp->base.createScreen = dri3_create_screen; @@ -1534,6 +1632,9 @@ dri3_create_display(Display * dpy) pdp->loader_extensions[i++] = NULL; return &pdp->base; +no_extension: + free(pdp); + return NULL; } #endif /* GLX_DIRECT_RENDERING */ diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h index 8703b39..8426253 100644 --- a/src/glx/dri3_priv.h +++ b/src/glx/dri3_priv.h @@ -56,6 +56,7 @@ #include <xcb/xcb.h> #include <xcb/dri3.h> +#include <xcb/present.h> #include <xcb/sync.h> /* From xmlpool/options.h, user exposed so should be stable */ @@ -73,6 +74,11 @@ struct dri3_display /* DRI3 bits */ int dri3Major; int dri3Minor; + + /* Present bits */ + int hasPresent; + int presentMajor; + int presentMinor; }; struct dri3_screen { @@ -101,6 +107,35 @@ struct dri3_context __DRIcontext *driContext; }; +#define DRI3_MAX_BACK 2 +#define DRI3_BACK_ID(i) (i) +#define DRI3_FRONT_ID (DRI3_MAX_BACK) + +static inline int +dri3_buf_id_next(int buf_id) +{ + if (buf_id == DRI3_MAX_BACK - 1) + return 0; + return buf_id + 1; +} + +static inline int +dri3_buf_id_prev(int buf_id) +{ + if (buf_id == 0) + return DRI3_MAX_BACK - 1; + return buf_id - 1; +} + +static inline int +dri3_pixmap_buf_id(enum __DRI3bufferType buffer_type) +{ + if (buffer_type == __DRI3_BUFFER_BACK) + return DRI3_BACK_ID(0); + else + return DRI3_FRONT_ID; +} + struct dri3_drawable { __GLXDRIdrawable base; @@ -111,15 +146,26 @@ struct dri3_drawable uint8_t have_fake_front; uint8_t is_pixmap; + uint32_t present_request_serial; + uint32_t present_event_serial; + + uint64_t sbc; + + uint64_t ust, msc; + + /* For WaitMSC */ + uint32_t present_msc_request_serial; + uint32_t present_msc_event_serial; + uint64_t previous_time; unsigned frames; - __DRIdri3Buffer *buffers[2]; + __DRIdri3Buffer *buffers[1 + DRI3_MAX_BACK]; + int cur_back; int depth; xcb_present_event_t eid; xcb_gcontext_t gc; - const xcb_query_extension_reply_t *dri3_extension; const xcb_query_extension_reply_t *present_extension; xcb_special_event_t *special_event; }; -- 1.8.4.2 |
From: Jose F. <jfo...@vm...> - 2013-02-12 13:50:35
|
----- Original Message ----- > Hi, > I plan to kill the liitle remainig free time with supporting OpenVG > accelerating gpus. At the moment I have access to the imageon/adreno > z160 in two different freescale boards. One of the boards has the z160 > next to a 3d Opengl|ES 2.0 gpu. Up to now I only stepped through mesa > code whenever there were issues in our client code. So I never > understood the internal structure of mesa. > > I thought that vega would define or use some kind of abstraction > similar to for example p_context for modern 3d gpus but dedicated to > vg. But it implements vg on top of a p_context. So Vega seems to be > the wrong starting point. Looking at what is exposed by the gpu the > registers values and enums indicate that the level of abstraction is > close to the vg spec. Looking at http://en.wikipedia.org/wiki/OpenVG#In_hardware it seems that some hardware has dedicated engine, others use 3d engines. If the GPU you care is really that close to OpenVG API, then maybe gallium is overkill. Gallium's idea was "one driver to rule them all", that is, to quickly target many graphics APIs with a single and compact driver. If every state trackers passes through its API to gallium interface then that would be lost -- drivers would be huge again. I also wonder if there's enough momentum behind dedicated OpenVG hardware. Looking at the wikipedia page and https://developer.qualcomm.com/discover/chipsets-and-modems/adreno-gpu it seems like the trend is towards implementing OpenVG on top of generic 3D hardware. But I admit I haven't been following OpenVG standard closely. Jose |
From: Andreas P. <and...@gm...> - 2013-02-09 13:57:56
|
Hi, I plan to kill the liitle remainig free time with supporting OpenVG accelerating gpus. At the moment I have access to the imageon/adreno z160 in two different freescale boards. One of the boards has the z160 next to a 3d Opengl|ES 2.0 gpu. Up to now I only stepped through mesa code whenever there were issues in our client code. So I never understood the internal structure of mesa. I thought that vega would define or use some kind of abstraction similar to for example p_context for modern 3d gpus but dedicated to vg. But it implements vg on top of a p_context. So Vega seems to be the wrong starting point. Looking at what is exposed by the gpu the registers values and enums indicate that the level of abstraction is close to the vg spec. I am still occupied with getting the board and toolchains up and running and getting command stream dumps for vg. After that it would be great to have some starting point within the mesa source. regards Andreas Pokorny |
From: Brian P. <br...@vm...> - 2013-01-17 23:45:16
|
On 01/17/2013 04:23 PM, Sedat Dilek wrote: > Hi, > > with the following patchset (13 patches) I was able to build > mesa-8.0.5 with LLVM v3.2. > > There is one big fat patch called "gallivm,draw,llvmpipe: Support > wider native registers." [1] which makes backporting hard. > Jose? > > Regards, > - Sedat - > > [1] http://cgit.freedesktop.org/mesa/mesa/commit/?id=3469715 > > P.S.: Patchset fixing build of mesa-8.0.5 with LLVM/CLANG v3.2 > > [ gallium-auxiliary-fixes-for-8-0-5 (PENDING) ] > 4b7b71a rtti was removed from more llvm libraries. Thanks to d0k for > the hint via IRC #llvm on irc.oftc.net > > For more details see [1] and followup [2] discussion (Thanks Johannes > Obermayr again)! > [1] http://lists.freedesktop.org/archives/mesa-dev/2012-October/029167.html > [2] http://lists.freedesktop.org/archives/mesa-dev/2012-October/029184.html > > [ gallivm-fixes-for-8-0-5 (CHERRY-PICKED) ] > 920a940 gallivm: Fix createOProfileJITEventListener namespace with llvm-3.1. > d998daf gallivm: Add constructor for raw_debug_ostream. > af1f68a gallivm: Add MCRegisterInfo.h to silence benign warnings about > missing implementation. > ad88aac gallivm: Pass in a MCInstrInfo to createMCInstPrinter on llvm-3.1. > 395c791 gallivm: Fix method overriding in raw_debug_ostream. > 557632f gallivm: Use InitializeNativeTargetDisassembler(). > 6c0144a gallivm: Pass in a MCRegisterInfo to MCInstPrinter on llvm-3.1. > 1bb5b0d gallivm: Initialize x86 disassembler on x86_64 too. > 4d25e57 gallivm: Replace architecture test with PIPE_ARCH_* > 192859a gallivm: Fix LLVM-2.7 build. > 2dfd7e5 Initialize only native LLVM Disassembler. > > [ dri-nouveau-fixes-for-8-0-5 (CHERRY-PICKED) ] > abd8713 dri/nouveau: don't use nested functions > > - EOT - Why are you using mesa 8.0.5? Wouldn't it be better to get into 9.x or master (aka 9.1)? -Brian |
From: Brian P. <br...@vm...> - 2013-01-17 23:43:59
|
On 01/17/2013 02:14 PM, Sedat Dilek wrote: > Hi > > I am playing again with llvm/clang v3.2 and patches I adapted from > LLVMLinux project. > > I wanted to test my new toolchain before doing a rough testing of the > mainline Linux-kernel. > > I decided to build the latest mesa-8.0.5 as I am on Ubuntu/precise > AMD64 here by making me and my build-deps happy (so NO mesa-9.x as it > requires a higher version of libdrm). > > Unfortunately, I hit the same problem Johannes Obermayr already described. > Gratefully he points also in the BTS to the patch which is NOT in > "8.0" mesa GIT branch! > Thank you Johannes. > > Can someone cherry-pick this one? > > commit 4aa1ac5fe94b5696095229ee3568bf4fa7cfed95 > "dri/nouveau: don't use nested functions" Done. -Brian |
From: Ian R. <id...@fr...> - 2012-09-11 08:20:35
|
On 09/11/2012 09:40 AM, Sedat Dilek wrote: > Hi, > > I can't see it in [1], forgotten? Mesa 9.0 hasn't been released yet, so of course there isn't a release tag. > Regards, > - Sedat - > > [1] http://cgit.freedesktop.org/mesa/mesa/refs/tags |
From: Eric A. <er...@an...> - 2012-07-25 16:55:04
|
"Zou, Nanhai" <nan...@in...> writes: > Hi, > I have notice that in current driver implementation. > When GL_DYNAMIC_DRAW flag is set in glBufferData, driver will not upload data to > Graphics memory. > Instead it will upload the _entire_ vertex/index buffer when glDrawElements/glDrawArray was called. We ripped out that awful code because it was hurting others, too. |
From: Zou, N. <nan...@in...> - 2012-07-24 07:44:32
|
We have check the sematic of GL_DYANMIC_DRAW, seems that it the Skia usage of GZL_DYNAMIC_DRAW is wrong. Thanks Zou Nanhai From: Zou, Nanhai [mailto:nan...@in...] Sent: Tuesday, July 24, 2012 11:25 AM To: mesa3d-dev (Mes...@li...) Cc: Versace, Chad; Ian Romanick (id...@fr...) Subject: [Mesa3d-dev] Correct behavior of GL_DYNAMIC_DRAW in glBufferData? Hi, I have notice that in current driver implementation. When GL_DYNAMIC_DRAW flag is set in glBufferData, driver will not upload data to Graphics memory. Instead it will upload the _entire_ vertex/index buffer when glDrawElements/glDrawArray was called. This sometimes brings a huge bottleneck , e.g. in Skia. Skia allocate a 256k vertexdata buffer and a 64k indexdata buffer as pools, and use glBufferData to upload the pools. Most of the Skia draw operations will only use a few vertexes in the pool, but driver will upload the _entire_ buffer each operation. This becomes No 1 bottleneck for Skia bench with GPU. I have tested if reduce the pool size to 1k, many tests in Skia bench get 3x to >10x performance improvement... Per my understanding. Even GL_DYNAMIC_DRAW is set in glBufferData, driver should not copy the entire buffer When glDrawElements/glDrawArray is called, it should copy only used vertex/index. Otherwise this is too heavy in Skia like usage scenario. Thanks Zou Nanhai |
From: Zou, N. <nan...@in...> - 2012-07-24 03:26:09
|
Hi, I have notice that in current driver implementation. When GL_DYNAMIC_DRAW flag is set in glBufferData, driver will not upload data to Graphics memory. Instead it will upload the _entire_ vertex/index buffer when glDrawElements/glDrawArray was called. This sometimes brings a huge bottleneck , e.g. in Skia. Skia allocate a 256k vertexdata buffer and a 64k indexdata buffer as pools, and use glBufferData to upload the pools. Most of the Skia draw operations will only use a few vertexes in the pool, but driver will upload the _entire_ buffer each operation. This becomes No 1 bottleneck for Skia bench with GPU. I have tested if reduce the pool size to 1k, many tests in Skia bench get 3x to >10x performance improvement... Per my understanding. Even GL_DYNAMIC_DRAW is set in glBufferData, driver should not copy the entire buffer When glDrawElements/glDrawArray is called, it should copy only used vertex/index. Otherwise this is too heavy in Skia like usage scenario. Thanks Zou Nanhai |
From: Thomas H. <the...@vm...> - 2011-10-18 09:00:29
|
On 10/18/2011 10:50 AM, Peter Hanzel wrote: > Hello. > > I am following Mesa3d-dev mailing list and also found your commit to > mesa/vmwgfx: > > b056516d5efb9386c35f45faf8190e3c211773f8 > vmwgfx: Require HWV8 for 3d support > On lower versions, the way we mix 2D and 3D may be too slow. > > Does this mean that for 3D working in VMWare now I need VMWare > workstation 8? > If i just change the line > > @@ -52,7 +52,7 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) > if (hwversion == 0) > return false; > - if (hwversion < SVGA3D_HWVERSION_WS65_B1) > + if (hwversion < SVGA3D_HWVERSION_WS8_B1) > return false; > return true; > > Back to WS65_B1, the 3d will work but slowly? or will work corrupted? > > Thanks for info. > > Peter Hanzel Peter, You will mainly get two problems: 1) If you alter the cliprects of a 3D window, like partly covering it with another window, each update of the 3D window will trigger a software readback, which will make things slow. 2) There is no guarantee that the kernel can fulfill large user-space requests for DMA bufffers, so you might run into problems with apps with large DMA buffer requirements. Like specviewperf for example. Otherwise I think it should work, but we haven't really tried. /Thomas |
From: Peter H. <han...@gm...> - 2011-10-18 08:51:03
|
Hello. I am following Mesa3d-dev mailing list and also found your commit to mesa/vmwgfx: b056516d5efb9386c35f45faf8190e3c211773f8 vmwgfx: Require HWV8 for 3d support On lower versions, the way we mix 2D and 3D may be too slow. Does this mean that for 3D working in VMWare now I need VMWare workstation 8? If i just change the line @@ -52,7 +52,7 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) if (hwversion == 0) return false; - if (hwversion < SVGA3D_HWVERSION_WS65_B1) + if (hwversion < SVGA3D_HWVERSION_WS8_B1) return false; return true; Back to WS65_B1, the 3d will work but slowly? or will work corrupted? Thanks for info. Peter Hanzel |
From: Ian R. <id...@fr...> - 2011-08-01 18:02:08
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 07/31/2011 02:51 PM, kri...@gm... wrote: > Please apply! Send patches using git-send-email. People cannot reply with review comments to patches sent as attachments. patch 1: + if (!gbm) + { + free(dri2_dpy); + return EGL_FALSE; + } should be + if (!gbm) { + free(dri2_dpy); + return EGL_FALSE; + } I think 'gbm == NULL' is the more common idiom in Mesa, but either way works for most people. It may be even better to fold this hunk with the following if-statement: gbm = (struct gbm_device *) disp->PlatformDisplay; - - if (strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) { + if (!gbm || strcmp(gbm_device_get_backend_name(gbm), "drm") != 0) { free(dri2_dpy); return EGL_FALSE; patch 2: I don't think always linking with -lm is quite correct either. The comment at the top says that backends should define GBM_LIBS, but then nothing under src/gdb uses GBM_LIBS. Also, I think everyone hates the commit message style of starting a sentence in the "brief" line and continuing it in the body. A better message is: gbm: link gbm_gallium_drm.so against math library This avoids the following runtime error with EGL on platforms that require linking with libm for nontrivial math functions: failed to load module: /xorg/lib64/gbm/gbm_gallium_drm.so: undefined symbol: powf -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk425PsACgkQX1gOwKyEAw9JzgCeMG8fw2Qtz8PXhcXc1xzc0ubP WOUAn1l0OjzsTA/c4lKpZcihgjVOqK4n =Db6m -----END PGP SIGNATURE----- |
From: <kri...@gm...> - 2011-07-31 21:52:04
|
Please apply! Thanks, Kristof |
From: Dee S. <dem...@ne...> - 2011-05-22 15:25:46
|
Hello all, I'm not sure that this is really the appropriate place to pose this question; but, I was wondering how GLX Visuals are created internally. What info does a video driver give that allows the XServer & also GLX to configure a list of Visuals? How is this info combined & shaped into Visuals? I'm looking specifically for functions & variables. If someone could point me to a few files, I'd be immensely grateful! Dee Sharpe |
From: STEVE555 <ste...@ho...> - 2011-05-19 09:58:18
|
STEVE555 wrote: > > > > STEVE555 wrote: >> >> Hi to all, >> I have been regularly been building the git version of mesa >> with with the gallium-nouveau code enabled. >> >> I'm currently using Fedora Rawhide with the latest updates. I use the >> following ./autogen.sh options to set mesa for the build: ./autogen.sh >> --enable-debug --enable-glx-tls --enable-asm --with-dri-drivers= >> --enable-gallium-nouveau --disable-gallium-i915 --disable-gallium-i965 >> --disable-egl --disable-gallium-r300 --disable-gallium-r600 >> --disable-gallium-svga --with-state-trackers=glx,dri(and I sometimes add >> the xorg-state-tracker at the end). >> >> The trouble I'm having is after I believe after some commits for GLX, >> Mesa keeps ending with this build error: >> >> DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS -DGALLIUM_LLVMPIPE >> -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 -fvisibility=hidden >> -DXF86VIDMODE -D_REENTRANT -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" >> glxcmds.c -o glxcmds.o >> gcc -c -I. -I../../include -I../../include/GL/internal -I../../src/mesa >> -I../../src/mapi -I../../src/mapi/glapi -I/usr/include/libdrm -g -O2 >> -Wall -Wmissing-prototypes -std=c99 -ffast-math -fno-strict-aliasing -g >> -fPIC -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM >> -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS >> -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER >> -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS >> -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 >> -fvisibility=hidden -DXF86VIDMODE -D_REENTRANT >> -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" glxcurrent.c -o glxcurrent.o >> gcc -c -I. -I../../include -I../../include/GL/internal -I../../src/mesa >> -I../../src/mapi -I../../src/mapi/glapi -I/usr/include/libdrm -g -O2 >> -Wall -Wmissing-prototypes -std=c99 -ffast-math -fno-strict-aliasing -g >> -fPIC -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM >> -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS >> -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER >> -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS >> -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 >> -fvisibility=hidden -DXF86VIDMODE -D_REENTRANT >> -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" glxext.c -o glxext.o >> glxext.c: In function ‘__glXWireToEvent’: >> glxext.c:141:35: error: ‘xGLXBufferSwapComplete’ has no member named >> ‘sbc_hi’ >> glxext.c:141:58: error: ‘xGLXBufferSwapComplete’ has no member named >> ‘sbc_lo’ >> gmake[2]: *** [glxext.o] Error 1 >> gmake[2]: Leaving directory `/opt/mesa/src/glx' >> gmake[1]: *** [subdirs] Error 1 >> gmake[1]: Leaving directory `/opt/mesa/src' >> gmake: *** [default] Error 1 >> >> I have waited for a few days to see if the problem had been solved after >> some new commits, but I haven't noticed any, so I wanted to report my >> problem here. >> >> Regards, >> STEVE555 >> > Hi all, > Looking further into the problem I have been having, I was looking > closer at the compile code and it seemed to me it was around the libdrm > area. I looked at the libdrm code and found out it was updated about 3 > days ago,(I hadn't git pulled on it since the 11th of April this year) So > I did the git pull on my copy of libdrm and re-compiled it into my system. > > Unfortunately, the build with the same ./configure options gives me this > new error: > > python2 -t -O -O builtins/tools/generate_builtins.py ./builtin_compiler > > builtin_function.cpp || rm -f builtin_function.cpp > g++ -c -I. -I../mesa -I../mapi -I../../include -g -O2 -Wall > -fno-strict-aliasing -g -fPIC -D_GNU_SOURCE -DPTHREADS -DDEBUG > -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 > -DIN_DRI_DRIVER -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING > -DHAVE_ALIAS -DHAVE_XEXTPROTO_71 -DGALLIUM_LLVMPIPE > -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 -DFEATURE_GL=1 > -fvisibility=hidden -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN > -DGLX_USE_TLS -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER > -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS > -DHAVE_XEXTPROTO_71 -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS > -DHAVE_LLVM=0x0209 -DFEATURE_GL=1 builtin_function.cpp -o > builtin_function.o > builtin_function.cpp:15008:2: error: #error builtins profile 130_vert > failed to compile > builtin_function.cpp: In function ‘void > _mesa_glsl_initialize_functions(_mesa_glsl_parse_state*)’: > builtin_function.cpp:15773:26: error: ‘prototypes_for_130_vert’ was not > declared in this scope > builtin_function.cpp:15774:26: error: ‘functions_for_130_vert’ was not > declared in this scope > gmake[2]: *** [builtin_function.o] Error 1 > gmake[2]: Leaving directory `/opt/mesa/src/glsl' > gmake[1]: *** [subdirs] Error 1 > gmake[1]: Leaving directory `/opt/mesa/src' > gmake: *** [default] Error 1 > > Regards, > STEVE555 > Hi all, I have managed to fix my problem. I had a chat on the xorg channel,and one of the devs told me that I needed to downgrade my dri2 headers. Do I uninstalled my git version of dri2proto and I reinstalled my Fedora Rawhide packages of libX11-proto and my lib-xcb-proto,and Mesa builds fine now. I would like to thank everyone who tried to help me. Regards, STEVE555 -- View this message in context: http://old.nabble.com/Compiling-Mesa-from-git-%28just-build%2Cnot-installed%29-tp31569584p31654527.html Sent from the mesa3d-dev mailing list archive at Nabble.com. |
From: STEVE555 <ste...@ho...> - 2011-05-17 23:00:17
|
STEVE555 wrote: > > Hi to all, > I have been regularly been building the git version of mesa with > with the gallium-nouveau code enabled. > > I'm currently using Fedora Rawhide with the latest updates. I use the > following ./autogen.sh options to set mesa for the build: ./autogen.sh > --enable-debug --enable-glx-tls --enable-asm --with-dri-drivers= > --enable-gallium-nouveau --disable-gallium-i915 --disable-gallium-i965 > --disable-egl --disable-gallium-r300 --disable-gallium-r600 > --disable-gallium-svga --with-state-trackers=glx,dri(and I sometimes add > the xorg-state-tracker at the end). > > The trouble I'm having is after I believe after some commits for GLX, Mesa > keeps ending with this build error: > > DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS -DGALLIUM_LLVMPIPE > -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 -fvisibility=hidden > -DXF86VIDMODE -D_REENTRANT -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" > glxcmds.c -o glxcmds.o > gcc -c -I. -I../../include -I../../include/GL/internal -I../../src/mesa > -I../../src/mapi -I../../src/mapi/glapi -I/usr/include/libdrm -g -O2 > -Wall -Wmissing-prototypes -std=c99 -ffast-math -fno-strict-aliasing -g > -fPIC -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM > -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS > -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER > -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS > -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 > -fvisibility=hidden -DXF86VIDMODE -D_REENTRANT > -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" glxcurrent.c -o glxcurrent.o > gcc -c -I. -I../../include -I../../include/GL/internal -I../../src/mesa > -I../../src/mapi -I../../src/mapi/glapi -I/usr/include/libdrm -g -O2 > -Wall -Wmissing-prototypes -std=c99 -ffast-math -fno-strict-aliasing -g > -fPIC -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM > -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS > -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER > -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS > -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 > -fvisibility=hidden -DXF86VIDMODE -D_REENTRANT > -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\" glxext.c -o glxext.o > glxext.c: In function ‘__glXWireToEvent’: > glxext.c:141:35: error: ‘xGLXBufferSwapComplete’ has no member named > ‘sbc_hi’ > glxext.c:141:58: error: ‘xGLXBufferSwapComplete’ has no member named > ‘sbc_lo’ > gmake[2]: *** [glxext.o] Error 1 > gmake[2]: Leaving directory `/opt/mesa/src/glx' > gmake[1]: *** [subdirs] Error 1 > gmake[1]: Leaving directory `/opt/mesa/src' > gmake: *** [default] Error 1 > > I have waited for a few days to see if the problem had been solved after > some new commits, but I haven't noticed any, so I wanted to report my > problem here. > > Regards, > STEVE555 > Hi all, Looking further into the problem I have been having, I was looking closer at the compile code and it seemed to me it was around the libdrm area. I looked at the libdrm code and found out it was updated about 3 days ago,(I hadn't git pulled on it since the 11th of April this year) So I did the git pull on my copy of libdrm and re-compiled it into my system. Unfortunately, the build with the same ./configure options gives me this new error: python2 -t -O -O builtins/tools/generate_builtins.py ./builtin_compiler > builtin_function.cpp || rm -f builtin_function.cpp g++ -c -I. -I../mesa -I../mapi -I../../include -g -O2 -Wall -fno-strict-aliasing -g -fPIC -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS -DHAVE_XEXTPROTO_71 -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 -DFEATURE_GL=1 -fvisibility=hidden -D_GNU_SOURCE -DPTHREADS -DDEBUG -DHAVE_POSIX_MEMALIGN -DGLX_USE_TLS -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER -DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING -DHAVE_ALIAS -DHAVE_XEXTPROTO_71 -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS -DHAVE_LLVM=0x0209 -DFEATURE_GL=1 builtin_function.cpp -o builtin_function.o builtin_function.cpp:15008:2: error: #error builtins profile 130_vert failed to compile builtin_function.cpp: In function ‘void _mesa_glsl_initialize_functions(_mesa_glsl_parse_state*)’: builtin_function.cpp:15773:26: error: ‘prototypes_for_130_vert’ was not declared in this scope builtin_function.cpp:15774:26: error: ‘functions_for_130_vert’ was not declared in this scope gmake[2]: *** [builtin_function.o] Error 1 gmake[2]: Leaving directory `/opt/mesa/src/glsl' gmake[1]: *** [subdirs] Error 1 gmake[1]: Leaving directory `/opt/mesa/src' gmake: *** [default] Error 1 Regards, STEVE555 -- View this message in context: http://old.nabble.com/Compiling-Mesa-from-git-%28just-build%2Cnot-installed%29-tp31569584p31642591.html Sent from the mesa3d-dev mailing list archive at Nabble.com. |