QDri2Context::QDri2Context(QXcbWindow *window) : d_ptr(new QDri2ContextPrivate(window)) { Q_D(QDri2Context); static const EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; eglBindAPI(EGL_OPENGL_ES_API); EGLContext shareContext = EGL_NO_CONTEXT; if (window->widget()->platformWindowFormat().sharedGLContext()) { QDri2Context *context = static_cast<QDri2Context *>(window->widget()->platformWindowFormat().sharedGLContext()); shareContext = context->d_func()->eglContext; } d->eglContext = eglCreateContext(EGL_DISPLAY_FROM_XCB(d->qXcbWindow), NULL, shareContext, contextAttribs); if (d->eglContext == EGL_NO_CONTEXT) { qDebug() << "No eglContext!" << eglGetError(); } EGLBoolean makeCurrentSuccess = eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,d->eglContext); if (!makeCurrentSuccess) { qDebug() << "eglMakeCurrent failed!" << eglGetError(); } xcb_dri2_create_drawable (d->xcbConnection(), d->xcbWindow()); glGenFramebuffers(1,&d->fbo); glBindFramebuffer(GL_FRAMEBUFFER,d->fbo); glActiveTexture(GL_TEXTURE0); glGenRenderbuffers(1, &d->rbo); glBindRenderbuffer(GL_RENDERBUFFER, d->rbo); glGenRenderbuffers(1,&d->depth); glBindRenderbuffer(GL_RENDERBUFFER, d->depth); resize(d->qXcbWindow->widget()->geometry().size()); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, d->rbo); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERER,d->depth); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERER,d->depth); //restore the old current context const QPlatformGLContext *currentContext = QPlatformGLContext::currentContext(); if (currentContext) const_cast<QPlatformGLContext*>(currentContext)->makeCurrent(); }
void QDri2Context::makeCurrent() { Q_D(QDri2Context); eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,d->eglContext); glBindFramebuffer(GL_FRAMEBUFFER,d->fbo); }
void QDri2Context::resize(const QSize &size) { Q_D(QDri2Context); d->size= size; glBindFramebuffer(GL_FRAMEBUFFER,d->fbo); xcb_dri2_dri2_buffer_t *backBfr = backBuffer(); if (d->image) { qDebug() << "destroing image"; eglDestroyImageKHR(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),d->image); } EGLint imgAttribs[] = { EGL_WIDTH, d->size.width(), EGL_HEIGHT, d->size.height(), EGL_DRM_BUFFER_STRIDE_MESA, backBfr->pitch /4, EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, EGL_NONE }; d->image = eglCreateImageKHR(EGL_DISPLAY_FROM_XCB(d->qXcbWindow), EGL_NO_CONTEXT, EGL_DRM_BUFFER_MESA, (EGLClientBuffer) backBfr->name, imgAttribs); glBindRenderbuffer(GL_RENDERBUFFER, d->rbo); glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, d->image); glBindRenderbuffer(GL_RENDERBUFFER, d->depth); glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8_OES,d->size.width(), d->size.height()); }
void QDri2Context::doneCurrent() { QPlatformGLContext::doneCurrent(); Q_D(QDri2Context); eglMakeCurrent(EGL_DISPLAY_FROM_XCB(d->qXcbWindow),EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT); }