1
0
forked from rpms/mesa

Update to 17.0.0-rc1

Signed-off-by: Igor Gnatenko <ignatenko@redhat.com>
This commit is contained in:
Igor Gnatenko 2017-01-20 09:49:47 +01:00
parent 5e8f8f1e6b
commit dbf4ade69d
4 changed files with 356 additions and 220 deletions

View File

@ -1,40 +1,64 @@
From 06c325b36bd6563a41cbc0261a8f9dd4e00f5572 Mon Sep 17 00:00:00 2001 From 97b447ee480a09a744094562da36b019a3eeb10f Mon Sep 17 00:00:00 2001
From: Kyle Brenneman <kbrenneman@nvidia.com> From: Kyle Brenneman <kbrenneman@nvidia.com>
Date: Fri, 8 Jul 2016 15:21:17 -0600 Date: Wed, 4 Jan 2017 11:31:58 -0700
Subject: [PATCH] egl: glvnd support Subject: [PATCH 1/2] EGL: Implement the libglvnd interface for EGL (v2)
[hdegoede@redhat.com: Rebased on 13.0 branch] Added separate --enable-libglvnd-glx and --enable-libglvnd-egl configure
options to enable libglvnd for GLX and EGL. The existing --enable-libglvnd
option will now enable both EGL and GLX.
The new interface mostly just sits on top of the existing library. The only
change to the existing EGL code is to split the client extension string into
platform extensions and everything else. On non-glvnd builds, eglQueryString
will just concatenate the two strings.
The EGL dispatch stubs are all generated. The script is based on the one used
to generate entrypoints in libglvnd itself.
v2:
Rebased against master.
Reworked the EGL makefile to use separate libtool targets instead of an
automake substitution "lib@EGL_LIB@_la_*" in the variable names. Using the
substitution broke automake's dependency tracking for "make dist".
Made the EGL code generation scripts work with Python 2 or 3.
Change gen_egl_dispatch.py to use argparse for the command line arguments.
Assorted formatting and style cleanup in the Python scripts.
--- ---
configure.ac | 159 ++- configure.ac | 154 ++-
src/egl/Makefile.am | 65 +- src/egl/Makefile.am | 97 +-
src/egl/generate/egl.xml | 2412 ++++++++++++++++++++++++++++++++++ src/egl/generate/egl.xml | 2412 ++++++++++++++++++++++++++++++++++
src/egl/generate/eglFunctionList.py | 191 +++ src/egl/generate/eglFunctionList.py | 197 +++
src/egl/generate/egl_other.xml | 47 + src/egl/generate/egl_other.xml | 47 +
src/egl/generate/genCommon.py | 223 ++++ src/egl/generate/genCommon.py | 223 ++++
src/egl/generate/gen_egl_dispatch.py | 223 ++++ src/egl/generate/gen_egl_dispatch.py | 250 ++++
src/egl/main/50_mesa.json.in | 6 + src/egl/main/50_mesa.json | 6 +
src/egl/main/eglapi.c | 6 +- src/egl/main/eglapi.c | 6 +-
src/egl/main/egldispatchstubs.c | 110 ++ src/egl/main/egldispatchstubs.c | 110 ++
src/egl/main/egldispatchstubs.h | 26 + src/egl/main/egldispatchstubs.h | 26 +
src/egl/main/eglglobals.c | 42 +- src/egl/main/eglglobals.c | 47 +-
src/egl/main/eglglobals.h | 13 +- src/egl/main/eglglobals.h | 13 +-
src/egl/main/eglglvnd.c | 75 ++ src/egl/main/eglglvnd.c | 82 ++
14 files changed, 3512 insertions(+), 86 deletions(-) 14 files changed, 3576 insertions(+), 94 deletions(-)
create mode 100644 src/egl/generate/egl.xml create mode 100755 src/egl/generate/egl.xml
create mode 100644 src/egl/generate/eglFunctionList.py create mode 100644 src/egl/generate/eglFunctionList.py
create mode 100644 src/egl/generate/egl_other.xml create mode 100644 src/egl/generate/egl_other.xml
create mode 100644 src/egl/generate/genCommon.py create mode 100644 src/egl/generate/genCommon.py
create mode 100644 src/egl/generate/gen_egl_dispatch.py create mode 100755 src/egl/generate/gen_egl_dispatch.py
create mode 100644 src/egl/main/50_mesa.json.in create mode 100644 src/egl/main/50_mesa.json
create mode 100644 src/egl/main/egldispatchstubs.c create mode 100644 src/egl/main/egldispatchstubs.c
create mode 100644 src/egl/main/egldispatchstubs.h create mode 100644 src/egl/main/egldispatchstubs.h
create mode 100644 src/egl/main/eglglvnd.c create mode 100644 src/egl/main/eglglvnd.c
diff --git a/configure.ac b/configure.ac diff --git a/configure.ac b/configure.ac
index d215b63..e49711d 100644 index de8af874ec..839b25c057 100644
--- a/configure.ac --- a/configure.ac
+++ b/configure.ac +++ b/configure.ac
@@ -521,8 +521,6 @@ else @@ -528,8 +528,6 @@ else
DEFINES="$DEFINES -DNDEBUG" DEFINES="$DEFINES -DNDEBUG"
fi fi
@ -43,7 +67,7 @@ index d215b63..e49711d 100644
dnl dnl
dnl Check if linker supports -Bsymbolic dnl Check if linker supports -Bsymbolic
dnl dnl
@@ -620,23 +618,6 @@ esac @@ -627,23 +625,6 @@ esac
AM_CONDITIONAL(HAVE_COMPAT_SYMLINKS, test "x$HAVE_COMPAT_SYMLINKS" = xyes) AM_CONDITIONAL(HAVE_COMPAT_SYMLINKS, test "x$HAVE_COMPAT_SYMLINKS" = xyes)
@ -67,7 +91,7 @@ index d215b63..e49711d 100644
dnl dnl
dnl library names dnl library names
dnl dnl
@@ -670,36 +651,6 @@ esac @@ -677,36 +658,6 @@ esac
AC_SUBST([LIB_EXT]) AC_SUBST([LIB_EXT])
@ -104,13 +128,12 @@ index d215b63..e49711d 100644
dnl dnl
dnl potentially-infringing-but-nobody-knows-for-sure stuff dnl potentially-infringing-but-nobody-knows-for-sure stuff
dnl dnl
@@ -1107,31 +1058,98 @@ AM_CONDITIONAL(HAVE_GALLIUM_XLIB_GLX, test "x$enable_glx" = xgallium-xlib) @@ -1335,31 +1286,94 @@ AM_CONDITIONAL(HAVE_GALLIUM_XLIB_GLX, test "x$enable_glx" = xgallium-xlib)
dnl dnl
dnl Libglvnd configuration dnl Libglvnd configuration
dnl dnl
+ +
+DEFAULT_GL_LIB_NAME=GL +DEFAULT_GL_LIB_NAME=GL
+EGL_LIB=EGL
+ +
AC_ARG_ENABLE([libglvnd], AC_ARG_ENABLE([libglvnd],
[AS_HELP_STRING([--enable-libglvnd], [AS_HELP_STRING([--enable-libglvnd],
@ -160,7 +183,6 @@ index d215b63..e49711d 100644
+ AC_MSG_ERROR([cannot build libglvnd without EGL]) + AC_MSG_ERROR([cannot build libglvnd without EGL])
+ fi + fi
+ DEFINES="${DEFINES} -DUSE_LIBGLVND_EGL=1" + DEFINES="${DEFINES} -DUSE_LIBGLVND_EGL=1"
+ EGL_LIB=EGL_mesa
+ else + else
+ PKG_CHECK_MODULES([GLVND], libglvnd >= 0.1.0) + PKG_CHECK_MODULES([GLVND], libglvnd >= 0.1.0)
+ fi + fi
@ -185,8 +207,6 @@ index d215b63..e49711d 100644
+ fi + fi
+fi +fi
+ +
+AC_SUBST([EGL_LIB])
+
+AC_ARG_WITH([gl-lib-name], +AC_ARG_WITH([gl-lib-name],
+ [AS_HELP_STRING([--with-gl-lib-name@<:@=NAME@:>@], + [AS_HELP_STRING([--with-gl-lib-name@<:@=NAME@:>@],
+ [specify GL library name @<:@default=GL@:>@])], + [specify GL library name @<:@default=GL@:>@])],
@ -222,15 +242,7 @@ index d215b63..e49711d 100644
# Check for libdrm # Check for libdrm
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED], PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
@@ -2685,6 +2703,7 @@ AC_CONFIG_FILES([Makefile @@ -2759,11 +2773,15 @@ xgallium-xlib)
src/compiler/Makefile
src/egl/Makefile
src/egl/main/egl.pc
+ src/egl/main/50_mesa.json
src/egl/wayland/wayland-drm/Makefile
src/egl/wayland/wayland-egl/Makefile
src/egl/wayland/wayland-egl/wayland-egl.pc
@@ -2846,11 +2865,15 @@ xgallium-xlib)
echo " GLX: $enable_glx" echo " GLX: $enable_glx"
;; ;;
esac esac
@ -247,83 +259,51 @@ index d215b63..e49711d 100644
egl_drivers="" egl_drivers=""
diff --git a/src/egl/Makefile.am b/src/egl/Makefile.am diff --git a/src/egl/Makefile.am b/src/egl/Makefile.am
index 304b0d3..1839155 100644 index 78cf525951..3bc62d550f 100644
--- a/src/egl/Makefile.am --- a/src/egl/Makefile.am
+++ b/src/egl/Makefile.am +++ b/src/egl/Makefile.am
@@ -32,16 +32,53 @@ AM_CFLAGS = \ @@ -32,19 +32,16 @@ AM_CFLAGS = \
$(EGL_CFLAGS) \ $(EGL_CFLAGS) \
-D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM) -D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM)
-lib_LTLIBRARIES = libEGL.la -lib_LTLIBRARIES = libEGL.la
+if USE_LIBGLVND_EGL -
+AM_CFLAGS += \
+ $(GLVND_CFLAGS)
+
+LIBEGL_C_FILES += \
+ main/eglglvnd.c \
+ main/egldispatchstubs.h \
+ main/egldispatchstubs.c \
+ g_egldispatchstubs.c
+
+EGL_LIB_VERSION=0
+
+PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
+g_egldispatchstubs.c: generate/gen_egl_dispatch.py generate/egl.xml \
+ generate/eglFunctionList.py generate/genCommon.py
+ $(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py source \
+ $(top_srcdir)/src/egl/generate/eglFunctionList.py \
+ $(top_srcdir)/src/egl/generate/egl.xml \
+ $(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+g_egldispatchstubs.h: generate/gen_egl_dispatch.py generate/egl.xml \
+ generate/eglFunctionList.py generate/genCommon.py
+ $(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py header \
+ $(top_srcdir)/src/egl/generate/eglFunctionList.py \
+ $(top_srcdir)/src/egl/generate/egl.xml \
+ $(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+BUILT_SOURCES = g_egldispatchstubs.c g_egldispatchstubs.h
+CLEANFILES = $(BUILT_SOURCES)
+
+vendorjsondir = @LIBGLVND_DATADIR@/glvnd/egl_vendor.d
+vendorjson_DATA = main/50_mesa.json
+
+else
+EGL_LIB_VERSION=1:0
+endif
+
+lib_LTLIBRARIES = lib@EGL_LIB@.la
-libEGL_la_SOURCES = \ -libEGL_la_SOURCES = \
+lib@EGL_LIB@_la_SOURCES = \ +# Depending on whether libglvnd is enabled, we'll build the EGL library as
+# either libEGL.so.1 or libEGL_mesa.so.0. Using an automake substitution
+# in the variable names breaks "make dist" target, so use a conenience library
+# instead.
+noinst_LTLIBRARIES = libEGL_common.la
+libEGL_common_la_SOURCES = \
$(LIBEGL_C_FILES) $(LIBEGL_C_FILES)
-libEGL_la_LIBADD = \ -libEGL_la_LIBADD = \
+lib@EGL_LIB@_la_LIBADD = \ +libEGL_common_la_LIBADD = \
$(EGL_LIB_DEPS) $(EGL_LIB_DEPS)
-libEGL_la_LDFLAGS = \ -libEGL_la_LDFLAGS = \
+lib@EGL_LIB@_la_LDFLAGS = \ - -no-undefined \
-no-undefined \
- -version-number 1:0 \ - -version-number 1:0 \
+ -version-number $(EGL_LIB_VERSION) \ - $(BSYMBOLIC) \
$(BSYMBOLIC) \ - $(GC_SECTIONS) \
$(GC_SECTIONS) \ - $(LD_NO_UNDEFINED)
$(LD_NO_UNDEFINED)
@@ -52,7 +89,7 @@ dri3_backend_FILES = dri2_backend_FILES =
dri3_backend_FILES =
@@ -52,7 +49,7 @@ dri3_backend_FILES =
if HAVE_PLATFORM_X11 if HAVE_PLATFORM_X11
AM_CFLAGS += -DHAVE_X11_PLATFORM AM_CFLAGS += -DHAVE_X11_PLATFORM
AM_CFLAGS += $(XCB_DRI2_CFLAGS) AM_CFLAGS += $(XCB_DRI2_CFLAGS)
-libEGL_la_LIBADD += $(XCB_DRI2_LIBS) -libEGL_la_LIBADD += $(XCB_DRI2_LIBS)
+lib@EGL_LIB@_la_LIBADD += $(XCB_DRI2_LIBS) +libEGL_common_la_LIBADD += $(XCB_DRI2_LIBS)
dri2_backend_FILES += drivers/dri2/platform_x11.c dri2_backend_FILES += drivers/dri2/platform_x11.c
if HAVE_DRI3 if HAVE_DRI3
@@ -60,22 +97,22 @@ dri3_backend_FILES += \ @@ -60,22 +57,22 @@ dri3_backend_FILES += \
drivers/dri2/platform_x11_dri3.c \ drivers/dri2/platform_x11_dri3.c \
drivers/dri2/platform_x11_dri3.h drivers/dri2/platform_x11_dri3.h
-libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la -libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la
+lib@EGL_LIB@_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la +libEGL_common_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la
endif endif
endif endif
@ -333,39 +313,112 @@ index 304b0d3..1839155 100644
-libEGL_la_LIBADD += $(WAYLAND_LIBS) -libEGL_la_LIBADD += $(WAYLAND_LIBS)
-libEGL_la_LIBADD += $(LIBDRM_LIBS) -libEGL_la_LIBADD += $(LIBDRM_LIBS)
-libEGL_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la -libEGL_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la
+lib@EGL_LIB@_la_LIBADD += $(WAYLAND_LIBS) +libEGL_common_la_LIBADD += $(WAYLAND_LIBS)
+lib@EGL_LIB@_la_LIBADD += $(LIBDRM_LIBS) +libEGL_common_la_LIBADD += $(LIBDRM_LIBS)
+lib@EGL_LIB@_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la +libEGL_common_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la
dri2_backend_FILES += drivers/dri2/platform_wayland.c dri2_backend_FILES += drivers/dri2/platform_wayland.c
endif endif
if HAVE_EGL_PLATFORM_DRM if HAVE_EGL_PLATFORM_DRM
AM_CFLAGS += -DHAVE_DRM_PLATFORM AM_CFLAGS += -DHAVE_DRM_PLATFORM
-libEGL_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la -libEGL_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la
+lib@EGL_LIB@_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la +libEGL_common_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la
dri2_backend_FILES += drivers/dri2/platform_drm.c dri2_backend_FILES += drivers/dri2/platform_drm.c
endif endif
@@ -100,13 +137,13 @@ AM_CFLAGS += \ @@ -87,7 +84,7 @@ endif
if HAVE_EGL_PLATFORM_ANDROID
AM_CFLAGS += -DHAVE_ANDROID_PLATFORM
AM_CFLAGS += $(ANDROID_CFLAGS)
-libEGL_la_LIBADD += $(ANDROID_LIBS)
+libEGL_common_la_LIBADD += $(ANDROID_LIBS)
dri2_backend_FILES += drivers/dri2/platform_android.c
endif
@@ -101,13 +98,68 @@ AM_CFLAGS += \
-DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\" \ -DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\" \
-D_EGL_BUILT_IN_DRIVER_DRI2 -D_EGL_BUILT_IN_DRIVER_DRI2
-libEGL_la_SOURCES += \ -libEGL_la_SOURCES += \
+lib@EGL_LIB@_la_SOURCES += \ +libEGL_common_la_SOURCES += \
$(dri2_backend_core_FILES) \ $(dri2_backend_core_FILES) \
$(dri2_backend_FILES) \ $(dri2_backend_FILES) \
$(dri3_backend_FILES) $(dri3_backend_FILES)
-libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader.la -libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader.la
-libEGL_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB) -libEGL_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB)
+lib@EGL_LIB@_la_LIBADD += $(top_builddir)/src/loader/libloader.la +libEGL_common_la_LIBADD += $(top_builddir)/src/loader/libloader.la
+lib@EGL_LIB@_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB) +libEGL_common_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB)
endif +
+GLVND_GEN_DEPS = generate/gen_egl_dispatch.py \
+ generate/egl.xml generate/eglFunctionList.py generate/genCommon.py \
+ generate/egl_other.xml
+
+PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
+g_egldispatchstubs.c: $(GLVND_GEN_DEPS)
+ $(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py source \
+ $(top_srcdir)/src/egl/generate/eglFunctionList.py \
+ $(top_srcdir)/src/egl/generate/egl.xml \
+ $(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+g_egldispatchstubs.h: $(GLVND_GEN_DEPS)
+ $(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py header \
+ $(top_srcdir)/src/egl/generate/eglFunctionList.py \
+ $(top_srcdir)/src/egl/generate/egl.xml \
+ $(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+BUILT_SOURCES = g_egldispatchstubs.c g_egldispatchstubs.h
+CLEANFILES = $(BUILT_SOURCES)
+
+if USE_LIBGLVND_EGL
+AM_CFLAGS += \
+ $(GLVND_CFLAGS)
+
+vendorjsondir = @LIBGLVND_DATADIR@/glvnd/egl_vendor.d
+vendorjson_DATA = main/50_mesa.json
+
+lib_LTLIBRARIES = libEGL_mesa.la
+libEGL_mesa_la_SOURCES = \
+ main/eglglvnd.c \
+ main/egldispatchstubs.h \
+ main/egldispatchstubs.c \
+ g_egldispatchstubs.c
+libEGL_mesa_la_LIBADD = libEGL_common.la
+libEGL_mesa_la_LDFLAGS = \
+ -no-undefined \
+ -version-number 0 \
+ $(BSYMBOLIC) \
+ $(GC_SECTIONS) \
+ $(LD_NO_UNDEFINED)
+
+else # USE_LIBGLVND_EGL
+
+lib_LTLIBRARIES = libEGL.la
+libEGL_la_SOURCES =
+libEGL_la_LIBADD = libEGL_common.la
+libEGL_la_LDFLAGS = \
+ -no-undefined \
+ -version-number 1:0 \
+ $(BSYMBOLIC) \
+ $(GC_SECTIONS) \
+ $(LD_NO_UNDEFINED)
+
+endif # USE_LIBGLVND_EGL
include $(top_srcdir)/install-lib-links.mk include $(top_srcdir)/install-lib-links.mk
@@ -133,4 +185,7 @@ EXTRA_DIST = \
SConscript \
drivers/haiku \
main/egl.def \
- main/README.txt
+ main/README.txt \
+ $(GLVND_GEN_DEPS) \
+ main/50_mesa.json
+
diff --git a/src/egl/generate/egl.xml b/src/egl/generate/egl.xml diff --git a/src/egl/generate/egl.xml b/src/egl/generate/egl.xml
new file mode 100644 new file mode 100755
index 0000000..f6dbbc0 index 0000000000..f6dbbc0f26
--- /dev/null --- /dev/null
+++ b/src/egl/generate/egl.xml +++ b/src/egl/generate/egl.xml
@@ -0,0 +1,2412 @@ @@ -0,0 +1,2412 @@
@ -2783,11 +2836,11 @@ index 0000000..f6dbbc0
+</registry> +</registry>
diff --git a/src/egl/generate/eglFunctionList.py b/src/egl/generate/eglFunctionList.py diff --git a/src/egl/generate/eglFunctionList.py b/src/egl/generate/eglFunctionList.py
new file mode 100644 new file mode 100644
index 0000000..39d3dd5 index 0000000000..b19b5f7193
--- /dev/null --- /dev/null
+++ b/src/egl/generate/eglFunctionList.py +++ b/src/egl/generate/eglFunctionList.py
@@ -0,0 +1,191 @@ @@ -0,0 +1,197 @@
+#!/usr/bin/python +#!/usr/bin/env python
+ +
+""" +"""
+Contains a list of EGL functions to generate dispatch functions for. +Contains a list of EGL functions to generate dispatch functions for.
@ -2846,7 +2899,7 @@ index 0000000..39d3dd5
+ """ + """
+ A convenience function to define an entry in the EGL function list. + A convenience function to define an entry in the EGL function list.
+ """ + """
+ if (inheader == None): + if inheader is None:
+ inheader = (not public) + inheader = (not public)
+ values = { + values = {
+ "method" : method, + "method" : method,
@ -2927,6 +2980,9 @@ index 0000000..39d3dd5
+ # EGL_EXT_swap_buffers_with_damage + # EGL_EXT_swap_buffers_with_damage
+ _eglFunc("eglSwapBuffersWithDamageEXT", "display"), + _eglFunc("eglSwapBuffersWithDamageEXT", "display"),
+ +
+ # KHR_EXT_swap_buffers_with_damage
+ _eglFunc("eglSwapBuffersWithDamageKHR", "display"),
+
+ # EGL_KHR_cl_event2 + # EGL_KHR_cl_event2
+ _eglFunc("eglCreateSync64KHR", "display"), + _eglFunc("eglCreateSync64KHR", "display"),
+ +
@ -2976,11 +3032,14 @@ index 0000000..39d3dd5
+ +
+ # EGL_CHROMIUM_get_sync_values + # EGL_CHROMIUM_get_sync_values
+ _eglFunc("eglGetSyncValuesCHROMIUM", "display"), + _eglFunc("eglGetSyncValuesCHROMIUM", "display"),
+
+ # EGL_ANDROID_native_fence_sync
+ _eglFunc("eglDupNativeFenceFDANDROID", "display"),
+) +)
+ +
diff --git a/src/egl/generate/egl_other.xml b/src/egl/generate/egl_other.xml diff --git a/src/egl/generate/egl_other.xml b/src/egl/generate/egl_other.xml
new file mode 100644 new file mode 100644
index 0000000..7fe3a9e index 0000000000..7fe3a9e272
--- /dev/null --- /dev/null
+++ b/src/egl/generate/egl_other.xml +++ b/src/egl/generate/egl_other.xml
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
@ -3033,7 +3092,7 @@ index 0000000..7fe3a9e
+ +
diff --git a/src/egl/generate/genCommon.py b/src/egl/generate/genCommon.py diff --git a/src/egl/generate/genCommon.py b/src/egl/generate/genCommon.py
new file mode 100644 new file mode 100644
index 0000000..5781275 index 0000000000..d493d7bf29
--- /dev/null --- /dev/null
+++ b/src/egl/generate/genCommon.py +++ b/src/egl/generate/genCommon.py
@@ -0,0 +1,223 @@ @@ -0,0 +1,223 @@
@ -3064,9 +3123,9 @@ index 0000000..5781275
+# Authors: +# Authors:
+# Kyle Brenneman <kbrenneman@nvidia.com> +# Kyle Brenneman <kbrenneman@nvidia.com>
+ +
+import sys
+import collections +import collections
+import re +import re
+import sys
+import xml.etree.cElementTree as etree +import xml.etree.cElementTree as etree
+ +
+MAPI_TABLE_NUM_DYNAMIC = 4096 +MAPI_TABLE_NUM_DYNAMIC = 4096
@ -3110,7 +3169,7 @@ index 0000000..5781275
+ # Assign a slot number to each function. This isn't strictly necessary, + # Assign a slot number to each function. This isn't strictly necessary,
+ # since you can just look at the index in the list, but it makes it easier + # since you can just look at the index in the list, but it makes it easier
+ # to include the slot when formatting output. + # to include the slot when formatting output.
+ for i in xrange(len(functions)): + for i in range(len(functions)):
+ functions[i] = functions[i]._replace(slot=i) + functions[i] = functions[i]._replace(slot=i)
+ +
+ return functions + return functions
@ -3124,17 +3183,17 @@ index 0000000..5781275
+ "glesv2". + "glesv2".
+ """ + """
+ featureNames = _LIBRARY_FEATURE_NAMES[target] + featureNames = _LIBRARY_FEATURE_NAMES[target]
+ if (featureNames == None): + if featureNames is None:
+ return set(func.name for func in getFunctionsFromRoots(roots)) + return set(func.name for func in getFunctionsFromRoots(roots))
+ +
+ names = set() + names = set()
+ for root in roots: + for root in roots:
+ features = [] + features = []
+ for featElem in root.findall("feature"): + for featElem in root.findall("feature"):
+ if (featElem.get("name") in featureNames): + if featElem.get("name") in featureNames:
+ features.append(featElem) + features.append(featElem)
+ for featElem in root.findall("extensions/extension"): + for featElem in root.findall("extensions/extension"):
+ if (featElem.get("name") in featureNames): + if featElem.get("name") in featureNames:
+ features.append(featElem) + features.append(featElem)
+ for featElem in features: + for featElem in features:
+ for commandElem in featElem.findall("require/command"): + for commandElem in featElem.findall("require/command"):
@ -3148,7 +3207,7 @@ index 0000000..5781275
+ Returns a "TYPE NAME" string, suitable for a function prototype. + Returns a "TYPE NAME" string, suitable for a function prototype.
+ """ + """
+ rv = str(self.type) + rv = str(self.type)
+ if(not rv.endswith("*")): + if not rv.endswith("*"):
+ rv += " " + rv += " "
+ rv += self.name + rv += self.name
+ return rv + return rv
@ -3166,7 +3225,7 @@ index 0000000..5781275
+ Returns a string with the types and names of the arguments, as you + Returns a string with the types and names of the arguments, as you
+ would use in a function declaration. + would use in a function declaration.
+ """ + """
+ if(len(self.args) == 0): + if not self.args:
+ return "void" + return "void"
+ else: + else:
+ return ", ".join(arg.dec for arg in self.args) + return ", ".join(arg.dec for arg in self.args)
@ -3181,7 +3240,7 @@ index 0000000..5781275
+ +
+ @property + @property
+ def basename(self): + def basename(self):
+ assert(self.name.startswith("gl")) + assert self.name.startswith("gl")
+ return self.name[2:] + return self.name[2:]
+ +
+def _getFunctionList(root): +def _getFunctionList(root):
@ -3205,10 +3264,10 @@ index 0000000..5781275
+ text = _flattenText(elem) + text = _flattenText(elem)
+ text = text.strip() + text = text.strip()
+ m = re.match(r"^(.+)\b(\w+)(?:\s*\[\s*(\d*)\s*\])?$", text, re.S) + m = re.match(r"^(.+)\b(\w+)(?:\s*\[\s*(\d*)\s*\])?$", text, re.S)
+ if (m): + if m:
+ typename = _fixupTypeName(m.group(1)) + typename = _fixupTypeName(m.group(1))
+ name = m.group(2) + name = m.group(2)
+ if (m.group(3)): + if m.group(3):
+ # HACK: glPathGlyphIndexRangeNV defines an argument like this: + # HACK: glPathGlyphIndexRangeNV defines an argument like this:
+ # GLuint baseAndCount[2] + # GLuint baseAndCount[2]
+ # Convert it to a pointer and hope for the best. + # Convert it to a pointer and hope for the best.
@ -3223,11 +3282,11 @@ index 0000000..5781275
+ removed. + removed.
+ """ + """
+ text = "" + text = ""
+ if(elem.text != None): + if elem.text is not None:
+ text = elem.text + text = elem.text
+ for ch in elem: + for ch in elem:
+ text += _flattenText(ch) + text += _flattenText(ch)
+ if(ch.tail != None): + if ch.tail is not None:
+ text += ch.tail + text += ch.tail
+ return text + return text
+ +
@ -3261,12 +3320,37 @@ index 0000000..5781275
+ return rv + return rv
+ +
diff --git a/src/egl/generate/gen_egl_dispatch.py b/src/egl/generate/gen_egl_dispatch.py diff --git a/src/egl/generate/gen_egl_dispatch.py b/src/egl/generate/gen_egl_dispatch.py
new file mode 100644 new file mode 100755
index 0000000..1e145aa index 0000000000..eeb3f3f9a5
--- /dev/null --- /dev/null
+++ b/src/egl/generate/gen_egl_dispatch.py +++ b/src/egl/generate/gen_egl_dispatch.py
@@ -0,0 +1,223 @@ @@ -0,0 +1,250 @@
+#!/usr/bin/python +#!/usr/bin/env python
+
+# (C) Copyright 2016, NVIDIA CORPORATION.
+# All Rights Reserved.
+#
+# 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
+# on the rights to use, copy, modify, merge, publish, distribute, sub
+# license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+# IBM AND/OR ITS SUPPLIERS 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:
+# Kyle Brenneman <kbrenneman@nvidia.com>
+ +
+""" +"""
+Generates dispatch functions for EGL. +Generates dispatch functions for EGL.
@ -3275,26 +3359,28 @@ index 0000000..1e145aa
+additional information defined in the module eglFunctionList. +additional information defined in the module eglFunctionList.
+""" +"""
+ +
+import sys +import argparse
+import collections +import collections
+import imp +import imp
+import sys
+import textwrap
+ +
+import genCommon +import genCommon
+ +
+def main(): +def main():
+ if (len(sys.argv) < 4): + parser = argparse.ArgumentParser()
+ print("Usage: %r source|header <function_list> <xml_file> [xml_file...]" % (sys.argv[0],)) + parser.add_argument("target", choices=("header", "source"),
+ sys.exit(2) + help="Whether to build the source or header file.")
+ parser.add_argument("func_list_file", help="The function list .py file.")
+ parser.add_argument("xml_files", nargs="+", help="The XML files with the EGL function lists.")
+ +
+ target = sys.argv[1] + args = parser.parse_args()
+ funcListFile = sys.argv[2]
+ xmlFiles = sys.argv[3:]
+ +
+ # The function list is a Python module, but it's specified on the command + # The function list is a Python module, but it's specified on the command
+ # line. + # line.
+ eglFunctionList = imp.load_source("eglFunctionList", funcListFile) + eglFunctionList = imp.load_source("eglFunctionList", args.func_list_file)
+ +
+ xmlFunctions = genCommon.getFunctions(xmlFiles) + xmlFunctions = genCommon.getFunctions(args.xml_files)
+ xmlByName = dict((f.name, f) for f in xmlFunctions) + xmlByName = dict((f.name, f) for f in xmlFunctions)
+ functions = [] + functions = []
+ for (name, eglFunc) in eglFunctionList.EGL_FUNCTIONS: + for (name, eglFunc) in eglFunctionList.EGL_FUNCTIONS:
@ -3305,49 +3391,47 @@ index 0000000..1e145aa
+ # Sort the function list by name. + # Sort the function list by name.
+ functions = sorted(functions, key=lambda f: f[0].name) + functions = sorted(functions, key=lambda f: f[0].name)
+ +
+ if (target == "header"): + if args.target == "header":
+ text = generateHeader(functions) + text = generateHeader(functions)
+ elif (target == "source"): + elif args.target == "source":
+ text = generateSource(functions) + text = generateSource(functions)
+ else:
+ raise ValueError("Invalid target: %r" % (target,))
+ sys.stdout.write(text) + sys.stdout.write(text)
+ +
+def fixupEglFunc(func, eglFunc): +def fixupEglFunc(func, eglFunc):
+ result = dict(eglFunc) + result = dict(eglFunc)
+ if (result.get("prefix") == None): + if result.get("prefix") is None:
+ result["prefix"] = "" + result["prefix"] = ""
+ +
+ if (result.get("extension") != None): + if result.get("extension") is not None:
+ text = "defined(" + result["extension"] + ")" + text = "defined(" + result["extension"] + ")"
+ result["extension"] = text + result["extension"] = text
+ +
+ if (result["method"] in ("none", "custom")): + if result["method"] in ("none", "custom"):
+ return result + return result
+ +
+ if (result["method"] not in ("display", "device", "current")): + if result["method"] not in ("display", "device", "current"):
+ raise ValueError("Invalid dispatch method %r for function %r" % (result["method"], func.name)) + raise ValueError("Invalid dispatch method %r for function %r" % (result["method"], func.name))
+ +
+ if (func.hasReturn()): + if func.hasReturn():
+ if (result.get("retval") == None): + if result.get("retval") is None:
+ result["retval"] = getDefaultReturnValue(func.rt) + result["retval"] = getDefaultReturnValue(func.rt)
+ +
+ return result + return result
+ +
+def generateHeader(functions): +def generateHeader(functions):
+ text = r""" + text = textwrap.dedent(r"""
+#ifndef G_EGLDISPATCH_STUBS_H + #ifndef G_EGLDISPATCH_STUBS_H
+#define G_EGLDISPATCH_STUBS_H + #define G_EGLDISPATCH_STUBS_H
+ +
+#ifdef __cplusplus + #ifdef __cplusplus
+extern "C" { + extern "C" {
+#endif + #endif
+ +
+#include <EGL/egl.h> + #include <EGL/egl.h>
+#include <EGL/eglext.h> + #include <EGL/eglext.h>
+#include "glvnd/libeglabi.h" + #include "glvnd/libeglabi.h"
+ +
+""".lstrip("\n") + """.lstrip("\n"))
+ +
+ text += "enum {\n" + text += "enum {\n"
+ for (func, eglFunc) in functions: + for (func, eglFunc) in functions:
@ -3358,17 +3442,17 @@ index 0000000..1e145aa
+ text += "};\n" + text += "};\n"
+ +
+ for (func, eglFunc) in functions: + for (func, eglFunc) in functions:
+ if (eglFunc["inheader"]): + if eglFunc["inheader"]:
+ text += generateGuardBegin(func, eglFunc) + text += generateGuardBegin(func, eglFunc)
+ text += "{f.rt} EGLAPIENTRY {ex[prefix]}{f.name}({f.decArgs});\n".format(f=func, ex=eglFunc) + text += "{f.rt} EGLAPIENTRY {ex[prefix]}{f.name}({f.decArgs});\n".format(f=func, ex=eglFunc)
+ text += generateGuardEnd(func, eglFunc) + text += generateGuardEnd(func, eglFunc)
+ +
+ text += r""" + text += textwrap.dedent(r"""
+#ifdef __cplusplus + #ifdef __cplusplus
+} + }
+#endif + #endif
+#endif // G_EGLDISPATCH_STUBS_H + #endif // G_EGLDISPATCH_STUBS_H
+""" + """)
+ return text + return text
+ +
+def generateSource(functions): +def generateSource(functions):
@ -3379,7 +3463,7 @@ index 0000000..1e145aa
+ text += "\n" + text += "\n"
+ +
+ for (func, eglFunc) in functions: + for (func, eglFunc) in functions:
+ if (eglFunc["method"] not in ("custom", "none")): + if eglFunc["method"] not in ("custom", "none"):
+ text += generateGuardBegin(func, eglFunc) + text += generateGuardBegin(func, eglFunc)
+ text += generateDispatchFunc(func, eglFunc) + text += generateDispatchFunc(func, eglFunc)
+ text += generateGuardEnd(func, eglFunc) + text += generateGuardEnd(func, eglFunc)
@ -3396,7 +3480,7 @@ index 0000000..1e145aa
+ text += "const __eglMustCastToProperFunctionPointerType __EGL_DISPATCH_FUNCS[__EGL_DISPATCH_COUNT + 1] = {\n" + text += "const __eglMustCastToProperFunctionPointerType __EGL_DISPATCH_FUNCS[__EGL_DISPATCH_COUNT + 1] = {\n"
+ for (func, eglFunc) in functions: + for (func, eglFunc) in functions:
+ text += generateGuardBegin(func, eglFunc) + text += generateGuardBegin(func, eglFunc)
+ if (eglFunc["method"] != "none"): + if eglFunc["method"] != "none":
+ text += " (__eglMustCastToProperFunctionPointerType) " + eglFunc.get("prefix", "") + func.name + ",\n" + text += " (__eglMustCastToProperFunctionPointerType) " + eglFunc.get("prefix", "") + func.name + ",\n"
+ else: + else:
+ text += " NULL, // " + func.name + "\n" + text += " NULL, // " + func.name + "\n"
@ -3408,13 +3492,13 @@ index 0000000..1e145aa
+ +
+def generateGuardBegin(func, eglFunc): +def generateGuardBegin(func, eglFunc):
+ ext = eglFunc.get("extension") + ext = eglFunc.get("extension")
+ if (ext != None): + if ext is not None:
+ return "#if " + ext + "\n" + return "#if " + ext + "\n"
+ else: + else:
+ return "" + return ""
+ +
+def generateGuardEnd(func, eglFunc): +def generateGuardEnd(func, eglFunc):
+ if (eglFunc.get("extension") != None): + if eglFunc.get("extension") is not None:
+ return "#endif\n" + return "#endif\n"
+ else: + else:
+ return "" + return ""
@ -3422,37 +3506,39 @@ index 0000000..1e145aa
+def generateDispatchFunc(func, eglFunc): +def generateDispatchFunc(func, eglFunc):
+ text = "" + text = ""
+ +
+ if (eglFunc.get("static")): + if eglFunc.get("static"):
+ text += "static " + text += "static "
+ elif (eglFunc.get("public")): + elif eglFunc.get("public"):
+ text += "PUBLIC " + text += "PUBLIC "
+ text += r"""{f.rt} EGLAPIENTRY {ef[prefix]}{f.name}({f.decArgs}) + text += textwrap.dedent(
+{{ + r"""
+ typedef {f.rt} EGLAPIENTRY (* _pfn_{f.name})({f.decArgs}); + {f.rt} EGLAPIENTRY {ef[prefix]}{f.name}({f.decArgs})
+""".format(f=func, ef=eglFunc) + {{
+ typedef {f.rt} EGLAPIENTRY (* _pfn_{f.name})({f.decArgs});
+ """).lstrip("\n").format(f=func, ef=eglFunc)
+ +
+ if (func.hasReturn()): + if func.hasReturn():
+ text += " {f.rt} _ret = {ef[retval]};\n".format(f=func, ef=eglFunc) + text += " {f.rt} _ret = {ef[retval]};\n".format(f=func, ef=eglFunc)
+ +
+ text += " _pfn_{f.name} _ptr_{f.name} = (_pfn_{f.name}) ".format(f=func) + text += " _pfn_{f.name} _ptr_{f.name} = (_pfn_{f.name}) ".format(f=func)
+ if (eglFunc["method"] == "current"): + if eglFunc["method"] == "current":
+ text += "__eglDispatchFetchByCurrent(__EGL_DISPATCH_{f.name});\n".format(f=func) + text += "__eglDispatchFetchByCurrent(__EGL_DISPATCH_{f.name});\n".format(f=func)
+ +
+ elif (eglFunc["method"] in ("display", "device")): + elif eglFunc["method"] in ("display", "device"):
+ if (eglFunc["method"] == "display"): + if eglFunc["method"] == "display":
+ lookupFunc = "__eglDispatchFetchByDisplay" + lookupFunc = "__eglDispatchFetchByDisplay"
+ lookupType = "EGLDisplay" + lookupType = "EGLDisplay"
+ else: + else:
+ assert(eglFunc["method"] == "device") + assert eglFunc["method"] == "device"
+ lookupFunc = "__eglDispatchFetchByDevice" + lookupFunc = "__eglDispatchFetchByDevice"
+ lookupType = "EGLDeviceEXT" + lookupType = "EGLDeviceEXT"
+ +
+ lookupArg = None + lookupArg = None
+ for arg in func.args: + for arg in func.args:
+ if (arg.type == lookupType): + if arg.type == lookupType:
+ lookupArg = arg.name + lookupArg = arg.name
+ break + break
+ if (lookupArg == None): + if lookupArg is None:
+ raise ValueError("Can't find %s argument for function %s" % (lookupType, func.name,)) + raise ValueError("Can't find %s argument for function %s" % (lookupType, func.name,))
+ +
+ text += "{lookupFunc}({lookupArg}, __EGL_DISPATCH_{f.name});\n".format( + text += "{lookupFunc}({lookupArg}, __EGL_DISPATCH_{f.name});\n".format(
@ -3462,50 +3548,50 @@ index 0000000..1e145aa
+ +
+ text += " if(_ptr_{f.name} != NULL) {{\n".format(f=func) + text += " if(_ptr_{f.name} != NULL) {{\n".format(f=func)
+ text += " " + text += " "
+ if (func.hasReturn()): + if func.hasReturn():
+ text += "_ret = " + text += "_ret = "
+ text += "_ptr_{f.name}({f.callArgs});\n".format(f=func) + text += "_ptr_{f.name}({f.callArgs});\n".format(f=func)
+ text += " }\n" + text += " }\n"
+ +
+ if (func.hasReturn()): + if func.hasReturn():
+ text += " return _ret;\n" + text += " return _ret;\n"
+ text += "}\n" + text += "}\n"
+ return text + return text
+ +
+def getDefaultReturnValue(typename): +def getDefaultReturnValue(typename):
+ if (typename.endswith("*")): + if typename.endswith("*"):
+ return "NULL" + return "NULL"
+ elif (typename == "EGLDisplay"): + elif typename == "EGLDisplay":
+ return "EGL_NO_DISPLAY" + return "EGL_NO_DISPLAY"
+ elif (typename == "EGLContext"): + elif typename == "EGLContext":
+ return "EGL_NO_CONTEXT" + return "EGL_NO_CONTEXT"
+ elif (typename == "EGLSurface"): + elif typename == "EGLSurface":
+ return "EGL_NO_SURFACE" + return "EGL_NO_SURFACE"
+ elif (typename == "EGLBoolean"): + elif typename == "EGLBoolean":
+ return "EGL_FALSE"; + return "EGL_FALSE";
+ +
+ return "0" + return "0"
+ +
+if (__name__ == "__main__"): +if __name__ == "__main__":
+ main() + main()
+ +
diff --git a/src/egl/main/50_mesa.json.in b/src/egl/main/50_mesa.json.in diff --git a/src/egl/main/50_mesa.json b/src/egl/main/50_mesa.json
new file mode 100644 new file mode 100644
index 0000000..58e2bd2 index 0000000000..8aaaa100ff
--- /dev/null --- /dev/null
+++ b/src/egl/main/50_mesa.json.in +++ b/src/egl/main/50_mesa.json
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
+{ +{
+ "file_format_version" : "1.0.0", + "file_format_version" : "1.0.0",
+ "ICD" : { + "ICD" : {
+ "library_path" : "lib@EGL_LIB@.so.0" + "library_path" : "libEGL_mesa.so.0"
+ } + }
+} +}
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 471cf7e..7ee9d87 100644 index cab05c2301..5f21f3457d 100644
--- a/src/egl/main/eglapi.c --- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c
@@ -644,7 +644,11 @@ eglQueryString(EGLDisplay dpy, EGLint name) @@ -651,7 +651,11 @@ eglQueryString(EGLDisplay dpy, EGLint name)
_EGLDriver *drv; _EGLDriver *drv;
if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) { if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
@ -3520,7 +3606,7 @@ index 471cf7e..7ee9d87 100644
disp = _eglLockDisplay(dpy); disp = _eglLockDisplay(dpy);
diff --git a/src/egl/main/egldispatchstubs.c b/src/egl/main/egldispatchstubs.c diff --git a/src/egl/main/egldispatchstubs.c b/src/egl/main/egldispatchstubs.c
new file mode 100644 new file mode 100644
index 0000000..e02abd7 index 0000000000..e02abd7a9e
--- /dev/null --- /dev/null
+++ b/src/egl/main/egldispatchstubs.c +++ b/src/egl/main/egldispatchstubs.c
@@ -0,0 +1,110 @@ @@ -0,0 +1,110 @@
@ -3636,7 +3722,7 @@ index 0000000..e02abd7
+ +
diff --git a/src/egl/main/egldispatchstubs.h b/src/egl/main/egldispatchstubs.h diff --git a/src/egl/main/egldispatchstubs.h b/src/egl/main/egldispatchstubs.h
new file mode 100644 new file mode 100644
index 0000000..7861ea5 index 0000000000..7861ea5e61
--- /dev/null --- /dev/null
+++ b/src/egl/main/egldispatchstubs.h +++ b/src/egl/main/egldispatchstubs.h
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
@ -3667,7 +3753,7 @@ index 0000000..7861ea5
+ +
+#endif // EGLDISPATCHSTUBS_H +#endif // EGLDISPATCHSTUBS_H
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index cb41063..e59e8f3 100644 index cb41063e32..baf96bb1ec 100644
--- a/src/egl/main/eglglobals.c --- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c +++ b/src/egl/main/eglglobals.c
@@ -29,6 +29,8 @@ @@ -29,6 +29,8 @@
@ -3679,32 +3765,34 @@ index cb41063..e59e8f3 100644
#include <assert.h> #include <assert.h>
#include "c11/threads.h" #include "c11/threads.h"
@@ -50,8 +52,11 @@ struct _egl_global _eglGlobal = @@ -50,9 +52,13 @@ struct _egl_global _eglGlobal =
_eglFiniDisplay _eglFiniDisplay
}, },
- /* ClientExtensionString */ - /* ClientExtensionString */
+ /* ClientOnlyExtensionString */ + /* ClientOnlyExtensionString */
"EGL_EXT_client_extensions" "EGL_EXT_client_extensions"
+ " EGL_KHR_client_get_all_proc_addresses", " EGL_EXT_platform_base"
+ " EGL_KHR_client_get_all_proc_addresses"
+ " EGL_KHR_debug",
+ +
+ /* PlatformExtensionString */ + /* PlatformExtensionString */
" EGL_EXT_platform_base"
#ifdef HAVE_WAYLAND_PLATFORM #ifdef HAVE_WAYLAND_PLATFORM
" EGL_EXT_platform_wayland" " EGL_EXT_platform_wayland"
@@ -65,9 +70,10 @@ struct _egl_global _eglGlobal = #endif
@@ -65,8 +71,9 @@ struct _egl_global _eglGlobal =
#ifdef HAVE_SURFACELESS_PLATFORM #ifdef HAVE_SURFACELESS_PLATFORM
" EGL_MESA_platform_surfaceless" " EGL_MESA_platform_surfaceless"
#endif #endif
- " EGL_KHR_client_get_all_proc_addresses" - " EGL_KHR_client_get_all_proc_addresses"
" EGL_KHR_debug", - " EGL_KHR_debug",
+ "",
+ NULL, /* ClientExtensionsString */
+ +
+ NULL, /* ClientExtensionsString */
NULL, /* debugCallback */ NULL, /* debugCallback */
_EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR, /* debugTypesEnabled */ _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR, /* debugTypesEnabled */
}; @@ -101,3 +108,37 @@ _eglAddAtExitCall(void (*func)(void))
@@ -101,3 +107,35 @@ _eglAddAtExitCall(void (*func)(void))
mtx_unlock(_eglGlobal.Mutex); mtx_unlock(_eglGlobal.Mutex);
} }
} }
@ -3720,7 +3808,7 @@ index cb41063..e59e8f3 100644
+ size_t clientLen = strlen(_eglGlobal.ClientOnlyExtensionString); + size_t clientLen = strlen(_eglGlobal.ClientOnlyExtensionString);
+ size_t platformLen = strlen(_eglGlobal.PlatformExtensionString); + size_t platformLen = strlen(_eglGlobal.PlatformExtensionString);
+ +
+ _eglGlobal.ClientExtensionString = (char *) malloc(clientLen + platformLen + 2); + _eglGlobal.ClientExtensionString = (char *) malloc(clientLen + platformLen + 1);
+ if (_eglGlobal.ClientExtensionString != NULL) { + if (_eglGlobal.ClientExtensionString != NULL) {
+ char *ptr = _eglGlobal.ClientExtensionString; + char *ptr = _eglGlobal.ClientExtensionString;
+ +
@ -3728,7 +3816,9 @@ index cb41063..e59e8f3 100644
+ ptr += clientLen; + ptr += clientLen;
+ +
+ if (platformLen > 0) { + if (platformLen > 0) {
+ *ptr++ = ' '; + // Note that if PlatformExtensionString is not empty, then it will
+ // already have a leading space.
+ assert(_eglGlobal.PlatformExtensionString[0] == ' ');
+ memcpy(ptr, _eglGlobal.PlatformExtensionString, platformLen); + memcpy(ptr, _eglGlobal.PlatformExtensionString, platformLen);
+ ptr += platformLen; + ptr += platformLen;
+ } + }
@ -3741,10 +3831,10 @@ index cb41063..e59e8f3 100644
+ return ret; + return ret;
+} +}
diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
index ec4f3d0..e3a7f58 100644 index ec4f3d04a3..c6ef59d482 100644
--- a/src/egl/main/eglglobals.h --- a/src/egl/main/eglglobals.h
+++ b/src/egl/main/eglglobals.h +++ b/src/egl/main/eglglobals.h
@@ -57,12 +57,23 @@ struct _egl_global @@ -57,7 +57,15 @@ struct _egl_global
EGLint NumAtExitCalls; EGLint NumAtExitCalls;
void (*AtExitCalls[10])(void); void (*AtExitCalls[10])(void);
@ -3761,20 +3851,20 @@ index ec4f3d0..e3a7f58 100644
EGLDEBUGPROCKHR debugCallback; EGLDEBUGPROCKHR debugCallback;
unsigned int debugTypesEnabled; unsigned int debugTypesEnabled;
}; @@ -76,4 +84,7 @@ static inline unsigned int DebugBitFromType(EGLenum type)
return (1 << (type - EGL_DEBUG_MSG_CRITICAL_KHR));
}
+extern const char * +extern const char *
+_eglGetClientExtensionString(void); +_eglGetClientExtensionString(void);
+ +
#endif /* EGLGLOBALS_INCLUDED */
extern struct _egl_global _eglGlobal;
diff --git a/src/egl/main/eglglvnd.c b/src/egl/main/eglglvnd.c diff --git a/src/egl/main/eglglvnd.c b/src/egl/main/eglglvnd.c
new file mode 100644 new file mode 100644
index 0000000..81fdb45 index 0000000000..6b984ed6c2
--- /dev/null --- /dev/null
+++ b/src/egl/main/eglglvnd.c +++ b/src/egl/main/eglglvnd.c
@@ -0,0 +1,75 @@ @@ -0,0 +1,82 @@
+#include <string.h> +#include <string.h>
+#include <assert.h> +#include <assert.h>
+ +
@ -3801,8 +3891,15 @@ index 0000000..81fdb45
+static const char * +static const char *
+__eglGLVNDGetVendorString(int name) +__eglGLVNDGetVendorString(int name)
+{ +{
+ if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) + if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) {
+ return _eglGlobal.PlatformExtensionString; + const char *str = _eglGlobal.PlatformExtensionString;
+ // The platform extension string may have a leading space. If it does,
+ // then skip over it.
+ while (*str == ' ') {
+ str++;
+ }
+ return str;
+ }
+ +
+ return NULL; + return NULL;
+} +}
@ -3851,5 +3948,5 @@ index 0000000..81fdb45
+} +}
+ +
-- --
2.9.3 2.11.0

