Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qopengltexturehelper.cpp
Go to the documentation of this file.
1// Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
7#include <QOpenGLContext>
8#include <private/qopenglextensions_p.h>
9
11
13{
14 functions = context->functions();
15 // Resolve EXT_direct_state_access entry points if present.
16
17 // However, disable it on some systems where DSA is known to be unreliable.
18 bool allowDSA = true;
19 const char *renderer = reinterpret_cast<const char *>(context->functions()->glGetString(GL_RENDERER));
20 // QTBUG-40653, QTBUG-44988
21 if (renderer && strstr(renderer, "AMD Radeon HD"))
22 allowDSA = false;
23
24 if (allowDSA && !context->isOpenGLES()
25 && context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) {
26 TextureParameteriEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLint )>(context->getProcAddress("glTextureParameteriEXT"));
27 TextureParameterivEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLint *)>(context->getProcAddress("glTextureParameterivEXT"));
28 TextureParameterfEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , GLfloat )>(context->getProcAddress("glTextureParameterfEXT"));
29 TextureParameterfvEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLenum , const GLfloat *)>(context->getProcAddress("glTextureParameterfvEXT"));
30 GenerateTextureMipmapEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum )>(context->getProcAddress("glGenerateTextureMipmapEXT"));
31 TextureStorage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage3DEXT"));
32 TextureStorage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTextureStorage2DEXT"));
33 TextureStorage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTextureStorage1DEXT"));
34 TextureStorage3DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage3DMultisampleEXT"));
35 TextureStorage2DMultisampleEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureStorage2DMultisampleEXT"));
36 TextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage3DEXT"));
37 TextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage2DEXT"));
38 TextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureImage1DEXT"));
39 TextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage3DEXT"));
40 TextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage2DEXT"));
41 TextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTextureSubImage1DEXT"));
42 CompressedTextureSubImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage1DEXT"));
43 CompressedTextureSubImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage2DEXT"));
44 CompressedTextureSubImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureSubImage3DEXT"));
45 CompressedTextureImage1DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage1DEXT"));
46 CompressedTextureImage2DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage2DEXT"));
47 CompressedTextureImage3DEXT = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTextureImage3DEXT"));
48
49 // Use the real DSA functions
50 TextureParameteri = &QOpenGLTextureHelper::dsa_TextureParameteri;
51 TextureParameteriv = &QOpenGLTextureHelper::dsa_TextureParameteriv;
52 TextureParameterf = &QOpenGLTextureHelper::dsa_TextureParameterf;
53 TextureParameterfv = &QOpenGLTextureHelper::dsa_TextureParameterfv;
54 GenerateTextureMipmap = &QOpenGLTextureHelper::dsa_GenerateTextureMipmap;
55 TextureStorage3D = &QOpenGLTextureHelper::dsa_TextureStorage3D;
56 TextureStorage2D = &QOpenGLTextureHelper::dsa_TextureStorage2D;
57 TextureStorage1D = &QOpenGLTextureHelper::dsa_TextureStorage1D;
58 TextureStorage3DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage3DMultisample;
59 TextureStorage2DMultisample = &QOpenGLTextureHelper::dsa_TextureStorage2DMultisample;
60 TextureImage3D = &QOpenGLTextureHelper::dsa_TextureImage3D;
61 TextureImage2D = &QOpenGLTextureHelper::dsa_TextureImage2D;
62 TextureImage1D = &QOpenGLTextureHelper::dsa_TextureImage1D;
63 TextureSubImage3D = &QOpenGLTextureHelper::dsa_TextureSubImage3D;
64 TextureSubImage2D = &QOpenGLTextureHelper::dsa_TextureSubImage2D;
65 TextureSubImage1D = &QOpenGLTextureHelper::dsa_TextureSubImage1D;
66 CompressedTextureSubImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D;
67 CompressedTextureSubImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D;
68 CompressedTextureSubImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D;
69 CompressedTextureImage1D = &QOpenGLTextureHelper::dsa_CompressedTextureImage1D;
70 CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D;
71 CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D;
72 } else {
73 // Use our own DSA emulation
74 TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri;
75 TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv;
76 TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf;
77 TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv;
78 GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap;
79 TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D;
80 TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D;
81 TextureStorage1D = &QOpenGLTextureHelper::qt_TextureStorage1D;
82 TextureStorage3DMultisample = &QOpenGLTextureHelper::qt_TextureStorage3DMultisample;
83 TextureStorage2DMultisample = &QOpenGLTextureHelper::qt_TextureStorage2DMultisample;
84 TextureImage3D = &QOpenGLTextureHelper::qt_TextureImage3D;
85 TextureImage2D = &QOpenGLTextureHelper::qt_TextureImage2D;
86 TextureImage1D = &QOpenGLTextureHelper::qt_TextureImage1D;
87 TextureSubImage3D = &QOpenGLTextureHelper::qt_TextureSubImage3D;
88 TextureSubImage2D = &QOpenGLTextureHelper::qt_TextureSubImage2D;
89 TextureSubImage1D = &QOpenGLTextureHelper::qt_TextureSubImage1D;
90 CompressedTextureSubImage1D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage1D;
91 CompressedTextureSubImage2D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage2D;
92 CompressedTextureSubImage3D = &QOpenGLTextureHelper::qt_CompressedTextureSubImage3D;
93 CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D;
94 CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D;
95 CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D;
96 }
97
98 // Some DSA functions are part of NV_texture_multisample instead
99 if (!context->isOpenGLES()
100 && context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) {
101 TextureImage3DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage3DMultisampleNV"));
102 TextureImage2DMultisampleNV = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTextureImage2DMultisampleNV"));
103
104 TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample;
105 TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample;
106 } else {
107 TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample;
108 TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample;
109 }
110
111#if QT_CONFIG(opengles2)
112 // Here we are targeting OpenGL ES 2.0+ only. This is likely using EGL, where,
113 // similarly to WGL, non-extension functions (i.e. any function that is part of the
114 // GLES spec) *may* not be queried via eglGetProcAddress.
115 QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
116 QOpenGLFunctionsPrivate *base = extra; // ES 2 core entry points live on the base
117
118 // OpenGL 1.0
119 TexImage1D = 0;
120
121 // OpenGL 1.1
122 TexSubImage1D = 0;
123
124 // OpenGL 1.3
125 GetCompressedTexImage = 0;
126 CompressedTexSubImage1D = 0;
127 CompressedTexSubImage2D = base->f.CompressedTexSubImage2D ? base->f.CompressedTexSubImage2D : ::glCompressedTexSubImage2D;
128 CompressedTexImage1D = 0;
129 CompressedTexImage2D = base->f.CompressedTexImage2D ? base->f.CompressedTexImage2D : ::glCompressedTexImage2D;
130 ActiveTexture = base->f.ActiveTexture ? base->f.ActiveTexture : ::glActiveTexture;
131
132 // OpenGL 3.0
133 GenerateMipmap = base->f.GenerateMipmap ? base->f.GenerateMipmap : ::glGenerateMipmap;
134
135 // OpenGL 3.2
136 TexImage3DMultisample = 0;
137 TexImage2DMultisample = 0;
138
139 // OpenGL 4.2
140 QOpenGLContext *ctx = QOpenGLContext::currentContext();
141 if (ctx->format().majorVersion() >= 3) {
142 // OpenGL ES 3.0+ has immutable storage for 2D and 3D at least.
143 TexStorage3D = extra->f.TexStorage3D;
144 TexStorage2D = extra->f.TexStorage2D;
145 } else {
146 TexStorage3D = 0;
147 TexStorage2D = 0;
148 }
149 TexStorage1D = 0;
150
151 // OpenGL 4.3
152 TexStorage3DMultisample = 0;
153 TexStorage2DMultisample = 0;
154 TexBufferRange = 0;
155 TextureView = 0;
156
157 // OpenGL ES 3.1+ has TexStorage2DMultisample
158 if (ctx->format().version() >= std::pair(3, 1))
159 TexStorage2DMultisample = extra->f.TexStorage2DMultisample;
160#endif
161
162 if (context->isOpenGLES() && context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) {
163 TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexImage3DOES"));
164 TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)>(context->getProcAddress("glTexSubImage3DOES"));
165 CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexImage3DOES"));
166 CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*)>(context->getProcAddress("glCompressedTexSubImage3DOES"));
167 } else {
168 QOpenGLContext *ctx = QOpenGLContext::currentContext();
169 if (ctx->isOpenGLES() && ctx->format().majorVersion() >= 3) {
170 // OpenGL ES 3.0+ has glTexImage3D.
171 QOpenGLExtraFunctionsPrivate *extra = static_cast<QOpenGLExtensions *>(context->extraFunctions())->d();
172 TexImage3D = extra->f.TexImage3D;
173 TexSubImage3D = extra->f.TexSubImage3D;
174 CompressedTexImage3D = extra->f.CompressedTexImage3D;
175 CompressedTexSubImage3D = extra->f.CompressedTexSubImage3D;
176 } else {
177 // OpenGL 1.2
178 TexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLsizei , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage3D"));
179 TexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage3D"));
180
181 // OpenGL 1.3
182 CompressedTexImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage3D"));
183 CompressedTexSubImage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLint , GLsizei , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage3D"));
184 }
185 }
186
187#if !QT_CONFIG(opengles2)
188 // OpenGL 1.0 and 1.1
189 TexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLint , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexImage1D"));
190 TexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLenum , const GLvoid *)>(context->getProcAddress("glTexSubImage1D"));
191
192 // OpenGL 1.3
193 GetCompressedTexImage = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLvoid *)>(context->getProcAddress("glGetCompressedTexImage"));
194 CompressedTexSubImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage1D"));
195 CompressedTexSubImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLint , GLint , GLsizei , GLsizei , GLenum , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexSubImage2D"));
196 CompressedTexImage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage1D"));
197 CompressedTexImage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLint , GLenum , GLsizei , GLsizei , GLint , GLsizei , const GLvoid *)>(context->getProcAddress("glCompressedTexImage2D"));
198 ActiveTexture = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glActiveTexture"));
199
200 // OpenGL 3.0
201 GenerateMipmap = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum )>(context->getProcAddress("glGenerateMipmap"));
202
203 // OpenGL 3.2
204 TexImage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage3DMultisample"));
205 TexImage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLint , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexImage2DMultisample"));
206
207 // OpenGL 4.2
208 TexStorage3D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage3D"));
209 TexStorage2D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei )>(context->getProcAddress("glTexStorage2D"));
210 TexStorage1D = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei )>(context->getProcAddress("glTexStorage1D"));
211
212 // OpenGL 4.3
213 TexStorage3DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage3DMultisample"));
214 TexStorage2DMultisample = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLsizei , GLenum , GLsizei , GLsizei , GLboolean )>(context->getProcAddress("glTexStorage2DMultisample"));
215 TexBufferRange = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLenum , GLenum , GLuint , GLintptr , GLsizeiptr )>(context->getProcAddress("glTexBufferRange"));
216 TextureView = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint , GLenum , GLuint , GLenum , GLuint , GLuint , GLuint , GLuint )>(context->getProcAddress("glTextureView"));
217#endif
218}
219
220void QOpenGLTextureHelper::dsa_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
221{
222 Q_UNUSED(bindingTarget);
223 TextureParameteriEXT(texture, target, pname, param);
224}
225
226void QOpenGLTextureHelper::dsa_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
227{
228 Q_UNUSED(bindingTarget);
229 TextureParameterivEXT(texture, target, pname, params);
230}
231
232void QOpenGLTextureHelper::dsa_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
233{
234 Q_UNUSED(bindingTarget);
235 TextureParameterfEXT(texture, target, pname, param);
236}
237
238void QOpenGLTextureHelper::dsa_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
239{
240 Q_UNUSED(bindingTarget);
241 TextureParameterfvEXT(texture, target, pname, params);
242}
243
244void QOpenGLTextureHelper::dsa_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
245{
246 Q_UNUSED(bindingTarget);
247 GenerateTextureMipmapEXT(texture, target);
248}
249
250void QOpenGLTextureHelper::dsa_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
251{
252 Q_UNUSED(bindingTarget);
253 TextureStorage3DEXT(texture, target, levels, internalFormat, width, height, depth);
254}
255
256void QOpenGLTextureHelper::dsa_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
257{
258 Q_UNUSED(bindingTarget);
259 TextureStorage2DEXT(texture, target, levels, internalFormat, width, height);
260}
261
262void QOpenGLTextureHelper::dsa_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
263{
264 Q_UNUSED(bindingTarget);
265 TextureStorage1DEXT(texture, target, levels, internalFormat, width);
266}
267
268void QOpenGLTextureHelper::dsa_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
269{
270 Q_UNUSED(bindingTarget);
271 TextureStorage3DMultisampleEXT(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
272}
273
274void QOpenGLTextureHelper::dsa_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
275{
276 Q_UNUSED(bindingTarget);
277 TextureStorage2DMultisampleEXT(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
278}
279
280void QOpenGLTextureHelper::dsa_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
281{
282 Q_UNUSED(bindingTarget);
283 TextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, format, type, pixels);
284}
285
286void QOpenGLTextureHelper::dsa_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
287{
288 Q_UNUSED(bindingTarget);
289 TextureImage2DEXT(texture, target, level, internalFormat, width, height, border, format, type, pixels);
290}
291
292void QOpenGLTextureHelper::dsa_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
293{
294 Q_UNUSED(bindingTarget);
295 TextureImage1DEXT(texture, target, level, internalFormat, width, border, format, type, pixels);
296}
297
298void QOpenGLTextureHelper::dsa_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
299{
300 Q_UNUSED(bindingTarget);
301 TextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
302}
303
304void QOpenGLTextureHelper::dsa_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
305{
306 Q_UNUSED(bindingTarget);
307 TextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
308}
309
310void QOpenGLTextureHelper::dsa_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
311{
312 Q_UNUSED(bindingTarget);
313 TextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);
314}
315
316void QOpenGLTextureHelper::dsa_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
317{
318 Q_UNUSED(bindingTarget);
319 TextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations);
320}
321
322void QOpenGLTextureHelper::dsa_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
323{
324 Q_UNUSED(bindingTarget);
325 TextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations);
326}
327
328void QOpenGLTextureHelper::dsa_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
329{
330 Q_UNUSED(bindingTarget);
331 CompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);
332}
333
334void QOpenGLTextureHelper::dsa_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
335{
336 Q_UNUSED(bindingTarget);
337 CompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);
338}
339
340void QOpenGLTextureHelper::dsa_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
341{
342 Q_UNUSED(bindingTarget);
343 CompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
344}
345
346void QOpenGLTextureHelper::dsa_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
347{
348 Q_UNUSED(bindingTarget);
349 CompressedTextureImage1DEXT(texture, target, level, internalFormat, width, border, imageSize, bits);
350}
351
352void QOpenGLTextureHelper::dsa_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
353{
354 Q_UNUSED(bindingTarget);
355 CompressedTextureImage2DEXT(texture, target, level, internalFormat, width, height, border, imageSize, bits);
356}
357
358void QOpenGLTextureHelper::dsa_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
359{
360 Q_UNUSED(bindingTarget);
361 CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits);
362}
363
364namespace {
365
366class TextureBinder
367{
368public:
369 TextureBinder(QOpenGLFunctions *functions, GLuint texture, GLenum target, GLenum bindingTarget)
370 : m_functions(functions)
371 {
372 // For cubemaps we can't use the standard DSA emulation as it is illegal to
373 // try to bind a texture to one of the cubemap face targets. So we force the
374 // target and binding target to the cubemap values in this case.
375 switch (target) {
382 bindingTarget = GL_TEXTURE_BINDING_CUBE_MAP;
383 m_target = GL_TEXTURE_CUBE_MAP;
384 break;
385
386 default:
387 m_target = target;
388 break;
389 }
390
391 m_functions->glGetIntegerv(bindingTarget, &m_oldTexture);
392 m_functions->glBindTexture(m_target, texture);
393 }
394
395 ~TextureBinder()
396 {
397 m_functions->glBindTexture(m_target, m_oldTexture);
398 }
399
400private:
401 QOpenGLFunctions *m_functions;
402 GLenum m_target;
403 GLint m_oldTexture;
404};
405
406} // namespace
407
408void QOpenGLTextureHelper::qt_TextureParameteri(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLint param)
409{
410 TextureBinder binder(functions, texture, target, bindingTarget);
411 functions->glTexParameteri(target, pname, param);
412}
413
414void QOpenGLTextureHelper::qt_TextureParameteriv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLint *params)
415{
416 TextureBinder binder(functions, texture, target, bindingTarget);
417 functions->glTexParameteriv(target, pname, params);
418}
419
420void QOpenGLTextureHelper::qt_TextureParameterf(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, GLfloat param)
421{
422 TextureBinder binder(functions, texture, target, bindingTarget);
423 functions->glTexParameterf(target, pname, param);
424}
425
426void QOpenGLTextureHelper::qt_TextureParameterfv(GLuint texture, GLenum target, GLenum bindingTarget, GLenum pname, const GLfloat *params)
427{
428 TextureBinder binder(functions, texture, target, bindingTarget);
429 functions->glTexParameterfv(target, pname, params);
430}
431
432void QOpenGLTextureHelper::qt_GenerateTextureMipmap(GLuint texture, GLenum target, GLenum bindingTarget)
433{
434 TextureBinder binder(functions, texture, target, bindingTarget);
435 functions->glGenerateMipmap(target);
436}
437
438void QOpenGLTextureHelper::qt_TextureStorage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
439{
440 TextureBinder binder(functions, texture, target, bindingTarget);
441 glTexStorage3D(target, levels, internalFormat, width, height, depth);
442}
443
444void QOpenGLTextureHelper::qt_TextureStorage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
445{
446 TextureBinder binder(functions, texture, target, bindingTarget);
447 glTexStorage2D(target, levels, internalFormat, width, height);
448}
449
450void QOpenGLTextureHelper::qt_TextureStorage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei levels, GLenum internalFormat, GLsizei width)
451{
452 TextureBinder binder(functions, texture, target, bindingTarget);
453 glTexStorage1D(target, levels, internalFormat, width);
454}
455
456void QOpenGLTextureHelper::qt_TextureStorage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
457{
458 TextureBinder binder(functions, texture, target, bindingTarget);
459 glTexStorage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
460}
461
462void QOpenGLTextureHelper::qt_TextureStorage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
463{
464 TextureBinder binder(functions, texture, target, bindingTarget);
465 glTexStorage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
466}
467
468void QOpenGLTextureHelper::qt_TextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
469{
470 TextureBinder binder(functions, texture, target, bindingTarget);
471 glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels);
472}
473
474void QOpenGLTextureHelper::qt_TextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
475{
476 TextureBinder binder(functions, texture, target, bindingTarget);
477 functions->glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
478}
479
480void QOpenGLTextureHelper::qt_TextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
481{
482 TextureBinder binder(functions, texture, target, bindingTarget);
483 glTexImage1D(target, level, internalFormat, width, border, format, type, pixels);
484}
485
486void QOpenGLTextureHelper::qt_TextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
487{
488 TextureBinder binder(functions, texture, target, bindingTarget);
489 glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
490}
491
492void QOpenGLTextureHelper::qt_TextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
493{
494 TextureBinder binder(functions, texture, target, bindingTarget);
495 functions->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
496}
497
498void QOpenGLTextureHelper::qt_TextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
499{
500 TextureBinder binder(functions, texture, target, bindingTarget);
501 glTexSubImage1D(target, level, xoffset, width, format, type, pixels);
502}
503
504void QOpenGLTextureHelper::qt_TextureImage3DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
505{
506 TextureBinder binder(functions, texture, target, bindingTarget);
507 glTexImage3DMultisample(target, samples, internalFormat, width, height, depth, fixedSampleLocations);
508}
509
510void QOpenGLTextureHelper::qt_TextureImage2DMultisample(GLuint texture, GLenum target, GLenum bindingTarget, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
511{
512 TextureBinder binder(functions, texture, target, bindingTarget);
513 glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedSampleLocations);
514}
515
516void QOpenGLTextureHelper::qt_CompressedTextureSubImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits)
517{
518 TextureBinder binder(functions, texture, target, bindingTarget);
519 glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, bits);
520}
521
522void QOpenGLTextureHelper::qt_CompressedTextureSubImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits)
523{
524 TextureBinder binder(functions, texture, target, bindingTarget);
525 glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, bits);
526}
527
528void QOpenGLTextureHelper::qt_CompressedTextureSubImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits)
529{
530 TextureBinder binder(functions, texture, target, bindingTarget);
531 glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);
532}
533
534void QOpenGLTextureHelper::qt_CompressedTextureImage1D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits)
535{
536 TextureBinder binder(functions, texture, target, bindingTarget);
537 glCompressedTexImage1D(target, level, internalFormat, width, border, imageSize, bits);
538}
539
540void QOpenGLTextureHelper::qt_CompressedTextureImage2D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits)
541{
542 TextureBinder binder(functions, texture, target, bindingTarget);
543 glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, bits);
544}
545
546void QOpenGLTextureHelper::qt_CompressedTextureImage3D(GLuint texture, GLenum target, GLenum bindingTarget, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits)
547{
548 TextureBinder binder(functions, texture, target, bindingTarget);
549 glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, bits);
550}
551
552QT_END_NAMESPACE
\inmodule QtGui
void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width)
void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
void glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth)
void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)
void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)
void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
void glTexImage3DMultisample(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations)
void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations)
void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height)
void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)
void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
Combined button and popup list for selecting options.
#define QOPENGLF_APIENTRYP
Definition qopengl.h:275
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y
Definition qopenglext.h:174
#define GL_TEXTURE_CUBE_MAP
Definition qopenglext.h:170
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
Definition qopenglext.h:177
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
Definition qopenglext.h:175
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z
Definition qopenglext.h:176
#define GL_TEXTURE_BINDING_CUBE_MAP
Definition qopenglext.h:171
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X
Definition qopenglext.h:172
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X
Definition qopenglext.h:173