6#include "private/qopenglcontext_p.h"
7#include <QtOpenGL/QOpenGLVersionFunctionsFactory>
8#include <QtCore/private/qobject_p.h>
9#include <QtCore/qdebug.h>
10#include <QtCore/qfile.h>
11#include <QtCore/qlist.h>
12#include <QtCore/qloggingcategory.h>
13#include <QtCore/qvarlengtharray.h>
14#include <QtGui/private/qopenglprogrambinarycache_p.h>
15#include <QtGui/qtransform.h>
16#include <QtGui/QColor>
17#include <QtGui/QSurfaceFormat>
19#if !QT_CONFIG(opengles2)
20#include <QtOpenGL/qopenglfunctions_4_0_core.h>
149#ifndef GL_GEOMETRY_SHADER
150#define GL_GEOMETRY_SHADER 0x8DD9
152#ifndef GL_TESS_CONTROL_SHADER
153#define GL_TESS_CONTROL_SHADER 0x8E88
155#ifndef GL_TESS_EVALUATION_SHADER
156#define GL_TESS_EVALUATION_SHADER 0x8E87
158#ifndef GL_COMPUTE_SHADER
159#define GL_COMPUTE_SHADER 0x91B9
161#ifndef GL_MAX_GEOMETRY_OUTPUT_VERTICES
162#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
164#ifndef GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS
165#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
167#ifndef GL_PATCH_VERTICES
168#define GL_PATCH_VERTICES 0x8E72
170#ifndef GL_PATCH_DEFAULT_OUTER_LEVEL
171#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
173#ifndef GL_PATCH_DEFAULT_INNER_LEVEL
174#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
177#if !QT_CONFIG(opengles2)
191#if !QT_CONFIG(opengles2)
203#if !QT_CONFIG(opengles2)
258 funcs->glDeleteShader(
id);
289 qWarning(
"QOpenGLShader: could not create shader");
314 const char *
types[] = {
318 "Tessellation Control",
319 "Tessellation Evaluation",
341 GLint infoLogLength = 0;
342 GLint sourceCodeLength = 0;
343 char *logBuffer =
nullptr;
344 char *sourceCodeBuffer =
nullptr;
349 if (infoLogLength > 1) {
351 logBuffer =
new char [infoLogLength];
358 if (sourceCodeLength > 1) {
360 sourceCodeBuffer =
new char [sourceCodeLength];
375 if (sourceCodeBuffer) {
376 qWarning(
"*** Problematic %s shader source code ***\n"
384 delete [] sourceCodeBuffer;
432 return d->shaderType;
440#if QT_CONFIG(opengles2) && !defined(QT_OPENGL_FORCE_SHADER_DEFINES)
443#define QOpenGL_REDEFINE_HIGHP 1
444static const char redefineHighp[] =
445 "#ifndef GL_FRAGMENT_PRECISION_HIGH\n"
446 "#define highp mediump\n"
452 "#ifdef GL_KHR_blend_equation_advanced\n"
453 "#extension GL_ARB_fragment_coord_conventions : enable\n"
454 "#extension GL_KHR_blend_equation_advanced : enable\n"
486 PreprocessorDirective,
491 }
state = StartOfLine;
496 case PreprocessorDirective:
497 if (*
c ==
' ' || *
c ==
'\t')
499 if (!strncmp(
c,
"version", strlen(
"version"))) {
501 c += strlen(
"version");
502 while (*
c && *
c !=
'\n')
504 int splitPosition =
c -
source + 1;
505 int linePosition = int(std::count(
source,
c,
'\n')) + 1;
507 }
else if (*
c ==
'/')
508 state = CommentStarting;
515 if (*
c ==
' ' || *
c ==
'\t')
517 else if (*
c ==
'#') {
518 state = PreprocessorDirective;
525 state = CommentStarting;
529 case CommentStarting:
531 state = MultiLineComment;
533 state = SingleLineComment;
537 case MultiLineComment:
539 state = CommentEnding;
541 case SingleLineComment:
549 state = MultiLineComment;
575 if (
d->shaderGuard &&
d->shaderGuard->id() &&
source) {
589 const char *vendor =
reinterpret_cast<const char *
>(
ctx->functions()->glGetString(GL_VENDOR));
590 if (vendor && !strcmp(vendor,
"Intel")) {
591 static const char version110[] =
"#version 110\n";
592 sourceChunks.
append(version110);
593 sourceChunkLengths.
append(
GLint(
sizeof(version110)) - 1);
608#ifdef QT_OPENGL_FORCE_SHADER_DEFINES
616#ifdef QOpenGL_REDEFINE_HIGHP
619 sourceChunks.
append(redefineHighp);
620 sourceChunkLengths.
append(
GLint(
sizeof(redefineHighp) - 1));
627 const char *version =
reinterpret_cast<const char *
>(
ctx->functions()->glGetString(GL_VERSION));
628 if (!version || !strstr(version,
"2.1 Mesa 8")) {
630 lineDirective =
QStringLiteral(
"#line %1\n").arg(versionDirectivePosition.
line).toUtf8();
639 d->glfuncs->glShaderSource(
d->shaderGuard->id(), sourceChunks.
size(), sourceChunks.
data(), sourceChunkLengths.
data());
640 return d->compile(
this);
744 return d->shaderGuard ?
d->shaderGuard->id() : 0;
775#if !QT_CONFIG(opengles2)
793 funcs->glDeleteProgram(
id);
854bool QOpenGLShaderProgram::init()
857 if ((
d->programGuard &&
d->programGuard->id()) ||
d->inited)
863 d->glfuncs->initializeOpenGLFunctions();
865#if !QT_CONFIG(opengles2)
867 d->tessellationFuncs = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_4_0_Core>(
context);
868 d->tessellationFuncs->initializeOpenGLFunctions();
874 qWarning(
"QOpenGLShaderProgram: could not create shader program");
878 delete d->programGuard;
900 if (
d->shaders.contains(
shader))
902 if (
d->programGuard &&
d->programGuard->id() &&
shader) {
903 if (!
shader->d_func()->shaderGuard || !
shader->d_func()->shaderGuard->id())
905 if (
d->programGuard->group() !=
shader->d_func()->shaderGuard->group()) {
906 qWarning(
"QOpenGLShaderProgram::addShader: Program and shader are not associated with same context.");
909 d->glfuncs->glAttachShader(
d->programGuard->id(),
shader->d_func()->shaderGuard->id());
1011 d->anonShaders.append(
shader);
1038 if (
d->isCacheDisabled())
1107 if (
d->isCacheDisabled())
1135 if (
d->isCacheDisabled())
1164 if (
d->isCacheDisabled())
1182 d->binaryProgram.shaders.append(
shader);
1196 if (
d->programGuard &&
d->programGuard->id()
1199 d->glfuncs->glDetachShader(
d->programGuard->id(),
shader->d_func()->shaderGuard->id());
1204 d->anonShaders.removeAll(
shader);
1232 d->removingShaders =
true;
1234 if (
d->programGuard &&
d->programGuard->id()
1237 d->glfuncs->glDetachShader(
d->programGuard->id(),
shader->d_func()->shaderGuard->id());
1243 d->anonShaders.clear();
1246 d->removingShaders =
false;
1280 if (!
d->linkBinaryRecursion &&
d->shaders.isEmpty() && !
d->binaryProgram.shaders.isEmpty())
1281 return d->linkBinary();
1284 if (
d->shaders.isEmpty()) {
1293 d->linked = (
value != 0);
1298 d->glfuncs->glLinkProgram(
program);
1301 d->linked = (
value != 0);
1306 char *logbuf =
new char [
value];
1310 if (!
d->linked && !
d->linkBinaryRecursion) {
1361 if (!
d->linked && !
link())
1365 qWarning(
"QOpenGLShaderProgram::bind: program is not valid in the current context.");
1384 qWarning(
"QOpenGLShaderProgram::release: program is not valid in the current context.");
1386 d->glfuncs->glUseProgram(0);
1397 GLuint id =
d->programGuard ?
d->programGuard->id() : 0;
1406 return d->programGuard ?
d->programGuard->id() : 0;
1423 if (!init() || !
d->programGuard || !
d->programGuard->id())
1425 d->glfuncs->glBindAttribLocation(
d->programGuard->id(),
location,
name);
1475 if (
d->linked &&
d->programGuard &&
d->programGuard->id()) {
1476 return d->glfuncs->glGetAttribLocation(
d->programGuard->id(),
name);
1478 qWarning(
"QOpenGLShaderProgram::attributeLocation(%s): shader program is not linked",
name);
1740 if (rows < 1 || rows > 4) {
1741 qWarning(
"QOpenGLShaderProgram::setAttributeValue: rows %d not supported", rows);
1745 while (columns-- > 0) {
1903 d->glfuncs->glVertexAttribPointer(
location, tupleSize,
type, GL_TRUE,
2092 d->glfuncs->glEnableVertexAttribArray(
location);
2122 d->glfuncs->glDisableVertexAttribArray(
location);
2150 if (
d->linked &&
d->programGuard &&
d->programGuard->id()) {
2151 return d->glfuncs->glGetUniformLocation(
d->programGuard->id(),
name);
2153 qWarning(
"QOpenGLShaderProgram::uniformLocation(%s): shader program is not linked",
name);
2596 d->glfuncs->glUniformMatrix2fv(
location, 1, GL_FALSE,
value.constData());
2724 d->glfuncs->glUniformMatrix3fv(
location, 1, GL_FALSE,
value.constData());
2852 d->glfuncs->glUniformMatrix4fv(
location, 1, GL_FALSE,
value.constData());
2979 d->glfuncs->glUniformMatrix3fv(
location, 1, GL_FALSE, mat[0]);
3073 else if (tupleSize == 2)
3075 else if (tupleSize == 3)
3077 else if (tupleSize == 4)
3080 qWarning(
"QOpenGLShaderProgram::setUniformValue: size %d not supported", tupleSize);
3181#define setUniformMatrixArray(func,location,values,count,type,cols,rows) \
3182 if (location == -1 || count <= 0) \
3184 if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
3185 func(location, count, GL_FALSE, \
3186 reinterpret_cast<const GLfloat *>(values[0].constData())); \
3188 QVarLengthArray<GLfloat> temp(cols * rows * count); \
3189 for (int index = 0; index < count; ++index) { \
3190 for (int index2 = 0; index2 < (cols * rows); ++index2) { \
3191 temp.data()[cols * rows * index + index2] = \
3192 values[index].constData()[index2]; \
3195 func(location, count, GL_FALSE, temp.constData()); \
3197#define setUniformGenericMatrixArray(colfunc,location,values,count,type,cols,rows) \
3198 if (location == -1 || count <= 0) \
3200 if (sizeof(type) == sizeof(GLfloat) * cols * rows) { \
3201 const GLfloat *data = reinterpret_cast<const GLfloat *> \
3202 (values[0].constData()); \
3203 colfunc(location, count * cols, data); \
3205 QVarLengthArray<GLfloat> temp(cols * rows * count); \
3206 for (int index = 0; index < count; ++index) { \
3207 for (int index2 = 0; index2 < (cols * rows); ++index2) { \
3208 temp.data()[cols * rows * index + index2] = \
3209 values[index].constData()[index2]; \
3212 colfunc(location, count * cols, temp.constData()); \
3510 int patchVertices = 0;
3513 return patchVertices;
3538#if !QT_CONFIG(opengles2)
3540 if (
d->tessellationFuncs) {
3545 const int argCount = 4;
3546 if (tessLevels.
size() < argCount) {
3548 for (
int i = tessLevels.
size();
i < argCount; ++
i)
3578#if !QT_CONFIG(opengles2)
3581 if (
d->tessellationFuncs)
3611#if !QT_CONFIG(opengles2)
3613 if (
d->tessellationFuncs) {
3618 const int argCount = 2;
3619 if (tessLevels.
size() < argCount) {
3621 for (
int i = tessLevels.
size();
i < argCount; ++
i)
3651#if !QT_CONFIG(opengles2)
3654 if (
d->tessellationFuncs)
3683void QOpenGLShaderProgram::shaderDestroyed()
3687 if (
shader && !
d->removingShaders)
3732 if (!
s->compileSourceCode(
shader.source)) {
3750 if (lcOpenGLProgramDiskCache().isEnabled(
QtDebugMsg))
3751 qCDebug(lcOpenGLProgramDiskCache,
"program with %d shaders, cache key %s",
3754 bool needsCompile =
true;
3755 if (binCache.
load(cacheKey,
q->programId())) {
3756 qCDebug(lcOpenGLProgramDiskCache,
"Program binary received from cache");
3757 needsCompile =
false;
3760 bool needsSave =
false;
3762 qCDebug(lcOpenGLProgramDiskCache,
"Program binary not in cache, compiling");
3770 bool ok =
q->link();
3772 if (
ok && needsSave)
3773 binCache.
save(cacheKey,
q->programId());
3780#include "moc_qopenglshaderprogram.cpp"
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
The QColor class provides colors based on RGB, HSV or CMYK values.
bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
The QGenericMatrix class is a template class that represents a NxM transformation matrix with N colum...
QByteArray readAll()
Reads all remaining data from the device, and returns it as a byte array.
qsizetype size() const noexcept
void reserve(qsizetype size)
void append(parameter_type t)
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QObject * sender() const
Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; othe...
QString objectName
the name of this object
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
static QOpenGLContextGroup * currentContextGroup()
Returns the QOpenGLContextGroup corresponding to the current context.
bool workaround_missingPrecisionQualifiers
static QOpenGLContextPrivate * get(QOpenGLContext *context)
static QOpenGLContext * currentContext()
Returns the last context which called makeCurrent in the current thread, or \nullptr,...
bool isOpenGLES() const
Returns true if the context is an OpenGL ES context.
The QOpenGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API.
void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei *length, char *source)
Convenience function that calls glGetShaderSource(shader, bufsize, length, source).
void glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
Convenience function that calls glGetShaderiv(shader, pname, params).
GLuint glCreateShader(GLenum type)
Convenience function that calls glCreateShader(type).
void glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei *length, char *infolog)
Convenience function that calls glGetShaderInfoLog(shader, bufsize, length, infolog).
bool hasOpenGLFeature(QOpenGLFunctions::OpenGLFeature feature) const
Returns true if feature is present on this system's OpenGL implementation; false otherwise.
void glCompileShader(GLuint shader)
Convenience function that calls glCompileShader(shader).
bool load(const QByteArray &cacheKey, uint programId)
void save(const QByteArray &cacheKey, uint programId)
QOpenGLProgramBinarySupportCheck * get(QOpenGLContext *context)
QOpenGLShader::ShaderType shaderType
QOpenGLExtraFunctions * glfuncs
QOpenGLSharedResourceGuard * shaderGuard
QOpenGLShaderPrivate(QOpenGLContext *ctx, QOpenGLShader::ShaderType type)
bool supportsComputeShaders
bool supportsGeometryShaders
bool supportsTessellationShaders
bool compile(QOpenGLShader *q)
QList< QOpenGLShader * > shaders
QOpenGLShaderProgramPrivate()
QOpenGLSharedResourceGuard * programGuard
bool hasShader(QOpenGLShader::ShaderType type) const
QOpenGLFunctions_4_0_Core * tessellationFuncs
bool isCacheDisabled() const
~QOpenGLShaderProgramPrivate()
QOpenGLProgramBinaryCache::ProgramDesc binaryProgram
QList< QOpenGLShader * > anonShaders
QOpenGLExtraFunctions * glfuncs
The QOpenGLShaderProgram class allows OpenGL shader programs to be linked and used.
void setPatchVertexCount(int count)
Use this function to specify to OpenGL the number of vertices in a patch to count.
void release()
Releases the active shader program from the current QOpenGLContext.
int maxGeometryOutputVertices() const
Returns the hardware limit for how many vertices a geometry shader can output.
int patchVertexCount() const
Returns the number of vertices per-patch to be used when rendering.
void bindAttributeLocation(const char *name, int location)
Binds the attribute name to the specified location.
bool addShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
Compiles source as a shader of the specified type and adds it to this shader program.
void enableAttributeArray(int location)
Enables the vertex array at location in this shader program so that the value set by setAttributeArra...
virtual bool link()
Links together the shaders that were added to this program with addShader().
bool create()
Requests the shader program's id to be created immediately.
int uniformLocation(const char *name) const
Returns the location of the uniform variable name within this shader program's parameter list.
QList< float > defaultOuterTessellationLevels() const
Returns the default outer tessellation levels to be used by the tessellation primitive generator in t...
void setDefaultInnerTessellationLevels(const QList< float > &levels)
Sets the default outer tessellation levels to be used by the tessellation primitive generator in the ...
QList< float > defaultInnerTessellationLevels() const
Returns the default inner tessellation levels to be used by the tessellation primitive generator in t...
void removeShader(QOpenGLShader *shader)
Removes shader from this shader program.
void setUniformValue(int location, GLfloat value)
Sets the uniform variable at location in the current context to value.
void removeAllShaders()
Removes all of the shaders that were added to this program previously.
QString log() const
Returns the errors and warnings that occurred during the last link() or addShader() with explicitly s...
void setDefaultOuterTessellationLevels(const QList< float > &levels)
Sets the default outer tessellation levels to be used by the tessellation primitive generator in the ...
bool addCacheableShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
Registers the shader of the specified type and fileName to this program.
void disableAttributeArray(int location)
Disables the vertex array at location in this shader program that was enabled by a previous call to e...
static bool hasOpenGLShaderPrograms(QOpenGLContext *context=nullptr)
Returns true if shader programs written in the OpenGL Shading Language (GLSL) are supported on this s...
bool addCacheableShaderFromSourceCode(QOpenGLShader::ShaderType type, const char *source)
Registers the shader of the specified type and source to this program.
void setAttributeArray(int location, const GLfloat *values, int tupleSize, int stride=0)
Sets an array of vertex values on the attribute at location in this shader program.
int attributeLocation(const char *name) const
Returns the location of the attribute name within this shader program's parameter list.
bool addShader(QOpenGLShader *shader)
Adds a compiled shader to this shader program.
QOpenGLShaderProgram(QObject *parent=nullptr)
Constructs a new shader program and attaches it to parent.
QList< QOpenGLShader * > shaders() const
Returns a list of all shaders that have been added to this shader program using addShader().
void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize)
Sets the uniform variable array at location in the current context to the count elements of values.
bool isLinked() const
Returns true if this shader program has been linked; false otherwise.
~QOpenGLShaderProgram()
Deletes this shader program.
GLuint programId() const
Returns the OpenGL identifier associated with this shader program.
bool bind()
Binds this shader program to the active QOpenGLContext and makes it the current shader program.
void setAttributeValue(int location, GLfloat value)
Sets the attribute at location in the current context to value.
bool addShaderFromSourceFile(QOpenGLShader::ShaderType type, const QString &fileName)
Compiles the contents of fileName as a shader of the specified type and adds it to this shader progra...
void setAttributeBuffer(int location, GLenum type, int offset, int tupleSize, int stride=0)
Sets an array of vertex values on the attribute at location in this shader program,...
The QOpenGLShader class allows OpenGL shaders to be compiled.
bool compileSourceFile(const QString &fileName)
Sets the source code for this shader to the contents of fileName and compiles it.
bool isCompiled() const
Returns true if this shader has been compiled; false otherwise.
QByteArray sourceCode() const
Returns the source code for this shader.
QOpenGLShader(QOpenGLShader::ShaderType type, QObject *parent=nullptr)
Constructs a new QOpenGLShader object of the specified type and attaches it to parent.
~QOpenGLShader()
Deletes this shader.
QOpenGLShader::ShaderType shaderType() const
Returns the type of this shader.
GLuint shaderId() const
Returns the OpenGL identifier associated with this shader.
QString log() const
Returns the errors and warnings that occurred during the last compile.
static bool hasOpenGLShaders(ShaderType type, QOpenGLContext *context=nullptr)
Returns true if shader programs of type type are supported on this system; false otherwise.
bool compileSourceCode(const char *source)
Sets the source code for this shader and compiles it.
The QOpenGLSharedResourceGuard class is a convenience sub-class of QOpenGLSharedResource to be used t...
\inmodule QtCore\reentrant
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
\inmodule QtCore\reentrant
constexpr int x() const noexcept
Returns the x coordinate of this point.
constexpr int y() const noexcept
Returns the y coordinate of this point.
Stage
Describes the stage of the graphics pipeline the shader is suitable for.
@ TessellationEvaluationStage
@ TessellationControlStage
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
constexpr size_type size() const noexcept
The QVector2D class represents a vector or vertex in 2D space.
The QVector3D class represents a vector or vertex in 3D space.
The QVector4D class represents a vector or vertex in 4D space.
static VulkanServerBufferGlFunctions * funcs
qDeleteAll(list.begin(), list.end())
Combined button and popup list for selecting options.
size_t qstrlen(const char *str)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCDebug(category,...)
GLenum GLsizei GLsizei GLint * values
[15]
typedef GLint(GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
typedef GLfloat(GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC)(GLuint path
GLfloat GLfloat GLfloat w
[0]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei GLenum GLenum * types
GLenum GLenum GLsizei count
const void GLsizei GLsizei stride
typedef GLenum(GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC)(void)
GLenum GLuint GLintptr offset
GLsizei GLsizei GLchar * source
#define GL_FRAGMENT_SHADER
#define GL_PATCH_DEFAULT_INNER_LEVEL
#define GL_SHADER_SOURCE_LENGTH
#define GL_COMPILE_STATUS
GLdouble GLdouble GLdouble GLdouble q
#define GL_PATCH_DEFAULT_OUTER_LEVEL
#define GL_MAX_GEOMETRY_OUTPUT_VERTICES
#define GL_PATCH_VERTICES
#define GL_INFO_LOG_LENGTH
#define setUniformGenericMatrixArray(colfunc, location, values, count, type, cols, rows)
static bool supportsTessellation(const QSurfaceFormat &f)
static QVersionDirectivePosition findVersionDirectivePosition(const char *source)
#define GL_GEOMETRY_SHADER
static QShader::Stage qt_shaderTypeToStage(QOpenGLShader::ShaderType type)
#define GL_TESS_CONTROL_SHADER
static bool isFormatGLES(const QSurfaceFormat &f)
static bool supportsGeometry(const QSurfaceFormat &f)
#define GL_COMPUTE_SHADER
#define GL_TESS_EVALUATION_SHADER
#define setUniformMatrixArray(func, location, values, count, type, cols, rows)
static const char blendEquationAdvancedHeader[]
static const char qualifierDefines[]
static QOpenGLShader::ShaderType qt_shaderStageToType(QShader::Stage stage)
static bool supportsCompute(const QSurfaceFormat &f)
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
#define qPrintable(string)
#define qUtf16Printable(string)
#define QStringLiteral(str)
#define QT_CONFIG(feature)
if(qFloatDistance(a, b)<(1<< 7))
[0]
myObject disconnect()
[26]
QList< ShaderDesc > shaders
QByteArray cacheKey() const
constexpr QVersionDirectivePosition(int position=0, int line=-1)
constexpr bool hasPosition() const
\qmltype MapCircle \instantiates QDeclarativeCircleMapItem \inqmlmodule QtLocation
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent