static void _glitz_agl_context_update (glitz_agl_drawable_t *drawable, glitz_constraint_t constraint) { AGLContext context; drawable->base.flushed = drawable->base.finished = 0; switch (constraint) { case GLITZ_NONE: break; case GLITZ_ANY_CONTEXT_CURRENT: context = aglGetCurrentContext (); if (context == (AGLContext) 0) _glitz_agl_context_make_current (drawable, 0); break; case GLITZ_CONTEXT_CURRENT: context = aglGetCurrentContext (); if (context != drawable->context->context) _glitz_agl_context_make_current (drawable, (context)? 1: 0); break; case GLITZ_DRAWABLE_CURRENT: if (drawable->base.width != drawable->width || drawable->base.height != drawable->height) glitz_agl_drawable_update_size (drawable, drawable->base.width, drawable->base.height); context = aglGetCurrentContext (); if (context != drawable->context->context) { _glitz_agl_context_make_current (drawable, (context)? 1: 0); } else { if (drawable->pbuffer) { AGLPbuffer pbuffer; GLint unused; aglGetPBuffer (drawable->context->context, &pbuffer, &unused, &unused, &unused); if (pbuffer != drawable->pbuffer) _glitz_agl_context_make_current (drawable, (context)? 1: 0); } else if (drawable->drawable) { if (aglGetDrawable (drawable->context->context) != drawable->drawable) _glitz_agl_context_make_current (drawable, (context)? 1: 0); } } break; } }
static void _glitz_agl_make_current (void *abstract_drawable, void *abstract_context) { glitz_agl_context_t *context = (glitz_agl_context_t *) abstract_context; glitz_agl_drawable_t *drawable = (glitz_agl_drawable_t *) abstract_drawable; int update = 0; if (drawable->base.width != drawable->width || drawable->base.height != drawable->height) glitz_agl_drawable_update_size (drawable, drawable->base.width, drawable->base.height); if (aglGetCurrentContext () != context->context) { update = 1; } else { if (drawable->pbuffer) { AGLPbuffer pbuffer; GLint unused; aglGetPBuffer (context->context, &pbuffer, &unused, &unused, &unused); if (pbuffer != drawable->pbuffer) update = 1; } else if (drawable->drawable) { if (aglGetDrawable (context->context) != drawable->drawable) update = 1; } } if (update) { if (drawable->thread_info->cctx) { glitz_context_t *ctx = drawable->thread_info->cctx; if (ctx->lose_current) ctx->lose_current (ctx->closure); } if (drawable->pbuffer) { aglSetPBuffer (context->context, drawable->pbuffer, 0, 0, aglGetVirtualScreen (context->context)); context->pbuffer = 1; } else { if (context->pbuffer) { aglSetDrawable (context->context, NULL); context->pbuffer = 0; } aglSetDrawable (context->context, drawable->drawable); } aglSetCurrentContext (context->context); } drawable->thread_info->cctx = &context->base; }
void QGLContext::updatePaintDevice() { Q_D(QGLContext); d->update = false; #if 0 //(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_5) { if(d->paintDevice->devType() == QInternal::Widget) { QWidget *w = (QWidget *)d->paintDevice; aglSetHIViewRef((AGLContext)d->cx, (HIViewRef)w->winId()); } else if(d->paintDevice->devType() == QInternal::Pixmap) { QPixmap *pm = (QPixmap *)d->paintDevice; aglSetOffScreen((AGLContext)d->cx, pm->width(), pm->height(), qt_mac_pixmap_get_bytes_per_line(pm), qt_mac_pixmap_get_base(pm)); } else { qWarning("QGLContext::updatePaintDevice(): Not sure how to render OpenGL on this device!"); } } else #endif { #ifndef Q_OS_MAC64 if(d->paintDevice->devType() == QInternal::Widget) { //get control information QWidget *w = (QWidget *)d->paintDevice; HIViewRef hiview = (HIViewRef)w->winId(); WindowPtr window = qt_mac_window_for(hiview); #ifdef DEBUG_OPENGL_REGION_UPDATE static int serial_no_gl = 0; qDebug("[%d] %p setting on %s::%s %p/%p [%s]", ++serial_no_gl, w, w->metaObject()->className(), w->objectName().toLatin1().constData(), hiview, window, w->handle() ? "Inside" : "Outside"); #endif //update drawable if(0 && w->isWindow() && w->isFullScreen()) { aglSetDrawable((AGLContext)d->cx, 0); aglSetFullScreen((AGLContext)d->cx, w->width(), w->height(), 0, QApplication::desktop()->screenNumber(w)); w->hide(); } else { AGLDrawable old_draw = aglGetDrawable((AGLContext)d->cx), new_draw = GetWindowPort(window); if(old_draw != new_draw) aglSetDrawable((AGLContext)d->cx, new_draw); } if(!w->isWindow()) { QRegion clp = qt_mac_get_widget_rgn(w); //get drawable area #ifdef DEBUG_OPENGL_REGION_UPDATE if(clp.isEmpty()) { qDebug(" Empty area!"); } else { QVector<QRect> rs = clp.rects(); for(int i = 0; i < rs.count(); i++) qDebug(" %d %d %d %d", rs[i].x(), rs[i].y(), rs[i].width(), rs[i].height()); } #endif //update the clip if(!aglIsEnabled((AGLContext)d->cx, AGL_BUFFER_RECT)) aglEnable((AGLContext)d->cx, AGL_BUFFER_RECT); if(clp.isEmpty()) { GLint offs[4] = { 0, 0, 0, 0 }; aglSetInteger((AGLContext)d->cx, AGL_BUFFER_RECT, offs); if(aglIsEnabled((AGLContext)d->cx, AGL_CLIP_REGION)) aglDisable((AGLContext)d->cx, AGL_CLIP_REGION); } else { HIPoint origin = { 0., 0. }; HIViewConvertPoint(&origin, HIViewRef(w->winId()), 0); const GLint offs[4] = { qRound(origin.x), w->window()->frameGeometry().height() - (qRound(origin.y) + w->height()), w->width(), w->height() }; aglSetInteger((AGLContext)d->cx, AGL_BUFFER_RECT, offs); aglSetInteger((AGLContext)d->cx, AGL_CLIP_REGION, (const GLint *)clp.handle(true)); if(!aglIsEnabled((AGLContext)d->cx, AGL_CLIP_REGION)) aglEnable((AGLContext)d->cx, AGL_CLIP_REGION); } } } else if(d->paintDevice->devType() == QInternal::Pixmap) { QPixmap *pm = (QPixmap *)d->paintDevice; PixMapHandle mac_pm = GetGWorldPixMap((GWorldPtr)pm->macQDHandle()); aglSetOffScreen((AGLContext)d->cx, pm->width(), pm->height(), GetPixRowBytes(mac_pm), GetPixBaseAddr(mac_pm)); } else { qWarning("QGLContext::updatePaintDevice(): Not sure how to render OpenGL on this device!"); } #endif // Q_OS_MAC64 } aglUpdateContext((AGLContext)d->cx); }