xorg-server: Changes to 'debian-unstable'
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 <jcristau@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 <dnusinow@debian.org> Mon, 25 May 2009 21:21:55 -0400
+ -- Julien Cristau <jcristau@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 <jcristau@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 <jcristau@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 <ajax@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.romanick@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.romanick@intel.com>
+ (cherry picked from commit 03aebed519986c4dd03e02b3b3d4af1f64595ca7)
+
+commit 540d5b87a4e24d85ec46620dfedd7bd7979180ea
+Author: Jerome Glisse <glisse@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.romanick@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.romanick@intel.com>
+ Tested-by: Pierre Willenbrock <pierre@pirsoft.de>
+ (cherry picked from commit 0d9d3f3e361f769822caedccf4c2a58cc9930ecc)
+
+commit 4fad615d689c61c6c3a000295a1fa755359737cb
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ Reviewed-by: Kristian Høgsberg <krh@redhat.com>
+
+commit 98c3c21735197fbd2c8166c9bdabf055e14c9009
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit 28ddfc88d8d547941c7f4713db527a3c2f9ec35a)
+
+commit 4cb4c210c365fd40ad314e0707eb38811f240a12
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit d1e916d29be8b470cbc8cadcf6e83991fdbc5a9f)
+
+commit aa13faef2b1464f808e04de9826c6b8b8b91ae89
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit de1e43181bd670877b994db221ad8a04b5d63324)
+
+commit d7277296ed7aea7bd41b3489d4ceef750d400206
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit 567cf67959b30432ae30f4851ec17b3a375ab838)
+
+commit 73b786f7e7f46d40bf3b039538540c2e25f45947
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit f1a995d1496d73741731e32f475097c44a8da972)
+
+commit 32d250a881341ece8a1f1d78359adc1b265b5174
+Author: Ian Romanick <ian.d.romanick@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.romanick@intel.com>
+ (cherry picked from commit aa2928325fe51d94a636dde9c090e8f54a311a12)
+
+commit db61eff891675aeaf2466c3529424de4621005dc
+Author: Adam Jackson <ajax@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 <ajax@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 <ajax@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 <ewalsh@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 <ewalsh@tycho.nsa.gov>
+ (cherry picked from commit 3cea176d5abcb0f14eefbdcbe17fed0847524dd4)
+
commit a9f85dcefbadfe44d8c58ad08430aaadb8c59d34
Author: Eamon Walsh <ewalsh@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 <jcristau@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 <jcristau@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 <ajax@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:%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.romanick@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.romanick@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 <glisse@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.romanick@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.romanick@intel.com>
Tested-by: Pierre Willenbrock <pierre@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.romanick@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.romanick@intel.com>
Reviewed-by: Kristian Høgsberg <krh@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;
Reply to: