blob: b8837de850d0bf89e4e61d56ae2a9fa17ab9ef10 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2008-2012 NVIDIA Corporation.
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Quick 3D.
**
** $QT_BEGIN_LICENSE:GPL$
** 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 General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) 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.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-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QSSGOPENGLUTIL_H
#define QSSGOPENGLUTIL_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick3DRender/private/qssgopengltokens_p.h>
#include <QtQuick3DRender/private/qssgrenderbasetypes_p.h>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLExtraFunctions>
#include <QVector2D>
#include <QVector3D>
#include <QVector4D>
QT_BEGIN_NAMESPACE
#if !defined(QT_OPENGL_ES)
static bool IsGlEsContext(QSSGRenderContextType inContextType)
{
QSSGRenderContextTypes esContextTypes(QSSGRenderContextType::GLES2 |
QSSGRenderContextType::GLES3 |
QSSGRenderContextType::GLES3PLUS);
return ((esContextTypes & inContextType) != 0);
}
#endif
struct GLConversion
{
GLConversion() {}
static const char *processGLError(GLenum error)
{
const char *errorString;
switch (error) {
case GL_NO_ERROR:
errorString = "GL_NO_ERROR";
break;
case GL_INVALID_ENUM:
errorString = "GL_INVALID_ENUM";
break;
case GL_INVALID_VALUE:
errorString = "GL_INVALID_VALUE";
break;
case GL_INVALID_OPERATION:
errorString = "GL_INVALID_OPERATION";
break;
case GL_INVALID_FRAMEBUFFER_OPERATION:
errorString = "GL_INVALID_FRAMEBUFFER_OPERATION";
break;
case GL_OUT_OF_MEMORY:
errorString = "GL_OUT_OF_MEMORY";
break;
default:
errorString = "Unknown GL error";
break;
}
return errorString;
}
static QSSGRenderSrcBlendFunc fromGLToSrcBlendFunc(qint32 value)
{
switch (value) {
case GL_ZERO:
return QSSGRenderSrcBlendFunc::Zero;
case GL_ONE:
return QSSGRenderSrcBlendFunc::One;
case GL_SRC_COLOR:
return QSSGRenderSrcBlendFunc::SrcColor;
case GL_ONE_MINUS_SRC_COLOR:
return QSSGRenderSrcBlendFunc::OneMinusSrcColor;
case GL_DST_COLOR:
return QSSGRenderSrcBlendFunc::DstColor;
case GL_ONE_MINUS_DST_COLOR:
return QSSGRenderSrcBlendFunc::OneMinusDstColor;
case GL_SRC_ALPHA:
return QSSGRenderSrcBlendFunc::SrcAlpha;
case GL_ONE_MINUS_SRC_ALPHA:
return QSSGRenderSrcBlendFunc::OneMinusSrcAlpha;
case GL_DST_ALPHA:
return QSSGRenderSrcBlendFunc::DstAlpha;
case GL_ONE_MINUS_DST_ALPHA:
return QSSGRenderSrcBlendFunc::OneMinusDstAlpha;
case GL_CONSTANT_COLOR:
return QSSGRenderSrcBlendFunc::ConstantColor;
case GL_ONE_MINUS_CONSTANT_COLOR:
return QSSGRenderSrcBlendFunc::OneMinusConstantColor;
case GL_CONSTANT_ALPHA:
return QSSGRenderSrcBlendFunc::ConstantAlpha;
case GL_ONE_MINUS_CONSTANT_ALPHA:
return QSSGRenderSrcBlendFunc::OneMinusConstantAlpha;
case GL_SRC_ALPHA_SATURATE:
return QSSGRenderSrcBlendFunc::SrcAlphaSaturate;
default:
Q_ASSERT(false);
return QSSGRenderSrcBlendFunc::Unknown;
}
}
static GLenum fromSrcBlendFuncToGL(QSSGRenderSrcBlendFunc value)
{
switch (value) {
case QSSGRenderSrcBlendFunc::Zero:
return GL_ZERO;
case QSSGRenderSrcBlendFunc::One:
return GL_ONE;
case QSSGRenderSrcBlendFunc::SrcColor:
return GL_SRC_COLOR;
case QSSGRenderSrcBlendFunc::OneMinusSrcColor:
return GL_ONE_MINUS_SRC_COLOR;
case QSSGRenderSrcBlendFunc::DstColor:
return GL_DST_COLOR;
case QSSGRenderSrcBlendFunc::OneMinusDstColor:
return GL_ONE_MINUS_DST_COLOR;
case QSSGRenderSrcBlendFunc::SrcAlpha:
return GL_SRC_ALPHA;
case QSSGRenderSrcBlendFunc::OneMinusSrcAlpha:
return GL_ONE_MINUS_SRC_ALPHA;
case QSSGRenderSrcBlendFunc::DstAlpha:
return GL_DST_ALPHA;
case QSSGRenderSrcBlendFunc::OneMinusDstAlpha:
return GL_ONE_MINUS_DST_ALPHA;
case QSSGRenderSrcBlendFunc::ConstantColor:
return GL_CONSTANT_COLOR;
case QSSGRenderSrcBlendFunc::OneMinusConstantColor:
return GL_ONE_MINUS_CONSTANT_COLOR;
case QSSGRenderSrcBlendFunc::ConstantAlpha:
return GL_CONSTANT_ALPHA;
case QSSGRenderSrcBlendFunc::OneMinusConstantAlpha:
return GL_ONE_MINUS_CONSTANT_ALPHA;
case QSSGRenderSrcBlendFunc::SrcAlphaSaturate:
return GL_SRC_ALPHA_SATURATE;
default:
Q_ASSERT(false);
return 0;
}
}
static QSSGRenderDstBlendFunc fromGLToDstBlendFunc(qint32 value)
{
switch (value) {
case GL_ZERO:
return QSSGRenderDstBlendFunc::Zero;
case GL_ONE:
return QSSGRenderDstBlendFunc::One;
case GL_SRC_COLOR:
return QSSGRenderDstBlendFunc::SrcColor;
case GL_ONE_MINUS_SRC_COLOR:
return QSSGRenderDstBlendFunc::OneMinusSrcColor;
case GL_DST_COLOR:
return QSSGRenderDstBlendFunc::DstColor;
case GL_ONE_MINUS_DST_COLOR:
return QSSGRenderDstBlendFunc::OneMinusDstColor;
case GL_SRC_ALPHA:
return QSSGRenderDstBlendFunc::SrcAlpha;
case GL_ONE_MINUS_SRC_ALPHA:
return QSSGRenderDstBlendFunc::OneMinusSrcAlpha;
case GL_DST_ALPHA:
return QSSGRenderDstBlendFunc::DstAlpha;
case GL_ONE_MINUS_DST_ALPHA:
return QSSGRenderDstBlendFunc::OneMinusDstAlpha;
case GL_CONSTANT_COLOR:
return QSSGRenderDstBlendFunc::ConstantColor;
case GL_ONE_MINUS_CONSTANT_COLOR:
return QSSGRenderDstBlendFunc::OneMinusConstantColor;
case GL_CONSTANT_ALPHA:
return QSSGRenderDstBlendFunc::ConstantAlpha;
case GL_ONE_MINUS_CONSTANT_ALPHA:
return QSSGRenderDstBlendFunc::OneMinusConstantAlpha;
default:
Q_ASSERT(false);
return QSSGRenderDstBlendFunc::Unknown;
}
}
static GLenum fromDstBlendFuncToGL(QSSGRenderDstBlendFunc value)
{
switch (value) {
case QSSGRenderDstBlendFunc::Zero:
return GL_ZERO;
case QSSGRenderDstBlendFunc::One:
return GL_ONE;
case QSSGRenderDstBlendFunc::SrcColor:
return GL_SRC_COLOR;
case QSSGRenderDstBlendFunc::OneMinusSrcColor:
return GL_ONE_MINUS_SRC_COLOR;
case QSSGRenderDstBlendFunc::DstColor:
return GL_DST_COLOR;
case QSSGRenderDstBlendFunc::OneMinusDstColor:
return GL_ONE_MINUS_DST_COLOR;
case QSSGRenderDstBlendFunc::SrcAlpha:
return GL_SRC_ALPHA;
case QSSGRenderDstBlendFunc::OneMinusSrcAlpha:
return GL_ONE_MINUS_SRC_ALPHA;
case QSSGRenderDstBlendFunc::DstAlpha:
return GL_DST_ALPHA;
case QSSGRenderDstBlendFunc::OneMinusDstAlpha:
return GL_ONE_MINUS_DST_ALPHA;
case QSSGRenderDstBlendFunc::ConstantColor:
return GL_CONSTANT_COLOR;
case QSSGRenderDstBlendFunc::OneMinusConstantColor:
return GL_ONE_MINUS_CONSTANT_COLOR;
case QSSGRenderDstBlendFunc::ConstantAlpha:
return GL_CONSTANT_ALPHA;
case QSSGRenderDstBlendFunc::OneMinusConstantAlpha:
return GL_ONE_MINUS_CONSTANT_ALPHA;
default:
Q_ASSERT(false);
return 0;
}
}
static GLenum fromBlendEquationToGL(QSSGRenderBlendEquation value, bool nvAdvancedBlendSupported, bool khrAdvancedBlendSupported)
{
switch (value) {
case QSSGRenderBlendEquation::Add:
return GL_FUNC_ADD;
case QSSGRenderBlendEquation::Subtract:
return GL_FUNC_SUBTRACT;
case QSSGRenderBlendEquation::ReverseSubtract:
return GL_FUNC_REVERSE_SUBTRACT;
default:
Q_ASSERT(nvAdvancedBlendSupported || khrAdvancedBlendSupported);
break;
}
if (nvAdvancedBlendSupported) {
switch (value) {
case QSSGRenderBlendEquation::Overlay:
return GL_OVERLAY_NV;
case QSSGRenderBlendEquation::ColorBurn:
return GL_COLORBURN_NV;
case QSSGRenderBlendEquation::ColorDodge:
return GL_COLORDODGE_NV;
default:
break;
}
}
#if defined(GL_KHR_blend_equation_advanced)
if (khrAdvancedBlendSupported) {
switch (value) {
case QSSGRenderBlendEquation::Overlay:
return GL_OVERLAY_KHR;
case QSSGRenderBlendEquation::ColorBurn:
return GL_COLORBURN_KHR;
case QSSGRenderBlendEquation::ColorDodge:
return GL_COLORDODGE_KHR;
default:
break;
}
}
#endif
Q_ASSERT(false);
return GL_FUNC_ADD;
}
static QSSGCullFaceMode fromGLToCullFaceMode(GLenum value)
{
switch (value) {
case GL_FRONT:
return QSSGCullFaceMode::Front;
case GL_BACK:
return QSSGCullFaceMode::Back;
case GL_FRONT_AND_BACK:
return QSSGCullFaceMode::FrontAndBack;
default:
break;
}
Q_ASSERT(false);
return QSSGCullFaceMode::Unknown;
}
static GLenum fromCullFaceModeToGL(QSSGCullFaceMode value)
{
switch (value) {
case QSSGCullFaceMode::Front:
return GL_FRONT;
case QSSGCullFaceMode::Back:
return GL_BACK;
case QSSGCullFaceMode::FrontAndBack:
return GL_FRONT_AND_BACK;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGReadFace fromGLToReadFaces(GLenum value)
{
switch (value) {
case GL_FRONT:
return QSSGReadFace::Front;
case GL_BACK:
return QSSGReadFace::Back;
case GL_COLOR_ATTACHMENT0:
return QSSGReadFace::Color0;
case GL_COLOR_ATTACHMENT1:
return QSSGReadFace::Color1;
case GL_COLOR_ATTACHMENT2:
return QSSGReadFace::Color2;
case GL_COLOR_ATTACHMENT3:
return QSSGReadFace::Color3;
case GL_COLOR_ATTACHMENT4:
return QSSGReadFace::Color4;
case GL_COLOR_ATTACHMENT5:
return QSSGReadFace::Color5;
case GL_COLOR_ATTACHMENT6:
return QSSGReadFace::Color6;
case GL_COLOR_ATTACHMENT7:
return QSSGReadFace::Color7;
default:
break;
}
Q_ASSERT(false);
return QSSGReadFace::Unknown;
}
static GLenum fromReadFacesToGL(QSSGReadFace value)
{
switch (value) {
case QSSGReadFace::Front:
return GL_FRONT;
case QSSGReadFace::Back:
return GL_BACK;
case QSSGReadFace::Color0:
return GL_COLOR_ATTACHMENT0;
case QSSGReadFace::Color1:
return GL_COLOR_ATTACHMENT1;
case QSSGReadFace::Color2:
return GL_COLOR_ATTACHMENT2;
case QSSGReadFace::Color3:
return GL_COLOR_ATTACHMENT3;
case QSSGReadFace::Color4:
return GL_COLOR_ATTACHMENT4;
case QSSGReadFace::Color5:
return GL_COLOR_ATTACHMENT5;
case QSSGReadFace::Color6:
return GL_COLOR_ATTACHMENT6;
case QSSGReadFace::Color7:
return GL_COLOR_ATTACHMENT7;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderWinding fromGLToWinding(GLenum value)
{
switch (value) {
case GL_CW:
return QSSGRenderWinding::Clockwise;
case GL_CCW:
return QSSGRenderWinding::CounterClockwise;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderWinding::Unknown;
}
static GLenum fromWindingToGL(QSSGRenderWinding value)
{
switch (value) {
case QSSGRenderWinding::Clockwise:
return GL_CW;
case QSSGRenderWinding::CounterClockwise:
return GL_CCW;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderBoolOp fromGLToBoolOp(GLenum value)
{
switch (value) {
case GL_NEVER:
return QSSGRenderBoolOp::Never;
case GL_LESS:
return QSSGRenderBoolOp::Less;
case GL_EQUAL:
return QSSGRenderBoolOp::Equal;
case GL_LEQUAL:
return QSSGRenderBoolOp::LessThanOrEqual;
case GL_GREATER:
return QSSGRenderBoolOp::Greater;
case GL_NOTEQUAL:
return QSSGRenderBoolOp::NotEqual;
case GL_GEQUAL:
return QSSGRenderBoolOp::GreaterThanOrEqual;
case GL_ALWAYS:
return QSSGRenderBoolOp::AlwaysTrue;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderBoolOp::Unknown;
}
static GLenum fromBoolOpToGL(QSSGRenderBoolOp value)
{
switch (value) {
case QSSGRenderBoolOp::Never:
return GL_NEVER;
case QSSGRenderBoolOp::Less:
return GL_LESS;
case QSSGRenderBoolOp::Equal:
return GL_EQUAL;
case QSSGRenderBoolOp::LessThanOrEqual:
return GL_LEQUAL;
case QSSGRenderBoolOp::Greater:
return GL_GREATER;
case QSSGRenderBoolOp::NotEqual:
return GL_NOTEQUAL;
case QSSGRenderBoolOp::GreaterThanOrEqual:
return GL_GEQUAL;
case QSSGRenderBoolOp::AlwaysTrue:
return GL_ALWAYS;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderHint fromGLToHint(GLenum value)
{
switch (value) {
case GL_FASTEST:
return QSSGRenderHint::Fastest;
case GL_NICEST:
return QSSGRenderHint::Nicest;
case GL_DONT_CARE:
return QSSGRenderHint::Unspecified;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderHint::Unknown;
}
static GLenum fromHintToGL(QSSGRenderHint value)
{
switch (value) {
case QSSGRenderHint::Fastest:
return GL_FASTEST;
case QSSGRenderHint::Nicest:
return GL_NICEST;
case QSSGRenderHint::Unspecified:
return GL_DONT_CARE;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderStencilOp fromGLToStencilOp(GLenum value)
{
switch (value) {
case GL_KEEP:
return QSSGRenderStencilOp::Keep;
case GL_ZERO:
return QSSGRenderStencilOp::Zero;
case GL_REPLACE:
return QSSGRenderStencilOp::Replace;
case GL_INCR:
return QSSGRenderStencilOp::Increment;
case GL_INCR_WRAP:
return QSSGRenderStencilOp::IncrementWrap;
case GL_DECR:
return QSSGRenderStencilOp::Decrement;
case GL_DECR_WRAP:
return QSSGRenderStencilOp::DecrementWrap;
case GL_INVERT:
return QSSGRenderStencilOp::Invert;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderStencilOp::Unknown;
}
static GLenum fromStencilOpToGL(QSSGRenderStencilOp value)
{
switch (value) {
case QSSGRenderStencilOp::Keep:
return GL_KEEP;
case QSSGRenderStencilOp::Zero:
return GL_ZERO;
case QSSGRenderStencilOp::Replace:
return GL_REPLACE;
case QSSGRenderStencilOp::Increment:
return GL_INCR;
case QSSGRenderStencilOp::IncrementWrap:
return GL_INCR_WRAP;
case QSSGRenderStencilOp::Decrement:
return GL_DECR;
case QSSGRenderStencilOp::DecrementWrap:
return GL_DECR_WRAP;
case QSSGRenderStencilOp::Invert:
return GL_INVERT;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderComponentType fromGLToBufferComponentTypes(GLenum value)
{
switch (value) {
case GL_UNSIGNED_BYTE:
return QSSGRenderComponentType::UnsignedInteger8;
case GL_BYTE:
return QSSGRenderComponentType::Integer8;
case GL_UNSIGNED_SHORT:
return QSSGRenderComponentType::UnsignedInteger16;
case GL_SHORT:
return QSSGRenderComponentType::Integer16;
case GL_UNSIGNED_INT:
return QSSGRenderComponentType::UnsignedInteger32;
case GL_FLOAT:
return QSSGRenderComponentType::Float32;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderComponentType::Unknown;
}
static GLenum fromBufferComponentTypesToGL(QSSGRenderComponentType value)
{
switch (value) {
case QSSGRenderComponentType::UnsignedInteger8:
return GL_UNSIGNED_BYTE;
case QSSGRenderComponentType::Integer8:
return GL_BYTE;
case QSSGRenderComponentType::UnsignedInteger16:
return GL_UNSIGNED_SHORT;
case QSSGRenderComponentType::Integer16:
return GL_SHORT;
case QSSGRenderComponentType::UnsignedInteger32:
return GL_UNSIGNED_INT;
case QSSGRenderComponentType::Integer32:
return GL_INT;
case QSSGRenderComponentType::Float32:
return GL_FLOAT;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static GLenum fromIndexBufferComponentsTypesToGL(QSSGRenderComponentType value)
{
switch (value) {
case QSSGRenderComponentType::UnsignedInteger8:
return GL_UNSIGNED_BYTE;
case QSSGRenderComponentType::UnsignedInteger16:
return GL_UNSIGNED_SHORT;
case QSSGRenderComponentType::UnsignedInteger32:
return GL_UNSIGNED_INT;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static GLenum fromBindBufferFlagsToGL(QSSGRenderBufferType type)
{
switch(type) {
case QSSGRenderBufferType::Vertex:
return GL_ARRAY_BUFFER;
case QSSGRenderBufferType::Index:
return GL_ELEMENT_ARRAY_BUFFER;
case QSSGRenderBufferType::Constant:
return GL_UNIFORM_BUFFER;
case QSSGRenderBufferType::Storage:
return GL_SHADER_STORAGE_BUFFER;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderBufferType fromGLToBindBufferFlags(GLenum value)
{
switch (value) {
case GL_ARRAY_BUFFER:
return QSSGRenderBufferType::Vertex;
case GL_ELEMENT_ARRAY_BUFFER:
return QSSGRenderBufferType::Index;
case GL_UNIFORM_BUFFER:
return QSSGRenderBufferType::Constant;
case GL_SHADER_STORAGE_BUFFER:
return QSSGRenderBufferType::Storage;
default:
Q_UNREACHABLE();
}
return QSSGRenderBufferType(0);
}
static QSSGRenderBufferUsageType fromGLToBufferUsageType(GLenum value)
{
switch (value) {
case GL_STATIC_DRAW:
return QSSGRenderBufferUsageType::Static;
case GL_DYNAMIC_DRAW:
return QSSGRenderBufferUsageType::Dynamic;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderBufferUsageType::Unknown;
}
static GLenum fromBufferUsageTypeToGL(QSSGRenderBufferUsageType value)
{
switch (value) {
case QSSGRenderBufferUsageType::Static:
return GL_STATIC_DRAW;
case QSSGRenderBufferUsageType::Dynamic:
return GL_DYNAMIC_DRAW;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static GLenum fromQueryTypeToGL(QSSGRenderQueryType type)
{
GLenum retval = GL_INVALID_ENUM;
if (type == QSSGRenderQueryType::Samples)
retval = GL_ANY_SAMPLES_PASSED;
#if defined(GL_TIME_ELAPSED)
else if (type == QSSGRenderQueryType::Timer)
retval = GL_TIME_ELAPSED;
#elif defined(GL_TIME_ELAPSED_EXT)
else if (type == QSSGRenderQueryType::Timer)
retval = GL_TIME_ELAPSED_EXT;
#endif
else
Q_ASSERT(false);
return retval;
}
static GLenum fromQueryResultTypeToGL(QSSGRenderQueryResultType type)
{
GLenum retval = GL_INVALID_ENUM;
if (type == QSSGRenderQueryResultType::ResultAvailable)
retval = GL_QUERY_RESULT_AVAILABLE;
else if (type == QSSGRenderQueryResultType::Result)
retval = GL_QUERY_RESULT;
else
Q_ASSERT(false);
return retval;
}
static GLenum fromSyncTypeToGL(QSSGRenderSyncType type)
{
GLenum retval = GL_INVALID_ENUM;
if (type == QSSGRenderSyncType::GpuCommandsComplete)
retval = GL_SYNC_GPU_COMMANDS_COMPLETE;
else
Q_ASSERT(false);
return retval;
}
static QSSGRenderTextureFormat replaceDeprecatedTextureFormat(QSSGRenderContextType type,
QSSGRenderTextureFormat value,
QSSGRenderTextureSwizzleMode &swizzleMode)
{
QSSGRenderContextTypes deprecatedContextFlags(QSSGRenderContextType::GL2 | QSSGRenderContextType::GLES2);
QSSGRenderTextureFormat newValue = value;
swizzleMode = QSSGRenderTextureSwizzleMode::NoSwizzle;
if (!(deprecatedContextFlags & type)) {
switch (value.format) {
case QSSGRenderTextureFormat::Luminance8:
newValue = QSSGRenderTextureFormat::R8;
swizzleMode = QSSGRenderTextureSwizzleMode::L8toR8;
break;
case QSSGRenderTextureFormat::LuminanceAlpha8:
newValue = QSSGRenderTextureFormat::RG8;
swizzleMode = QSSGRenderTextureSwizzleMode::L8A8toRG8;
break;
case QSSGRenderTextureFormat::Alpha8:
newValue = QSSGRenderTextureFormat::R8;
swizzleMode = QSSGRenderTextureSwizzleMode::A8toR8;
break;
case QSSGRenderTextureFormat::Luminance16:
newValue = QSSGRenderTextureFormat::R16;
swizzleMode = QSSGRenderTextureSwizzleMode::L16toR16;
break;
default:
break;
}
}
return newValue;
}
static void NVRenderConvertSwizzleModeToGL(const QSSGRenderTextureSwizzleMode swizzleMode, GLint glSwizzle[4])
{
switch (swizzleMode) {
case QSSGRenderTextureSwizzleMode::L16toR16:
case QSSGRenderTextureSwizzleMode::L8toR8:
glSwizzle[0] = GL_RED;
glSwizzle[1] = GL_RED;
glSwizzle[2] = GL_RED;
glSwizzle[3] = GL_ONE;
break;
case QSSGRenderTextureSwizzleMode::L8A8toRG8:
glSwizzle[0] = GL_RED;
glSwizzle[1] = GL_RED;
glSwizzle[2] = GL_RED;
glSwizzle[3] = GL_GREEN;
break;
case QSSGRenderTextureSwizzleMode::A8toR8:
glSwizzle[0] = GL_ZERO;
glSwizzle[1] = GL_ZERO;
glSwizzle[2] = GL_ZERO;
glSwizzle[3] = GL_RED;
break;
case QSSGRenderTextureSwizzleMode::NoSwizzle:
default:
glSwizzle[0] = GL_RED;
glSwizzle[1] = GL_GREEN;
glSwizzle[2] = GL_BLUE;
glSwizzle[3] = GL_ALPHA;
break;
}
}
#ifndef GL_ALPHA8
#define GL_ALPHA8 0x803C
#endif
#ifndef GL_LUMINANCE8
#define GL_LUMINANCE8 0x8040
#endif
#ifndef GL_LUMINANCE16
#define GL_LUMINANCE16 0x8042
#endif
#ifndef GL_LUMINANCE8_ALPHA8
#define GL_LUMINANCE8_ALPHA8 0x8045
#endif
#ifndef GL_DEPTH_COMPONENT32
#define GL_DEPTH_COMPONENT32 0x81A7
#endif
static QSSGRenderTextureFormat fromGLtoTextureFormat(GLenum internalFormat)
{
switch (internalFormat) {
case GL_R8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R8);
case GL_R16:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R16);
case GL_R16F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R16F);
case GL_R32I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R32I);
case GL_R32UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R32UI);
case GL_R32F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R32F);
case GL_RG8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RG8);
case GL_RGBA8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA8);
case GL_RGB8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8);
case GL_SRGB8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8);
case GL_SRGB8_ALPHA8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8A8);
case GL_RGB565:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB565);
case GL_ALPHA8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Alpha8);
case GL_LUMINANCE8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Luminance8);
case GL_LUMINANCE16:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Luminance16);
case GL_LUMINANCE8_ALPHA8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::LuminanceAlpha8);
case GL_RGBA16F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA16F);
case GL_RG16F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RG16F);
case GL_RG32F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RG32F);
case GL_RGB32F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB32F);
case GL_RGBA32F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA32F);
case GL_R11F_G11F_B10F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R11G11B10);
case GL_RGB9_E5:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB9E5);
case GL_RGB10_A2:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB10_A2);
case GL_RGB16F:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB16F);
case GL_RGBA32UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA32UI);
case GL_RGB32UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB32UI);
case GL_RGBA16UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA16UI);
case GL_RGB16UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB16UI);
case GL_RGBA8UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA8UI);
case GL_RGB8UI:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8UI);
case GL_RGBA32I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA32I);
case GL_RGB32I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB32I);
case GL_RGBA16I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA16I);
case GL_RGB16I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB16I);
case GL_RGBA8I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA8I);
case GL_RGB8I:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8I);
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_DXT1);
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB_DXT1);
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_DXT3);
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_DXT5);
case GL_COMPRESSED_R11_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R11_EAC_UNorm);
case GL_COMPRESSED_SIGNED_R11_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::R11_EAC_SNorm);
case GL_COMPRESSED_RG11_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RG11_EAC_UNorm);
case GL_COMPRESSED_SIGNED_RG11_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RG11_EAC_SNorm);
case GL_COMPRESSED_RGB8_ETC2:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8_ETC2);
case GL_COMPRESSED_SRGB8_ETC2:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_ETC2);
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8_PunchThrough_Alpha1_ETC2);
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_PunchThrough_Alpha1_ETC2);
case GL_COMPRESSED_RGBA8_ETC2_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA8_ETC2_EAC);
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ETC2_EAC);
// case GL_ETC1_RGB8_OES:
// return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGB8_ETC1);
case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_4x4);
case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_5x4);
case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_5x5);
case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_6x5);
case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_6x6);
case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_8x5);
case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_8x6);
case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_8x8);
case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_10x5);
case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_10x6);
case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_10x8);
case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_10x10);
case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_12x10);
case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::RGBA_ASTC_12x12);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_4x4);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_5x4);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_5x5);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_6x5);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_6x6);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x5);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x6);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x8);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x5);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x6);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x8);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x10);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_12x10);
case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_12x12);
case GL_DEPTH_COMPONENT16:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Depth16);
case GL_DEPTH_COMPONENT24:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Depth24);
case GL_DEPTH_COMPONENT32:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Depth32);
case GL_DEPTH24_STENCIL8:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Depth24Stencil8);
default:
return QSSGRenderTextureFormat(QSSGRenderTextureFormat::Unknown);
}
}
static bool fromUncompressedTextureFormatToGL(QSSGRenderContextType type,
QSSGRenderTextureFormat value,
GLenum &outFormat,
GLenum &outDataType,
GLenum &outInternalFormat)
{
switch (value.format) {
case QSSGRenderTextureFormat::R8:
if (type == QSSGRenderContextType::GLES2) {
outFormat = GL_ALPHA;
outInternalFormat = GL_ALPHA;
} else {
outFormat = GL_RED;
outInternalFormat = GL_R8;
}
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RG8:
outFormat = GL_RG;
outInternalFormat = GL_RG8;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RGBE8:
case QSSGRenderTextureFormat::RGBA8:
outFormat = GL_RGBA;
outInternalFormat = GL_RGBA8;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RGB8:
outFormat = GL_RGB;
outInternalFormat = GL_RGB8;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RGB565:
outFormat = GL_RGB;
outInternalFormat = GL_RGB8;
outDataType = GL_UNSIGNED_SHORT_5_6_5;
return true;
case QSSGRenderTextureFormat::RGBA5551:
outFormat = GL_RGBA;
outInternalFormat = GL_RGBA8;
outDataType = GL_UNSIGNED_SHORT_5_5_5_1;
return true;
case QSSGRenderTextureFormat::Alpha8:
outFormat = GL_ALPHA;
outInternalFormat = GL_ALPHA;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::Luminance8:
outFormat = GL_LUMINANCE;
outInternalFormat = GL_LUMINANCE;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::LuminanceAlpha8:
outFormat = GL_LUMINANCE_ALPHA;
outInternalFormat = GL_LUMINANCE_ALPHA;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::Luminance16:
#if defined(QT_OPENGL_ES)
outFormat = GL_LUMINANCE16F_EXT;
outInternalFormat = GL_LUMINANCE16F_EXT;
#else
outFormat = GL_LUMINANCE;
outInternalFormat = GL_LUMINANCE;
#endif
outDataType = GL_UNSIGNED_INT;
return true;
case QSSGRenderTextureFormat::RGB10_A2:
outFormat = GL_RGBA;
outInternalFormat = GL_RGB10_A2;
outDataType = GL_UNSIGNED_INT_10_10_10_2;
return true;
case QSSGRenderTextureFormat::RGB16F:
outFormat = GL_RGB;
outInternalFormat = GL_RGB16F;
outDataType = GL_HALF_FLOAT;
return true;
case QSSGRenderTextureFormat::RGBA32UI:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA32UI;
outDataType = GL_UNSIGNED_INT;
return true;
case QSSGRenderTextureFormat::RGB32UI:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB32UI;
outDataType = GL_UNSIGNED_INT;
return true;
case QSSGRenderTextureFormat::RGBA16UI:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA16UI;
outDataType = GL_UNSIGNED_SHORT;
return true;
case QSSGRenderTextureFormat::RGB16UI:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB16UI;
outDataType = GL_UNSIGNED_SHORT;
return true;
case QSSGRenderTextureFormat::RGBA8UI:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA8UI;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RGB8UI:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB8UI;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::RGBA32I:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA32I;
outDataType = GL_INT;
return true;
case QSSGRenderTextureFormat::RGB32I:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB32I;
outDataType = GL_INT;
return true;
case QSSGRenderTextureFormat::RGBA16I:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA16I;
outDataType = GL_SHORT;
return true;
case QSSGRenderTextureFormat::RGB16I:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB16I;
outDataType = GL_SHORT;
return true;
case QSSGRenderTextureFormat::RGBA8I:
outFormat = GL_RGBA_INTEGER;
outInternalFormat = GL_RGBA8I;
outDataType = GL_BYTE;
return true;
case QSSGRenderTextureFormat::RGB8I:
outFormat = GL_RGB_INTEGER;
outInternalFormat = GL_RGB8I;
outDataType = GL_BYTE;
return true;
default:
break;
}
QSSGRenderContextTypes contextFlags(QSSGRenderContextType::GL2 | QSSGRenderContextType::GLES2);
// check extented texture formats
if (!(contextFlags & type)) {
switch (value.format) {
#if !defined(QT_OPENGL_ES)
case QSSGRenderTextureFormat::R16: {
if (IsGlEsContext(type)) {
outFormat = GL_RED_INTEGER;
outInternalFormat = GL_R16UI;
} else {
outFormat = GL_RED;
outInternalFormat = GL_R16;
}
outDataType = GL_UNSIGNED_SHORT;
return true;
}
#endif
case QSSGRenderTextureFormat::R16F:
outFormat = GL_RED;
outInternalFormat = GL_R16F;
outDataType = GL_HALF_FLOAT;
return true;
case QSSGRenderTextureFormat::R32UI:
outFormat = GL_RED_INTEGER;
outInternalFormat = GL_R32UI;
outDataType = GL_UNSIGNED_INT;
return true;
case QSSGRenderTextureFormat::R32F:
outFormat = GL_RED;
outInternalFormat = GL_R32F;
outDataType = GL_FLOAT;
return true;
case QSSGRenderTextureFormat::RGBA16F:
outFormat = GL_RGBA;
outInternalFormat = GL_RGBA16F;
outDataType = GL_HALF_FLOAT;
return true;
case QSSGRenderTextureFormat::RG16F:
outFormat = GL_RG;
outInternalFormat = GL_RG16F;
outDataType = GL_HALF_FLOAT;
return true;
case QSSGRenderTextureFormat::RG32F:
outFormat = GL_RG;
outInternalFormat = GL_RG32F;
outDataType = GL_FLOAT;
return true;
case QSSGRenderTextureFormat::RGBA32F:
outFormat = GL_RGBA;
outInternalFormat = GL_RGBA32F;
outDataType = GL_FLOAT;
return true;
case QSSGRenderTextureFormat::RGB32F:
outFormat = GL_RGB;
outInternalFormat = GL_RGB32F;
outDataType = GL_FLOAT;
return true;
case QSSGRenderTextureFormat::R11G11B10:
outFormat = GL_RGB;
outInternalFormat = GL_R11F_G11F_B10F;
outDataType = GL_UNSIGNED_INT_10F_11F_11F_REV;
return true;
case QSSGRenderTextureFormat::RGB9E5:
outFormat = GL_RGB;
outInternalFormat = GL_RGB9_E5;
outDataType = GL_UNSIGNED_INT_5_9_9_9_REV;
return true;
case QSSGRenderTextureFormat::SRGB8:
outFormat = GL_RGB;
outInternalFormat = GL_SRGB8;
outDataType = GL_UNSIGNED_BYTE;
return true;
case QSSGRenderTextureFormat::SRGB8A8:
outFormat = GL_RGBA;
outInternalFormat = GL_SRGB8_ALPHA8;
outDataType = GL_UNSIGNED_BYTE;
return true;
default:
break;
}
}
Q_ASSERT(false);
return false;
}
static GLenum fromCompressedTextureFormatToGL(QSSGRenderTextureFormat value)
{
switch (value.format) {
case QSSGRenderTextureFormat::RGBA_DXT1:
return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
case QSSGRenderTextureFormat::RGB_DXT1:
return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
case QSSGRenderTextureFormat::RGBA_DXT3:
return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
case QSSGRenderTextureFormat::RGBA_DXT5:
return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
case QSSGRenderTextureFormat::R11_EAC_UNorm:
return GL_COMPRESSED_R11_EAC;
case QSSGRenderTextureFormat::R11_EAC_SNorm:
return GL_COMPRESSED_SIGNED_R11_EAC;
case QSSGRenderTextureFormat::RG11_EAC_UNorm:
return GL_COMPRESSED_RG11_EAC;
case QSSGRenderTextureFormat::RG11_EAC_SNorm:
return GL_COMPRESSED_SIGNED_RG11_EAC;
case QSSGRenderTextureFormat::RGB8_ETC2:
return GL_COMPRESSED_RGB8_ETC2;
case QSSGRenderTextureFormat::SRGB8_ETC2:
return GL_COMPRESSED_SRGB8_ETC2;
case QSSGRenderTextureFormat::RGB8_PunchThrough_Alpha1_ETC2:
return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
case QSSGRenderTextureFormat::SRGB8_PunchThrough_Alpha1_ETC2:
return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
case QSSGRenderTextureFormat::RGBA8_ETC2_EAC:
return GL_COMPRESSED_RGBA8_ETC2_EAC;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ETC2_EAC:
return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
// case QSSGRenderTextureFormat::RGB8_ETC1:
// return GL_ETC1_RGB8_OES;
case QSSGRenderTextureFormat::RGBA_ASTC_4x4:
return GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_5x4:
return GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_5x5:
return GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_6x5:
return GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_6x6:
return GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_8x5:
return GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_8x6:
return GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_8x8:
return GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_10x5:
return GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_10x6:
return GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_10x8:
return GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_10x10:
return GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_12x10:
return GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
case QSSGRenderTextureFormat::RGBA_ASTC_12x12:
return GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_4x4:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_5x4:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_5x5:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_6x5:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_6x6:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x5:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x6:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_8x8:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x5:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x6:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x8:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_10x10:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_12x10:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
case QSSGRenderTextureFormat::SRGB8_Alpha8_ASTC_12x12:
return GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static bool fromDepthTextureFormatToGL(QSSGRenderContextType type,
QSSGRenderTextureFormat value,
GLenum &outFormat,
GLenum &outDataType,
GLenum &outInternalFormat)
{
QSSGRenderContextTypes theContextFlags(QSSGRenderContextType::GLES2 | QSSGRenderContextType::GL2);
bool supportDepth24 = !(theContextFlags & type);
bool supportDepth32f = !(theContextFlags & type);
bool supportDepth24Stencil8 = !(theContextFlags & type);
switch (value.format) {
case QSSGRenderTextureFormat::Depth16:
outFormat = GL_DEPTH_COMPONENT;
outInternalFormat = GL_DEPTH_COMPONENT16;
outDataType = GL_UNSIGNED_SHORT;
return true;
case QSSGRenderTextureFormat::Depth24:
outFormat = GL_DEPTH_COMPONENT;
outInternalFormat = (supportDepth24) ? GL_DEPTH_COMPONENT24 : GL_DEPTH_COMPONENT16;
outDataType = (supportDepth24) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;
return true;
case QSSGRenderTextureFormat::Depth32:
outFormat = GL_DEPTH_COMPONENT;
outInternalFormat = (supportDepth32f) ? GL_DEPTH_COMPONENT32F : GL_DEPTH_COMPONENT16;
outDataType = (supportDepth32f) ? GL_FLOAT : GL_UNSIGNED_SHORT;
return true;
case QSSGRenderTextureFormat::Depth24Stencil8:
outFormat = (supportDepth24Stencil8) ? GL_DEPTH_STENCIL : GL_DEPTH_COMPONENT;
outInternalFormat = (supportDepth24Stencil8) ? GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16;
outDataType = (supportDepth24Stencil8) ? GL_UNSIGNED_INT_24_8 : GL_UNSIGNED_SHORT;
return true;
default:
break;
}
Q_ASSERT(false);
return false;
}
static GLenum fromTextureTargetToGL(QSSGRenderTextureTargetType value)
{
GLenum retval = 0;
if (value == QSSGRenderTextureTargetType::Texture2D)
retval = GL_TEXTURE_2D;
else if (value == QSSGRenderTextureTargetType::Texture2D_MS)
retval = GL_TEXTURE_2D_MULTISAMPLE;
else if (value == QSSGRenderTextureTargetType::TextureCube)
retval = GL_TEXTURE_CUBE_MAP;
else if (value == QSSGRenderTextureTargetType::TextureCubeNegX)
retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
else if (value == QSSGRenderTextureTargetType::TextureCubePosX)
retval = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
else if (value == QSSGRenderTextureTargetType::TextureCubeNegY)
retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
else if (value == QSSGRenderTextureTargetType::TextureCubePosY)
retval = GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
else if (value == QSSGRenderTextureTargetType::TextureCubeNegZ)
retval = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
else if (value == QSSGRenderTextureTargetType::TextureCubePosZ)
retval = GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
else
Q_ASSERT(false);
return retval;
}
static QSSGRenderTextureTargetType fromGLToTextureTarget(GLenum value)
{
QSSGRenderTextureTargetType retval = QSSGRenderTextureTargetType::Unknown;
if (value == GL_TEXTURE_2D)
retval = QSSGRenderTextureTargetType::Texture2D;
else if (value == GL_TEXTURE_2D_MULTISAMPLE)
retval = QSSGRenderTextureTargetType::Texture2D_MS;
else
Q_ASSERT(false);
return retval;
}
static GLenum fromTextureUnitToGL(QSSGRenderTextureUnit value)
{
quint32 v = static_cast<quint32>(value);
GLenum retval = GL_TEXTURE0;
retval = GL_TEXTURE0 + v;
return retval;
}
static QSSGRenderTextureUnit fromGLToTextureUnit(GLenum value)
{
Q_ASSERT(value > GL_TEXTURE0);
quint32 v = value - GL_TEXTURE0;
QSSGRenderTextureUnit retval = QSSGRenderTextureUnit(v);
return retval;
}
static GLenum fromTextureMinifyingOpToGL(QSSGRenderTextureMinifyingOp value)
{
switch (value) {
case QSSGRenderTextureMinifyingOp::Nearest:
return GL_NEAREST;
case QSSGRenderTextureMinifyingOp::Linear:
return GL_LINEAR;
case QSSGRenderTextureMinifyingOp::NearestMipmapNearest:
return GL_NEAREST_MIPMAP_NEAREST;
case QSSGRenderTextureMinifyingOp::LinearMipmapNearest:
return GL_LINEAR_MIPMAP_NEAREST;
case QSSGRenderTextureMinifyingOp::NearestMipmapLinear:
return GL_NEAREST_MIPMAP_LINEAR;
case QSSGRenderTextureMinifyingOp::LinearMipmapLinear:
return GL_LINEAR_MIPMAP_LINEAR;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderTextureMinifyingOp fromGLToTextureMinifyingOp(GLenum value)
{
switch (value) {
case GL_NEAREST:
return QSSGRenderTextureMinifyingOp::Nearest;
case GL_LINEAR:
return QSSGRenderTextureMinifyingOp::Linear;
case GL_NEAREST_MIPMAP_NEAREST:
return QSSGRenderTextureMinifyingOp::NearestMipmapNearest;
case GL_LINEAR_MIPMAP_NEAREST:
return QSSGRenderTextureMinifyingOp::LinearMipmapNearest;
case GL_NEAREST_MIPMAP_LINEAR:
return QSSGRenderTextureMinifyingOp::NearestMipmapLinear;
case GL_LINEAR_MIPMAP_LINEAR:
return QSSGRenderTextureMinifyingOp::LinearMipmapLinear;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderTextureMinifyingOp::Unknown;
}
static GLenum fromTextureMagnifyingOpToGL(QSSGRenderTextureMagnifyingOp value)
{
switch (value) {
case QSSGRenderTextureMagnifyingOp::Nearest:
return GL_NEAREST;
case QSSGRenderTextureMagnifyingOp::Linear:
return GL_LINEAR;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderTextureMagnifyingOp fromGLToTextureMagnifyingOp(GLenum value)
{
switch (value) {
case GL_NEAREST:
return QSSGRenderTextureMagnifyingOp::Nearest;
case GL_LINEAR:
return QSSGRenderTextureMagnifyingOp::Linear;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderTextureMagnifyingOp::Unknown;
}
static GLenum fromTextureCoordOpToGL(QSSGRenderTextureCoordOp value)
{
switch (value) {
case QSSGRenderTextureCoordOp::ClampToEdge:
return GL_CLAMP_TO_EDGE;
case QSSGRenderTextureCoordOp::MirroredRepeat:
return GL_MIRRORED_REPEAT;
case QSSGRenderTextureCoordOp::Repeat:
return GL_REPEAT;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderTextureCoordOp fromGLToTextureCoordOp(GLenum value)
{
switch (value) {
case GL_CLAMP_TO_EDGE:
return QSSGRenderTextureCoordOp::ClampToEdge;
case GL_MIRRORED_REPEAT:
return QSSGRenderTextureCoordOp::MirroredRepeat;
case GL_REPEAT:
return QSSGRenderTextureCoordOp::Repeat;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderTextureCoordOp::Unknown;
}
static GLenum fromTextureCompareModeToGL(QSSGRenderTextureCompareMode value)
{
switch (value) {
case QSSGRenderTextureCompareMode::NoCompare:
return GL_NONE;
case QSSGRenderTextureCompareMode::CompareToRef:
return GL_COMPARE_REF_TO_TEXTURE;
default:
break;
}
Q_ASSERT(false);
return GL_INVALID_ENUM;
}
static QSSGRenderTextureCompareMode fromGLToTextureCompareMode(GLenum value)
{
switch (value) {
case GL_NONE:
return QSSGRenderTextureCompareMode::NoCompare;
case GL_COMPARE_REF_TO_TEXTURE:
return QSSGRenderTextureCompareMode::CompareToRef;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderTextureCompareMode::Unknown;
}
static GLenum fromTextureCompareFuncToGL(QSSGRenderTextureCompareOp value)
{
switch (value) {
case QSSGRenderTextureCompareOp::Never:
return GL_NEVER;
case QSSGRenderTextureCompareOp::Less:
return GL_LESS;
case QSSGRenderTextureCompareOp::Equal:
return GL_EQUAL;
case QSSGRenderTextureCompareOp::LessThanOrEqual:
return GL_LEQUAL;
case QSSGRenderTextureCompareOp::Greater:
return GL_GREATER;
case QSSGRenderTextureCompareOp::NotEqual:
return GL_NOTEQUAL;
case QSSGRenderTextureCompareOp::GreaterThanOrEqual:
return GL_GEQUAL;
case QSSGRenderTextureCompareOp::AlwaysTrue:
return GL_ALWAYS;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static GLenum fromImageFormatToGL(QSSGRenderTextureFormat value)
{
switch (value.format) {
case QSSGRenderTextureFormat::R8:
return GL_R8;
case QSSGRenderTextureFormat::R32I:
return GL_R32I;
case QSSGRenderTextureFormat::R32UI:
return GL_R32UI;
case QSSGRenderTextureFormat::R32F:
return GL_R32F;
case QSSGRenderTextureFormat::RGBE8:
case QSSGRenderTextureFormat::RGBA8:
return GL_RGBA8;
case QSSGRenderTextureFormat::SRGB8A8:
return GL_RGBA8_SNORM;
case QSSGRenderTextureFormat::RG16F:
return GL_RG16F;
case QSSGRenderTextureFormat::RGBA16F:
return GL_RGBA16F;
case QSSGRenderTextureFormat::RGBA32F:
return GL_RGBA32F;
default:
break;
}
Q_ASSERT(false);
return GL_INVALID_ENUM;
}
static GLenum fromImageAccessToGL(QSSGRenderImageAccessType value)
{
switch (value) {
case QSSGRenderImageAccessType::Read:
return GL_READ_ONLY;
case QSSGRenderImageAccessType::Write:
return GL_WRITE_ONLY;
case QSSGRenderImageAccessType::ReadWrite:
return GL_READ_WRITE;
default:
break;
}
Q_ASSERT(false);
return GL_INVALID_ENUM;
}
static GLbitfield fromBufferAccessBitToGL(QSSGRenderBufferAccessFlags flags)
{
GLbitfield retval = 0;
if (flags & QSSGRenderBufferAccessTypeValues::Read)
retval |= GL_MAP_READ_BIT;
if (flags & QSSGRenderBufferAccessTypeValues::Write)
retval |= GL_MAP_WRITE_BIT;
if (flags & QSSGRenderBufferAccessTypeValues::Invalid)
retval |= GL_MAP_INVALIDATE_BUFFER_BIT;
if (flags & QSSGRenderBufferAccessTypeValues::InvalidRange)
retval |= GL_MAP_INVALIDATE_RANGE_BIT;
Q_ASSERT(retval);
return retval;
}
static GLbitfield fromMemoryBarrierFlagsToGL(QSSGRenderBufferBarrierFlags flags)
{
GLbitfield retval = 0;
#if !defined(QT_OPENGL_ES)
if (flags & QSSGRenderBufferBarrierValues::AtomicCounter)
retval |= GL_ATOMIC_COUNTER_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::BufferUpdate)
retval |= GL_BUFFER_UPDATE_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::CommandBuffer)
retval |= GL_COMMAND_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::ElementArray)
retval |= GL_ELEMENT_ARRAY_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::Framebuffer)
retval |= GL_FRAMEBUFFER_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::PixelBuffer)
retval |= GL_PIXEL_BUFFER_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::ShaderImageAccess)
retval |= GL_SHADER_IMAGE_ACCESS_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::ShaderStorage)
retval |= GL_SHADER_STORAGE_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::TextureFetch)
retval |= GL_TEXTURE_FETCH_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::TextureUpdate)
retval |= GL_TEXTURE_UPDATE_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::TransformFeedback)
retval |= GL_TRANSFORM_FEEDBACK_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::UniformBuffer)
retval |= GL_UNIFORM_BARRIER_BIT;
if (flags & QSSGRenderBufferBarrierValues::VertexAttribArray)
retval |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT;
Q_ASSERT(retval);
#else
Q_UNUSED(flags);
#endif
return retval;
}
static GLbitfield fromShaderTypeFlagsToGL(QSSGRenderShaderTypeFlags flags)
{
GLbitfield retval = 0;
if (flags & QSSGRenderShaderTypeValue::Vertex)
retval |= GL_VERTEX_SHADER_BIT;
if (flags & QSSGRenderShaderTypeValue::Fragment)
retval |= GL_FRAGMENT_SHADER_BIT;
if (flags & QSSGRenderShaderTypeValue::TessControl)
retval |= GL_TESS_CONTROL_SHADER_BIT;
if (flags & QSSGRenderShaderTypeValue::TessEvaluation)
retval |= GL_TESS_EVALUATION_SHADER_BIT;
if (flags & QSSGRenderShaderTypeValue::Geometry)
#if defined(QT_OPENGL_ES_3_1)
retval |= GL_GEOMETRY_SHADER_BIT_EXT;
#else
retval |= GL_GEOMETRY_SHADER_BIT;
#endif
Q_ASSERT(retval || !flags);
return retval;
}
static GLenum fromPropertyDataTypesToShaderGL(QSSGRenderShaderDataType value)
{
// cube Sampler and mat22 unsupported
switch (value) {
case QSSGRenderShaderDataType::Float:
return GL_FLOAT;
case QSSGRenderShaderDataType::Vec2:
return GL_FLOAT_VEC2;
case QSSGRenderShaderDataType::Vec3:
return GL_FLOAT_VEC3;
case QSSGRenderShaderDataType::Vec4:
return GL_FLOAT_VEC4;
case QSSGRenderShaderDataType::Integer:
return GL_INT;
case QSSGRenderShaderDataType::IntegerVec2:
return GL_INT_VEC2;
case QSSGRenderShaderDataType::IntegerVec3:
return GL_INT_VEC3;
case QSSGRenderShaderDataType::IntegerVec4:
return GL_INT_VEC4;
case QSSGRenderShaderDataType::Boolean:
return GL_BOOL;
case QSSGRenderShaderDataType::BooleanVec2:
return GL_BOOL_VEC2;
case QSSGRenderShaderDataType::BooleanVec3:
return GL_BOOL_VEC3;
case QSSGRenderShaderDataType::BooleanVec4:
return GL_BOOL_VEC4;
case QSSGRenderShaderDataType::UnsignedInteger:
return GL_UNSIGNED_INT;
case QSSGRenderShaderDataType::UnsignedIntegerVec2:
return GL_UNSIGNED_INT_VEC2;
case QSSGRenderShaderDataType::UnsignedIntegerVec3:
return GL_UNSIGNED_INT_VEC3;
case QSSGRenderShaderDataType::UnsignedIntegerVec4:
return GL_UNSIGNED_INT_VEC4;
case QSSGRenderShaderDataType::Matrix3x3:
return GL_FLOAT_MAT3;
case QSSGRenderShaderDataType::Matrix4x4:
return GL_FLOAT_MAT4;
case QSSGRenderShaderDataType::Texture2D:
return GL_SAMPLER_2D;
case QSSGRenderShaderDataType::TextureCube:
return GL_SAMPLER_CUBE;
case QSSGRenderShaderDataType::Image2D:
return GL_IMAGE_2D;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderShaderDataType fromShaderGLToPropertyDataTypes(GLenum value)
{
// cube Sampler and mat22 unsupported
switch (value) {
case GL_FLOAT:
return QSSGRenderShaderDataType::Float;
case GL_FLOAT_VEC2:
return QSSGRenderShaderDataType::Vec2;
case GL_FLOAT_VEC3:
return QSSGRenderShaderDataType::Vec3;
case GL_FLOAT_VEC4:
return QSSGRenderShaderDataType::Vec4;
case GL_INT:
return QSSGRenderShaderDataType::Integer;
case GL_INT_VEC2:
return QSSGRenderShaderDataType::IntegerVec2;
case GL_INT_VEC3:
return QSSGRenderShaderDataType::IntegerVec3;
case GL_INT_VEC4:
return QSSGRenderShaderDataType::IntegerVec4;
case GL_BOOL:
return QSSGRenderShaderDataType::Boolean;
case GL_BOOL_VEC2:
return QSSGRenderShaderDataType::BooleanVec2;
case GL_BOOL_VEC3:
return QSSGRenderShaderDataType::BooleanVec3;
case GL_BOOL_VEC4:
return QSSGRenderShaderDataType::BooleanVec4;
case GL_UNSIGNED_INT:
return QSSGRenderShaderDataType::UnsignedInteger;
case GL_UNSIGNED_INT_VEC2:
return QSSGRenderShaderDataType::UnsignedIntegerVec2;
case GL_UNSIGNED_INT_VEC3:
return QSSGRenderShaderDataType::UnsignedIntegerVec3;
case GL_UNSIGNED_INT_VEC4:
return QSSGRenderShaderDataType::UnsignedIntegerVec4;
case GL_FLOAT_MAT3:
return QSSGRenderShaderDataType::Matrix3x3;
case GL_FLOAT_MAT4:
return QSSGRenderShaderDataType::Matrix4x4;
case GL_SAMPLER_2D:
return QSSGRenderShaderDataType::Texture2D;
case GL_SAMPLER_CUBE:
return QSSGRenderShaderDataType::TextureCube;
case GL_IMAGE_2D:
return QSSGRenderShaderDataType::Image2D;
case GL_SAMPLER_2D_SHADOW:
return QSSGRenderShaderDataType::Texture2D;
#if !defined(QT_OPENGL_ES)
case GL_UNSIGNED_INT_ATOMIC_COUNTER:
return QSSGRenderShaderDataType::Integer;
case GL_UNSIGNED_INT_IMAGE_2D:
return QSSGRenderShaderDataType::Image2D;
#endif
default:
break;
}
Q_ASSERT(false);
return QSSGRenderShaderDataType::Unknown;
}
static GLenum fromComponentTypeAndNumCompsToAttribGL(QSSGRenderComponentType compType, quint32 numComps)
{
if (compType == QSSGRenderComponentType::Float32) {
switch (numComps) {
case 1:
return GL_FLOAT;
case 2:
return GL_FLOAT_VEC2;
case 3:
return GL_FLOAT_VEC3;
case 4:
return GL_FLOAT_VEC4;
case 9:
return GL_FLOAT_MAT3;
case 16:
return GL_FLOAT_MAT4;
default:
break;
}
}
Q_ASSERT(false);
return 0;
}
static void fromAttribGLToComponentTypeAndNumComps(GLenum enumVal, QSSGRenderComponentType &outCompType, quint32 &outNumComps)
{
switch (enumVal) {
case GL_FLOAT:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 1;
return;
case GL_FLOAT_VEC2:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 2;
return;
case GL_FLOAT_VEC3:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 3;
return;
case GL_FLOAT_VEC4:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 4;
return;
case GL_FLOAT_MAT2:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 4;
return;
case GL_FLOAT_MAT3:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 9;
return;
case GL_FLOAT_MAT4:
outCompType = QSSGRenderComponentType::Float32;
outNumComps = 16;
return;
default:
break;
}
Q_ASSERT(false);
outCompType = QSSGRenderComponentType::Unknown;
outNumComps = 0;
}
static GLenum fromRenderBufferFormatsToRenderBufferGL(QSSGRenderRenderBufferFormat value)
{
switch (value) {
#if defined(GL_DEPTH_COMPONENT32)
case QSSGRenderRenderBufferFormat::RGBA4:
return GL_RGBA4;
case QSSGRenderRenderBufferFormat::RGB565:
return GL_RGB565;
case QSSGRenderRenderBufferFormat::RGBA5551:
return GL_RGB5_A1;
case QSSGRenderRenderBufferFormat::Depth16:
return GL_DEPTH_COMPONENT16;
case QSSGRenderRenderBufferFormat::Depth24:
return GL_DEPTH_COMPONENT24;
case QSSGRenderRenderBufferFormat::Depth32:
return GL_DEPTH_COMPONENT32;
case QSSGRenderRenderBufferFormat::StencilIndex8:
return GL_STENCIL_INDEX8;
#else
case QSSGRenderRenderBufferFormat::RGBA4:
return GL_RGBA4;
case QSSGRenderRenderBufferFormat::RGB565:
return GL_RGB565;
case QSSGRenderRenderBufferFormat::RGBA5551:
return GL_RGB5_A1;
case QSSGRenderRenderBufferFormat::Depth16:
return GL_DEPTH_COMPONENT16;
case QSSGRenderRenderBufferFormat::Depth24:
return GL_DEPTH_COMPONENT24;
case QSSGRenderRenderBufferFormat::StencilIndex8:
return GL_STENCIL_INDEX8;
#endif
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderRenderBufferFormat fromRenderBufferGLToRenderBufferFormats(GLenum value)
{
#if defined(GL_DEPTH_COMPONENT32)
switch (value) {
case GL_RGBA4:
return QSSGRenderRenderBufferFormat::RGBA4;
case GL_RGB565:
return QSSGRenderRenderBufferFormat::RGB565;
case GL_RGB5_A1:
return QSSGRenderRenderBufferFormat::RGBA5551;
case GL_DEPTH_COMPONENT16:
return QSSGRenderRenderBufferFormat::Depth16;
case GL_DEPTH_COMPONENT24:
return QSSGRenderRenderBufferFormat::Depth24;
case GL_DEPTH_COMPONENT32:
return QSSGRenderRenderBufferFormat::Depth32;
case GL_STENCIL_INDEX8:
return QSSGRenderRenderBufferFormat::StencilIndex8;
#else
switch (value) {
case GL_RGBA4:
return QSSGRenderRenderBufferFormat::RGBA4;
case GL_RGB565:
return QSSGRenderRenderBufferFormat::RGB565;
case GL_RGB5_A1:
return QSSGRenderRenderBufferFormat::RGBA5551;
case GL_DEPTH_COMPONENT16:
return QSSGRenderRenderBufferFormat::Depth16;
case GL_DEPTH_COMPONENT24:
return QSSGRenderRenderBufferFormat::Depth24;
case GL_STENCIL_INDEX8:
return QSSGRenderRenderBufferFormat::StencilIndex8;
#endif
default:
break;
}
Q_ASSERT(false);
return QSSGRenderRenderBufferFormat::Unknown;
}
static GLenum fromFramebufferAttachmentsToGL(QSSGRenderFrameBufferAttachment value)
{
switch (value) {
case QSSGRenderFrameBufferAttachment::Color0:
return GL_COLOR_ATTACHMENT0;
case QSSGRenderFrameBufferAttachment::Color1:
return GL_COLOR_ATTACHMENT1;
case QSSGRenderFrameBufferAttachment::Color2:
return GL_COLOR_ATTACHMENT2;
case QSSGRenderFrameBufferAttachment::Color3:
return GL_COLOR_ATTACHMENT3;
case QSSGRenderFrameBufferAttachment::Color4:
return GL_COLOR_ATTACHMENT4;
case QSSGRenderFrameBufferAttachment::Color5:
return GL_COLOR_ATTACHMENT5;
case QSSGRenderFrameBufferAttachment::Color6:
return GL_COLOR_ATTACHMENT6;
case QSSGRenderFrameBufferAttachment::Color7:
return GL_COLOR_ATTACHMENT7;
case QSSGRenderFrameBufferAttachment::Depth:
return GL_DEPTH_ATTACHMENT;
case QSSGRenderFrameBufferAttachment::Stencil:
return GL_STENCIL_ATTACHMENT;
case QSSGRenderFrameBufferAttachment::DepthStencil:
return GL_DEPTH_STENCIL_ATTACHMENT;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderFrameBufferAttachment fromGLToFramebufferAttachments(GLenum value)
{
switch (value) {
case GL_COLOR_ATTACHMENT0:
return QSSGRenderFrameBufferAttachment::Color0;
case GL_COLOR_ATTACHMENT1:
return QSSGRenderFrameBufferAttachment::Color1;
case GL_COLOR_ATTACHMENT2:
return QSSGRenderFrameBufferAttachment::Color2;
case GL_COLOR_ATTACHMENT3:
return QSSGRenderFrameBufferAttachment::Color3;
case GL_COLOR_ATTACHMENT4:
return QSSGRenderFrameBufferAttachment::Color4;
case GL_COLOR_ATTACHMENT5:
return QSSGRenderFrameBufferAttachment::Color5;
case GL_COLOR_ATTACHMENT6:
return QSSGRenderFrameBufferAttachment::Color6;
case GL_COLOR_ATTACHMENT7:
return QSSGRenderFrameBufferAttachment::Color7;
case GL_DEPTH_ATTACHMENT:
return QSSGRenderFrameBufferAttachment::Depth;
case GL_STENCIL_ATTACHMENT:
return QSSGRenderFrameBufferAttachment::Stencil;
case GL_DEPTH_STENCIL_ATTACHMENT:
return QSSGRenderFrameBufferAttachment::DepthStencil;
}
Q_ASSERT(false);
return QSSGRenderFrameBufferAttachment::Unknown;
}
static GLbitfield fromClearFlagsToGL(QSSGRenderClearFlags flags)
{
GLbitfield retval = 0;
if ((flags & QSSGRenderClearValues::Color))
retval |= GL_COLOR_BUFFER_BIT;
if ((flags & QSSGRenderClearValues::Depth))
retval |= GL_DEPTH_BUFFER_BIT;
if ((flags & QSSGRenderClearValues::Stencil))
retval |= GL_STENCIL_BUFFER_BIT;
return retval;
}
static QSSGRenderClearFlags fromGLToClearFlags(GLbitfield value)
{
QSSGRenderClearFlags retval;
if ((value & GL_COLOR_BUFFER_BIT))
retval |= QSSGRenderClearValues::Color;
if ((value & GL_DEPTH_BUFFER_BIT))
retval |= QSSGRenderClearValues::Depth;
if ((value & GL_STENCIL_BUFFER_BIT))
retval |= QSSGRenderClearValues::Stencil;
return retval;
}
static GLenum fromDrawModeToGL(QSSGRenderDrawMode value, bool inTesselationSupported)
{
switch (value) {
case QSSGRenderDrawMode::Points:
return GL_POINTS;
case QSSGRenderDrawMode::Lines:
return GL_LINES;
case QSSGRenderDrawMode::LineStrip:
return GL_LINE_STRIP;
case QSSGRenderDrawMode::LineLoop:
return GL_LINE_LOOP;
case QSSGRenderDrawMode::TriangleStrip:
return GL_TRIANGLE_STRIP;
case QSSGRenderDrawMode::TriangleFan:
return GL_TRIANGLE_FAN;
case QSSGRenderDrawMode::Triangles:
return GL_TRIANGLES;
case QSSGRenderDrawMode::Patches:
return (inTesselationSupported) ? GL_PATCHES : GL_TRIANGLES;
default:
break;
}
Q_ASSERT(false);
return GL_INVALID_ENUM;
}
static QSSGRenderDrawMode fromGLToDrawMode(GLenum value)
{
switch (value) {
case GL_POINTS:
return QSSGRenderDrawMode::Points;
case GL_LINES:
return QSSGRenderDrawMode::Lines;
case GL_LINE_STRIP:
return QSSGRenderDrawMode::LineStrip;
case GL_LINE_LOOP:
return QSSGRenderDrawMode::LineLoop;
case GL_TRIANGLE_STRIP:
return QSSGRenderDrawMode::TriangleStrip;
case GL_TRIANGLE_FAN:
return QSSGRenderDrawMode::TriangleFan;
case GL_TRIANGLES:
return QSSGRenderDrawMode::Triangles;
case GL_PATCHES:
return QSSGRenderDrawMode::Patches;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderDrawMode::Unknown;
}
static GLenum fromRenderStateToGL(QSSGRenderState value)
{
switch (value) {
case QSSGRenderState::Blend:
return GL_BLEND;
case QSSGRenderState::CullFace:
return GL_CULL_FACE;
case QSSGRenderState::DepthTest:
return GL_DEPTH_TEST;
case QSSGRenderState::Multisample:
return GL_MULTISAMPLE;
case QSSGRenderState::StencilTest:
return GL_STENCIL_TEST;
case QSSGRenderState::ScissorTest:
return GL_SCISSOR_TEST;
default:
break;
}
Q_ASSERT(false);
return 0;
}
static QSSGRenderState fromGLToRenderState(GLenum value)
{
switch (value) {
case GL_BLEND:
return QSSGRenderState::Blend;
case GL_CULL_FACE:
return QSSGRenderState::CullFace;
case GL_DEPTH_TEST:
return QSSGRenderState::DepthTest;
case GL_MULTISAMPLE:
return QSSGRenderState::Multisample;
case GL_STENCIL_TEST:
return QSSGRenderState::StencilTest;
case GL_SCISSOR_TEST:
return QSSGRenderState::ScissorTest;
default:
break;
}
Q_ASSERT(false);
return QSSGRenderState::Unknown;
}
static bool fromReadPixelsToGlFormatAndType(QSSGRenderReadPixelFormat inReadPixels, GLuint *outFormat, GLuint *outType)
{
switch (inReadPixels) {
case QSSGRenderReadPixelFormat::Alpha8:
*outFormat = GL_ALPHA;
*outType = GL_UNSIGNED_BYTE;
break;
case QSSGRenderReadPixelFormat::RGB565:
*outFormat = GL_RGB;
*outType = GL_UNSIGNED_SHORT_5_6_5;
break;
case QSSGRenderReadPixelFormat::RGB8:
*outFormat = GL_RGB;
*outType = GL_UNSIGNED_BYTE;
break;
case QSSGRenderReadPixelFormat::RGBA4444:
*outFormat = GL_RGBA;
*outType = GL_UNSIGNED_SHORT_4_4_4_4;
break;
case QSSGRenderReadPixelFormat::RGBA5551:
*outFormat = GL_RGBA;
*outType = GL_UNSIGNED_SHORT_5_5_5_1;
break;
case QSSGRenderReadPixelFormat::RGBA8:
*outFormat = GL_RGBA;
*outType = GL_UNSIGNED_BYTE;
break;
default:
*outFormat = 0;
*outType = 0;
Q_ASSERT(false);
return false;
};
return true;
}
};
QT_END_NAMESPACE
#endif // QSSGOPENGLUTIL_H