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;
}
Ejemplo n.º 3
0
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);
}