ChangeLog | 166 +++++++++++++++++++++++++++++ configure.ac | 2 debian/changelog | 11 + debian/control | 7 - debian/xsfbs/xsfbs.sh | 12 -- dix/events.c | 6 - glx/glxdri2.c | 82 +++++++++++++- hw/vfb/InitOutput.c | 30 ----- hw/xfree86/common/xf86pciBus.c | 10 - hw/xfree86/ddc/edid.h | 2 hw/xfree86/ddc/interpret_edid.c | 7 - hw/xfree86/dri2/dri2.c | 217 ++++++++++++++++++++++++++++++++++----- hw/xfree86/dri2/dri2.h | 46 +++++++- hw/xfree86/dri2/dri2ext.c | 96 +++++++++++++---- hw/xfree86/modes/xf86EdidModes.c | 87 +++++++++++++++ 15 files changed, 664 insertions(+), 117 deletions(-)
New commits: commit 6cbcf591b89e05c979c80f615b34153fe0bac0b8 Author: Julien Cristau <jcris...@debian.org> Date: Tue Jun 23 19:52:15 2009 +0200 Prepare changelog for upload diff --git a/debian/changelog b/debian/changelog index 3432eca..35a6001 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low +xorg-server (2:1.6.1.901-3) unstable; urgency=low [ Julien Cristau ] * xvfb-run: don't pass the magic cookie to xauth on the command line @@ -38,7 +38,7 @@ xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low [ David Nusinow ] * Add README.source - -- David Nusinow <dnusi...@debian.org> Mon, 25 May 2009 21:21:55 -0400 + -- Julien Cristau <jcris...@debian.org> Tue, 23 Jun 2009 19:52:10 +0200 xorg-server (2:1.6.1.901-2) unstable; urgency=low commit ba3a35397b603ce3398939ba79c2ccd64cfb060a Author: Julien Cristau <jcris...@debian.org> Date: Tue Jun 23 19:07:02 2009 +0200 Bump build-dep on libselinux1-dev to 2.0.80 for avc_netlink_acquire_fd. diff --git a/debian/changelog b/debian/changelog index 49297b4..3432eca 100644 --- a/debian/changelog +++ b/debian/changelog @@ -33,6 +33,7 @@ xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low point. * Pull from upstream server-1.6-branch as of June 23rd (commit dbac41b). * Bump build-dep on dri2proto to 2.1 for new protocol. + * Bump build-dep on libselinux1-dev to 2.0.80 for avc_netlink_acquire_fd. [ David Nusinow ] * Add README.source diff --git a/debian/control b/debian/control index 6c21335..0e0b9ab 100644 --- a/debian/control +++ b/debian/control @@ -49,7 +49,7 @@ Build-Depends: libgcrypt-dev, libdbus-1-dev [!hurd-i386], libhal-dev [!hurd-i386], - libselinux1-dev [alpha amd64 arm armeb armel hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], + libselinux1-dev (>= 2.0.80) [alpha amd64 arm armeb armel hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], libaudit-dev [alpha amd64 arm armeb armel hppa i386 ia64 lpia m32r m68k mips mipsel powerpc ppc64 s390 s390x sh3 sh3eb sh4 sh4eb sparc], x11proto-xf86dri-dev, libdrm-dev (>= 2.4.3) [!hurd-i386], commit 5adbafd20521c73fa82963ce8279a81c92bfc945 Author: Julien Cristau <jcris...@debian.org> Date: Tue Jun 23 19:02:25 2009 +0200 Update changelogs and bump dri2proto build-dep diff --git a/ChangeLog b/ChangeLog index 357cf46..ccf2e0f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,169 @@ +commit dbac41b624e4aa86a6a184b7ebb52bfdd367bbf0 +Author: Adam Jackson <a...@redhat.com> +Date: Fri Jun 19 12:42:07 2009 -0400 + + pci: Dump vendor/devices ids in the printed device list + (cherry picked from commit eb35402d0a5290e8a73d7d1e92f173294c364cc2) + +commit 6be19e8f43086fb4b7fb30a47b89b5f3eed798ef +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Wed Apr 8 14:54:30 2009 -0700 + + Use a #define instead of a magic number + + The number of buffers is likely to change in the future, so having + this as a define is the right way to go. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit 03aebed519986c4dd03e02b3b3d4af1f64595ca7) + +commit 540d5b87a4e24d85ec46620dfedd7bd7979180ea +Author: Jerome Glisse <gli...@freedesktop.org> +Date: Mon May 11 22:52:46 2009 +0200 + + DRI2: update DRI2 private drawable width & height according to X drawable + (cherry picked from commit f250eea2e90fc50bec5214c2f41132b95edc2c46) + +commit ec9f1ae32474bc0507a3c66e63bdf2835d467a34 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Mon Apr 27 15:11:10 2009 -0700 + + DRI2: Force allocation of real-front buffer for non-windows as well + + For redirected rendering we end up with pixmaps (which the app thinks are + windows) that are double buffered. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + Tested-by: Pierre Willenbrock <pie...@pirsoft.de> + (cherry picked from commit 0d9d3f3e361f769822caedccf4c2a58cc9930ecc) + +commit 4fad615d689c61c6c3a000295a1fa755359737cb +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Fri Apr 24 12:49:19 2009 -0700 + + DRI2: Implement protocol for DRI2GetBuffersWithFormat + + This change implements the protocol for DRI2GetBuffersWithFormat, but + the bulk of the differences are the changes to the extension / driver + interface to make this function work. The old CreateBuffers and + DeleteBuffers routines are replaced with CreateBuffer and DeleteBuffer + (both singular). + + This allows drivers to allocate buffers for a drawable one at a time. + As a result, 3D drivers can now allocate the (fake) front-buffer for a + window only when it is needed. Since 3D drivers only ask for the + front-buffer on demand, the real front-buffer is always created. This + allows CopyRegion impelemenations of SwapBuffers to continue working. + As with previous version of this code, if the client asks for the + front-buffer for a window, we instead give it the fake front-buffer. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + Reviewed-by: Kristian Høgsberg <k...@redhat.com> + +commit 98c3c21735197fbd2c8166c9bdabf055e14c9009 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Fri Apr 24 12:09:21 2009 -0700 + + DRI2: Add interface for drivers to query DRI2 extension version + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit 28ddfc88d8d547941c7f4713db527a3c2f9ec35a) + +commit 4cb4c210c365fd40ad314e0707eb38811f240a12 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Thu Apr 16 12:10:34 2009 -0700 + + DRI2: Add missing front-buffer flush callback. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit d1e916d29be8b470cbc8cadcf6e83991fdbc5a9f) + +commit aa13faef2b1464f808e04de9826c6b8b8b91ae89 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Wed Apr 15 11:13:48 2009 -0700 + + DRI2: Don't leave empty entries in private->buffers + + This should fix bug #21130. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit de1e43181bd670877b994db221ad8a04b5d63324) + +commit d7277296ed7aea7bd41b3489d4ceef750d400206 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Thu Apr 9 14:38:24 2009 -0700 + + DRI2: Synchronize the contents of the real and fake front-buffers + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit 567cf67959b30432ae30f4851ec17b3a375ab838) + +commit 73b786f7e7f46d40bf3b039538540c2e25f45947 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Thu Apr 9 14:31:01 2009 -0700 + + DRI2: Do not send the real front buffer of a window to the client + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit f1a995d1496d73741731e32f475097c44a8da972) + +commit 32d250a881341ece8a1f1d78359adc1b265b5174 +Author: Ian Romanick <ian.d.roman...@intel.com> +Date: Wed Apr 8 15:44:34 2009 -0700 + + DRI2: Add fake front-buffer to request list for windows + + If a front-buffer is requested for a window, add the fake front-buffer + to the list of requested buffers. + + Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> + (cherry picked from commit aa2928325fe51d94a636dde9c090e8f54a311a12) + +commit db61eff891675aeaf2466c3529424de4621005dc +Author: Adam Jackson <a...@redhat.com> +Date: Fri May 22 12:01:55 2009 -0400 + + EDID: Add modes from Established Timings III descriptor to mode pool + + EDID 1.4, section 3.10.3.9 + (cherry picked from commit 99e22b86c5f1a3653f3caaf01368a777d2b208d0) + +commit ebca49e0fedcc1c536f1dee7c58cae9903e74fa2 +Author: Adam Jackson <a...@redhat.com> +Date: Thu May 21 10:20:48 2009 -0400 + + EDID: Be more cautious about finding vendor blocks. + + Many old monitors zero-fill the detailed descriptors, so check for that + to avoid a useless warning like: + + (WW) RADEON(0): Unknown vendor-specific block 0 + (cherry picked from commit a2c5ee36b21c2ee5c0468f1b251e74c1412dbecb) + +commit c643d24cdeaade8d7839691a3113c4d2d17be61e +Author: Adam Jackson <a...@redhat.com> +Date: Fri May 29 18:07:48 2009 -0400 + + vfb: Fix depth setup. + + Initialize the depth corresponding to the root window before the + pixmap-only depths. Otherwise you end up with the root window depth in + the depth list twice, which is mildly confusing for clients and + catastrophically confusing for PanoramiXConsolidate(). + (cherry picked from commit 45530d16097459a756696e255ab4e72d6e51fbc4) + +commit 5cd5a01259ba349f1868ca4af04207cf120d69e4 +Author: Eamon Walsh <ewa...@tycho.nsa.gov> +Date: Tue May 19 19:30:33 2009 -0400 + + xace: Fix a bad device access hook call. + + Add a proper access mode, and reverse the logic of the return value. + Zero ("Success") is returned on success from the hook calls. + + Signed-off-by: Eamon Walsh <ewa...@tycho.nsa.gov> + (cherry picked from commit 3cea176d5abcb0f14eefbdcbe17fed0847524dd4) + commit a9f85dcefbadfe44d8c58ad08430aaadb8c59d34 Author: Eamon Walsh <ewa...@tycho.nsa.gov> Date: Mon May 11 15:27:46 2009 -0400 diff --git a/debian/changelog b/debian/changelog index 3bf45ae..49297b4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -31,6 +31,8 @@ xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low * Bump Standards-Version to 3.8.2 now that we have README.source. * Drop Build-Conflicts on xlibs-static-dev; it's only in oldstable at this point. + * Pull from upstream server-1.6-branch as of June 23rd (commit dbac41b). + * Bump build-dep on dri2proto to 2.1 for new protocol. [ David Nusinow ] * Add README.source diff --git a/debian/control b/debian/control index b104011..6c21335 100644 --- a/debian/control +++ b/debian/control @@ -39,7 +39,7 @@ Build-Depends: xtrans-dev (>= 1.2.2), libxau-dev (>= 1:0.99.1), x11proto-input-dev (>= 1.5), - x11proto-dri2-dev (>= 1.99.3), + x11proto-dri2-dev (>= 2.1), libxdmcp-dev (>= 1:0.99.1), libxfont-dev, libfontenc-dev, commit 2b08d75164d92dd95d2303275ed9b7e23a78256e Author: Julien Cristau <jcris...@debian.org> Date: Tue Jun 23 18:55:56 2009 +0200 Drop Build-Conflicts on xlibs-static-dev It's only in oldstable at this point. diff --git a/debian/changelog b/debian/changelog index 533e9d6..3bf45ae 100644 --- a/debian/changelog +++ b/debian/changelog @@ -29,6 +29,8 @@ xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low fixed and cursor fonts, which are the only required ones. Keep xfonts-* packages in Suggests for xserver-xorg-core. * Bump Standards-Version to 3.8.2 now that we have README.source. + * Drop Build-Conflicts on xlibs-static-dev; it's only in oldstable at this + point. [ David Nusinow ] * Add README.source diff --git a/debian/control b/debian/control index b337bcf..b104011 100644 --- a/debian/control +++ b/debian/control @@ -72,7 +72,6 @@ Build-Depends: libxfixes-dev (>= 1:3.0.0), libxv-dev, libxinerama-dev -Build-Conflicts: xlibs-static-dev Standards-Version: 3.8.2 Vcs-Git: git://git.debian.org/git/pkg-xorg/xserver/xorg-server Vcs-Browser: http://git.debian.org/?p=pkg-xorg/xserver/xorg-server.git commit 08526e686076cd2e3b4d5d029ca9d54fc6e1e8c5 Author: Julien Cristau <jcris...@debian.org> Date: Tue Jun 23 18:53:32 2009 +0200 Bump Standards-Version to 3.8.2 diff --git a/debian/changelog b/debian/changelog index 423142a..533e9d6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -28,7 +28,7 @@ xorg-server (2:1.6.1.901-3) UNRELEASED; urgency=low * Don't recommend xfonts-base. libXfont provides builtin versions of the fixed and cursor fonts, which are the only required ones. Keep xfonts-* packages in Suggests for xserver-xorg-core. - * Bump Standards-Version to 3.8.1 now that we have README.source. + * Bump Standards-Version to 3.8.2 now that we have README.source. [ David Nusinow ] * Add README.source diff --git a/debian/control b/debian/control index 2afc936..b337bcf 100644 --- a/debian/control +++ b/debian/control @@ -73,7 +73,7 @@ Build-Depends: libxv-dev, libxinerama-dev Build-Conflicts: xlibs-static-dev -Standards-Version: 3.8.1 +Standards-Version: 3.8.2 Vcs-Git: git://git.debian.org/git/pkg-xorg/xserver/xorg-server Vcs-Browser: http://git.debian.org/?p=pkg-xorg/xserver/xorg-server.git commit dbac41b624e4aa86a6a184b7ebb52bfdd367bbf0 Author: Adam Jackson <a...@redhat.com> Date: Fri Jun 19 12:42:07 2009 -0400 pci: Dump vendor/devices ids in the printed device list (cherry picked from commit eb35402d0a5290e8a73d7d1e92f173294c364cc2) diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c index 467a0c3..5b29a15 100644 --- a/hw/xfree86/common/xf86pciBus.c +++ b/hw/xfree86/common/xf86pciBus.c @@ -417,18 +417,16 @@ xf86PciProbe(void) if (xf86IsPrimaryPci(info)) prim = "*"; - xf86Msg( X_PROBED, "PCI:%s(%...@%u:%u:%u) ", prim, info->domain, - info->bus, info->dev, info->func ); + xf86Msg(X_PROBED, "PCI:%s(%u:%u:%u:%u) %04x:%04x:%04x:%04x ", prim, + info->domain, info->bus, info->dev, info->func, + info->vendor_id, info->device_id, + info->subvendor_id, info->subdevice_id); if (vendorname) xf86ErrorF("%s ", vendorname); - else - xf86ErrorF("unknown vendor (0x%04x) ", info->vendor_id); if (chipname) xf86ErrorF("%s ", chipname); - else - xf86ErrorF("unknown chipset (0x%04x) ", info->device_id); xf86ErrorF("rev %d", info->revision); commit 6be19e8f43086fb4b7fb30a47b89b5f3eed798ef Author: Ian Romanick <ian.d.roman...@intel.com> Date: Wed Apr 8 14:54:30 2009 -0700 Use a #define instead of a magic number The number of buffers is likely to change in the future, so having this as a define is the right way to go. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> (cherry picked from commit 03aebed519986c4dd03e02b3b3d4af1f64595ca7) diff --git a/glx/glxdri2.c b/glx/glxdri2.c index c671670..f2682d4 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -82,6 +82,8 @@ struct __GLXDRIcontext { __DRIcontext *driContext; }; +#define MAX_DRAWABLE_BUFFERS 5 + struct __GLXDRIdrawable { __GLXdrawable base; __DRIdrawable *driDrawable; @@ -90,7 +92,7 @@ struct __GLXDRIdrawable { /* Dimensions as last reported by DRI2GetBuffers. */ int width; int height; - __DRIbuffer buffers[5]; + __DRIbuffer buffers[MAX_DRAWABLE_BUFFERS]; int count; }; @@ -365,7 +367,7 @@ dri2GetBuffers(__DRIdrawable *driDrawable, buffers = DRI2GetBuffers(private->base.pDraw, width, height, attachments, count, out_count); - if (*out_count > 5) { + if (*out_count > MAX_DRAWABLE_BUFFERS) { *out_count = 0; return NULL; } commit 540d5b87a4e24d85ec46620dfedd7bd7979180ea Author: Jerome Glisse <gli...@freedesktop.org> Date: Mon May 11 22:52:46 2009 +0200 DRI2: update DRI2 private drawable width & height according to X drawable (cherry picked from commit f250eea2e90fc50bec5214c2f41132b95edc2c46) diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 1d49d7c..385c5e8 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -257,6 +257,8 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, pPriv->buffers = buffers; pPriv->bufferCount = *out_count; + pPriv->width = pDraw->width; + pPriv->height = pDraw->height; *width = pPriv->width; *height = pPriv->height; commit ec9f1ae32474bc0507a3c66e63bdf2835d467a34 Author: Ian Romanick <ian.d.roman...@intel.com> Date: Mon Apr 27 15:11:10 2009 -0700 DRI2: Force allocation of real-front buffer for non-windows as well For redirected rendering we end up with pixmaps (which the app thinks are windows) that are double buffered. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Tested-by: Pierre Willenbrock <pie...@pirsoft.de> (cherry picked from commit 0d9d3f3e361f769822caedccf4c2a58cc9930ecc) diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 9ded048..1d49d7c 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -206,18 +206,21 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, * attachments. The counting logic in the loop accounts for the case * where the client requests both the fake and real front-buffer. */ - if (pDraw->type == DRAWABLE_WINDOW) { - if (attachment == DRI2BufferBackLeft) { - need_real_front++; - front_format = format; - } + if (attachment == DRI2BufferBackLeft) { + need_real_front++; + front_format = format; + } - if (attachment == DRI2BufferFrontLeft) { - need_real_front--; + if (attachment == DRI2BufferFrontLeft) { + need_real_front--; + front_format = format; + + if (pDraw->type == DRAWABLE_WINDOW) { need_fake_front++; - front_format = format; } + } + if (pDraw->type == DRAWABLE_WINDOW) { if (attachment == DRI2BufferFakeFrontLeft) { need_fake_front--; have_fake_front = 1; commit 4fad615d689c61c6c3a000295a1fa755359737cb Author: Ian Romanick <ian.d.roman...@intel.com> Date: Fri Apr 24 12:49:19 2009 -0700 DRI2: Implement protocol for DRI2GetBuffersWithFormat This change implements the protocol for DRI2GetBuffersWithFormat, but the bulk of the differences are the changes to the extension / driver interface to make this function work. The old CreateBuffers and DeleteBuffers routines are replaced with CreateBuffer and DeleteBuffer (both singular). This allows drivers to allocate buffers for a drawable one at a time. As a result, 3D drivers can now allocate the (fake) front-buffer for a window only when it is needed. Since 3D drivers only ask for the front-buffer on demand, the real front-buffer is always created. This allows CopyRegion impelemenations of SwapBuffers to continue working. As with previous version of this code, if the client asks for the front-buffer for a window, we instead give it the fake front-buffer. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Reviewed-by: Kristian Høgsberg <k...@redhat.com> diff --git a/configure.ac b/configure.ac index af4ba4f..1f0fddd 100644 --- a/configure.ac +++ b/configure.ac @@ -859,7 +859,7 @@ if test "x$DRI" = xyes; then AC_SUBST(GL_CFLAGS) fi -PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= 1.99.3], +PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= 2.1], [HAVE_DRI2PROTO=yes], [HAVE_DRI2PROTO=no]) case "$DRI2,$HAVE_DRI2PROTO" in yes,no) diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 84d2c03..c671670 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -359,7 +359,7 @@ dri2GetBuffers(__DRIdrawable *driDrawable, int *out_count, void *loaderPrivate) { __GLXDRIdrawable *private = loaderPrivate; - DRI2BufferPtr buffers; + DRI2BufferPtr *buffers; int i; int j; @@ -380,15 +380,59 @@ dri2GetBuffers(__DRIdrawable *driDrawable, /* Do not send the real front buffer of a window to the client. */ if ((private->base.pDraw->type == DRAWABLE_WINDOW) - && (buffers[i].attachment == DRI2BufferFrontLeft)) { + && (buffers[i]->attachment == DRI2BufferFrontLeft)) { continue; } - private->buffers[j].attachment = buffers[i].attachment; - private->buffers[j].name = buffers[i].name; - private->buffers[j].pitch = buffers[i].pitch; - private->buffers[j].cpp = buffers[i].cpp; - private->buffers[j].flags = buffers[i].flags; + private->buffers[j].attachment = buffers[i]->attachment; + private->buffers[j].name = buffers[i]->name; + private->buffers[j].pitch = buffers[i]->pitch; + private->buffers[j].cpp = buffers[i]->cpp; + private->buffers[j].flags = buffers[i]->flags; + j++; + } + + *out_count = j; + return private->buffers; +} + +static __DRIbuffer * +dri2GetBuffersWithFormat(__DRIdrawable *driDrawable, + int *width, int *height, + unsigned int *attachments, int count, + int *out_count, void *loaderPrivate) +{ + __GLXDRIdrawable *private = loaderPrivate; + DRI2BufferPtr *buffers; + int i; + int j = 0; + + buffers = DRI2GetBuffersWithFormat(private->base.pDraw, + width, height, attachments, count, + out_count); + if (*out_count > MAX_DRAWABLE_BUFFERS) { + *out_count = 0; + return NULL; + } + + private->width = *width; + private->height = *height; + + /* This assumes the DRI2 buffer attachment tokens matches the + * __DRIbuffer tokens. */ + for (i = 0; i < *out_count; i++) { + /* Do not send the real front buffer of a window to the client. + */ + if ((private->base.pDraw->type == DRAWABLE_WINDOW) + && (buffers[i]->attachment == DRI2BufferFrontLeft)) { + continue; + } + + private->buffers[j].attachment = buffers[i]->attachment; + private->buffers[j].name = buffers[i]->name; + private->buffers[j].pitch = buffers[i]->pitch; + private->buffers[j].cpp = buffers[i]->cpp; + private->buffers[j].flags = buffers[i]->flags; j++; } @@ -407,6 +451,7 @@ static const __DRIdri2LoaderExtension loaderExtension = { { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION }, dri2GetBuffers, dri2FlushFrontBuffer, + dri2GetBuffersWithFormat, }; static const __DRIextension *loader_extensions[] = { diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 80de18f..9ded048 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -53,7 +53,7 @@ typedef struct _DRI2Drawable { unsigned int refCount; int width; int height; - DRI2BufferPtr buffers; + DRI2BufferPtr *buffers; int bufferCount; unsigned int pendingSequence; } DRI2DrawableRec, *DRI2DrawablePtr; @@ -63,8 +63,8 @@ typedef struct _DRI2Screen { const char *deviceName; int fd; unsigned int lastSequence; - DRI2CreateBuffersProcPtr CreateBuffers; - DRI2DestroyBuffersProcPtr DestroyBuffers; + DRI2CreateBufferProcPtr CreateBuffer; + DRI2DestroyBufferProcPtr DestroyBuffer; DRI2CopyRegionProcPtr CopyRegion; HandleExposuresProcPtr HandleExposures; @@ -132,71 +132,130 @@ DRI2CreateDrawable(DrawablePtr pDraw) return Success; } -DRI2BufferPtr -DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, - unsigned int *attachments, int count, int *out_count) +static int +find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment) +{ + int i; + + if (buffer_list == NULL) { + return -1; + } + + for (i = 0; i < count; i++) { + if ((buffer_list[i] != NULL) + && (buffer_list[i]->attachment == attachment)) { + return i; + } + } + + return -1; +} + +static DRI2BufferPtr +allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds, + DRI2DrawablePtr pPriv, + unsigned int attachment, unsigned int format, + int dimensions_match) +{ + DRI2BufferPtr buffer; + int old_buf; + + old_buf = find_attachment(pPriv->buffers, pPriv->bufferCount, attachment); + + if ((old_buf < 0) + || !dimensions_match + || (pPriv->buffers[old_buf]->format != format)) { + buffer = (*ds->CreateBuffer)(pDraw, attachment, format); + } else { + buffer = pPriv->buffers[old_buf]; + pPriv->buffers[old_buf] = NULL; + } + + return buffer; +} + +static DRI2BufferPtr * +do_get_buffers(DrawablePtr pDraw, int *width, int *height, + unsigned int *attachments, int count, int *out_count, + int has_format) { DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen); DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw); - DRI2BufferPtr buffers; - unsigned int temp_buf[32]; - unsigned int *temp = temp_buf; + DRI2BufferPtr *buffers; + int need_real_front = 0; + int need_fake_front = 0; int have_fake_front = 0; + int front_format = 0; + const int dimensions_match = (pDraw->width == pPriv->width) + && (pDraw->height == pPriv->height); + int i; - /* If the drawable is a window and the front-buffer is requested, silently - * add the fake front-buffer to the list of requested attachments. The - * counting logic in the loop accounts for the case where the client - * requests both the fake and real front-buffer. - */ - if (pDraw->type == DRAWABLE_WINDOW) { - int need_fake_front = 0; - int i; + buffers = xalloc((count + 1) * sizeof(buffers[0])); - if ((count + 1) > 32) { - temp = xalloc((count + 1) * sizeof(temp[0])); - } + for (i = 0; i < count; i++) { + const unsigned attachment = *(attachments++); + const unsigned format = (has_format) ? *(attachments++) : 0; + + buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment, + format, dimensions_match); - for (i = 0; i < count; i++) { - if (attachments[i] == DRI2BufferFrontLeft) { + + /* If the drawable is a window and the front-buffer is requested, + * silently add the fake front-buffer to the list of requested + * attachments. The counting logic in the loop accounts for the case + * where the client requests both the fake and real front-buffer. + */ + if (pDraw->type == DRAWABLE_WINDOW) { + if (attachment == DRI2BufferBackLeft) { + need_real_front++; + front_format = format; + } + + if (attachment == DRI2BufferFrontLeft) { + need_real_front--; need_fake_front++; + front_format = format; } - if (attachments[i] == DRI2BufferFakeFrontLeft) { + if (attachment == DRI2BufferFakeFrontLeft) { need_fake_front--; have_fake_front = 1; } - - temp[i] = attachments[i]; - } - - if (need_fake_front > 0) { - temp[i] = DRI2BufferFakeFrontLeft; - count++; - have_fake_front = 1; - attachments = temp; } } + if (need_real_front > 0) { + buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv, + DRI2BufferFrontLeft, + front_format, dimensions_match); + } - if (pPriv->buffers == NULL || - pDraw->width != pPriv->width || pDraw->height != pPriv->height) - { - buffers = (*ds->CreateBuffers)(pDraw, attachments, count); - (*ds->DestroyBuffers)(pDraw, pPriv->buffers, pPriv->bufferCount); - pPriv->buffers = buffers; - pPriv->bufferCount = count; - pPriv->width = pDraw->width; - pPriv->height = pDraw->height; + if (need_fake_front > 0) { + buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv, + DRI2BufferFakeFrontLeft, + front_format, dimensions_match); + have_fake_front = 1; } - if (temp != temp_buf) { - xfree(temp); + *out_count = i; + + + if (pPriv->buffers != NULL) { + for (i = 0; i < pPriv->bufferCount; i++) { + if (pPriv->buffers[i] != NULL) { + (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]); + } + } + + xfree(pPriv->buffers); } + + pPriv->buffers = buffers; + pPriv->bufferCount = *out_count; *width = pPriv->width; *height = pPriv->height; - *out_count = pPriv->bufferCount; /* If the client is getting a fake front-buffer, pre-fill it with the @@ -220,6 +279,22 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, return pPriv->buffers; } +DRI2BufferPtr * +DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, + unsigned int *attachments, int count, int *out_count) +{ + return do_get_buffers(pDraw, width, height, attachments, count, + out_count, FALSE); +} + +DRI2BufferPtr * +DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height, + unsigned int *attachments, int count, int *out_count) +{ + return do_get_buffers(pDraw, width, height, attachments, count, + out_count, TRUE); +} + int DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion, unsigned int dest, unsigned int src) @@ -237,10 +312,10 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion, pSrcBuffer = NULL; for (i = 0; i < pPriv->bufferCount; i++) { - if (pPriv->buffers[i].attachment == dest) - pDestBuffer = &pPriv->buffers[i]; - if (pPriv->buffers[i].attachment == src) - pSrcBuffer = &pPriv->buffers[i]; + if (pPriv->buffers[i]->attachment == dest) + pDestBuffer = pPriv->buffers[i]; + if (pPriv->buffers[i]->attachment == src) + pSrcBuffer = pPriv->buffers[i]; } if (pSrcBuffer == NULL || pDestBuffer == NULL) return BadValue; @@ -266,7 +341,16 @@ DRI2DestroyDrawable(DrawablePtr pDraw) if (pPriv->refCount > 0) return; - (*ds->DestroyBuffers)(pDraw, pPriv->buffers, pPriv->bufferCount); + if (pPriv->buffers != NULL) { + int i; + + for (i = 0; i < pPriv->bufferCount; i++) { + (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]); + } + + xfree(pPriv->buffers); + } + xfree(pPriv); if (pDraw->type == DRAWABLE_WINDOW) @@ -320,11 +404,18 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) if (!ds) return FALSE; + if ((info->version < 2) + || (info->CreateBuffer == NULL) + || (info->DestroyBuffer == NULL)) { + return FALSE; + } + + ds->fd = info->fd; ds->driverName = info->driverName; ds->deviceName = info->deviceName; - ds->CreateBuffers = info->CreateBuffers; - ds->DestroyBuffers = info->DestroyBuffers; + ds->CreateBuffer = info->CreateBuffer; + ds->DestroyBuffer = info->DestroyBuffer; ds->CopyRegion = info->CopyRegion; dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds); @@ -371,7 +462,7 @@ static XF86ModuleVersionInfo DRI2VersRec = MODINFOSTRING1, MODINFOSTRING2, XORG_VERSION_CURRENT, - 1, 0, 0, + 1, 1, 0, ABI_CLASS_EXTENSION, ABI_EXTENSION_VERSION, MOD_CLASS_NONE, diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h index e6c4b97..c9a0d3f 100644 --- a/hw/xfree86/dri2/dri2.h +++ b/hw/xfree86/dri2/dri2.h @@ -41,6 +41,7 @@ typedef struct { unsigned int pitch; unsigned int cpp; unsigned int flags; + unsigned int format; void *driverPrivate; } DRI2BufferRec, *DRI2BufferPtr; @@ -58,8 +59,19 @@ typedef void (*DRI2CopyRegionProcPtr)(DrawablePtr pDraw, typedef void (*DRI2WaitProcPtr)(WindowPtr pWin, unsigned int sequence); +typedef DRI2BufferPtr (*DRI2CreateBufferProcPtr)(DrawablePtr pDraw, + unsigned int attachment, + unsigned int format); +typedef void (*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw, + DRI2BufferPtr buffer); + +/** + * Version of the DRI2InfoRec structure defined in this header + */ +#define DRI2INFOREC_VERSION 2 + typedef struct { - unsigned int version; /* Version of this struct */ + unsigned int version; /**< Version of this struct */ int fd; const char *driverName; const char *deviceName; @@ -69,6 +81,14 @@ typedef struct { DRI2CopyRegionProcPtr CopyRegion; DRI2WaitProcPtr Wait; + /** + * \name Fields added in version 2 of the structure. + */ + /*...@{*/ + DRI2CreateBufferProcPtr CreateBuffer; + DRI2DestroyBufferProcPtr DestroyBuffer; + /*...@}*/ + } DRI2InfoRec, *DRI2InfoPtr; Bool DRI2ScreenInit(ScreenPtr pScreen, @@ -88,7 +108,7 @@ int DRI2CreateDrawable(DrawablePtr pDraw); void DRI2DestroyDrawable(DrawablePtr pDraw); -DRI2BufferPtr DRI2GetBuffers(DrawablePtr pDraw, +DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height, unsigned int *attachments, @@ -118,4 +138,8 @@ int DRI2CopyRegion(DrawablePtr pDraw, */ extern _X_EXPORT void DRI2Version(int *major, int *minor); +extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw, + int *width, int *height, unsigned int *attachments, int count, + int *out_count); + #endif diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c index ccc1bbb..97b96fa 100644 --- a/hw/xfree86/dri2/dri2ext.c +++ b/hw/xfree86/dri2/dri2ext.c @@ -81,7 +81,7 @@ ProcDRI2QueryVersion(ClientPtr client) rep.length = 0; rep.sequenceNumber = client->sequence; rep.majorVersion = 1; - rep.minorVersion = 0; + rep.minorVersion = 1; if (client->swapped) { swaps(&rep.sequenceNumber, n); @@ -193,32 +193,20 @@ ProcDRI2DestroyDrawable(ClientPtr client) return client->noClientException; } -static int -ProcDRI2GetBuffers(ClientPtr client) + +static void +send_buffers_reply(ClientPtr client, DrawablePtr pDrawable, + DRI2BufferPtr *buffers, int count, int width, int height) { - REQUEST(xDRI2GetBuffersReq); xDRI2GetBuffersReply rep; - DrawablePtr pDrawable; - DRI2BufferPtr buffers; - int i, status, width, height, count; - unsigned int *attachments; - xDRI2Buffer buffer; -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org