From patchwork Tue May 3 17:59:18 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jesse Barnes X-Patchwork-Id: 751002 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p43I5oOe027508 for ; Tue, 3 May 2011 18:06:11 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3F9F59F0DE for ; Tue, 3 May 2011 11:05:50 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from oproxy6-pub.bluehost.com (oproxy6-pub.bluehost.com [67.222.54.6]) by gabe.freedesktop.org (Postfix) with SMTP id 3D27E9F034 for ; Tue, 3 May 2011 11:00:10 -0700 (PDT) Received: (qmail 29982 invoked by uid 0); 3 May 2011 18:00:08 -0000 Received: from unknown (HELO box514.bluehost.com) (74.220.219.114) by cpoproxy3.bluehost.com with SMTP; 3 May 2011 18:00:08 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=virtuousgeek.org; h=Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer:In-Reply-To:References:X-Identified-User; b=dl2KgXe1PoAj/VI30toHCVkibpeZzvK+wHMcMTTPOVlYD46qHJBmxjCwGWQrPGSjhTpsj+TJ9cZfAJTGEdu9Cdw7jSFISDkT9fNrGgVVDFLA/N7XN6OBVlEh+MUWKyNo; Received: from c-67-161-37-189.hsd1.ca.comcast.net ([67.161.37.189] helo=localhost.localdomain) by box514.bluehost.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.69) (envelope-from ) id 1QHJtB-0004gv-5X; Tue, 03 May 2011 12:00:01 -0600 From: Jesse Barnes To: dri-devel@lists.freedesktop.org, xorg-devel@lists.freedesktop.org, mesa-dev@lists.freedesktop.org Subject: [PATCH 5/5] GLX: support generic swap events Date: Tue, 3 May 2011 10:59:18 -0700 Message-Id: <1304445561-9910-6-git-send-email-jbarnes@virtuousgeek.org> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1304445561-9910-1-git-send-email-jbarnes@virtuousgeek.org> References: <1304445561-9910-1-git-send-email-jbarnes@virtuousgeek.org> X-Identified-User: {10642:box514.bluehost.com:virtuous:virtuousgeek.org} {sentby:smtp auth 67.161.37.189 authed with jbarnes@virtuousgeek.org} X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 03 May 2011 18:06:11 +0000 (UTC) The existing swap event structure is too big to fit in an XEvent, so support servers that send generic events instead. Do this by advertising the GLX proto version we support when connecting and check for generic events in the event stream. Convert any received events into regular swap complete events for client compatibility. Signed-off-by: Jesse Barnes --- configure.ac | 2 +- src/glx/glxclient.h | 2 +- src/glx/glxext.c | 55 ++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index 92d11af..94fb6f7 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ LIBDRM_REQUIRED=2.4.24 LIBDRM_RADEON_REQUIRED=2.4.24 LIBDRM_INTEL_REQUIRED=2.4.24 DRI2PROTO_REQUIRED=2.4 -GLPROTO_REQUIRED=1.4.11 +GLPROTO_REQUIRED=1.4.13 LIBDRM_XORG_REQUIRED=2.4.24 LIBKMS_XORG_REQUIRED=1.0.0 diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 755a66d..cdef2a1 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -63,7 +63,7 @@ #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) #define GLX_MAJOR_VERSION 1 /* current version numbers */ -#define GLX_MINOR_VERSION 4 +#define GLX_MINOR_VERSION 5 #define __GLX_MAX_TEXTURE_UNITS 32 diff --git a/src/glx/glxext.c b/src/glx/glxext.c index 278c719..fb29711 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -104,14 +104,42 @@ XEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName, */ static Bool +__glXServerSupportsSBC(Display *dpy) +{ + struct glx_display *glx_dpy = __glXInitialize(dpy); + + return (glx_dpy->majorVersion > 1 || (glx_dpy->majorVersion == 1 && + glx_dpy->minorVersion > 4)); +} + +static Bool +__glXGenericEvent(Display *dpy, xGenericEvent *wire) +{ + struct glx_display *glx_dpy = __glXInitialize(dpy); + + return wire->extension == glx_dpy->codes->major_opcode; +} + +static Bool __glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) { struct glx_display *glx_dpy = __glXInitialize(dpy); + int type; if (glx_dpy == NULL) return False; - switch ((wire->u.u.type & 0x7f) - glx_dpy->codes->first_event) { + /* New extension will send generic events for some events */ + if (wire->u.u.type == GenericEvent && __glXServerSupportsSBC(dpy)) { + xGenericEvent *wire2 = (xGenericEvent *)wire; + if (!__glXGenericEvent(dpy, wire2)) + return False; + type = wire2->evtype; + } else { + type = (wire->u.u.type & 0x7f) - glx_dpy->codes->first_event; + } + + switch (type) { case GLX_PbufferClobber: { GLXPbufferClobberEvent *aevent = (GLXPbufferClobberEvent *)event; @@ -133,12 +161,23 @@ __glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) case GLX_BufferSwapComplete: { GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; - xGLXBufferSwapComplete *awire = (xGLXBufferSwapComplete *)wire; - aevent->event_type = awire->event_type; - aevent->drawable = awire->drawable; - aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; - aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; - aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo; + if (__glXServerSupportsSBC(dpy)) { + xGLXBufferSwapComplete2 *awire = (xGLXBufferSwapComplete2 *)wire; + /* Make it look like a regular event to clients */ + aevent->type = glx_dpy->codes->first_event + awire->evtype; + aevent->event_type = awire->swap_event_type; + aevent->drawable = awire->drawable; + aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; + aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; + aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo; + } else { + xGLXBufferSwapComplete *awire = (xGLXBufferSwapComplete *)wire; + aevent->event_type = awire->event_type; + aevent->drawable = awire->drawable; + aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; + aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; + aevent->sbc = 0; + } return True; } default: @@ -843,6 +882,8 @@ __glXInitialize(Display * dpy) XESetEventToWire(dpy, dpyPriv->codes->first_event + i, __glXEventToWire); } + XESetWireToEvent(dpy, GenericEvent, __glXWireToEvent); + XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay); XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString);