diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2020-01-17 15:51:29 +0100 |
---|---|---|
committer | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2020-02-17 08:01:27 +0100 |
commit | f2bbc9c69f5265986dd5574a790e189a7a126c61 (patch) | |
tree | 77affb6415c6b276bcc3e7f17a2e663c189ef82d /src/opengl/qopenglframebufferobject.h | |
parent | bd4635009d3ba6ea560bc5f70811fa0afee518fc (diff) |
Move QOpenGLFrameBufferObject from QtGui to QtOpenGL
Task-number: QTBUG-74409
Change-Id: I817ea6f052fc61a6465d443450c8017ac5d0c0e9
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/opengl/qopenglframebufferobject.h')
-rw-r--r-- | src/opengl/qopenglframebufferobject.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/opengl/qopenglframebufferobject.h b/src/opengl/qopenglframebufferobject.h new file mode 100644 index 0000000000..da3347eaec --- /dev/null +++ b/src/opengl/qopenglframebufferobject.h @@ -0,0 +1,196 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtOpenGL module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** 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. +** +** 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. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QOPENGLFRAMEBUFFEROBJECT_H +#define QOPENGLFRAMEBUFFEROBJECT_H + +#include <QtOpenGL/qtopenglglobal.h> + +#include <QtGui/qopengl.h> +#include <QtGui/qpaintdevice.h> + +#include <QtCore/qscopedpointer.h> + +#if defined(Q_CLANG_QDOC) +#undef GLuint +typedef unsigned int GLuint; +#undef GLenum +typedef unsigned int GLenum; +#undef GL_TEXTURE_2D +#define GL_TEXTURE_2D 0x0DE1 +#undef GLbitfield +typedef unsigned int GLbitfield; +#endif + +QT_BEGIN_NAMESPACE + +class QOpenGLFramebufferObjectPrivate; +class QOpenGLFramebufferObjectFormat; + +class Q_OPENGL_EXPORT QOpenGLFramebufferObject +{ + Q_DECLARE_PRIVATE(QOpenGLFramebufferObject) +public: + enum Attachment { + NoAttachment, + CombinedDepthStencil, + Depth + }; + + explicit QOpenGLFramebufferObject(const QSize &size, GLenum target = GL_TEXTURE_2D); + QOpenGLFramebufferObject(int width, int height, GLenum target = GL_TEXTURE_2D); + + QOpenGLFramebufferObject(const QSize &size, Attachment attachment, + GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0); + QOpenGLFramebufferObject(int width, int height, Attachment attachment, + GLenum target = GL_TEXTURE_2D, GLenum internalFormat = 0); + + QOpenGLFramebufferObject(const QSize &size, const QOpenGLFramebufferObjectFormat &format); + QOpenGLFramebufferObject(int width, int height, const QOpenGLFramebufferObjectFormat &format); + + virtual ~QOpenGLFramebufferObject(); + + void addColorAttachment(const QSize &size, GLenum internalFormat = 0); + void addColorAttachment(int width, int height, GLenum internalFormat = 0); + + QOpenGLFramebufferObjectFormat format() const; + + bool isValid() const; + bool isBound() const; + bool bind(); + bool release(); + + int width() const { return size().width(); } + int height() const { return size().height(); } + + GLuint texture() const; + QVector<GLuint> textures() const; + + GLuint takeTexture(); + GLuint takeTexture(int colorAttachmentIndex); + + QSize size() const; + QVector<QSize> sizes() const; + + QImage toImage() const; + QImage toImage(bool flipped) const; + QImage toImage(bool flipped, int colorAttachmentIndex) const; + + Attachment attachment() const; + void setAttachment(Attachment attachment); + + GLuint handle() const; + + static bool bindDefault(); + + static bool hasOpenGLFramebufferObjects(); + + static bool hasOpenGLFramebufferBlit(); + + enum FramebufferRestorePolicy { + DontRestoreFramebufferBinding, + RestoreFramebufferBindingToDefault, + RestoreFrameBufferBinding + }; + + static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, + QOpenGLFramebufferObject *source, const QRect &sourceRect, + GLbitfield buffers, + GLenum filter, + int readColorAttachmentIndex, + int drawColorAttachmentIndex, + FramebufferRestorePolicy restorePolicy); + static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, + QOpenGLFramebufferObject *source, const QRect &sourceRect, + GLbitfield buffers, + GLenum filter, + int readColorAttachmentIndex, + int drawColorAttachmentIndex); + static void blitFramebuffer(QOpenGLFramebufferObject *target, const QRect &targetRect, + QOpenGLFramebufferObject *source, const QRect &sourceRect, + GLbitfield buffers = GL_COLOR_BUFFER_BIT, + GLenum filter = GL_NEAREST); + static void blitFramebuffer(QOpenGLFramebufferObject *target, + QOpenGLFramebufferObject *source, + GLbitfield buffers = GL_COLOR_BUFFER_BIT, + GLenum filter = GL_NEAREST); + +private: + Q_DISABLE_COPY(QOpenGLFramebufferObject) + QScopedPointer<QOpenGLFramebufferObjectPrivate> d_ptr; + friend class QOpenGLPaintDevice; + friend class QOpenGLFBOGLPaintDevice; +}; + +class QOpenGLFramebufferObjectFormatPrivate; +class Q_OPENGL_EXPORT QOpenGLFramebufferObjectFormat +{ +public: + QOpenGLFramebufferObjectFormat(); + QOpenGLFramebufferObjectFormat(const QOpenGLFramebufferObjectFormat &other); + QOpenGLFramebufferObjectFormat &operator=(const QOpenGLFramebufferObjectFormat &other); + ~QOpenGLFramebufferObjectFormat(); + + void setSamples(int samples); + int samples() const; + + void setMipmap(bool enabled); + bool mipmap() const; + + void setAttachment(QOpenGLFramebufferObject::Attachment attachment); + QOpenGLFramebufferObject::Attachment attachment() const; + + void setTextureTarget(GLenum target); + GLenum textureTarget() const; + + void setInternalTextureFormat(GLenum internalTextureFormat); + GLenum internalTextureFormat() const; + + bool operator==(const QOpenGLFramebufferObjectFormat& other) const; + bool operator!=(const QOpenGLFramebufferObjectFormat& other) const; + +private: + QOpenGLFramebufferObjectFormatPrivate *d; + + void detach(); +}; + +QT_END_NAMESPACE + +#endif // QOPENGLFRAMEBUFFEROBJECT_H |