include/sal/log-areas.dox | 1 vcl/Library_vclplug_qt5.mk | 1 vcl/inc/qt5/Qt5Object.hxx | 8 +- vcl/inc/qt5/Qt5OpenGLContext.hxx | 50 ++++++++++++ vcl/qt5/Qt5Instance.cxx | 3 vcl/qt5/Qt5Object.cxx | 5 + vcl/qt5/Qt5OpenGLContext.cxx | 151 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 215 insertions(+), 4 deletions(-)
New commits: commit 56b19f9a814ae5a39ed760ee542d715493cd0bf3 Author: Aleksei Nikiforov <darktemp...@basealt.ru> AuthorDate: Fri Dec 14 12:44:20 2018 +0300 Commit: Thorsten Behrens <thorsten.behr...@cib.de> CommitDate: Wed Dec 19 07:19:52 2018 +0100 tdf#121247, tdf#121266 KDE5: Add basic support for OpenGL Change-Id: Id3a5879f661a6fa51b9f9dc40af73687a8f624df Reviewed-on: https://gerrit.libreoffice.org/65310 Reviewed-by: Katarina Behrens <katarina.behr...@cib.de> Tested-by: Jenkins diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox index 66ca425e9fea..9ee69be03b6f 100644 --- a/include/sal/log-areas.dox +++ b/include/sal/log-areas.dox @@ -478,6 +478,7 @@ certain functionality. @li @c vcl.layout - Widget layout @li @c vcl.lazydelete @li @c vcl.opengl +@li @c vcl.opengl.qt5 - QT5 OpenGL @li @c vcl.osx @li @c vcl.osx.print @li @c vcl.pdfwriter diff --git a/vcl/Library_vclplug_qt5.mk b/vcl/Library_vclplug_qt5.mk index cd3605720534..d51175756009 100644 --- a/vcl/Library_vclplug_qt5.mk +++ b/vcl/Library_vclplug_qt5.mk @@ -99,6 +99,7 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_qt5,\ vcl/qt5/Qt5MainWindow \ vcl/qt5/Qt5Menu \ vcl/qt5/Qt5Object \ + vcl/qt5/Qt5OpenGLContext \ vcl/qt5/Qt5Painter \ vcl/qt5/Qt5Printer \ vcl/qt5/Qt5System \ diff --git a/vcl/inc/qt5/Qt5Object.hxx b/vcl/inc/qt5/Qt5Object.hxx index 294f4da4d9db..640c83753deb 100644 --- a/vcl/inc/qt5/Qt5Object.hxx +++ b/vcl/inc/qt5/Qt5Object.hxx @@ -24,14 +24,18 @@ #include <QtGui/QRegion> -class QWidget; class Qt5Frame; +class QWidget; +class QWindow; class Qt5Object : public SalObject { + friend class Qt5OpenGLContext; + SystemEnvData m_aSystemData; Qt5Frame* m_pParent; - QWidget* m_pQWidget; + QWidget* m_pQWidget; // main widget, container + QWindow* m_pQWindow; // contained window, used for opengl rendering QRegion m_pRegion; public: diff --git a/vcl/inc/qt5/Qt5OpenGLContext.hxx b/vcl/inc/qt5/Qt5OpenGLContext.hxx new file mode 100644 index 000000000000..778df689ba65 --- /dev/null +++ b/vcl/inc/qt5/Qt5OpenGLContext.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <vcl/opengl/OpenGLContext.hxx> + +class QWindow; +class QOpenGLContext; + +class Qt5OpenGLContext : public OpenGLContext +{ +public: + virtual void initWindow() override; + +private: + virtual const GLWindow& getOpenGLWindow() const override { return m_aGLWin; } + virtual GLWindow& getModifiableOpenGLWindow() override { return m_aGLWin; } + virtual bool ImplInit() override; + + virtual void makeCurrent() override; + virtual void destroyCurrentContext() override; + virtual bool isCurrent() override; + virtual bool isAnyCurrent() override; + virtual void resetCurrent() override; + virtual void swapBuffers() override; + + static bool g_bAnyCurrent; + + GLWindow m_aGLWin; + + QWindow* m_pWindow; + QOpenGLContext* m_pContext; +}; diff --git a/vcl/qt5/Qt5Instance.cxx b/vcl/qt5/Qt5Instance.cxx index 2e21f2563d90..6564edd2241b 100644 --- a/vcl/qt5/Qt5Instance.cxx +++ b/vcl/qt5/Qt5Instance.cxx @@ -30,6 +30,7 @@ #include <Qt5Frame.hxx> #include <Qt5Menu.hxx> #include <Qt5Object.hxx> +#include <Qt5OpenGLContext.hxx> #include <Qt5System.hxx> #include <Qt5Timer.hxx> #include <Qt5VirtualDevice.hxx> @@ -202,7 +203,7 @@ OUString Qt5Instance::GetConnectionIdentifier() { return OUString(); } void Qt5Instance::AddToRecentDocumentList(const OUString&, const OUString&, const OUString&) {} -OpenGLContext* Qt5Instance::CreateOpenGLContext() { return nullptr; } +OpenGLContext* Qt5Instance::CreateOpenGLContext() { return new Qt5OpenGLContext; } bool Qt5Instance::IsMainThread() const { return qApp->thread() != QThread::currentThread(); } diff --git a/vcl/qt5/Qt5Object.cxx b/vcl/qt5/Qt5Object.cxx index 4f0a92da7bf7..e498283ef1ee 100644 --- a/vcl/qt5/Qt5Object.cxx +++ b/vcl/qt5/Qt5Object.cxx @@ -22,15 +22,18 @@ #include <Qt5Frame.hxx> #include <QtWidgets/QWidget> +#include <QtGui/QWindow> Qt5Object::Qt5Object(Qt5Frame* pParent, bool bShow) : m_pParent(pParent) , m_pQWidget(nullptr) + , m_pQWindow(nullptr) { if (!m_pParent || !pParent->GetQWidget()) return; - m_pQWidget = new QWidget(pParent->GetQWidget()); + m_pQWindow = new QWindow; + m_pQWidget = QWidget::createWindowContainer(m_pQWindow, pParent->GetQWidget()); if (bShow) m_pQWidget->show(); diff --git a/vcl/qt5/Qt5OpenGLContext.cxx b/vcl/qt5/Qt5OpenGLContext.cxx new file mode 100644 index 000000000000..6f095e7cc857 --- /dev/null +++ b/vcl/qt5/Qt5OpenGLContext.cxx @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <Qt5OpenGLContext.hxx> + +#include <vcl/sysdata.hxx> +#include <opengl/zone.hxx> +#include <sal/log.hxx> + +#include <window.h> + +#include <Qt5Object.hxx> + +#include <QtGui/QOpenGLContext> +#include <QtGui/QWindow> + +bool Qt5OpenGLContext::g_bAnyCurrent = false; + +void Qt5OpenGLContext::swapBuffers() +{ + OpenGLZone aZone; + + if (m_pContext && m_pWindow && m_pWindow->isExposed()) + { + m_pContext->swapBuffers(m_pWindow); + } + + BuffersSwapped(); +} + +void Qt5OpenGLContext::resetCurrent() +{ + clearCurrent(); + + OpenGLZone aZone; + + if (m_pContext) + { + m_pContext->doneCurrent(); + g_bAnyCurrent = false; + } +} + +bool Qt5OpenGLContext::isCurrent() +{ + OpenGLZone aZone; + return g_bAnyCurrent && (QOpenGLContext::currentContext() == m_pContext); +} + +bool Qt5OpenGLContext::isAnyCurrent() +{ + OpenGLZone aZone; + return g_bAnyCurrent && (QOpenGLContext::currentContext() != nullptr); +} + +bool Qt5OpenGLContext::ImplInit() +{ + if (!m_pWindow) + { + SAL_WARN("vcl.opengl.qt5", "failed to create window"); + return false; + } + + m_pWindow->setSurfaceType(QSurface::OpenGLSurface); + m_pWindow->create(); + + m_pContext = new QOpenGLContext(m_pWindow); + if (!m_pContext->create()) + { + SAL_WARN("vcl.opengl.qt5", "failed to create context"); + return false; + } + + m_pContext->makeCurrent(m_pWindow); + g_bAnyCurrent = true; + + bool bRet = InitGL(); + InitGLDebugging(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + registerAsCurrent(); + + return bRet; +} + +void Qt5OpenGLContext::makeCurrent() +{ + if (isCurrent()) + return; + + OpenGLZone aZone; + + clearCurrent(); + + if (m_pContext && m_pWindow) + { + m_pContext->makeCurrent(m_pWindow); + g_bAnyCurrent = true; + } + + registerAsCurrent(); +} + +void Qt5OpenGLContext::destroyCurrentContext() +{ + OpenGLZone aZone; + + if (m_pContext) + { + m_pContext->doneCurrent(); + g_bAnyCurrent = false; + } + + if (glGetError() != GL_NO_ERROR) + { + SAL_WARN("vcl.opengl.qt5", "glError: " << glGetError()); + } +} + +void Qt5OpenGLContext::initWindow() +{ + if (!m_pChildWindow) + { + SystemWindowData winData = generateWinData(mpWindow, mbRequestLegacyContext); + m_pChildWindow = VclPtr<SystemChildWindow>::Create(mpWindow, 0, &winData, false); + } + + if (m_pChildWindow) + { + InitChildWindow(m_pChildWindow.get()); + } + + m_pWindow = static_cast<Qt5Object*>(m_pChildWindow->ImplGetWindowImpl()->mpSysObj)->m_pQWindow; +} _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits