Xext/panoramiXprocs.c | 4 Xext/saver.c | 2 Xext/shm.c | 17 Xi/exevents.c | 3 configure.ac | 28 debian/changelog | 22 debian/patches/glamor-disable-logic-ops-when-doing-compositing.diff | 57 - debian/patches/os-treat-ssh-as-a-non-local-client.diff | 97 -- debian/patches/series | 4 debian/xserver-xorg-core.NEWS | 14 dix/cursor.c | 23 dix/devices.c | 3 dix/enterleave.c | 20 dix/ptrveloc.c | 10 exa/exa_glyphs.c | 8 exa/exa_render.c | 3 glamor/glamor.c | 45 + glamor/glamor.h | 1 glamor/glamor_composite_glyphs.c | 5 glamor/glamor_compositerects.c | 18 glamor/glamor_copy.c | 8 glamor/glamor_dash.c | 3 glamor/glamor_egl.c | 11 glamor/glamor_fbo.c | 4 glamor/glamor_priv.h | 28 glamor/glamor_program.c | 8 glamor/glamor_render.c | 94 +- glamor/glamor_spans.c | 3 glamor/glamor_text.c | 13 glamor/glamor_transfer.c | 3 glamor/glamor_transform.c | 12 glamor/glamor_transform.h | 4 glx/glxext.c | 6 hw/kdrive/linux/keyboard.c | 441 ---------- hw/xfree86/common/xf86Config.c | 68 + hw/xfree86/common/xf86Configure.c | 2 hw/xfree86/common/xf86Init.c | 4 hw/xfree86/common/xf86Privstr.h | 1 hw/xfree86/drivers/modesetting/Makefile.am | 2 hw/xfree86/drivers/modesetting/driver.c | 85 + hw/xfree86/drivers/modesetting/drmmode_display.c | 99 +- hw/xfree86/drivers/modesetting/drmmode_display.h | 2 hw/xfree86/drivers/modesetting/present.c | 9 hw/xfree86/drivers/modesetting/sh3224.c | 140 +++ hw/xfree86/drivers/modesetting/sh3224.h | 7 hw/xfree86/int10/xf86x86emu.c | 2 hw/xfree86/man/xorg.conf.man | 4 hw/xfree86/modes/xf86Crtc.c | 3 hw/xfree86/os-support/linux/lnx_init.c | 10 hw/xfree86/x86emu/x86emu/regs.h | 8 hw/xquartz/bundle/Info.plist.cpp | 23 hw/xquartz/bundle/Makefile.am | 6 hw/xwayland/xwayland-cursor.c | 15 hw/xwayland/xwayland-glamor-xv.c | 2 hw/xwayland/xwayland-glamor.c | 3 hw/xwayland/xwayland-output.c | 17 hw/xwayland/xwayland-shm.c | 10 hw/xwayland/xwayland.h | 2 include/xkbsrv.h | 4 os/access.c | 44 present/present.c | 33 randr/rrprovider.c | 2 render/picture.h | 2 xkb/xkb.c | 5 xkb/xkbEvents.c | 2 xkb/xkbLEDs.c | 2 66 files changed, 801 insertions(+), 839 deletions(-)
New commits: commit ff1e68160300e54849fc30e4747d30fc8d75b9f0 Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Jul 20 08:24:29 2016 +0300 release to yak diff --git a/debian/changelog b/debian/changelog index b0dad8e..73cfddf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +xorg-server (2:1.18.4-1ubuntu1) yakkety; urgency=medium + + * Merge from debian. + * glamor-disable-logic-ops-when-doing-compositing.diff: Dropped, + upstream. + + -- Timo Aaltonen <tjaal...@debian.org> Wed, 20 Jul 2016 08:22:32 +0300 + xorg-server (2:1.18.4-1) unstable; urgency=medium * New upstream stable release. @@ -6,14 +14,6 @@ xorg-server (2:1.18.4-1) unstable; urgency=medium -- Timo Aaltonen <tjaal...@debian.org> Wed, 20 Jul 2016 06:00:21 +0300 -xorg-server (2:1.18.3-2ubuntu1) UNRELEASED; urgency=medium - - * Merge from debian. - * glamor-disable-logic-ops-when-doing-compositing.diff: Dropped, - included in upstream-fixes.diff. - - -- Timo Aaltonen <tjaal...@debian.org> Tue, 19 Jul 2016 09:52:09 +0300 - xorg-server (2:1.18.3-2) unstable; urgency=medium * Drop 08_xfree86_fix_ia64_inx_outx.diff from the tree, it wasn't commit d61c7f31d336a8b55aa09623d6b44b3fd3320d55 Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Jul 20 06:00:44 2016 +0300 release to unstable diff --git a/debian/changelog b/debian/changelog index cfd0a4a..26f41bf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,10 @@ -xorg-server (2:1.18.4-1) UNRELEASED; urgency=medium +xorg-server (2:1.18.4-1) unstable; urgency=medium * New upstream stable release. * os-treat-ssh-as-a-non-local-client.diff, upstream-fixes.diff: Dropped, upstream. - -- Timo Aaltonen <tjaal...@debian.org> Wed, 20 Jul 2016 05:55:42 +0300 + -- Timo Aaltonen <tjaal...@debian.org> Wed, 20 Jul 2016 06:00:21 +0300 xorg-server (2:1.18.3-2) unstable; urgency=medium commit 15dd24a2f379d779f2f9f72485d5d2ef54766916 Author: Timo Aaltonen <tjaal...@debian.org> Date: Wed Jul 20 06:00:05 2016 +0300 os-treat-ssh-as-a-non-local-client.diff, upstream-fixes.diff: Dropped, upstream. diff --git a/debian/changelog b/debian/changelog index aa12670..cfd0a4a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ xorg-server (2:1.18.4-1) UNRELEASED; urgency=medium * New upstream stable release. + * os-treat-ssh-as-a-non-local-client.diff, upstream-fixes.diff: + Dropped, upstream. -- Timo Aaltonen <tjaal...@debian.org> Wed, 20 Jul 2016 05:55:42 +0300 diff --git a/debian/patches/os-treat-ssh-as-a-non-local-client.diff b/debian/patches/os-treat-ssh-as-a-non-local-client.diff deleted file mode 100644 index 0b879bf..0000000 --- a/debian/patches/os-treat-ssh-as-a-non-local-client.diff +++ /dev/null @@ -1,97 +0,0 @@ -commit adefbaee499b9679c6cac21f52ec6545af2b36b5 -Author: Adam Jackson <a...@redhat.com> -Date: Mon Mar 28 18:11:09 2016 +0900 - - os: Treat ssh as a non-local client (v4) - - By the time we get to ComputeLocalClient, we've already done - NextAvailableClient → ReserveClientIds → DetermineClientCmd (assuming - we're built with #define CLIENTIDS), so we can look up the name of the - client process and refuse to treat ssh's X forwarding as if it were - local. - - v2: (Michel Dänzer) - * Only match "ssh" itself, not other executable names starting with - that prefix. - * Ignore executable path for the match. - v3: (Michel Dänzer) - * Use GetClientCmdName (Mark Kettenis) - * Perform check on Windows as well, but only ignore path on Cygwin - (Martin Peres, Emil Velikov, Jon Turney) - v4: (Michel Dänzer) - * Cut of any colon and whatever comes after it. (Adam Jackson) - * Add bugzilla reference. - - Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93261 - - Signed-off-by: Adam Jackson <a...@redhat.com> - Signed-off-by: Michel Dänzer <michel.daen...@amd.com> - -diff --git a/os/access.c b/os/access.c -index 8b2177f..58f95a9 100644 ---- a/os/access.c -+++ b/os/access.c -@@ -173,6 +173,10 @@ SOFTWARE. - - #endif /* WIN32 */ - -+#if !defined(WIN32) || defined(__CYGWIN__) -+#include <libgen.h> -+#endif -+ - #define X_INCLUDE_NETDB_H - #include <X11/Xos_r.h> - -@@ -1080,9 +1084,8 @@ ResetHosts(const char *display) - } - } - --/* Is client on the local host */ --Bool --ComputeLocalClient(ClientPtr client) -+static Bool -+xtransLocalClient(ClientPtr client) - { - int alen, family, notused; - Xtransaddr *from = NULL; -@@ -1115,6 +1118,40 @@ ComputeLocalClient(ClientPtr client) - return FALSE; - } - -+/* Is client on the local host */ -+Bool -+ComputeLocalClient(ClientPtr client) -+{ -+ const char *cmdname = GetClientCmdName(client); -+ -+ if (!xtransLocalClient(client)) -+ return FALSE; -+ -+ /* If the executable name is "ssh", assume that this client connection -+ * is forwarded from another host via SSH -+ */ -+ if (cmdname) { -+ char **cmd; -+ Bool ret; -+ -+ /* Cut off any colon and whatever comes after it, see -+ * https://lists.freedesktop.org/archives/xorg-devel/2015-December/048164.html -+ */ -+ cmd = xstrtokenize(cmdname, ":"); -+ -+#if !defined(WIN32) || defined(__CYGWIN__) -+ cmd[0] = basename(cmd[0]); -+#endif -+ -+ ret = strcmp(cmd[0], "ssh") != 0; -+ free(cmd); -+ -+ return ret; -+ } -+ -+ return TRUE; -+} -+ - /* - * Return the uid and all gids of a connected local client - * Allocates a LocalClientCredRec - caller must call FreeLocalClientCreds diff --git a/debian/patches/series b/debian/patches/series index ec71c11..55da92c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -5,5 +5,3 @@ 03_static-nettle.diff 05_Revert-Unload-submodules.diff 06_use-intel-only-on-pre-gen4.diff -os-treat-ssh-as-a-non-local-client.diff -upstream-fixes.diff diff --git a/debian/patches/upstream-fixes.diff b/debian/patches/upstream-fixes.diff deleted file mode 100644 index ea25501..0000000 --- a/debian/patches/upstream-fixes.diff +++ /dev/null @@ -1,2089 +0,0 @@ -diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c -index 9eb29bd..18f3ac7 100644 ---- a/Xext/panoramiXprocs.c -+++ b/Xext/panoramiXprocs.c -@@ -106,7 +106,7 @@ PanoramiXCreateWindow(ClientPtr client) - if ((Mask) stuff->mask & CWColormap) { - cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - result = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -@@ -210,7 +210,7 @@ PanoramiXChangeWindowAttributes(ClientPtr client) - if ((Mask) stuff->valueMask & CWColormap) { - cmap_offset = Ones((Mask) stuff->valueMask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - result = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -diff --git a/Xext/saver.c b/Xext/saver.c -index 0e20467..750b8b9 100644 ---- a/Xext/saver.c -+++ b/Xext/saver.c -@@ -1143,7 +1143,7 @@ ProcScreenSaverSetAttributes(ClientPtr client) - if ((Mask) stuff->mask & CWColormap) { - cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - status = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -diff --git a/Xi/exevents.c b/Xi/exevents.c -index e728310..52b91e8 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -1379,6 +1379,9 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, - if (!TouchResourceIsOwner(ti, listener->listener)) - return !Success; - -+ if (!ti->emulate_pointer) -+ return !Success; -+ - nevents = TouchConvertToPointerEvent(ev, &motion, &button); - BUG_RETURN_VAL(nevents == 0, BadValue); - -diff --git a/configure.ac b/configure.ac -index 77cf234..cfffcd8 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -555,17 +555,27 @@ AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name - [ APPLE_APPLICATION_NAME="${withval}" ], - [ APPLE_APPLICATION_NAME="X11" ]) - AC_SUBST([APPLE_APPLICATION_NAME]) --AC_ARG_WITH(launchd-id-prefix, AS_HELP_STRING([--with-launchd-id-prefix=PATH], [Deprecated: Use --with-bundle-id-prefix.]), -- [ BUNDLE_ID_PREFIX="${withval}" ], -- [ BUNDLE_ID_PREFIX="org.x" ]) --AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=PATH], [Prefix to use for bundle identifiers (default: org.x)]), -+AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=RDNS_PREFIX], [Prefix to use for bundle identifiers (default: org.x)]), - [ BUNDLE_ID_PREFIX="${withval}" ]) - AC_SUBST([BUNDLE_ID_PREFIX]) - AC_DEFINE_UNQUOTED(BUNDLE_ID_PREFIX, "$BUNDLE_ID_PREFIX", [Prefix to use for bundle identifiers]) -+m4_define(DEFAULT_BUNDLE_VERSION, m4_esyscmd([echo ]AC_PACKAGE_VERSION[ | cut -f1-3 -d. | tr -d '\n'])) -+AC_ARG_WITH(bundle-version, AS_HELP_STRING([--with-bundle-version=VERSION], [Version to use for X11.app's CFBundleVersion (default: ]DEFAULT_BUNDLE_VERSION[)]), -+ [ BUNDLE_VERSION="${withval}" ], -+ [ BUNDLE_VERSION="DEFAULT_BUNDLE_VERSION" ]) -+AC_SUBST([BUNDLE_VERSION]) -+AC_ARG_WITH(bundle-version-string, AS_HELP_STRING([--with-bundle-version-string=VERSION], [Version to use for X11.app's CFBundleShortVersionString (default: ]AC_PACKAGE_VERSION[)]), -+ [ BUNDLE_VERSION_STRING="${withval}" ], -+ [ BUNDLE_VERSION_STRING="${PACKAGE_VERSION}" ]) -+AC_SUBST([BUNDLE_VERSION_STRING]) - AC_ARG_ENABLE(sparkle,AS_HELP_STRING([--enable-sparkle], [Enable updating of X11.app using the Sparkle Framework (default: disabled)]), - [ XQUARTZ_SPARKLE="${enableval}" ], - [ XQUARTZ_SPARKLE="no" ]) - AC_SUBST([XQUARTZ_SPARKLE]) -+AC_ARG_WITH(sparkle-feed-url, AS_HELP_STRING([--with-sparkle-feed-url=URL], [URL for the Sparkle feed (default: https://www.xquartz.org/releases/sparkle/release.xml)]), -+ [ XQUARTZ_SPARKLE_FEED_URL="${withval}" ], -+ [ XQUARTZ_SPARKLE_FEED_URL="https://www.xquartz.org/releases/sparkle/release.xml" ]) -+AC_SUBST([XQUARTZ_SPARKLE_FEED_URL]) - AC_ARG_ENABLE(visibility, AS_HELP_STRING([--enable-visibility], [Enable symbol visibility (default: auto)]), - [SYMBOL_VISIBILITY=$enableval], - [SYMBOL_VISIBILITY=auto]) -@@ -880,7 +890,7 @@ if test "x$CONFIG_UDEV" = xyes; then - fi - SAVE_LIBS=$LIBS - SAVE_CFLAGS=$CFLAGS -- CFLAGS=$UDEV_CFLAGS -+ CFLAGS="$CFLAGS $UDEV_CFLAGS" - LIBS=$UDEV_LIBS - AC_CHECK_FUNCS([udev_monitor_filter_add_match_tag]) - AC_CHECK_FUNCS([udev_enumerate_add_match_tag]) -@@ -1293,7 +1303,7 @@ fi - - if test "x$DRI2" = xyes; then - save_CFLAGS=$CFLAGS -- CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS" -+ CFLAGS="$CFLAGS $GL_CFLAGS $LIBDRM_CFLAGS" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h> - #include <GL/internal/dri_interface.h> - #ifndef __DRI_DRI2 -diff --git a/dix/devices.c b/dix/devices.c -index 9b0c7d2..a532dcf 100644 ---- a/dix/devices.c -+++ b/dix/devices.c -@@ -1682,8 +1682,7 @@ ProcSetModifierMapping(ClientPtr client) - stuff->numKeyPerModifier); - if (rc == MappingFailed || rc == -1) - return BadValue; -- if (rc != Success && rc != MappingSuccess && rc != MappingFailed && -- rc != MappingBusy) -+ if (rc != MappingSuccess && rc != MappingFailed && rc != MappingBusy) - return rc; - - rep.success = rc; -diff --git a/dix/enterleave.c b/dix/enterleave.c -index f0b1572..1b341f2 100644 ---- a/dix/enterleave.c -+++ b/dix/enterleave.c -@@ -1446,19 +1446,25 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - - if ((to == NullWindow) || (to == PointerRootWin)) { - if ((from == NullWindow) || (from == PointerRootWin)) { -- if (from == PointerRootWin) -+ if (from == PointerRootWin) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, - GetCurrentRootWindow(dev), mode, - NotifyPointer); -+ } - /* Notify all the roots */ - for (i = 0; i < nscreens; i++) - DeviceFocusEvent(dev, XI_FocusOut, mode, out, - screenInfo.screens[i]->root); - } - else { -- if (IsParent(from, sprite->win)) -+ if (IsParent(from, sprite->win)) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, from, mode, - NotifyPointer); -+ } - DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from); - /* next call catches the root too, if the screen changed */ - DeviceFocusOutEvents(dev, from, NullWindow, mode, -@@ -1476,10 +1482,13 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - } - else { - if ((from == NullWindow) || (from == PointerRootWin)) { -- if (from == PointerRootWin) -+ if (from == PointerRootWin) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, - GetCurrentRootWindow(dev), mode, - NotifyPointer); -+ } - for (i = 0; i < nscreens; i++) - DeviceFocusEvent(dev, XI_FocusOut, mode, out, - screenInfo.screens[i]->root); -@@ -1506,9 +1515,12 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - if ((IsParent(from, sprite->win)) && - (sprite->win != from) && - (!IsParent(to, sprite->win)) && -- (!IsParent(sprite->win, to))) -+ (!IsParent(sprite->win, to))) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, from, mode, - NotifyPointer); -+ } - DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyInferior, from); - DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual); - DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyAncestor, to); -diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c -index e75300a..050c12a 100644 ---- a/dix/ptrveloc.c -+++ b/dix/ptrveloc.c -@@ -134,13 +134,19 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev, - scheme = *protoScheme; - vel = calloc(1, sizeof(DeviceVelocityRec)); - schemeData = calloc(1, sizeof(PredictableAccelSchemeRec)); -- if (!vel || !schemeData) -+ if (!vel || !schemeData) { -+ free(vel); -+ free(schemeData); - return FALSE; -+ } - InitVelocityData(vel); - schemeData->vel = vel; - scheme.accelData = schemeData; -- if (!InitializePredictableAccelerationProperties(dev, vel, schemeData)) -+ if (!InitializePredictableAccelerationProperties(dev, vel, schemeData)) { -+ free(vel); -+ free(schemeData); - return FALSE; -+ } - /* all fine, assign scheme to device */ - dev->valuator->accelScheme = scheme; - return TRUE; -diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c -index cf21ea9..192a643 100644 ---- a/exa/exa_glyphs.c -+++ b/exa/exa_glyphs.c -@@ -618,9 +618,9 @@ exaGlyphsToMask(PicturePtr pMask, ExaGlyphBufferPtr buffer) - } - - static void --exaGlyphsToDst(PicturePtr pSrc, PicturePtr pDst, ExaGlyphBufferPtr buffer) -+exaGlyphsToDst(CARD8 op, PicturePtr pSrc, PicturePtr pDst, ExaGlyphBufferPtr buffer) - { -- exaCompositeRects(PictOpOver, pSrc, buffer->mask, pDst, buffer->count, -+ exaCompositeRects(op, pSrc, buffer->mask, pDst, buffer->count, - buffer->rects); - - buffer->count = 0; -@@ -801,7 +801,7 @@ exaGlyphs(CARD8 op, - 0, 0, x - glyph->info.x, - y - glyph->info.y) - == ExaGlyphNeedFlush) { -- exaGlyphsToDst(pSrc, pDst, &buffer); -+ exaGlyphsToDst(op, pSrc, pDst, &buffer); - exaBufferGlyph(pScreen, &buffer, glyph, pSrc, pDst, - xSrc + (x - glyph->info.x) - first_xOff, - ySrc + (y - glyph->info.y) - first_yOff, -@@ -821,7 +821,7 @@ exaGlyphs(CARD8 op, - if (maskFormat) - exaGlyphsToMask(pMask, &buffer); - else -- exaGlyphsToDst(pSrc, pDst, &buffer); -+ exaGlyphsToDst(op, pSrc, pDst, &buffer); - } - - if (maskFormat) { -diff --git a/exa/exa_render.c b/exa/exa_render.c -index fc3ddea..b24bec0 100644 ---- a/exa/exa_render.c -+++ b/exa/exa_render.c -@@ -1141,7 +1141,8 @@ exaTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst, - - exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST); - for (; ntrap; ntrap--, traps++) -- (*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1); -+ if (xTrapezoidValid(traps)) -+ (*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1); - exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST); - - xRel = bounds.x1 + xSrc - xDst; -diff --git a/glamor/glamor.c b/glamor/glamor.c -index 9c6a0d1..0cb73c4 100644 ---- a/glamor/glamor.c -+++ b/glamor/glamor.c -@@ -140,6 +140,42 @@ glamor_get_pixmap_texture(PixmapPtr pixmap) - return pixmap_priv->fbo->tex; - } - -+void -+glamor_bind_texture(glamor_screen_private *glamor_priv, GLenum texture, -+ glamor_pixmap_fbo *fbo, Bool destination_red) -+{ -+ glActiveTexture(texture); -+ glBindTexture(GL_TEXTURE_2D, fbo->tex); -+ -+ /* If we're pulling data from a GL_RED texture, then whether we -+ * want to make it an A,0,0,0 result or a 0,0,0,R result depends -+ * on whether the destination is also a GL_RED texture. -+ * -+ * For GL_RED destinations, we need to leave the bits in the R -+ * channel. For all other destinations, we need to clear out the R -+ * channel so that it returns zero for R, G and B. -+ * -+ * Note that we're leaving the SWIZZLE_A value alone; for GL_RED -+ * destinations, that means we'll actually be returning R,0,0,R, -+ * but it doesn't matter as the bits in the alpha channel aren't -+ * going anywhere. -+ */ -+ -+ /* Is the operand a GL_RED fbo? -+ */ -+ -+ if (glamor_fbo_red_is_alpha(glamor_priv, fbo)) { -+ -+ /* If destination is also GL_RED, then preserve the bits in -+ * the R channel */ -+ -+ if (destination_red) -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); -+ else -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ZERO); -+ } -+} -+ - PixmapPtr - glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, - unsigned int usage) -@@ -816,3 +852,12 @@ glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size) - } - return -1; - } -+ -+void -+glamor_finish(ScreenPtr screen) -+{ -+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); -+ -+ glamor_make_current(glamor_priv); -+ glFinish(); -+} -diff --git a/glamor/glamor.h b/glamor/glamor.h -index 0aa6d56..250dc83 100644 ---- a/glamor/glamor.h -+++ b/glamor/glamor.h -@@ -342,6 +342,7 @@ extern _X_EXPORT void glamor_destroy_gc(GCPtr gc); - extern Bool _X_EXPORT glamor_change_window_attributes(WindowPtr pWin, unsigned long mask); - extern void _X_EXPORT glamor_copy_window(WindowPtr window, DDXPointRec old_origin, RegionPtr src_region); - -+extern _X_EXPORT void glamor_finish(ScreenPtr screen); - #define HAS_GLAMOR_TEXT 1 - - #ifdef GLAMOR_FOR_XORG -diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c -index f51ff6d..cc0aa6f 100644 ---- a/glamor/glamor_composite_glyphs.c -+++ b/glamor/glamor_composite_glyphs.c -@@ -246,8 +246,7 @@ glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst, - glamor_put_vbo_space(drawable->pScreen); - - glEnable(GL_SCISSOR_TEST); -- glActiveTexture(GL_TEXTURE1); -- glBindTexture(GL_TEXTURE_2D, atlas_fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE1, atlas_fbo, FALSE); - - for (;;) { - if (!glamor_use_program_render(prog, op, src, dst)) -@@ -558,7 +557,7 @@ glamor_free_glyph_atlas(struct glamor_glyph_atlas *atlas) - if (!atlas) - return; - if (atlas->atlas) -- FreePicture(atlas->atlas, 0); -+ (*atlas->atlas->drawable.pScreen->DestroyPixmap)(atlas->atlas); - free (atlas); - } - -diff --git a/glamor/glamor_compositerects.c b/glamor/glamor_compositerects.c -index 885a6c0..199e627 100644 ---- a/glamor/glamor_compositerects.c -+++ b/glamor/glamor_compositerects.c -@@ -107,7 +107,6 @@ glamor_composite_rectangles(CARD8 op, - struct glamor_pixmap_private *priv; - pixman_region16_t region; - pixman_box16_t *boxes; -- int dst_x, dst_y; - int num_boxes; - PicturePtr source = NULL; - Bool need_free_region = FALSE; -@@ -225,17 +224,18 @@ glamor_composite_rectangles(CARD8 op, - RegionExtents(®ion)->x2, RegionExtents(®ion)->y2, - RegionNumRects(®ion)); - -- glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y); -- pixman_region_translate(®ion, dst_x, dst_y); -- -- DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n", -- __FUNCTION__, dst_x, dst_y, -- RegionExtents(®ion)->x1, RegionExtents(®ion)->y1, -- RegionExtents(®ion)->x2, RegionExtents(®ion)->y2); -- - boxes = pixman_region_rectangles(®ion, &num_boxes); - if (op == PictOpSrc || op == PictOpClear) { - CARD32 pixel; -+ int dst_x, dst_y; -+ -+ glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y); -+ pixman_region_translate(®ion, dst_x, dst_y); -+ -+ DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n", -+ __FUNCTION__, dst_x, dst_y, -+ RegionExtents(®ion)->x1, RegionExtents(®ion)->y1, -+ RegionExtents(®ion)->x2, RegionExtents(®ion)->y2); - - if (op == PictOpClear) - pixel = 0; -diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c -index 5fed89f..3501a0d 100644 ---- a/glamor/glamor_copy.c -+++ b/glamor/glamor_copy.c -@@ -38,8 +38,8 @@ use_copyarea(PixmapPtr dst, GCPtr gc, glamor_program *prog, void *arg) - struct copy_args *args = arg; - glamor_pixmap_fbo *src = args->src; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, src->tex); -+ glamor_bind_texture(glamor_get_screen_private(dst->drawable.pScreen), -+ GL_TEXTURE0, src, TRUE); - - glUniform2f(prog->fill_offset_uniform, args->dx, args->dy); - glUniform2f(prog->fill_size_inv_uniform, 1.0f/src->width, 1.0f/src->height); -@@ -67,8 +67,8 @@ use_copyplane(PixmapPtr dst, GCPtr gc, glamor_program *prog, void *arg) - struct copy_args *args = arg; - glamor_pixmap_fbo *src = args->src; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, src->tex); -+ glamor_bind_texture(glamor_get_screen_private(dst->drawable.pScreen), -+ GL_TEXTURE0, src, TRUE); - - glUniform2f(prog->fill_offset_uniform, args->dx, args->dy); - glUniform2f(prog->fill_size_inv_uniform, 1.0f/src->width, 1.0f/src->height); -diff --git a/glamor/glamor_dash.c b/glamor/glamor_dash.c -index a6a11c1..3c19dba 100644 ---- a/glamor/glamor_dash.c -+++ b/glamor/glamor_dash.c -@@ -188,8 +188,7 @@ glamor_dash_setup(DrawablePtr drawable, GCPtr gc) - - /* Set the dash pattern as texture 1 */ - -- glActiveTexture(GL_TEXTURE1); -- glBindTexture(GL_TEXTURE_2D, dash_priv->fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE1, dash_priv->fbo, FALSE); - glUniform1i(prog->dash_uniform, 1); - glUniform1f(prog->dash_length_uniform, dash_pixmap->drawable.width); - -diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c -index 80a97f7..5aacbed 100644 ---- a/glamor/glamor_egl.c -+++ b/glamor/glamor_egl.c -@@ -823,11 +823,6 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) - - glamor_egl->has_gem = glamor_egl_check_has_gem(fd); - --#ifndef GLAMOR_GLES2 -- eglBindAPI(EGL_OPENGL_API); --#else -- eglBindAPI(EGL_OPENGL_ES_API); --#endif - if (!eglInitialize - (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n"); -@@ -835,6 +830,12 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) - goto error; - } - -+#ifndef GLAMOR_GLES2 -+ eglBindAPI(EGL_OPENGL_API); -+#else -+ eglBindAPI(EGL_OPENGL_ES_API); -+#endif -+ - version = eglQueryString(glamor_egl->display, EGL_VERSION); - xf86Msg(X_INFO, "%s: EGL version %s:\n", glamor_name, version); - -diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c -index c6ba095..5bfffe5 100644 ---- a/glamor/glamor_fbo.c -+++ b/glamor/glamor_fbo.c -@@ -340,10 +340,8 @@ _glamor_create_tex(glamor_screen_private *glamor_priv, - glBindTexture(GL_TEXTURE_2D, tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -- if (format == glamor_priv->one_channel_format && format == GL_RED) { -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ZERO); -+ if (format == glamor_priv->one_channel_format && format == GL_RED) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED); -- } - glamor_priv->suppress_gl_out_of_memory_logging = true; - glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, - format, GL_UNSIGNED_BYTE, NULL); -diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h -index a70f10e..9d40397 100644 ---- a/glamor/glamor_priv.h -+++ b/glamor/glamor_priv.h -@@ -593,6 +593,34 @@ void glamor_fini_pixmap_fbo(ScreenPtr screen); - Bool glamor_pixmap_fbo_fixup(ScreenPtr screen, PixmapPtr pixmap); - void glamor_fbo_expire(glamor_screen_private *glamor_priv); - -+/* Return whether 'picture' is alpha-only */ -+static inline Bool glamor_picture_is_alpha(PicturePtr picture) -+{ -+ return picture->format == PICT_a1 || picture->format == PICT_a8; -+} -+ -+/* Return whether 'fbo' is storing alpha bits in the red channel */ -+static inline Bool -+glamor_fbo_red_is_alpha(glamor_screen_private *glamor_priv, glamor_pixmap_fbo *fbo) -+{ -+ /* True when the format is GL_RED (that can only happen when our one channel format is GL_RED */ -+ return fbo->format == GL_RED; -+} -+ -+/* Return whether 'picture' is storing alpha bits in the red channel */ -+static inline Bool -+glamor_picture_red_is_alpha(PicturePtr picture) -+{ -+ /* True when the picture is alpha only and the screen is using GL_RED for alpha pictures */ -+ return glamor_picture_is_alpha(picture) && -+ glamor_get_screen_private(picture->pDrawable->pScreen)->one_channel_format == GL_RED; -+} -+ -+void glamor_bind_texture(glamor_screen_private *glamor_priv, -+ GLenum texture, -+ glamor_pixmap_fbo *fbo, -+ Bool destination_red); -+ - glamor_pixmap_fbo *glamor_create_fbo_array(glamor_screen_private *glamor_priv, - int w, int h, GLenum format, - int flag, int block_w, int block_h, -diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c -index 0a94de6..dec116c 100644 ---- a/glamor/glamor_program.c -+++ b/glamor/glamor_program.c -@@ -445,6 +445,7 @@ static struct blendinfo composite_op_info[] = { - static void - glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst) - { -+ glamor_screen_private *glamor_priv = glamor_get_screen_private(dst->pDrawable->pScreen); - GLenum src_blend, dst_blend; - struct blendinfo *op_info; - -@@ -459,6 +460,9 @@ glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst) - break; - } - -+ if (glamor_priv->gl_flavor != GLAMOR_GL_ES2) -+ glDisable(GL_COLOR_LOGIC_OP); -+ - if (op == PictOpSrc) - return; - -@@ -527,6 +531,7 @@ use_source_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *pro - glamor_set_blend(op, prog->alpha, dst); - - return glamor_set_texture((PixmapPtr) src->pDrawable, -+ glamor_picture_red_is_alpha(dst), - 0, 0, - prog->fill_offset_uniform, - prog->fill_size_inv_uniform); -@@ -545,7 +550,8 @@ use_source_1x1_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program - { - glamor_set_blend(op, prog->alpha, dst); - -- return glamor_set_texture_pixmap((PixmapPtr) src->pDrawable); -+ return glamor_set_texture_pixmap((PixmapPtr) src->pDrawable, -+ glamor_picture_red_is_alpha(dst)); - } - - static const glamor_facet glamor_source_1x1_picture = { -diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c -index 73ac831..d70316d 100644 ---- a/glamor/glamor_render.c -+++ b/glamor/glamor_render.c -@@ -105,7 +105,7 @@ glamor_create_composite_fs(struct shader_key *key) - /* The texture and the pixmap size is not match eaxctly, so can't sample it directly. - * rel_sampler will recalculate the texture coords.*/ - const char *rel_sampler = -- " vec4 rel_sampler(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" -+ " vec4 rel_sampler_rgba(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" - "{\n" - " if (repeat >= RepeatFix) {\n" - " tex = rel_tex_coord(tex, wh, repeat);\n" -@@ -117,6 +117,19 @@ glamor_create_composite_fs(struct shader_key *key) - " }\n" - " }\n" - " return texture2D(tex_image, tex);\n" -+ "}\n" -+ " vec4 rel_sampler_rgbx(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" -+ "{\n" -+ " if (repeat >= RepeatFix) {\n" -+ " tex = rel_tex_coord(tex, wh, repeat);\n" -+ " if (repeat == RepeatFix + RepeatNone) {\n" -+ " if (tex.x < 0.0 || tex.x >= 1.0 || \n" -+ " tex.y < 0.0 || tex.y >= 1.0)\n" -+ " return vec4(0.0, 0.0, 0.0, 0.0);\n" -+ " tex = (fract(tex) / wh.xy);\n" -+ " }\n" -+ " }\n" -+ " return vec4(texture2D(tex_image, tex).rgb, 1.0);\n" - "}\n"; - - const char *source_solid_fetch = -@@ -131,8 +144,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 source_wh;" - "vec4 get_source()\n" - "{\n" -- " return rel_sampler(source_sampler, source_texture,\n" -- " source_wh, source_repeat_mode);\n" -+ " return rel_sampler_rgba(source_sampler, source_texture,\n" -+ " source_wh, source_repeat_mode);\n" - "}\n"; - const char *source_pixmap_fetch = - "varying vec2 source_texture;\n" -@@ -140,9 +153,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 source_wh;\n" - "vec4 get_source()\n" - "{\n" -- " return vec4(rel_sampler(source_sampler, source_texture,\n" -- " source_wh, source_repeat_mode).rgb,\n" -- " 1.0);\n" -+ " return rel_sampler_rgbx(source_sampler, source_texture,\n" -+ " source_wh, source_repeat_mode);\n" - "}\n"; - const char *mask_none = - "vec4 get_mask()\n" -@@ -161,8 +173,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 mask_wh;\n" - "vec4 get_mask()\n" - "{\n" -- " return rel_sampler(mask_sampler, mask_texture,\n" -- " mask_wh, mask_repeat_mode);\n" -+ " return rel_sampler_rgba(mask_sampler, mask_texture,\n" -+ " mask_wh, mask_repeat_mode);\n" - "}\n"; - const char *mask_pixmap_fetch = - "varying vec2 mask_texture;\n" -@@ -170,8 +182,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 mask_wh;\n" - "vec4 get_mask()\n" - "{\n" -- " return vec4(rel_sampler(mask_sampler, mask_texture,\n" -- " mask_wh, mask_repeat_mode).rgb, 1.0);\n" -+ " return rel_sampler_rgbx(mask_sampler, mask_texture,\n" -+ " mask_wh, mask_repeat_mode);\n" - "}\n"; - - const char *dest_swizzle_default = -@@ -500,15 +512,24 @@ static void - glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, - PicturePtr picture, - PixmapPtr pixmap, -- GLuint wh_location, GLuint repeat_location) -+ GLuint wh_location, GLuint repeat_location, -+ glamor_pixmap_private *dest_priv) - { - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); -+ glamor_pixmap_fbo *fbo = pixmap_priv->fbo; - float wh[4]; - int repeat_type; - - glamor_make_current(glamor_priv); -- glActiveTexture(GL_TEXTURE0 + unit); -- glBindTexture(GL_TEXTURE_2D, pixmap_priv->fbo->tex); -+ -+ /* The red channel swizzling doesn't depend on whether we're using -+ * 'fbo' as source or mask as we must have the same answer in case -+ * the same fbo is being used for both. That means the mask -+ * channel will sometimes get red bits in the R channel, and -+ * sometimes get zero bits in the R channel, which is harmless. -+ */ -+ glamor_bind_texture(glamor_priv, GL_TEXTURE0 + unit, fbo, -+ glamor_fbo_red_is_alpha(glamor_priv, dest_priv->fbo)); - repeat_type = picture->repeatType; - switch (picture->repeatType) { - case RepeatNone: -@@ -557,8 +578,8 @@ glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, - * - **/ - if (glamor_pixmap_priv_is_large(pixmap_priv) || -- (glamor_priv->gl_flavor == GLAMOR_GL_ES2 && repeat_type == RepeatNone && -- picture->transform)) { -+ ((!PICT_FORMAT_A(picture->format) || glamor_priv->gl_flavor == GLAMOR_GL_ES2) && -+ repeat_type == RepeatNone && picture->transform)) { - glamor_pixmap_fbo_fix_wh_ratio(wh, pixmap, pixmap_priv); - glUniform4fv(wh_location, 1, wh); - -@@ -1068,7 +1089,8 @@ glamor_composite_set_shader_blend(glamor_screen_private *glamor_priv, - glamor_set_composite_texture(glamor_priv, 0, - shader->source, - shader->source_pixmap, shader->source_wh, -- shader->source_repeat_mode); -+ shader->source_repeat_mode, -+ dest_priv); - } - - if (key->mask != SHADER_MASK_NONE) { -@@ -1080,10 +1102,14 @@ glamor_composite_set_shader_blend(glamor_screen_private *glamor_priv, - glamor_set_composite_texture(glamor_priv, 1, - shader->mask, - shader->mask_pixmap, shader->mask_wh, -- shader->mask_repeat_mode); -+ shader->mask_repeat_mode, -+ dest_priv); - } - } - -+ if (glamor_priv->gl_flavor != GLAMOR_GL_ES2) -+ glDisable(GL_COLOR_LOGIC_OP); -+ - if (op_info->source_blend == GL_ONE && op_info->dest_blend == GL_ZERO) { - glDisable(GL_BLEND); - } -@@ -1144,12 +1170,12 @@ glamor_composite_with_shader(CARD8 op, - } - } - -+ glamor_make_current(glamor_priv); -+ - glamor_set_destination_pixmap_priv_nc(glamor_priv, dest_pixmap, dest_pixmap_priv); - glamor_composite_set_shader_blend(glamor_priv, dest_pixmap_priv, &key, shader, &op_info); - glamor_set_alu(screen, GXcopy); - -- glamor_make_current(glamor_priv); -- - glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID; - glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE && - key.mask != SHADER_MASK_SOLID); -@@ -1392,6 +1418,36 @@ glamor_composite_clipped_region(CARD8 op, - DEBUGF("clipped (%d %d) (%d %d) (%d %d) width %d height %d \n", - x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height); - -+ /* Is the composite operation equivalent to a copy? */ -+ if (!mask && !source->alphaMap && !dest->alphaMap -+ && source->pDrawable && !source->transform -+ && ((op == PictOpSrc -+ && (source->format == dest->format -+ || (PICT_FORMAT_COLOR(dest->format) -+ && PICT_FORMAT_COLOR(source->format) -+ && dest->format == PICT_FORMAT(PICT_FORMAT_BPP(source->format), -+ PICT_FORMAT_TYPE(source->format), -+ 0, -+ PICT_FORMAT_R(source->format), -+ PICT_FORMAT_G(source->format), -+ PICT_FORMAT_B(source->format))))) -+ || (op == PictOpOver -+ && source->format == dest->format -+ && !PICT_FORMAT_A(source->format))) -+ && x_source >= 0 && y_source >= 0 -+ && (x_source + width) <= source->pDrawable->width -+ && (y_source + height) <= source->pDrawable->height) {