static Bool dri2_bind_context(struct glx_context *context, struct glx_context *old, GLXDrawable draw, GLXDrawable read) { struct dri2_context *pcp = (struct dri2_context *) context; struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; struct dri2_drawable *pdraw, *pread; struct dri2_display *pdp; pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw); pread = (struct dri2_drawable *) driFetchDrawable(context, read); if (pdraw == NULL || pread == NULL) return GLXBadDrawable; if (!(*psc->core->bindContext) (pcp->driContext, pdraw->driDrawable, pread->driDrawable)) return GLXBadContext; /* If the server doesn't send invalidate events, we may miss a * resize before the rendering starts. Invalidate the buffers now * so the driver will recheck before rendering starts. */ pdp = (struct dri2_display *) psc->base.display; if (!pdp->invalidateAvailable) { dri2InvalidateBuffers(psc->base.dpy, pdraw->base.xDrawable); if (pread != pdraw) dri2InvalidateBuffers(psc->base.dpy, pread->base.xDrawable); } return Success; }
static int64_t dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, int64_t remainder) { __GLXDRIdrawablePrivate *priv = (__GLXDRIdrawablePrivate *) pdraw; __GLXdisplayPrivate *dpyPriv = __glXInitialize(priv->base.psc->dpy); __GLXDRIdisplayPrivate *pdp = (__GLXDRIdisplayPrivate *)dpyPriv->dri2Display; int64_t ret; #ifdef __DRI2_FLUSH if (pdraw->psc->f) (*pdraw->psc->f->flush)(pdraw->driDrawable); #endif /* Old servers don't send invalidate events */ if (!pdp->invalidateAvailable) dri2InvalidateBuffers(dpyPriv->dpy, pdraw->drawable); /* Old servers can't handle swapbuffers */ if (!pdp->swapAvailable) { dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height); return 0; } #ifdef X_DRI2SwapBuffers DRI2SwapBuffers(pdraw->psc->dpy, pdraw->xDrawable, target_msc, divisor, remainder, &ret); #endif return ret; }
static Bool DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire) { #if 0 XExtDisplayInfo *info = DRI2FindDisplay(dpy); XExtDisplayInfo *glx_info = glXFindDisplay(dpy); XextCheckExtension(dpy, info, dri2ExtensionName, False); switch ((wire->u.u.type & 0x7f) - info->codes->first_event) { #ifdef X_DRI2SwapBuffers case DRI2_BufferSwapComplete: { GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; xDRI2BufferSwapComplete *awire = (xDRI2BufferSwapComplete *)wire; aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); aevent->type = (glx_info->codes->first_event + GLX_BufferSwapComplete) & 0x75; aevent->send_event = (awire->type & 0x80) != 0; aevent->display = dpy; aevent->drawable = awire->drawable; switch (awire->event_type) { case DRI2_EXCHANGE_COMPLETE: aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL; break; case DRI2_BLIT_COMPLETE: aevent->event_type = GLX_BLIT_COMPLETE_INTEL; break; case DRI2_FLIP_COMPLETE: aevent->event_type = GLX_FLIP_COMPLETE_INTEL; break; default: /* unknown swap completion type */ return False; } 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; return True; } #endif #ifdef DRI2_InvalidateBuffers case DRI2_InvalidateBuffers: { xDRI2InvalidateBuffers *awire = (xDRI2InvalidateBuffers *)wire; dri2InvalidateBuffers(dpy, awire->drawable); return False; } #endif default: /* client doesn't support server event */ break; } #endif return False; }
static void dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) { __GLXDRIdrawablePrivate *pdraw = loaderPrivate; __GLXdisplayPrivate *priv = __glXInitialize(pdraw->base.psc->dpy); __GLXDRIdisplayPrivate *pdp = (__GLXDRIdisplayPrivate *)priv->dri2Display; /* Old servers don't send invalidate events */ if (!pdp->invalidateAvailable) dri2InvalidateBuffers(priv->dpy, pdraw->base.drawable); dri2WaitGL(loaderPrivate); }
static Bool DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire) { XExtDisplayInfo *info = DRI2FindDisplay(dpy); struct glx_drawable *glxDraw; XextCheckExtension(dpy, info, dri2ExtensionName, False); switch ((wire->u.u.type & 0x7f) - info->codes->first_event) { #ifdef X_DRI2SwapBuffers case DRI2_BufferSwapComplete: { GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; xDRI2BufferSwapComplete2 *awire = (xDRI2BufferSwapComplete2 *)wire; __GLXDRIdrawable *pdraw; pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable); if (pdraw == NULL) return False; /* Ignore swap events if we're not looking for them */ aevent->type = dri2GetSwapEventType(dpy, awire->drawable); if(!aevent->type) return False; aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); aevent->send_event = (awire->type & 0x80) != 0; aevent->display = dpy; aevent->drawable = awire->drawable; switch (awire->event_type) { case DRI2_EXCHANGE_COMPLETE: aevent->event_type = GLX_EXCHANGE_COMPLETE_INTEL; break; case DRI2_BLIT_COMPLETE: aevent->event_type = GLX_COPY_COMPLETE_INTEL; break; case DRI2_FLIP_COMPLETE: aevent->event_type = GLX_FLIP_COMPLETE_INTEL; break; default: /* unknown swap completion type */ return False; } aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; glxDraw = GetGLXDrawable(dpy, pdraw->drawable); if (glxDraw != NULL) { if (awire->sbc < glxDraw->lastEventSbc) glxDraw->eventSbcWrap += 0x100000000; glxDraw->lastEventSbc = awire->sbc; aevent->sbc = awire->sbc + glxDraw->eventSbcWrap; } else { aevent->sbc = awire->sbc; } return True; } #endif #ifdef DRI2_InvalidateBuffers case DRI2_InvalidateBuffers: { xDRI2InvalidateBuffers *awire = (xDRI2InvalidateBuffers *)wire; dri2InvalidateBuffers(dpy, awire->drawable); return False; } #endif default: /* client doesn't support server event */ break; } return False; }