GLboolean intelMakeCurrent(__DRIcontext * driContextPriv, __DRIdrawable * driDrawPriv, __DRIdrawable * driReadPriv) { struct brw_context *brw; GET_CURRENT_CONTEXT(curCtx); if (driContextPriv) brw = (struct brw_context *) driContextPriv->driverPrivate; else brw = NULL; /* According to the glXMakeCurrent() man page: "Pending commands to * the previous context, if any, are flushed before it is released." * But only flush if we're actually changing contexts. */ if (brw_context(curCtx) && brw_context(curCtx) != brw) { _mesa_flush(curCtx); } if (driContextPriv) { struct gl_context *ctx = &brw->ctx; struct gl_framebuffer *fb, *readFb; if (driDrawPriv == NULL && driReadPriv == NULL) { fb = _mesa_get_incomplete_framebuffer(); readFb = _mesa_get_incomplete_framebuffer(); } else { fb = driDrawPriv->driverPrivate; readFb = driReadPriv->driverPrivate; driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1; driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1; } /* The sRGB workaround changes the renderbuffer's format. We must change * the format before the renderbuffer's miptree get's allocated, otherwise * the formats of the renderbuffer and its miptree will differ. */ intel_gles3_srgb_workaround(brw, fb); intel_gles3_srgb_workaround(brw, readFb); /* If the context viewport hasn't been initialized, force a call out to * the loader to get buffers so we have a drawable size for the initial * viewport. */ if (!brw->ctx.ViewportInitialized) intel_prepare_render(brw); _mesa_make_current(ctx, fb, readFb); } else { _mesa_make_current(NULL, NULL, NULL); } return true; }
GLboolean intelMakeCurrent(__DRIcontext * driContextPriv, __DRIdrawable * driDrawPriv, __DRIdrawable * driReadPriv) { struct intel_context *intel; GET_CURRENT_CONTEXT(curCtx); if (driContextPriv) intel = (struct intel_context *) driContextPriv->driverPrivate; else intel = NULL; /* According to the glXMakeCurrent() man page: "Pending commands to * the previous context, if any, are flushed before it is released." * But only flush if we're actually changing contexts. */ if (intel_context(curCtx) && intel_context(curCtx) != intel) { _mesa_flush(curCtx); } if (driContextPriv) { struct gl_context *ctx = &intel->ctx; struct gl_framebuffer *fb, *readFb; if (driDrawPriv == NULL && driReadPriv == NULL) { fb = _mesa_get_incomplete_framebuffer(); readFb = _mesa_get_incomplete_framebuffer(); } else { fb = driDrawPriv->driverPrivate; readFb = driReadPriv->driverPrivate; driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1; driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1; } intel_prepare_render(intel); _mesa_make_current(ctx, fb, readFb); intel_gles3_srgb_workaround(intel, ctx->WinSysDrawBuffer); intel_gles3_srgb_workaround(intel, ctx->WinSysReadBuffer); /* We do this in intel_prepare_render() too, but intel->ctx.DrawBuffer * is NULL at that point. We can't call _mesa_makecurrent() * first, since we need the buffer size for the initial * viewport. So just call intel_draw_buffer() again here. */ intel_draw_buffer(ctx); } else { _mesa_make_current(NULL, NULL, NULL); } return true; }
GLboolean intelMakeCurrent(__DRIcontext * driContextPriv, __DRIdrawable * driDrawPriv, __DRIdrawable * driReadPriv) { struct brw_context *brw; GET_CURRENT_CONTEXT(curCtx); if (driContextPriv) brw = (struct brw_context *) driContextPriv->driverPrivate; else brw = NULL; /* According to the glXMakeCurrent() man page: "Pending commands to * the previous context, if any, are flushed before it is released." * But only flush if we're actually changing contexts. */ if (brw_context(curCtx) && brw_context(curCtx) != brw) { _mesa_flush(curCtx); } if (driContextPriv) { struct gl_context *ctx = &brw->ctx; struct gl_framebuffer *fb, *readFb; if (driDrawPriv == NULL && driReadPriv == NULL) { fb = _mesa_get_incomplete_framebuffer(); readFb = _mesa_get_incomplete_framebuffer(); } else { fb = driDrawPriv->driverPrivate; readFb = driReadPriv->driverPrivate; driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1; driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1; } intel_prepare_render(brw); _mesa_make_current(ctx, fb, readFb); intel_gles3_srgb_workaround(brw, ctx->WinSysDrawBuffer); intel_gles3_srgb_workaround(brw, ctx->WinSysReadBuffer); } else { _mesa_make_current(NULL, NULL, NULL); } return true; }
static boolean st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi, struct st_framebuffer_iface *stdrawi, struct st_framebuffer_iface *streadi) { struct st_context *st = (struct st_context *) stctxi; struct st_framebuffer *stdraw, *stread; boolean ret; _glapi_check_multithread(); if (st) { /* reuse or create the draw fb */ stdraw = st_framebuffer_reuse_or_create(st->ctx->WinSysDrawBuffer, stdrawi); if (streadi != stdrawi) { /* do the same for the read fb */ stread = st_framebuffer_reuse_or_create(st->ctx->WinSysReadBuffer, streadi); } else { stread = NULL; /* reuse the draw fb for the read fb */ if (stdraw) st_framebuffer_reference(&stread, stdraw); } if (stdraw && stread) { st_framebuffer_validate(stdraw, st); if (stread != stdraw) st_framebuffer_validate(stread, st); ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base); st->draw_stamp = stdraw->stamp - 1; st->read_stamp = stread->stamp - 1; st_context_validate(st, stdraw, stread); } else { struct gl_framebuffer *incomplete = _mesa_get_incomplete_framebuffer(); ret = _mesa_make_current(st->ctx, incomplete, incomplete); } st_framebuffer_reference(&stdraw, NULL); st_framebuffer_reference(&stread, NULL); } else { ret = _mesa_make_current(NULL, NULL, NULL); } return ret; }
/** * Flush the front buffer if the current context renders to the front buffer. */ void st_manager_flush_frontbuffer(struct st_context *st) { struct st_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer); struct st_renderbuffer *strb = NULL; if (stfb) strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer); if (!strb) return; /* never a dummy fb */ assert(&stfb->Base != _mesa_get_incomplete_framebuffer()); stfb->iface->flush_front(stfb->iface, ST_ATTACHMENT_FRONT_LEFT); }
static struct st_framebuffer * st_framebuffer_reuse_or_create(struct gl_framebuffer *fb, struct st_framebuffer_iface *stfbi) { struct st_framebuffer *cur = st_ws_framebuffer(fb), *stfb = NULL; /* dummy framebuffers cant be used as st_framebuffer */ if (cur && &cur->Base != _mesa_get_incomplete_framebuffer() && cur->iface == stfbi) { /* reuse the current stfb */ st_framebuffer_reference(&stfb, cur); } else { /* create a new one */ stfb = st_framebuffer_create(stfbi); } return stfb; }
static boolean st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi, struct st_framebuffer_iface *stdrawi, struct st_framebuffer_iface *streadi) { struct st_context *st = (struct st_context *) stctxi; struct st_framebuffer *stdraw, *stread; boolean ret; _glapi_check_multithread(); if (st) { /* reuse or create the draw fb */ stdraw = st_framebuffer_reuse_or_create(st->ctx->WinSysDrawBuffer, stdrawi); if (streadi != stdrawi) { /* do the same for the read fb */ stread = st_framebuffer_reuse_or_create(st->ctx->WinSysReadBuffer, streadi); } else { stread = NULL; /* reuse the draw fb for the read fb */ if (stdraw) st_framebuffer_reference(&stread, stdraw); } if (stdraw && stread) { if (stctxi != st_api_get_current(stapi)) { p_atomic_set(&stdraw->revalidate, TRUE); p_atomic_set(&stread->revalidate, TRUE); } st_framebuffer_validate(stdraw, st); if (stread != stdraw) st_framebuffer_validate(stread, st); /* modify the draw/read buffers of the context */ if (stdraw->iface) { st_visual_to_default_buffer(stdraw->iface->visual, &st->ctx->Color.DrawBuffer[0], NULL); } if (stread->iface) { st_visual_to_default_buffer(stread->iface->visual, &st->ctx->Pixel.ReadBuffer, NULL); } ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base); } else { struct gl_framebuffer *incomplete = _mesa_get_incomplete_framebuffer(); ret = _mesa_make_current(st->ctx, incomplete, incomplete); } st_framebuffer_reference(&stdraw, NULL); st_framebuffer_reference(&stread, NULL); } else { ret = _mesa_make_current(NULL, NULL, NULL); } return ret; }