void QGLPaintDevice::beginPaint() { // Make sure our context is the current one: QGLContext *ctx = context(); ctx->makeCurrent(); ctx->d_func()->refreshCurrentFbo(); // Record the currently bound FBO so we can restore it again // in endPaint() and bind this device's FBO // // Note: m_thisFBO could be zero if the paint device is not // backed by an FBO (e.g. window back buffer). But there could // be a previous FBO bound to the context which we need to // explicitly unbind. Otherwise the painting will go into // the previous FBO instead of to the window. m_previousFBO = ctx->d_func()->current_fbo; if (m_previousFBO != m_thisFBO) { ctx->d_func()->setCurrentFbo(m_thisFBO); ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_thisFBO); } // Set the default fbo for the context to m_thisFBO so that // if some raw GL code between beginNativePainting() and // endNativePainting() calls QGLFramebufferObject::release(), // painting will revert to the window surface's fbo. ctx->d_ptr->default_fbo = m_thisFBO; }
void QGLPaintDevice::endPaint() { // Make sure the FBO bound at beginPaint is re-bound again here: QGLContext *ctx = context(); ctx->d_func()->refreshCurrentFbo(); if (m_previousFBO != ctx->d_func()->current_fbo) { ctx->d_func()->setCurrentFbo(m_previousFBO); ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_previousFBO); } ctx->d_ptr->default_fbo = 0; }
void QGLPaintDevice::ensureActiveTarget() { QGLContext* ctx = context(); if (ctx != QGLContext::currentContext()) ctx->makeCurrent(); ctx->d_func()->refreshCurrentFbo(); if (ctx->d_ptr->current_fbo != m_thisFBO) { ctx->d_func()->setCurrentFbo(m_thisFBO); ctx->contextHandle()->functions()->glBindFramebuffer(GL_FRAMEBUFFER, m_thisFBO); } ctx->d_ptr->default_fbo = m_thisFBO; }