/**************************************************************************** ** ** 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 #include 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 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