View File

@ -0,0 +1,33 @@
From 2d4094c2caad6cef2f5544b3966fcc37ceb32036 Mon Sep 17 00:00:00 2001
From: Kyle Brenneman <kbrenneman@nvidia.com>
Date: Thu, 5 Jan 2017 14:29:47 -0700
Subject: [PATCH 2/2] fixup! EGL: Implement the libglvnd interface for EGL (v2)
---
src/egl/generate/eglFunctionList.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/egl/generate/eglFunctionList.py b/src/egl/generate/eglFunctionList.py
index b19b5f7193..80cb83437c 100644
--- a/src/egl/generate/eglFunctionList.py
+++ b/src/egl/generate/eglFunctionList.py
@@ -53,12 +53,14 @@ method values:
Select the vendor that owns the current context.
"""
-def _eglFunc(name, method, static=False, public=False, inheader=None, prefix="", extension=None, retval=None):
+def _eglFunc(name, method, static=None, public=False, inheader=None, prefix="dispatch_", extension=None, retval=None):
"""
A convenience function to define an entry in the EGL function list.
"""
+ if static is None:
+ static = (not public and method != "custom")
if inheader is None:
- inheader = (not public)
+ inheader = (not static)
values = {
"method" : method,
"prefix" : prefix,
--
2.11.0

View File

@ -54,16 +54,16 @@
%global sanitize 1 %global sanitize 1
#global rctag rc2 %global rctag rc1
Name: mesa Name: mesa
Summary: Mesa graphics libraries Summary: Mesa graphics libraries
Version: 13.0.3 Version: 17.0.0
Release: 3%{?rctag:.%{rctag}}%{?dist} Release: 0%{?rctag:.%{rctag}}%{?dist}
License: MIT License: MIT
URL: http://www.mesa3d.org URL: http://www.mesa3d.org
Source0: https://mesa.freedesktop.org/archive/%{version}/%{name}-%{version}%{?rctag:-%{rctag}}.tar.xz Source0: https://mesa.freedesktop.org/archive/%{name}-%{version}%{?rctag:-%{rctag}}.tar.xz
Source1: vl_decoder.c Source1: vl_decoder.c
Source2: vl_mpeg12_decoder.c Source2: vl_mpeg12_decoder.c
# src/gallium/auxiliary/postprocess/pp_mlaa* have an ... interestingly worded license. # src/gallium/auxiliary/postprocess/pp_mlaa* have an ... interestingly worded license.
@ -77,10 +77,13 @@ Patch3: 0003-evergreen-big-endian.patch
Patch4: 0004-bigendian-assert.patch Patch4: 0004-bigendian-assert.patch
# glvnd support patches # glvnd support patches
Patch11: 0001-egl-glvnd-support.patch # https://patchwork.freedesktop.org/series/12354/, v3 & v4
Patch12: glvnd-fix-gl-dot-pc.patch Patch11: 0001-EGL-Implement-the-libglvnd-interface-for-EGL-v2.patch
Patch13: 0001-Fix-linkage-against-shared-glapi.patch Patch12: 0002-fixup-EGL-Implement-the-libglvnd-interface-for-EGL-v.patch
Patch14: 0001-glapi-Link-with-glapi-when-built-shared.patch # non-upstreamed ones
Patch13: glvnd-fix-gl-dot-pc.patch
Patch14: 0001-Fix-linkage-against-shared-glapi.patch
Patch15: 0001-glapi-Link-with-glapi-when-built-shared.patch
BuildRequires: gcc BuildRequires: gcc
BuildRequires: gcc-c++ BuildRequires: gcc-c++
@ -675,6 +678,9 @@ popd
%endif %endif
%changelog %changelog
* Fri Jan 20 2017 Igor Gnatenko <ignatenko@redhat.com> - 17.0.0-0.rc1
- Update to 17.0.0-rc1
* Tue Jan 17 2017 Hans de Goede <hdegoede@redhat.com> - 13.0.3-3 * Tue Jan 17 2017 Hans de Goede <hdegoede@redhat.com> - 13.0.3-3
- Enable libglvnd support (rhbz#1413579) - Enable libglvnd support (rhbz#1413579)

View File

@ -1 +1 @@
SHA512 (mesa-13.0.3.tar.xz) = e94a60f7e3b2c64d7b44130ccac95fef8edb74ee1574125aa9ec8ceecb1819df26b0fb08369254aaee6cd6df4eecea814783351e604d4c39b0130746b15a3c1e SHA512 (mesa-17.0.0-rc1.tar.xz) = 9796b0386f1c7e37e5b61500faf3477cfb1a8950d023d1c81ae46d44745ff851da9564445e1658e54d085d209420bd3a423e4ed150666364b122b0d7e0914a89