From c0eb289559705e15fe13013c72a218e647ad6d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 3 Aug 2010 08:46:44 +0200 Subject: Make it possible to view what format a QPlatformGlContext has QPlatformGlContext has now a pure virtual format getter. The way its intended to work is that the tlw has a QPlatformWindowFormat which is the requested format. Once you get the QPlatformGlContext of the window, you can request the QPlatformWindowFormat of the context to see what you really got. --- src/gui/kernel/qplatformglcontext_qpa.cpp | 3 ++ src/gui/kernel/qplatformglcontext_qpa.h | 5 +- src/opengl/qgl_qpa.cpp | 1 + .../platforms/eglconvenience/qeglconvenience.cpp | 45 +++++++++++++++++ .../platforms/eglconvenience/qeglconvenience.h | 4 ++ .../eglconvenience/qeglplatformcontext.cpp | 12 ++++- .../platforms/eglconvenience/qeglplatformcontext.h | 4 ++ src/plugins/platforms/testlite/qglxintegration.cpp | 57 ++++++++++++++++++++-- src/plugins/platforms/testlite/qglxintegration.h | 4 +- 9 files changed, 129 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qplatformglcontext_qpa.cpp b/src/gui/kernel/qplatformglcontext_qpa.cpp index a2ffbf3..36db2b0 100644 --- a/src/gui/kernel/qplatformglcontext_qpa.cpp +++ b/src/gui/kernel/qplatformglcontext_qpa.cpp @@ -41,6 +41,9 @@ #include "qplatformglcontext_qpa.h" +QPlatformGLContext::~QPlatformGLContext() +{ } + static QPlatformGLContext *staticSharedContext = 0; void QPlatformGLContext::setDefaultSharedContext(QPlatformGLContext *sharedContext) diff --git a/src/gui/kernel/qplatformglcontext_qpa.h b/src/gui/kernel/qplatformglcontext_qpa.h index 9f3bfb3..d235848 100644 --- a/src/gui/kernel/qplatformglcontext_qpa.h +++ b/src/gui/kernel/qplatformglcontext_qpa.h @@ -51,16 +51,19 @@ QT_BEGIN_NAMESPACE class Q_OPENGL_EXPORT QPlatformGLContext { public: - virtual ~QPlatformGLContext() { } + virtual ~QPlatformGLContext(); virtual void makeCurrent() = 0; virtual void doneCurrent() = 0; virtual void swapBuffers() = 0; virtual void* getProcAddress(const QString& procName) = 0; + virtual QPlatformWindowFormat platformWindowFormat() const = 0; + static QPlatformGLContext *defaultSharedContext(); protected: + static void setDefaultSharedContext(QPlatformGLContext *sharedContext); }; diff --git a/src/opengl/qgl_qpa.cpp b/src/opengl/qgl_qpa.cpp index 8fa210b..f859ff1 100644 --- a/src/opengl/qgl_qpa.cpp +++ b/src/opengl/qgl_qpa.cpp @@ -134,6 +134,7 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) widget->winId();//make window } d->platformContext = widget->platformWindow()->glContext(); + d->glFormat = qt_platformwindowformat_to_glformat(d->platformContext->platformWindowFormat()); d->valid =(bool) d->platformContext; } diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp index c50101d..b3a4c53 100644 --- a/src/plugins/platforms/eglconvenience/qeglconvenience.cpp +++ b/src/plugins/platforms/eglconvenience/qeglconvenience.cpp @@ -1,5 +1,7 @@ #include "qeglconvenience.h" +QT_BEGIN_NAMESPACE + QVector q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format) { int redSize = format.redBufferSize(); @@ -228,3 +230,46 @@ EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformW qWarning("Cant find EGLConfig, returning null config"); return 0; } + +QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config) +{ + QPlatformWindowFormat format; + EGLint redSize = 0; + EGLint greenSize = 0; + EGLint blueSize = 0; + EGLint alphaSize = 0; + EGLint depthSize = 0; + EGLint stencilSize = 0; + EGLint sampleCount = 0; + EGLint level = 0; + + eglGetConfigAttrib(display, config, EGL_RED_SIZE, &redSize); + eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &greenSize); + eglGetConfigAttrib(display, config, EGL_BLUE_SIZE, &blueSize); + eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &alphaSize); + eglGetConfigAttrib(display, config, EGL_DEPTH_SIZE, &depthSize); + eglGetConfigAttrib(display, config, EGL_STENCIL_SIZE, &stencilSize); + eglGetConfigAttrib(display, config, EGL_SAMPLES, &sampleCount); + eglGetConfigAttrib(display, config, EGL_LEVEL, &level); + + format.setRedBufferSize(redSize); + format.setGreenBufferSize(greenSize); + format.setBlueBufferSize(blueSize); + format.setAlphaBufferSize(alphaSize); + format.setDepthBufferSize(depthSize); + format.setStencilBufferSize(stencilSize); + format.setSamples(sampleCount); + format.setDirectRendering(true); // All EGL contexts are direct-rendered + format.setRgba(true); // EGL doesn't support colour index rendering + format.setStereo(false); // EGL doesn't support stereo buffers + format.setAccumBufferSize(0); // EGL doesn't support accululation buffers + + // Clear the EGL error state because some of the above may + // have errored out because the attribute is not applicable + // to the surface type. Such errors don't matter. + eglGetError(); + + return format; +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/eglconvenience/qeglconvenience.h b/src/plugins/platforms/eglconvenience/qeglconvenience.h index bd5a6d3..12731e1 100644 --- a/src/plugins/platforms/eglconvenience/qeglconvenience.h +++ b/src/plugins/platforms/eglconvenience/qeglconvenience.h @@ -46,9 +46,13 @@ #include #include +QT_BEGIN_NAMESPACE + QVector q_createConfigAttributesFromFormat(const QPlatformWindowFormat &format); bool q_reduceConfigAttributes(QVector *configAttributes); EGLConfig q_configFromQPlatformWindowFormat(EGLDisplay display, const QPlatformWindowFormat &format); +QPlatformWindowFormat qt_qPlatformWindowFormatFromConfig(EGLDisplay display, const EGLConfig config); +QT_END_NAMESPACE #endif //QEGLCONVENIENCE_H diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp index b3a5bba..87cd958 100644 --- a/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp +++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.cpp @@ -45,8 +45,11 @@ #include +#include "qeglconvenience.h" + QEGLPlatformContext::QEGLPlatformContext(EGLDisplay display, EGLConfig config, EGLint contextAttrs[], EGLSurface surface, EGLenum eglApi) - : m_eglDisplay(display) + : QPlatformGLContext() + , m_eglDisplay(display) , m_eglSurface(surface) , m_eglApi(eglApi) { @@ -61,6 +64,8 @@ QEGLPlatformContext::QEGLPlatformContext(EGLDisplay display, EGLConfig config, E eglTerminate(m_eglDisplay); qFatal("EGL error"); } + + m_windowFormat = qt_qPlatformWindowFormatFromConfig(display,config); } QEGLPlatformContext::~QEGLPlatformContext() @@ -142,3 +147,8 @@ void QEGLPlatformContext::makeDefaultSaredContext() { setDefaultSharedContext(this); } + +QPlatformWindowFormat QEGLPlatformContext::platformWindowFormat() const +{ + return m_windowFormat; +} diff --git a/src/plugins/platforms/eglconvenience/qeglplatformcontext.h b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h index 2a49129..b0cbbe0 100644 --- a/src/plugins/platforms/eglconvenience/qeglplatformcontext.h +++ b/src/plugins/platforms/eglconvenience/qeglplatformcontext.h @@ -57,11 +57,15 @@ public: void* getProcAddress(const QString& procName); void makeDefaultSaredContext(); + + QPlatformWindowFormat platformWindowFormat() const; private: EGLContext m_eglContext; EGLDisplay m_eglDisplay; EGLSurface m_eglSurface; EGLenum m_eglApi; + + QPlatformWindowFormat m_windowFormat; }; #endif //QOPENKODEGLINTEGRATION_H diff --git a/src/plugins/platforms/testlite/qglxintegration.cpp b/src/plugins/platforms/testlite/qglxintegration.cpp index e554e8d..57f9de4 100644 --- a/src/plugins/platforms/testlite/qglxintegration.cpp +++ b/src/plugins/platforms/testlite/qglxintegration.cpp @@ -125,6 +125,54 @@ GLXFBConfig QGLXGLContext::findConfig(const GLXFBConfig *configs, int configCoun return chosenConfig; } +QPlatformWindowFormat QGLXGLContext::platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config) +{ + QPlatformWindowFormat format; + int redSize = 0; + int greenSize = 0; + int blueSize = 0; + int alphaSize = 0; + int depthSize = 0; + int stencilSize = 0; + int sampleCount = 0; + int level = 0; + int rgba = 0; + int stereo = 0; + int accumSizeA = 0; + int accumSizeR = 0; + int accumSizeG = 0; + int accumSizeB = 0; + + glXGetFBConfigAttrib(display, config, GLX_RED_SIZE, &redSize); + glXGetFBConfigAttrib(display, config, GLX_GREEN_SIZE, &greenSize); + glXGetFBConfigAttrib(display, config, GLX_BLUE_SIZE, &blueSize); + glXGetFBConfigAttrib(display, config, GLX_ALPHA_SIZE, &alphaSize); + glXGetFBConfigAttrib(display, config, GLX_DEPTH_SIZE, &depthSize); + glXGetFBConfigAttrib(display, config, GLX_STENCIL_SIZE, &stencilSize); + glXGetFBConfigAttrib(display, config, GLX_SAMPLES, &sampleCount); + glXGetFBConfigAttrib(display, config, GLX_LEVEL, &level); + glXGetFBConfigAttrib(display, config, GLX_RGBA, &rgba); + glXGetFBConfigAttrib(display, config, GLX_STEREO, &stereo); + glXGetFBConfigAttrib(display, config, GLX_ACCUM_ALPHA_SIZE, &accumSizeA); + glXGetFBConfigAttrib(display, config, GLX_ACCUM_RED_SIZE, &accumSizeR); + glXGetFBConfigAttrib(display, config, GLX_ACCUM_GREEN_SIZE, &accumSizeG); + glXGetFBConfigAttrib(display, config, GLX_ACCUM_BLUE_SIZE, &accumSizeB); + + format.setRedBufferSize(redSize); + format.setGreenBufferSize(greenSize); + format.setBlueBufferSize(blueSize); + format.setAlphaBufferSize(alphaSize); + format.setDepthBufferSize(depthSize); + format.setStencilBufferSize(stencilSize); + format.setSamples(sampleCount); + format.setDirectRendering(true); // We don't support anything else for now. + format.setRgba(rgba); + format.setStereo(stereo); + format.setAccumBufferSize(accumSizeA + accumSizeB + accumSizeG + accumSizeR); + + return format; +} + QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindowFormat &format) : QPlatformGLContext() , m_xd(xd) @@ -159,6 +207,7 @@ QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindow { GLXFBConfig config = findConfig(configs,confcount,format,xd); m_context = glXCreateNewContext(xd->display,config,GLX_RGBA_TYPE,shareGlxContext,TRUE); + m_windowFormat = QGLXGLContext::platformWindowFromGLXFBConfig(xd->display,config); XFree(configs); } else { qFatal("Warning no context created"); @@ -167,9 +216,6 @@ QGLXGLContext::QGLXGLContext(Window window, MyDisplay *xd, const QPlatformWindow #ifdef MYX11_DEBUG qDebug() << "QGLXGLContext::create context" << m_context; #endif - -// TODO: Populate the QGLFormat with the values of the GLXFBConfig - } QGLXGLContext::QGLXGLContext(MyDisplay *display, Drawable drawable, GLXContext context) @@ -266,4 +312,9 @@ void* QGLXGLContext::getProcAddress(const QString& procName) return glXGetProcAddressARB(reinterpret_cast(procName.toLatin1().data())); } +QPlatformWindowFormat QGLXGLContext::platformWindowFormat() const +{ + return m_windowFormat; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/testlite/qglxintegration.h b/src/plugins/platforms/testlite/qglxintegration.h index decbe36..5a98e25 100644 --- a/src/plugins/platforms/testlite/qglxintegration.h +++ b/src/plugins/platforms/testlite/qglxintegration.h @@ -68,14 +68,16 @@ public: GLXContext glxContext() {return m_context;} - + QPlatformWindowFormat platformWindowFormat() const; private: static QVector buildSpec(const QPlatformWindowFormat &format); static GLXFBConfig findConfig(const GLXFBConfig *configs,int configCount, const QPlatformWindowFormat &format, const MyDisplay *xd); + static QPlatformWindowFormat platformWindowFromGLXFBConfig(Display *display, GLXFBConfig config); MyDisplay *m_xd; Drawable m_drawable; GLXContext m_context; + QPlatformWindowFormat m_windowFormat; QGLXGLContext (MyDisplay *display, Drawable drawable, GLXContext context); static QMutex m_defaultSharedContextMutex; -- cgit v0.12