2011-09-07 06:14:22 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
2016-01-15 07:08:27 +00:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2011-09-07 06:14:22 +00:00
|
|
|
**
|
|
|
|
** This file is part of the QtGui module of the Qt Toolkit.
|
|
|
|
**
|
2016-01-15 07:08:27 +00:00
|
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
2012-09-19 12:28:29 +00:00
|
|
|
** Commercial License Usage
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2015-01-28 08:44:43 +00:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
2016-01-15 07:08:27 +00:00
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2012-09-19 12:28:29 +00:00
|
|
|
**
|
2011-09-07 06:14:22 +00:00
|
|
|
** GNU Lesser General Public License Usage
|
2012-09-19 12:28:29 +00:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
2016-01-15 07:08:27 +00:00
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU Lesser General Public License version 3 requirements
|
|
|
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
2011-09-07 06:14:22 +00:00
|
|
|
**
|
2016-01-15 07:08:27 +00:00
|
|
|
** GNU General Public License Usage
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
** General Public License version 2.0 or (at your option) the GNU General
|
|
|
|
** Public license version 3 or any later version approved by the KDE Free
|
|
|
|
** Qt Foundation. The licenses are as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
|
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
2011-09-07 06:14:22 +00:00
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "qsurface.h"
|
2014-05-22 11:38:17 +00:00
|
|
|
#include "qopenglcontext.h"
|
2019-08-06 11:15:35 +00:00
|
|
|
#include <qpa/qplatformintegration.h>
|
|
|
|
#include <QtGui/private/qguiapplication_p.h>
|
2011-09-07 06:14:22 +00:00
|
|
|
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
|
2022-01-18 16:38:48 +00:00
|
|
|
QT_IMPL_METATYPE_EXTERN_TAGGED(QSurface*, QSurface_ptr)
|
2012-01-19 11:51:43 +00:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\class QSurface
|
2012-06-13 19:45:44 +00:00
|
|
|
\inmodule QtGui
|
2012-03-15 14:55:46 +00:00
|
|
|
\since 5.0
|
2012-01-19 11:51:43 +00:00
|
|
|
\brief The QSurface class is an abstraction of renderable surfaces in Qt.
|
|
|
|
|
|
|
|
The size of the surface is accessible with the size() function. The rendering
|
|
|
|
specific attributes of the surface are accessible through the format() function.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\enum QSurface::SurfaceClass
|
|
|
|
|
|
|
|
The SurfaceClass enum describes the actual subclass of the surface.
|
|
|
|
|
|
|
|
\value Window The surface is an instance of QWindow.
|
2013-02-08 19:05:34 +00:00
|
|
|
\value Offscreen The surface is an instance of QOffscreenSurface.
|
2012-01-19 11:51:43 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\enum QSurface::SurfaceType
|
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
The SurfaceType enum describes what type of surface this is.
|
2012-01-19 11:51:43 +00:00
|
|
|
|
|
|
|
\value RasterSurface The surface is is composed of pixels and can be rendered to using
|
|
|
|
a software rasterizer like Qt's raster paint engine.
|
|
|
|
\value OpenGLSurface The surface is an OpenGL compatible surface and can be used
|
|
|
|
in conjunction with QOpenGLContext.
|
2013-12-18 13:48:22 +00:00
|
|
|
\value RasterGLSurface The surface can be rendered to using a software rasterizer,
|
|
|
|
and also supports OpenGL. This surface type is intended for internal Qt use, and
|
|
|
|
requires the use of private API.
|
2016-09-16 09:26:15 +00:00
|
|
|
\value OpenVGSurface The surface is an OpenVG compatible surface and can be used
|
|
|
|
in conjunction with OpenVG contexts.
|
2017-01-31 14:04:33 +00:00
|
|
|
\value VulkanSurface The surface is a Vulkan compatible surface and can be used
|
|
|
|
in conjunction with the Vulkan graphics API.
|
2018-04-04 12:11:43 +00:00
|
|
|
\value MetalSurface The surface is a Metal compatible surface and can be used
|
2022-02-09 14:05:20 +00:00
|
|
|
in conjunction with Apple's Metal graphics API. This surface type is only supported
|
|
|
|
on \macos and iOS.
|
Add a dedicated QWindow surface type for D3D
Even though there is no D3D-specific logic in the windows platform
plugin, meaning a QWindow with either OpenGLSurface or VulkanSurface
(or anything really) is DXGI/D3D-compatible, it now looks like it is
beneficial, and more future proof, if there is a dedicated surface
type.
As the linked report shows, there are OpenGL-specific workarounds
accumulated in the platform plugin, while not being clear if these
are relevant to non-OpenGL content, or if they are relevant at all
still. (and some of these can be difficult/impossible to retest and
verify in practice)
When D3D-based windows use the same surface type, all these are
active for those windows as well, while Vulkan-based windows have
their own type and so some of these old workarounds are not active
for those. To reduce confusion, having a dedicated surface type for
D3D as well allows the logic to skip the old OpenGL workarounds,
giving us (and users) a more clear overall behavior when it comes
to OpenGL vs. Vulkan vs. D3D.
The change is compatible with any existing code in other modules
because any code that uses OpenGLSurface for D3D will continue to
work, using the new type can be introduced incrementally.
Task-number: QTBUG-89715
Change-Id: Ieba86a580bf5a3636730952184dc3a3ab7669b26
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2021-01-04 09:27:11 +00:00
|
|
|
\value Direct3DSurface The surface is a Direct 3D 11 and 12 compatible
|
|
|
|
surface and can be used in conjunction with the DXGI and Direct3D APIs. This
|
2022-02-09 14:05:20 +00:00
|
|
|
surface type is only supported on Windows.
|
2012-01-19 11:51:43 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
2012-08-21 08:34:18 +00:00
|
|
|
\fn QSurfaceFormat QSurface::format() const
|
2012-01-19 11:51:43 +00:00
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
Returns the format of the surface.
|
|
|
|
*/
|
|
|
|
|
2013-12-18 13:48:22 +00:00
|
|
|
/*!
|
|
|
|
Returns true if the surface is OpenGL compatible and can be used in
|
|
|
|
conjunction with QOpenGLContext; otherwise returns false.
|
|
|
|
|
|
|
|
\since 5.3
|
|
|
|
*/
|
|
|
|
|
|
|
|
bool QSurface::supportsOpenGL() const
|
|
|
|
{
|
|
|
|
SurfaceType type = surfaceType();
|
2019-08-06 11:15:35 +00:00
|
|
|
if (type == RasterSurface) {
|
|
|
|
QPlatformIntegration *integ = QGuiApplicationPrivate::instance()->platformIntegration();
|
|
|
|
return integ->hasCapability(QPlatformIntegration::OpenGLOnRasterSurface);
|
|
|
|
}
|
2013-12-18 13:48:22 +00:00
|
|
|
return type == OpenGLSurface || type == RasterGLSurface;
|
|
|
|
}
|
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
/*!
|
|
|
|
\fn QPlatformSurface *QSurface::surfaceHandle() const
|
|
|
|
|
|
|
|
Returns a handle to the platform-specific implementation of the surface.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\fn SurfaceType QSurface::surfaceType() const
|
|
|
|
|
|
|
|
Returns the type of the surface.
|
2012-01-19 11:51:43 +00:00
|
|
|
*/
|
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
/*!
|
|
|
|
\fn QSize QSurface::size() const
|
2012-01-19 11:51:43 +00:00
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
Returns the size of the surface in pixels.
|
|
|
|
*/
|
2012-01-19 11:51:43 +00:00
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
/*!
|
|
|
|
Creates a surface with the given \a type.
|
|
|
|
*/
|
2012-01-19 11:51:43 +00:00
|
|
|
QSurface::QSurface(SurfaceClass type)
|
2019-11-22 13:46:58 +00:00
|
|
|
: m_type(type), m_reserved(nullptr)
|
2011-09-07 06:14:22 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
/*!
|
|
|
|
Destroys the surface.
|
|
|
|
*/
|
2012-04-11 23:59:39 +00:00
|
|
|
QSurface::~QSurface()
|
|
|
|
{
|
2014-05-22 11:38:17 +00:00
|
|
|
#ifndef QT_NO_OPENGL
|
|
|
|
QOpenGLContext *context = QOpenGLContext::currentContext();
|
|
|
|
if (context && context->surface() == this)
|
|
|
|
context->doneCurrent();
|
|
|
|
#endif
|
2012-04-11 23:59:39 +00:00
|
|
|
}
|
2012-01-19 11:51:43 +00:00
|
|
|
|
2012-08-17 15:51:16 +00:00
|
|
|
/*!
|
|
|
|
Returns the surface class of this surface.
|
|
|
|
*/
|
2012-01-19 11:51:43 +00:00
|
|
|
QSurface::SurfaceClass QSurface::surfaceClass() const
|
2011-09-07 06:14:22 +00:00
|
|
|
{
|
|
|
|
return m_type;
|
|
|
|
}
|
|
|
|
|
2011-09-23 13:01:04 +00:00
|
|
|
QT_END_NAMESPACE
|
2011-09-07 06:14:22 +00:00
|
|
|
|