summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorSvenn-Arne Dragly <s@dragly.com>2016-08-01 17:45:09 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-08-12 09:23:28 +0000
commitdbde2eb556ae074435a5ae8217166868999d05a8 (patch)
tree2865156be6c2cd3cfdadc1ede91729f6e59b3c30 /src/render
parent8858f42cba558c46efd5f021819ae269cf697b89 (diff)
Introduce GraphicsHelperES3, allow multiple color attachments
GraphicsHelperES2 only allows one attachment, but OpenGL ES 3.0 supports at least 4 attachments. Support for this is added by testing for ES 3.0 and using the new GraphicsHelperES3. It currently also reports reporting MRT support and propertly calls glDrawBuffers. Later more functions need to be implemented and tested to extend ES 3.0 support. Change-Id: I84f52b3de26a29b3327b99df2d1d1cf8217ab072 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/graphicshelpers/graphicscontext.cpp6
-rw-r--r--src/render/graphicshelpers/graphicshelperes2.cpp36
-rw-r--r--src/render/graphicshelpers/graphicshelperes2_p.h4
-rw-r--r--src/render/graphicshelpers/graphicshelperes3.cpp173
-rw-r--r--src/render/graphicshelpers/graphicshelperes3_p.h85
-rw-r--r--src/render/graphicshelpers/graphicshelpers.pri2
6 files changed, 276 insertions, 30 deletions
diff --git a/src/render/graphicshelpers/graphicscontext.cpp b/src/render/graphicshelpers/graphicscontext.cpp
index 77b0967d8..2fc36c306 100644
--- a/src/render/graphicshelpers/graphicscontext.cpp
+++ b/src/render/graphicshelpers/graphicscontext.cpp
@@ -70,6 +70,7 @@
#include <Qt3DRender/private/graphicshelpergl4_p.h>
#endif
#include <Qt3DRender/private/graphicshelperes2_p.h>
+#include <Qt3DRender/private/graphicshelperes3_p.h>
#include <QSurface>
#include <QWindow>
@@ -637,7 +638,10 @@ GraphicsHelperInterface *GraphicsContext::resolveHighestOpenGLFunctions()
GraphicsHelperInterface *glHelper = nullptr;
if (m_gl->isOpenGLES()) {
- glHelper = new GraphicsHelperES2();
+ if (m_gl->format().majorVersion() >= 3)
+ glHelper = new GraphicsHelperES3();
+ else
+ glHelper = new GraphicsHelperES2();
glHelper->initializeHelper(m_gl, nullptr);
qCDebug(Backend) << Q_FUNC_INFO << " Building OpenGL 2/ES2 Helper";
}
diff --git a/src/render/graphicshelpers/graphicshelperes2.cpp b/src/render/graphicshelpers/graphicshelperes2.cpp
index 6bf287cee..b09e33291 100644
--- a/src/render/graphicshelpers/graphicshelperes2.cpp
+++ b/src/render/graphicshelpers/graphicshelperes2.cpp
@@ -80,9 +80,6 @@ void GraphicsHelperES2::initializeHelper(QOpenGLContext *context,
Q_ASSERT(context);
m_funcs = context->functions();
Q_ASSERT(m_funcs);
- m_isES3 = context->format().majorVersion() >= 3;
- if (m_isES3)
- m_extraFuncs = QOpenGLContext::currentContext()->extraFunctions();
}
void GraphicsHelperES2::drawElementsInstancedBaseVertexBaseInstance(GLenum primitiveType,
@@ -99,19 +96,11 @@ void GraphicsHelperES2::drawElementsInstancedBaseVertexBaseInstance(GLenum primi
if (baseVertex != 0)
qWarning() << "glDrawElementsInstancedBaseVertex is not supported with OpenGL ES 2";
- if (m_isES3 && m_extraFuncs) {
- m_extraFuncs->glDrawElementsInstanced(primitiveType,
- primitiveCount,
- indexType,
- indices,
- instances);
- } else {
- for (GLint i = 0; i < instances; i++)
- drawElements(primitiveType,
- primitiveCount,
- indexType,
- indices);
- }
+ for (GLint i = 0; i < instances; i++)
+ drawElements(primitiveType,
+ primitiveCount,
+ indexType,
+ indices);
}
void GraphicsHelperES2::drawArraysInstanced(GLenum primitiveType,
@@ -241,8 +230,8 @@ QVector<ShaderStorageBlock> GraphicsHelperES2::programShaderStorageBlocks(GLuint
void GraphicsHelperES2::vertexAttribDivisor(GLuint index, GLuint divisor)
{
- if (m_isES3 && m_extraFuncs)
- m_extraFuncs->glVertexAttribDivisor(index, divisor);
+ Q_UNUSED(index);
+ Q_UNUSED(divisor);
}
void GraphicsHelperES2::blendEquation(GLenum mode)
@@ -365,7 +354,7 @@ bool GraphicsHelperES2::supportsFeature(GraphicsHelperInterface::Feature feature
return false;
}
}
-void GraphicsHelperES2::drawBuffers(GLsizei , const int *)
+void GraphicsHelperES2::drawBuffers(GLsizei, const int *)
{
qWarning() << "drawBuffers is not supported by ES 2.0";
}
@@ -462,13 +451,8 @@ void GraphicsHelperES2::bindUniform(const QVariant &v, const ShaderUniform &desc
case GL_SAMPLER_CUBE_SHADOW:
case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_2D_ARRAY_SHADOW:
- if (m_isES3) {
- Q_ASSERT(description.m_size == 1);
- m_funcs->glUniform1i(description.m_location, v.toInt());
- } else {
- qWarning() << Q_FUNC_INFO << "ES 3.0 uniform type" << description.m_type << "for"
- << description.m_name << "is not supported in ES 2.0";
- }
+ qWarning() << Q_FUNC_INFO << "ES 3.0 uniform type" << description.m_type << "for"
+ << description.m_name << "is not supported in ES 2.0";
break;
default:
diff --git a/src/render/graphicshelpers/graphicshelperes2_p.h b/src/render/graphicshelpers/graphicshelperes2_p.h
index 5f4413e09..df8f148a9 100644
--- a/src/render/graphicshelpers/graphicshelperes2_p.h
+++ b/src/render/graphicshelpers/graphicshelperes2_p.h
@@ -118,10 +118,8 @@ public:
uint uniformByteSize(const ShaderUniform &description) Q_DECL_OVERRIDE;
void useProgram(GLuint programId) Q_DECL_OVERRIDE;
void vertexAttribDivisor(GLuint index, GLuint divisor) Q_DECL_OVERRIDE;
-private:
+protected:
QOpenGLFunctions *m_funcs;
- QOpenGLExtraFunctions *m_extraFuncs = nullptr;
- bool m_isES3;
};
} // namespace Render
diff --git a/src/render/graphicshelpers/graphicshelperes3.cpp b/src/render/graphicshelpers/graphicshelperes3.cpp
new file mode 100644
index 000000000..fe39d9d3f
--- /dev/null
+++ b/src/render/graphicshelpers/graphicshelperes3.cpp
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2016 Svenn-Arne Dragly.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D 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$
+**
+****************************************************************************/
+
+#include "graphicshelperes3_p.h"
+#include <private/attachmentpack_p.h>
+#include <QOpenGLExtraFunctions>
+
+QT_BEGIN_NAMESPACE
+
+// ES 3.0+
+#ifndef GL_SAMPLER_3D
+#define GL_SAMPLER_3D 0x8B5F
+#endif
+#ifndef GL_SAMPLER_2D_SHADOW
+#define GL_SAMPLER_2D_SHADOW 0x8B62
+#endif
+#ifndef GL_SAMPLER_CUBE_SHADOW
+#define GL_SAMPLER_CUBE_SHADOW 0x8DC5
+#endif
+#ifndef GL_SAMPLER_2D_ARRAY
+#define GL_SAMPLER_2D_ARRAY 0x8DC1
+#endif
+#ifndef GL_SAMPLER_2D_ARRAY_SHADOW
+#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4
+#endif
+
+namespace Qt3DRender {
+namespace Render {
+
+GraphicsHelperES3::GraphicsHelperES3()
+{
+}
+
+GraphicsHelperES3::~GraphicsHelperES3()
+{
+}
+
+void GraphicsHelperES3::initializeHelper(QOpenGLContext *context,
+ QAbstractOpenGLFunctions *functions)
+{
+ GraphicsHelperES2::initializeHelper(context, functions);
+ m_extraFuncs = context->extraFunctions();
+ Q_ASSERT(m_extraFuncs);
+}
+
+void GraphicsHelperES3::drawElementsInstancedBaseVertexBaseInstance(GLenum primitiveType,
+ GLsizei primitiveCount,
+ GLint indexType,
+ void *indices,
+ GLsizei instances,
+ GLint baseVertex,
+ GLint baseInstance)
+{
+ if (baseInstance != 0)
+ qWarning() << "glDrawElementsInstancedBaseVertexBaseInstance is not supported with OpenGL ES 3";
+
+ if (baseVertex != 0)
+ qWarning() << "glDrawElementsInstancedBaseVertex is not supported with OpenGL ES 3";
+
+ m_extraFuncs->glDrawElementsInstanced(primitiveType,
+ primitiveCount,
+ indexType,
+ indices,
+ instances);
+}
+
+void GraphicsHelperES3::vertexAttribDivisor(GLuint index, GLuint divisor)
+{
+ m_extraFuncs->glVertexAttribDivisor(index, divisor);
+}
+
+void GraphicsHelperES3::bindFrameBufferAttachment(QOpenGLTexture *texture, const Attachment &attachment)
+{
+ GLenum attr = GL_COLOR_ATTACHMENT0;
+
+ if (attachment.m_point <= QRenderTargetOutput::Color15)
+ attr = GL_COLOR_ATTACHMENT0 + attachment.m_point;
+ else if (attachment.m_point == QRenderTargetOutput::Depth)
+ attr = GL_DEPTH_ATTACHMENT;
+ else if (attachment.m_point == QRenderTargetOutput::Stencil)
+ attr = GL_STENCIL_ATTACHMENT;
+ else
+ qCritical() << "Unsupported FBO attachment OpenGL ES 3.0";
+
+ texture->bind();
+ QOpenGLTexture::Target target = texture->target();
+ if (target == QOpenGLTexture::Target2D)
+ m_funcs->glFramebufferTexture2D(GL_FRAMEBUFFER, attr, target, texture->textureId(), attachment.m_mipLevel);
+ else if (target == QOpenGLTexture::TargetCubeMap)
+ m_funcs->glFramebufferTexture2D(GL_FRAMEBUFFER, attr, attachment.m_face, texture->textureId(), attachment.m_mipLevel);
+ else
+ qCritical() << "Unsupported Texture FBO attachment format";
+ texture->release();
+}
+
+bool GraphicsHelperES3::supportsFeature(GraphicsHelperInterface::Feature feature) const
+{
+ switch (feature) {
+ case RenderBufferDimensionRetrieval:
+ case MRT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void GraphicsHelperES3::drawBuffers(GLsizei n, const int *bufs)
+{
+ QVarLengthArray<GLenum, 16> drawBufs(n);
+
+ for (int i = 0; i < n; i++)
+ drawBufs[i] = GL_COLOR_ATTACHMENT0 + bufs[i];
+ m_extraFuncs->glDrawBuffers(n, drawBufs.constData());
+}
+
+void GraphicsHelperES3::bindUniform(const QVariant &v, const ShaderUniform &description)
+{
+ switch (description.m_type) {
+ case GL_SAMPLER_3D:
+ case GL_SAMPLER_2D_SHADOW:
+ case GL_SAMPLER_CUBE_SHADOW:
+ case GL_SAMPLER_2D_ARRAY:
+ case GL_SAMPLER_2D_ARRAY_SHADOW:
+ Q_ASSERT(description.m_size == 1);
+ m_funcs->glUniform1i(description.m_location, v.toInt());
+ break;
+ default:
+ GraphicsHelperES2::bindUniform(v, description);
+ break;
+ }
+}
+
+} // namespace Render
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
diff --git a/src/render/graphicshelpers/graphicshelperes3_p.h b/src/render/graphicshelpers/graphicshelperes3_p.h
new file mode 100644
index 000000000..e5bb51c53
--- /dev/null
+++ b/src/render/graphicshelpers/graphicshelperes3_p.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Copyright (C) 2016 Svenn-Arne Dragly.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D 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 QT3DRENDER_RENDER_GRAPHICSHELPERES3_H
+#define QT3DRENDER_RENDER_GRAPHICSHELPERES3_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <Qt3DRender/private/graphicshelperes2_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DRender {
+namespace Render {
+
+class GraphicsHelperES3 : public GraphicsHelperES2
+{
+public:
+ GraphicsHelperES3();
+ virtual ~GraphicsHelperES3();
+
+ // QGraphicHelperInterface interface
+ virtual void bindFrameBufferAttachment(QOpenGLTexture *texture, const Attachment &attachment) Q_DECL_OVERRIDE;
+ virtual void bindUniform(const QVariant &v, const ShaderUniform &description) Q_DECL_OVERRIDE;
+ virtual void drawBuffers(GLsizei n, const int *bufs) Q_DECL_OVERRIDE;
+ virtual void drawElementsInstancedBaseVertexBaseInstance(GLenum primitiveType, GLsizei primitiveCount, GLint indexType, void *indices, GLsizei instances, GLint baseVertex = 0, GLint baseInstance = 0) Q_DECL_OVERRIDE;
+ virtual void initializeHelper(QOpenGLContext *context, QAbstractOpenGLFunctions *functions) Q_DECL_OVERRIDE;
+ virtual bool supportsFeature(Feature feature) const Q_DECL_OVERRIDE;
+ virtual void vertexAttribDivisor(GLuint index, GLuint divisor) Q_DECL_OVERRIDE;
+protected:
+ QOpenGLExtraFunctions *m_extraFuncs = Q_NULLPTR;
+};
+
+} // namespace Render
+} // namespace Qt3DRender
+
+QT_END_NAMESPACE
+
+#endif // QT3DRENDER_RENDER_GRAPHICSHELPERES3_H
diff --git a/src/render/graphicshelpers/graphicshelpers.pri b/src/render/graphicshelpers/graphicshelpers.pri
index a5dcbe808..ecf2e6b54 100644
--- a/src/render/graphicshelpers/graphicshelpers.pri
+++ b/src/render/graphicshelpers/graphicshelpers.pri
@@ -6,6 +6,7 @@ HEADERS += \
$$PWD/graphicscontext_p.h \
$$PWD/graphicshelperinterface_p.h \
$$PWD/graphicshelperes2_p.h \
+ $$PWD/graphicshelperes3_p.h \
$$PWD/graphicshelpergl2_p.h \
$$PWD/graphicshelpergl3_p.h \
$$PWD/graphicshelpergl3_3_p.h \
@@ -14,6 +15,7 @@ HEADERS += \
SOURCES += \
$$PWD/graphicscontext.cpp \
$$PWD/graphicshelperes2.cpp \
+ $$PWD/graphicshelperes3.cpp \
$$PWD/graphicshelpergl2.cpp \
$$PWD/graphicshelpergl3.cpp \
$$PWD/graphicshelpergl3_3.cpp \