Android: Support offscreen surfaces on pbuffers
This is pretty much the same thing that eglfs does. Task-number: QTBUG-38960 Change-Id: Ibf310ca8e3a4e31e5310ab3a3d3e851eae31a4ad Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
This commit is contained in:
parent
90808ead98
commit
80b6fbc2d9
@ -45,11 +45,14 @@
|
|||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QOpenGLContext>
|
#include <QOpenGLContext>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QOffscreenSurface>
|
||||||
|
|
||||||
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
|
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
|
||||||
|
#include <QtPlatformSupport/private/qeglpbuffer_p.h>
|
||||||
|
|
||||||
#include <qpa/qwindowsysteminterface.h>
|
#include <qpa/qwindowsysteminterface.h>
|
||||||
#include <qpa/qplatformwindow.h>
|
#include <qpa/qplatformwindow.h>
|
||||||
|
#include <qpa/qplatformoffscreensurface.h>
|
||||||
|
|
||||||
#include "androidjnimain.h"
|
#include "androidjnimain.h"
|
||||||
#include "qabstracteventdispatcher.h"
|
#include "qabstracteventdispatcher.h"
|
||||||
@ -207,6 +210,17 @@ QPlatformOpenGLContext *QAndroidPlatformIntegration::createPlatformOpenGLContext
|
|||||||
return new QAndroidPlatformOpenGLContext(format, context->shareHandle(), m_eglDisplay);
|
return new QAndroidPlatformOpenGLContext(format, context->shareHandle(), m_eglDisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPlatformOffscreenSurface *QAndroidPlatformIntegration::createPlatformOffscreenSurface(QOffscreenSurface *surface) const
|
||||||
|
{
|
||||||
|
QSurfaceFormat format(surface->requestedFormat());
|
||||||
|
format.setAlphaBufferSize(8);
|
||||||
|
format.setRedBufferSize(8);
|
||||||
|
format.setGreenBufferSize(8);
|
||||||
|
format.setBlueBufferSize(8);
|
||||||
|
|
||||||
|
return new QEGLPbuffer(m_eglDisplay, format, surface);
|
||||||
|
}
|
||||||
|
|
||||||
QPlatformWindow *QAndroidPlatformIntegration::createPlatformWindow(QWindow *window) const
|
QPlatformWindow *QAndroidPlatformIntegration::createPlatformWindow(QWindow *window) const
|
||||||
{
|
{
|
||||||
if (window->type() == Qt::ForeignWindow)
|
if (window->type() == Qt::ForeignWindow)
|
||||||
|
@ -82,6 +82,7 @@ public:
|
|||||||
QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
|
QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context) const;
|
||||||
QAbstractEventDispatcher *createEventDispatcher() const;
|
QAbstractEventDispatcher *createEventDispatcher() const;
|
||||||
QAndroidPlatformScreen *screen() { return m_primaryScreen; }
|
QAndroidPlatformScreen *screen() { return m_primaryScreen; }
|
||||||
|
QPlatformOffscreenSurface *createPlatformOffscreenSurface(QOffscreenSurface *surface) const;
|
||||||
|
|
||||||
virtual void setDesktopSize(int width, int height);
|
virtual void setDesktopSize(int width, int height);
|
||||||
virtual void setDisplayMetrics(int width, int height);
|
virtual void setDisplayMetrics(int width, int height);
|
||||||
|
@ -44,6 +44,8 @@
|
|||||||
#include "qandroidplatformopenglwindow.h"
|
#include "qandroidplatformopenglwindow.h"
|
||||||
#include "qandroidplatformintegration.h"
|
#include "qandroidplatformintegration.h"
|
||||||
|
|
||||||
|
#include <QtPlatformSupport/private/qeglpbuffer_p.h>
|
||||||
|
|
||||||
#include <QSurface>
|
#include <QSurface>
|
||||||
#include <QtGui/private/qopenglcontext_p.h>
|
#include <QtGui/private/qopenglcontext_p.h>
|
||||||
|
|
||||||
@ -98,7 +100,8 @@ EGLSurface QAndroidPlatformOpenGLContext::eglSurfaceForPlatformSurface(QPlatform
|
|||||||
{
|
{
|
||||||
if (surface->surface()->surfaceClass() == QSurface::Window)
|
if (surface->surface()->surfaceClass() == QSurface::Window)
|
||||||
return static_cast<QAndroidPlatformOpenGLWindow *>(surface)->eglSurface(eglConfig());
|
return static_cast<QAndroidPlatformOpenGLWindow *>(surface)->eglSurface(eglConfig());
|
||||||
return EGL_NO_SURFACE;
|
else
|
||||||
|
return static_cast<QEGLPbuffer *>(surface)->pbuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -127,6 +127,7 @@ void QAndroidPlatformOpenGLWindow::createEgl(EGLConfig config)
|
|||||||
m_nativeWindow = ANativeWindow_fromSurface(env, m_androidSurfaceObject.object());
|
m_nativeWindow = ANativeWindow_fromSurface(env, m_androidSurfaceObject.object());
|
||||||
m_androidSurfaceObject = QJNIObjectPrivate();
|
m_androidSurfaceObject = QJNIObjectPrivate();
|
||||||
m_eglSurface = eglCreateWindowSurface(m_eglDisplay, config, m_nativeWindow, NULL);
|
m_eglSurface = eglCreateWindowSurface(m_eglDisplay, config, m_nativeWindow, NULL);
|
||||||
|
m_format = q_glFormatFromConfig(m_eglDisplay, config, window()->requestedFormat());
|
||||||
if (m_eglSurface == EGL_NO_SURFACE) {
|
if (m_eglSurface == EGL_NO_SURFACE) {
|
||||||
EGLint error = eglGetError();
|
EGLint error = eglGetError();
|
||||||
eglTerminate(m_eglDisplay);
|
eglTerminate(m_eglDisplay);
|
||||||
@ -134,6 +135,14 @@ void QAndroidPlatformOpenGLWindow::createEgl(EGLConfig config)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSurfaceFormat QAndroidPlatformOpenGLWindow::format() const
|
||||||
|
{
|
||||||
|
if (m_nativeWindow == 0)
|
||||||
|
return window()->requestedFormat();
|
||||||
|
else
|
||||||
|
return m_format;
|
||||||
|
}
|
||||||
|
|
||||||
void QAndroidPlatformOpenGLWindow::clearEgl()
|
void QAndroidPlatformOpenGLWindow::clearEgl()
|
||||||
{
|
{
|
||||||
eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
@ -60,6 +60,7 @@ public:
|
|||||||
|
|
||||||
void setGeometry(const QRect &rect);
|
void setGeometry(const QRect &rect);
|
||||||
EGLSurface eglSurface(EGLConfig config);
|
EGLSurface eglSurface(EGLConfig config);
|
||||||
|
QSurfaceFormat format() const;
|
||||||
|
|
||||||
void checkNativeSurface(EGLConfig config);
|
void checkNativeSurface(EGLConfig config);
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ private:
|
|||||||
int m_nativeSurfaceId = -1;
|
int m_nativeSurfaceId = -1;
|
||||||
QJNIObjectPrivate m_androidSurfaceObject;
|
QJNIObjectPrivate m_androidSurfaceObject;
|
||||||
QWaitCondition m_surfaceWaitCondition;
|
QWaitCondition m_surfaceWaitCondition;
|
||||||
|
QSurfaceFormat m_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
Loading…
Reference in New Issue
Block a user