xorg-server: Changes to 'debian-unstable'
Xext/panoramiXprocs.c | 4
Xext/saver.c | 2
Xext/shm.c | 17
Xi/exevents.c | 3
configure.ac | 28
debian/changelog | 8
debian/patches/os-treat-ssh-as-a-non-local-client.diff | 97
debian/patches/series | 2
debian/patches/upstream-fixes.diff | 2089 -----------------
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
65 files changed, 773 insertions(+), 2869 deletions(-)
New commits:
commit d61c7f31d336a8b55aa09623d6b44b3fd3320d55
Author: Timo Aaltonen <tjaalton@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 <tjaalton@debian.org> Wed, 20 Jul 2016 05:55:42 +0300
+ -- Timo Aaltonen <tjaalton@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 <tjaalton@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 <tjaalton@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 <ajax@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 <ajax@redhat.com>
- Signed-off-by: Michel Dänzer <michel.daenzer@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) {
-+ x_source += source->pDrawable->x;
-+ y_source += source->pDrawable->y;
-+ x_dest += dest->pDrawable->x;
-+ y_dest += dest->pDrawable->y;
-+ glamor_copy(source->pDrawable, dest->pDrawable, NULL,
-+ box, nbox, x_source - x_dest,
-+ y_source - y_dest, FALSE, FALSE, 0, NULL);
-+ ok = TRUE;
-+ goto out;
-+ }
-+
- /* XXX is it possible source mask have non-zero drawable.x/y? */
- if (source
- && ((!source->pDrawable
-diff --git a/glamor/glamor_spans.c b/glamor/glamor_spans.c
-index 89a9c51..5217d04 100644
---- a/glamor/glamor_spans.c
-+++ b/glamor/glamor_spans.c
-@@ -294,8 +294,7 @@ glamor_set_spans_gl(DrawablePtr drawable, GCPtr gc, char *src,
- BoxPtr box = glamor_pixmap_box_at(pixmap_priv, box_index);
- glamor_pixmap_fbo *fbo = glamor_pixmap_fbo_at(pixmap_priv, box_index);
-
-- glActiveTexture(GL_TEXTURE0);
-- glBindTexture(GL_TEXTURE_2D, fbo->tex);
-+ glamor_bind_texture(glamor_priv, GL_TEXTURE0, fbo, TRUE);
-
- s = src;
- for (n = 0; n < numPoints; n++) {
-diff --git a/glamor/glamor_transfer.c b/glamor/glamor_transfer.c
-index ed81195..d788d06 100644
---- a/glamor/glamor_transfer.c
-+++ b/glamor/glamor_transfer.c
-@@ -83,8 +83,7 @@ glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox,
- BoxPtr boxes = in_boxes;
- int nbox = in_nbox;
-
-- glActiveTexture(GL_TEXTURE0);
-- glBindTexture(GL_TEXTURE_2D, fbo->tex);
-+ glamor_bind_texture(glamor_priv, GL_TEXTURE0, fbo, TRUE);
Reply to: