From patchwork Fri Nov 22 06:54:16 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Packard X-Patchwork-Id: 3221521 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D4AD89F26C for ; Fri, 22 Nov 2013 06:54:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id DBA6520760 for ; Fri, 22 Nov 2013 06:54:40 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id BF9792074B for ; Fri, 22 Nov 2013 06:54:39 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3F66AFAFD3; Thu, 21 Nov 2013 22:54:30 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from keithp.com (home.keithp.com [63.227.221.253]) by gabe.freedesktop.org (Postfix) with ESMTP id B2AD6FAFE3; Thu, 21 Nov 2013 22:54:26 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by keithp.com (Postfix) with ESMTP id 08F3C1488005; Thu, 21 Nov 2013 22:54:26 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at keithp.com Received: from keithp.com ([127.0.0.1]) by localhost (keithp.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id hNZPFkfFErlx; Thu, 21 Nov 2013 22:54:21 -0800 (PST) Received: by keithp.com (Postfix, from userid 1033) id 95FB91488002; Thu, 21 Nov 2013 22:54:21 -0800 (PST) Received: from miki.keithp.com (localhost [127.0.0.1]) by keithp.com (Postfix) with ESMTP id 6999F15803D; Thu, 21 Nov 2013 22:54:21 -0800 (PST) Received: by miki.keithp.com (Postfix, from userid 1001) id 1139FB0C; Thu, 21 Nov 2013 22:54:21 -0800 (PST) From: Keith Packard To: xorg-devel@lists.freedesktop.org Subject: [PATCH] present: Send GLX_BufferSwapComplete events from present extension Date: Thu, 21 Nov 2013 22:54:16 -0800 Message-Id: <1385103256-24620-1-git-send-email-keithp@keithp.com> X-Mailer: git-send-email 1.8.4.2 Cc: mesa-dev@lists.freedesktop.org, dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 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@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This allows GL to support the GLX_INTEL_swap_event extension Signed-off-by: Keith Packard Reviewed-by: Eric Anholt --- This is the X server side; the mesa patch will be sent shortly (it's tiny) glx/Makefile.am | 3 ++- glx/glxcmds.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ glx/glxdri2.c | 26 +++++-------------- glx/glxext.c | 3 +++ glx/glxserver.h | 9 +++++++ present/present.h | 9 +++++++ present/present_event.c | 10 +++++++ 7 files changed, 109 insertions(+), 20 deletions(-) diff --git a/glx/Makefile.am b/glx/Makefile.am index 5f28e87..44d3a7d 100644 --- a/glx/Makefile.am +++ b/glx/Makefile.am @@ -20,7 +20,8 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/hw/xfree86/os-support/bus \ -I$(top_srcdir)/hw/xfree86/common \ -I$(top_srcdir)/hw/xfree86/dri \ - -I$(top_srcdir)/mi + -I$(top_srcdir)/mi \ + -I$(top_srcdir)/present if DRI2_AIGLX AM_CPPFLAGS += -I$(top_srcdir)/hw/xfree86/dri2 diff --git a/glx/glxcmds.c b/glx/glxcmds.c index efa4aec..2c5de70 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -2468,3 +2468,72 @@ __glXDisp_ClientInfo(__GLXclientState * cl, GLbyte * pc) return Success; } + +#include + +void +__glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust, + CARD64 msc, CARD32 sbc) +{ + ClientPtr client = clients[CLIENT_ID(drawable->drawId)]; + + xGLXBufferSwapComplete2 wire = { + .type = __glXEventBase + GLX_BufferSwapComplete + }; + + if (!client) + return; + + if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) + return; + + wire.event_type = type; + wire.drawable = drawable->drawId; + wire.ust_hi = ust >> 32; + wire.ust_lo = ust & 0xffffffff; + wire.msc_hi = msc >> 32; + wire.msc_lo = msc & 0xffffffff; + wire.sbc = sbc; + + WriteEventsToClient(client, 1, (xEvent *) &wire); +} + +#if PRESENT +static void +__glXpresentCompleteNotify(WindowPtr window, CARD8 present_mode, CARD32 serial, + uint64_t ust, uint64_t msc) +{ + __GLXdrawable *drawable; + int error; + int glx_type; + int rc; + + rc = dixLookupResourceByType((pointer *) &drawable, window->drawable.id, + __glXDrawableRes, serverClient, DixGetAttrAccess); + + if (rc != Success) + return; + + switch(present_mode) { + case PresentCompleteModeFlip: + glx_type = GLX_FLIP_COMPLETE_INTEL; + break; + case PresentCompleteModeCopy: + glx_type = GLX_BLIT_COMPLETE_INTEL; + break; + default: + glx_type = 0; + break; + } + + __glXsendSwapEvent(drawable, glx_type, ust, msc, serial); +} + +#include + +void +__glXregisterPresentCompleteNotify(void) +{ + present_register_complete_notify(__glXpresentCompleteNotify); +} +#endif diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 1d74c8f..9d3f3c3 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -177,36 +177,24 @@ __glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust, CARD64 msc, CARD32 sbc) { __GLXdrawable *drawable = data; - xGLXBufferSwapComplete2 wire = { - .type = __glXEventBase + GLX_BufferSwapComplete - }; - - if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) - return; - + int glx_type; switch (type) { case DRI2_EXCHANGE_COMPLETE: - wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL; + glx_type = GLX_EXCHANGE_COMPLETE_INTEL; break; case DRI2_BLIT_COMPLETE: - wire.event_type = GLX_BLIT_COMPLETE_INTEL; + glx_type = GLX_BLIT_COMPLETE_INTEL; break; case DRI2_FLIP_COMPLETE: - wire.event_type = GLX_FLIP_COMPLETE_INTEL; + glx_type = GLX_FLIP_COMPLETE_INTEL; break; default: /* unknown swap completion type */ - wire.event_type = 0; + glx_type = 0; break; } - wire.drawable = drawable->drawId; - wire.ust_hi = ust >> 32; - wire.ust_lo = ust & 0xffffffff; - wire.msc_hi = msc >> 32; - wire.msc_lo = msc & 0xffffffff; - wire.sbc = sbc; - - WriteEventsToClient(client, 1, (xEvent *) &wire); + + __glXsendSwapEvent(drawable, glx_type, ust, msc, sbc); } /* diff --git a/glx/glxext.c b/glx/glxext.c index 3a7de28..601d08a 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -399,6 +399,9 @@ GlxExtensionInit(void) __glXErrorBase = extEntry->errorBase; __glXEventBase = extEntry->eventBase; +#if PRESENT + __glXregisterPresentCompleteNotify(); +#endif } /************************************************************************/ diff --git a/glx/glxserver.h b/glx/glxserver.h index 5e29abb..f862b63 100644 --- a/glx/glxserver.h +++ b/glx/glxserver.h @@ -120,6 +120,15 @@ void glxResumeClients(void); void __glXsetGetProcAddress(void (*(*get_proc_address) (const char *)) (void)); void *__glGetProcAddress(const char *); +void +__glXsendSwapEvent(__GLXdrawable *drawable, int type, CARD64 ust, + CARD64 msc, CARD32 sbc); + +#if PRESENT +void +__glXregisterPresentCompleteNotify(void); +#endif + /* ** State kept per client. */ diff --git a/present/present.h b/present/present.h index 6a451fb..0e3bdc0 100644 --- a/present/present.h +++ b/present/present.h @@ -115,4 +115,13 @@ present_event_abandon(RRCrtcPtr crtc); extern _X_EXPORT Bool present_screen_init(ScreenPtr screen, present_screen_info_ptr info); +typedef void (*present_complete_notify_proc)(WindowPtr window, + CARD8 mode, + CARD32 serial, + uint64_t ust, + uint64_t msc); + +extern _X_EXPORT void +present_register_complete_notify(present_complete_notify_proc proc); + #endif /* _PRESENT_H_ */ diff --git a/present/present_event.c b/present/present_event.c index a8f7176..f0d509e 100644 --- a/present/present_event.c +++ b/present/present_event.c @@ -137,6 +137,14 @@ present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, } } +static present_complete_notify_proc complete_notify; + +void +present_register_complete_notify(present_complete_notify_proc proc) +{ + complete_notify = proc; +} + void present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc) { @@ -165,6 +173,8 @@ present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 se } } } + if (complete_notify) + (*complete_notify)(window, mode, serial, ust, msc); } void