1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB).
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QOPENGLABSTRACTTEXTURE_H
41 #define QOPENGLABSTRACTTEXTURE_H
42 
43 #include <QtGui/qtguiglobal.h>
44 
45 #ifndef QT_NO_OPENGL
46 
47 #include <QtGui/qopengl.h>
48 #include <QtGui/qimage.h>
49 #include <QtCore/QScopedPointer>
50 
51 QT_BEGIN_NAMESPACE
52 
53 class QDebug;
54 class QOpenGLTexturePrivate;
55 class QOpenGLPixelTransferOptions;
56 
57 class Q_GUI_EXPORT QOpenGLTexture
58 {
59     Q_GADGET
60 public:
61     enum Target {
62         Target1D                   = 0x0DE0,    // GL_TEXTURE_1D
63         Target1DArray              = 0x8C18,    // GL_TEXTURE_1D_ARRAY
64         Target2D                   = 0x0DE1,    // GL_TEXTURE_2D
65         Target2DArray              = 0x8C1A,    // GL_TEXTURE_2D_ARRAY
66         Target3D                   = 0x806F,    // GL_TEXTURE_3D
67         TargetCubeMap              = 0x8513,    // GL_TEXTURE_CUBE_MAP
68         TargetCubeMapArray         = 0x9009,    // GL_TEXTURE_CUBE_MAP_ARRAY
69         Target2DMultisample        = 0x9100,    // GL_TEXTURE_2D_MULTISAMPLE
70         Target2DMultisampleArray   = 0x9102,    // GL_TEXTURE_2D_MULTISAMPLE_ARRAY
71         TargetRectangle            = 0x84F5,    // GL_TEXTURE_RECTANGLE
72         TargetBuffer               = 0x8C2A     // GL_TEXTURE_BUFFER
73     };
74     Q_ENUM(Target)
75 
76     enum BindingTarget {
77         BindingTarget1D                    = 0x8068,   // GL_TEXTURE_BINDING_1D
78         BindingTarget1DArray               = 0x8C1C,   // GL_TEXTURE_BINDING_1D_ARRAY
79         BindingTarget2D                    = 0x8069,   // GL_TEXTURE_BINDING_2D
80         BindingTarget2DArray               = 0x8C1D,   // GL_TEXTURE_BINDING_2D_ARRAY
81         BindingTarget3D                    = 0x806A,   // GL_TEXTURE_BINDING_3D
82         BindingTargetCubeMap               = 0x8514,   // GL_TEXTURE_BINDING_CUBE_MAP
83         BindingTargetCubeMapArray          = 0x900A,   // GL_TEXTURE_BINDING_CUBE_MAP_ARRAY
84         BindingTarget2DMultisample         = 0x9104,   // GL_TEXTURE_BINDING_2D_MULTISAMPLE
85         BindingTarget2DMultisampleArray    = 0x9105,   // GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
86         BindingTargetRectangle             = 0x84F6,   // GL_TEXTURE_BINDING_RECTANGLE
87         BindingTargetBuffer                = 0x8C2C    // GL_TEXTURE_BINDING_BUFFER
88     };
89     Q_ENUM(BindingTarget)
90 
91     enum MipMapGeneration {
92         GenerateMipMaps,
93         DontGenerateMipMaps
94     };
95     Q_ENUM(MipMapGeneration)
96 
97     enum TextureUnitReset {
98         ResetTextureUnit,
99         DontResetTextureUnit
100     };
101     Q_ENUM(TextureUnitReset)
102 
103     enum TextureFormat {
104         NoFormat               = 0,         // GL_NONE
105 
106         // Unsigned normalized formats
107         R8_UNorm               = 0x8229,    // GL_R8
108         RG8_UNorm              = 0x822B,    // GL_RG8
109         RGB8_UNorm             = 0x8051,    // GL_RGB8
110         RGBA8_UNorm            = 0x8058,    // GL_RGBA8
111 
112         R16_UNorm              = 0x822A,    // GL_R16
113         RG16_UNorm             = 0x822C,    // GL_RG16
114         RGB16_UNorm            = 0x8054,    // GL_RGB16
115         RGBA16_UNorm           = 0x805B,    // GL_RGBA16
116 
117         // Signed normalized formats
118         R8_SNorm               = 0x8F94,    // GL_R8_SNORM
119         RG8_SNorm              = 0x8F95,    // GL_RG8_SNORM
120         RGB8_SNorm             = 0x8F96,    // GL_RGB8_SNORM
121         RGBA8_SNorm            = 0x8F97,    // GL_RGBA8_SNORM
122 
123         R16_SNorm              = 0x8F98,    // GL_R16_SNORM
124         RG16_SNorm             = 0x8F99,    // GL_RG16_SNORM
125         RGB16_SNorm            = 0x8F9A,    // GL_RGB16_SNORM
126         RGBA16_SNorm           = 0x8F9B,    // GL_RGBA16_SNORM
127 
128         // Unsigned integer formats
129         R8U                    = 0x8232,    // GL_R8UI
130         RG8U                   = 0x8238,    // GL_RG8UI
131         RGB8U                  = 0x8D7D,    // GL_RGB8UI
132         RGBA8U                 = 0x8D7C,    // GL_RGBA8UI
133 
134         R16U                   = 0x8234,    // GL_R16UI
135         RG16U                  = 0x823A,    // GL_RG16UI
136         RGB16U                 = 0x8D77,    // GL_RGB16UI
137         RGBA16U                = 0x8D76,    // GL_RGBA16UI
138 
139         R32U                   = 0x8236,    // GL_R32UI
140         RG32U                  = 0x823C,    // GL_RG32UI
141         RGB32U                 = 0x8D71,    // GL_RGB32UI
142         RGBA32U                = 0x8D70,    // GL_RGBA32UI
143 
144         // Signed integer formats
145         R8I                    = 0x8231,    // GL_R8I
146         RG8I                   = 0x8237,    // GL_RG8I
147         RGB8I                  = 0x8D8F,    // GL_RGB8I
148         RGBA8I                 = 0x8D8E,    // GL_RGBA8I
149 
150         R16I                   = 0x8233,    // GL_R16I
151         RG16I                  = 0x8239,    // GL_RG16I
152         RGB16I                 = 0x8D89,    // GL_RGB16I
153         RGBA16I                = 0x8D88,    // GL_RGBA16I
154 
155         R32I                   = 0x8235,    // GL_R32I
156         RG32I                  = 0x823B,    // GL_RG32I
157         RGB32I                 = 0x8D83,    // GL_RGB32I
158         RGBA32I                = 0x8D82,    // GL_RGBA32I
159 
160         // Floating point formats
161         R16F                   = 0x822D,    // GL_R16F
162         RG16F                  = 0x822F,    // GL_RG16F
163         RGB16F                 = 0x881B,    // GL_RGB16F
164         RGBA16F                = 0x881A,    // GL_RGBA16F
165 
166         R32F                   = 0x822E,    // GL_R32F
167         RG32F                  = 0x8230,    // GL_RG32F
168         RGB32F                 = 0x8815,    // GL_RGB32F
169         RGBA32F                = 0x8814,    // GL_RGBA32F
170 
171         // Packed formats
172         RGB9E5                 = 0x8C3D,    // GL_RGB9_E5
173         RG11B10F               = 0x8C3A,    // GL_R11F_G11F_B10F
174         RG3B2                  = 0x2A10,    // GL_R3_G3_B2
175         R5G6B5                 = 0x8D62,    // GL_RGB565
176         RGB5A1                 = 0x8057,    // GL_RGB5_A1
177         RGBA4                  = 0x8056,    // GL_RGBA4
178         RGB10A2                = 0x906F,    // GL_RGB10_A2UI
179 
180         // Depth formats
181         D16                    = 0x81A5,    // GL_DEPTH_COMPONENT16
182         D24                    = 0x81A6,    // GL_DEPTH_COMPONENT24
183         D24S8                  = 0x88F0,    // GL_DEPTH24_STENCIL8
184         D32                    = 0x81A7,    // GL_DEPTH_COMPONENT32
185         D32F                   = 0x8CAC,    // GL_DEPTH_COMPONENT32F
186         D32FS8X24              = 0x8CAD,    // GL_DEPTH32F_STENCIL8
187         S8                     = 0x8D48,    // GL_STENCIL_INDEX8
188 
189         // Compressed formats
190         RGB_DXT1               = 0x83F0,    // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
191         RGBA_DXT1              = 0x83F1,    // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
192         RGBA_DXT3              = 0x83F2,    // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
193         RGBA_DXT5              = 0x83F3,    // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
194         R_ATI1N_UNorm          = 0x8DBB,    // GL_COMPRESSED_RED_RGTC1
195         R_ATI1N_SNorm          = 0x8DBC,    // GL_COMPRESSED_SIGNED_RED_RGTC1
196         RG_ATI2N_UNorm         = 0x8DBD,    // GL_COMPRESSED_RG_RGTC2
197         RG_ATI2N_SNorm         = 0x8DBE,    // GL_COMPRESSED_SIGNED_RG_RGTC2
198         RGB_BP_UNSIGNED_FLOAT  = 0x8E8F,    // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
199         RGB_BP_SIGNED_FLOAT    = 0x8E8E,    // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
200         RGB_BP_UNorm           = 0x8E8C,    // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
201         R11_EAC_UNorm          = 0x9270,    // GL_COMPRESSED_R11_EAC
202         R11_EAC_SNorm          = 0x9271,    // GL_COMPRESSED_SIGNED_R11_EAC
203         RG11_EAC_UNorm         = 0x9272,    // GL_COMPRESSED_RG11_EAC
204         RG11_EAC_SNorm         = 0x9273,    // GL_COMPRESSED_SIGNED_RG11_EAC
205         RGB8_ETC2              = 0x9274,    // GL_COMPRESSED_RGB8_ETC2
206         SRGB8_ETC2             = 0x9275,    // GL_COMPRESSED_SRGB8_ETC2
207         RGB8_PunchThrough_Alpha1_ETC2 = 0x9276, // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
208         SRGB8_PunchThrough_Alpha1_ETC2 = 0x9277, // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
209         RGBA8_ETC2_EAC         = 0x9278,    // GL_COMPRESSED_RGBA8_ETC2_EAC
210         SRGB8_Alpha8_ETC2_EAC  = 0x9279,    // GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
211         RGB8_ETC1              = 0x8D64,    // GL_ETC1_RGB8_OES
212         RGBA_ASTC_4x4          = 0x93B0,    // GL_COMPRESSED_RGBA_ASTC_4x4_KHR
213         RGBA_ASTC_5x4          = 0x93B1,    // GL_COMPRESSED_RGBA_ASTC_5x4_KHR
214         RGBA_ASTC_5x5          = 0x93B2,    // GL_COMPRESSED_RGBA_ASTC_5x5_KHR
215         RGBA_ASTC_6x5          = 0x93B3,    // GL_COMPRESSED_RGBA_ASTC_6x5_KHR
216         RGBA_ASTC_6x6          = 0x93B4,    // GL_COMPRESSED_RGBA_ASTC_6x6_KHR
217         RGBA_ASTC_8x5          = 0x93B5,    // GL_COMPRESSED_RGBA_ASTC_8x5_KHR
218         RGBA_ASTC_8x6          = 0x93B6,    // GL_COMPRESSED_RGBA_ASTC_8x6_KHR
219         RGBA_ASTC_8x8          = 0x93B7,    // GL_COMPRESSED_RGBA_ASTC_8x8_KHR
220         RGBA_ASTC_10x5         = 0x93B8,    // GL_COMPRESSED_RGBA_ASTC_10x5_KHR
221         RGBA_ASTC_10x6         = 0x93B9,    // GL_COMPRESSED_RGBA_ASTC_10x6_KHR
222         RGBA_ASTC_10x8         = 0x93BA,    // GL_COMPRESSED_RGBA_ASTC_10x8_KHR
223         RGBA_ASTC_10x10        = 0x93BB,    // GL_COMPRESSED_RGBA_ASTC_10x10_KHR
224         RGBA_ASTC_12x10        = 0x93BC,    // GL_COMPRESSED_RGBA_ASTC_12x10_KHR
225         RGBA_ASTC_12x12        = 0x93BD,    // GL_COMPRESSED_RGBA_ASTC_12x12_KHR
226         SRGB8_Alpha8_ASTC_4x4  = 0x93D0,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
227         SRGB8_Alpha8_ASTC_5x4  = 0x93D1,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
228         SRGB8_Alpha8_ASTC_5x5  = 0x93D2,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
229         SRGB8_Alpha8_ASTC_6x5  = 0x93D3,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
230         SRGB8_Alpha8_ASTC_6x6  = 0x93D4,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
231         SRGB8_Alpha8_ASTC_8x5  = 0x93D5,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
232         SRGB8_Alpha8_ASTC_8x6  = 0x93D6,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
233         SRGB8_Alpha8_ASTC_8x8  = 0x93D7,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
234         SRGB8_Alpha8_ASTC_10x5 = 0x93D8,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
235         SRGB8_Alpha8_ASTC_10x6 = 0x93D9,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
236         SRGB8_Alpha8_ASTC_10x8 = 0x93DA,    // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
237         SRGB8_Alpha8_ASTC_10x10 = 0x93DB,   // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
238         SRGB8_Alpha8_ASTC_12x10 = 0x93DC,   // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
239         SRGB8_Alpha8_ASTC_12x12 = 0x93DD,   // GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
240 
241         // sRGB formats
242         SRGB8                  = 0x8C41,    // GL_SRGB8
243         SRGB8_Alpha8           = 0x8C43,    // GL_SRGB8_ALPHA8
244         SRGB_DXT1              = 0x8C4C,    // GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
245         SRGB_Alpha_DXT1        = 0x8C4D,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
246         SRGB_Alpha_DXT3        = 0x8C4E,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
247         SRGB_Alpha_DXT5        = 0x8C4F,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
248         SRGB_BP_UNorm          = 0x8E8D,    // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
249 
250         // ES 2 formats
251         DepthFormat            = 0x1902,    // GL_DEPTH_COMPONENT
252         AlphaFormat            = 0x1906,    // GL_ALPHA
253         RGBFormat              = 0x1907,    // GL_RGB
254         RGBAFormat             = 0x1908,    // GL_RGBA
255         LuminanceFormat        = 0x1909,    // GL_LUMINANCE
256         LuminanceAlphaFormat   = 0x190A
257 
258     };
259     Q_ENUM(TextureFormat)
260 
261     // This is not used externally yet but is reserved to allow checking of
262     // compatibility between texture formats
263 #ifndef Q_QDOC
264     enum TextureFormatClass {
265         NoFormatClass,
266         FormatClass_128Bit,
267         FormatClass_96Bit,
268         FormatClass_64Bit,
269         FormatClass_48Bit,
270         FormatClass_32Bit,
271         FormatClass_24Bit,
272         FormatClass_16Bit,
273         FormatClass_8Bit,
274         FormatClass_RGTC1_R,
275         FormatClass_RGTC2_RG,
276         FormatClass_BPTC_Unorm,
277         FormatClass_BPTC_Float,
278         FormatClass_S3TC_DXT1_RGB,
279         FormatClass_S3TC_DXT1_RGBA,
280         FormatClass_S3TC_DXT3_RGBA,
281         FormatClass_S3TC_DXT5_RGBA,
282         FormatClass_Unique
283     };
284 #endif
285 
286     enum CubeMapFace {
287         CubeMapPositiveX = 0x8515,  // GL_TEXTURE_CUBE_MAP_POSITIVE_X
288         CubeMapNegativeX = 0x8516,  // GL_TEXTURE_CUBE_MAP_NEGATIVE_X
289         CubeMapPositiveY = 0x8517,  // GL_TEXTURE_CUBE_MAP_POSITIVE_Y
290         CubeMapNegativeY = 0x8518,  // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
291         CubeMapPositiveZ = 0x8519,  // GL_TEXTURE_CUBE_MAP_POSITIVE_Z
292         CubeMapNegativeZ = 0x851A   // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
293     };
294     Q_ENUM(CubeMapFace)
295 
296     enum PixelFormat {
297         NoSourceFormat = 0,         // GL_NONE
298         Red            = 0x1903,    // GL_RED
299         RG             = 0x8227,    // GL_RG
300         RGB            = 0x1907,    // GL_RGB
301         BGR            = 0x80E0,    // GL_BGR
302         RGBA           = 0x1908,    // GL_RGBA
303         BGRA           = 0x80E1,    // GL_BGRA
304         Red_Integer    = 0x8D94,    // GL_RED_INTEGER
305         RG_Integer     = 0x8228,    // GL_RG_INTEGER
306         RGB_Integer    = 0x8D98,    // GL_RGB_INTEGER
307         BGR_Integer    = 0x8D9A,    // GL_BGR_INTEGER
308         RGBA_Integer   = 0x8D99,    // GL_RGBA_INTEGER
309         BGRA_Integer   = 0x8D9B,    // GL_BGRA_INTEGER
310         Stencil        = 0x1901,    // GL_STENCIL_INDEX
311         Depth          = 0x1902,    // GL_DEPTH_COMPONENT
312         DepthStencil   = 0x84F9,    // GL_DEPTH_STENCIL
313         Alpha          = 0x1906,    // GL_ALPHA
314         Luminance      = 0x1909,    // GL_LUMINANCE
315         LuminanceAlpha = 0x190A     // GL_LUMINANCE_ALPHA
316     };
317     Q_ENUM(PixelFormat)
318 
319     enum PixelType {
320         NoPixelType        = 0,         // GL_NONE
321         Int8               = 0x1400,    // GL_BYTE
322         UInt8              = 0x1401,    // GL_UNSIGNED_BYTE
323         Int16              = 0x1402,    // GL_SHORT
324         UInt16             = 0x1403,    // GL_UNSIGNED_SHORT
325         Int32              = 0x1404,    // GL_INT
326         UInt32             = 0x1405,    // GL_UNSIGNED_INT
327         Float16            = 0x140B,    // GL_HALF_FLOAT
328         Float16OES         = 0x8D61,    // GL_HALF_FLOAT_OES
329         Float32            = 0x1406,    // GL_FLOAT
330         UInt32_RGB9_E5     = 0x8C3E,    // GL_UNSIGNED_INT_5_9_9_9_REV
331         UInt32_RG11B10F    = 0x8C3B,    // GL_UNSIGNED_INT_10F_11F_11F_REV
332         UInt8_RG3B2        = 0x8032,    // GL_UNSIGNED_BYTE_3_3_2
333         UInt8_RG3B2_Rev    = 0x8362,    // GL_UNSIGNED_BYTE_2_3_3_REV
334         UInt16_RGB5A1      = 0x8034,    // GL_UNSIGNED_SHORT_5_5_5_1
335         UInt16_RGB5A1_Rev  = 0x8366,    // GL_UNSIGNED_SHORT_1_5_5_5_REV
336         UInt16_R5G6B5      = 0x8363,    // GL_UNSIGNED_SHORT_5_6_5
337         UInt16_R5G6B5_Rev  = 0x8364,    // GL_UNSIGNED_SHORT_5_6_5_REV
338         UInt16_RGBA4       = 0x8033,    // GL_UNSIGNED_SHORT_4_4_4_4
339         UInt16_RGBA4_Rev   = 0x8365,    // GL_UNSIGNED_SHORT_4_4_4_4_REV
340         UInt32_RGBA8       = 0x8035,    // GL_UNSIGNED_INT_8_8_8_8
341         UInt32_RGBA8_Rev   = 0x8367,    // GL_UNSIGNED_INT_8_8_8_8_REV
342         UInt32_RGB10A2     = 0x8036,    // GL_UNSIGNED_INT_10_10_10_2
343         UInt32_RGB10A2_Rev = 0x8368,    // GL_UNSIGNED_INT_2_10_10_10_REV
344         UInt32_D24S8       = 0x84FA,    // GL_UNSIGNED_INT_24_8
345         Float32_D32_UInt32_S8_X24 = 0x8DAD // GL_FLOAT_32_UNSIGNED_INT_24_8_REV
346     };
347     Q_ENUM(PixelType)
348 
349     enum SwizzleComponent {
350         SwizzleRed   = 0x8E42,  // GL_TEXTURE_SWIZZLE_R
351         SwizzleGreen = 0x8E43,  // GL_TEXTURE_SWIZZLE_G
352         SwizzleBlue  = 0x8E44,  // GL_TEXTURE_SWIZZLE_B
353         SwizzleAlpha = 0x8E45   // GL_TEXTURE_SWIZZLE_A
354     };
355     Q_ENUM(SwizzleComponent)
356 
357     enum SwizzleValue {
358         RedValue   = 0x1903, // GL_RED
359         GreenValue = 0x1904, // GL_GREEN
360         BlueValue  = 0x1905, // GL_BLUE
361         AlphaValue = 0x1906, // GL_ALPHA
362         ZeroValue  = 0,      // GL_ZERO
363         OneValue   = 1       // GL_ONE
364     };
365     Q_ENUM(SwizzleValue)
366 
367     enum WrapMode {
368         Repeat         = 0x2901, // GL_REPEAT
369         MirroredRepeat = 0x8370, // GL_MIRRORED_REPEAT
370         ClampToEdge    = 0x812F, // GL_CLAMP_TO_EDGE
371         ClampToBorder  = 0x812D  // GL_CLAMP_TO_BORDER
372     };
373     Q_ENUM(WrapMode)
374 
375     enum CoordinateDirection {
376         DirectionS = 0x2802, // GL_TEXTURE_WRAP_S
377         DirectionT = 0x2803, // GL_TEXTURE_WRAP_T
378         DirectionR = 0x8072  // GL_TEXTURE_WRAP_R
379     };
380     Q_ENUM(CoordinateDirection)
381 
382     // Features
383     enum Feature {
384         ImmutableStorage            = 0x00000001,
385         ImmutableMultisampleStorage = 0x00000002,
386         TextureRectangle            = 0x00000004,
387         TextureArrays               = 0x00000008,
388         Texture3D                   = 0x00000010,
389         TextureMultisample          = 0x00000020,
390         TextureBuffer               = 0x00000040,
391         TextureCubeMapArrays        = 0x00000080,
392         Swizzle                     = 0x00000100,
393         StencilTexturing            = 0x00000200,
394         AnisotropicFiltering        = 0x00000400,
395         NPOTTextures                = 0x00000800,
396         NPOTTextureRepeat           = 0x00001000,
397         Texture1D                   = 0x00002000,
398         TextureComparisonOperators  = 0x00004000,
399         TextureMipMapLevel          = 0x00008000,
400 #ifndef Q_QDOC
401         MaxFeatureFlag              = 0x00010000
402 #endif
403     };
404     Q_DECLARE_FLAGS(Features, Feature)
405     Q_ENUM(Feature)
406 
407     explicit QOpenGLTexture(Target target);
408     explicit QOpenGLTexture(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
409     ~QOpenGLTexture();
410 
411     Target target() const;
412 
413     // Creation and destruction
414     bool create();
415     void destroy();
416     bool isCreated() const;
417     GLuint textureId() const;
418 
419     // Binding and releasing
420     void bind();
421     void bind(uint unit, TextureUnitReset reset = DontResetTextureUnit);
422     void release();
423     void release(uint unit, TextureUnitReset reset = DontResetTextureUnit);
424 
425     bool isBound() const;
426     bool isBound(uint unit);
427     static GLuint boundTextureId(BindingTarget target);
428     static GLuint boundTextureId(uint unit, BindingTarget target);
429 
430     // Storage allocation
431     void setFormat(TextureFormat format);
432     TextureFormat format() const;
433     void setSize(int width, int height = 1, int depth = 1);
434     int width() const;
435     int height() const;
436     int depth() const;
437     void setMipLevels(int levels);
438     int mipLevels() const;
439     int maximumMipLevels() const;
440     void setLayers(int layers);
441     int layers() const;
442     int faces() const;
443     void setSamples(int samples);
444     int samples() const;
445     void setFixedSamplePositions(bool fixed);
446     bool isFixedSamplePositions() const;
447     void allocateStorage();
448     void allocateStorage(PixelFormat pixelFormat, PixelType pixelType);
449     bool isStorageAllocated() const;
450 
451     QOpenGLTexture *createTextureView(Target target,
452                                       TextureFormat viewFormat,
453                                       int minimumMipmapLevel, int maximumMipmapLevel,
454                                       int minimumLayer, int maximumLayer) const;
455     bool isTextureView() const;
456 
457     // Pixel transfer
458     // ### Qt 6: remove the non-const void * overloads
459 #if QT_DEPRECATED_SINCE(5, 3)
460     QT_DEPRECATED void setData(int mipLevel, int layer, CubeMapFace cubeFace,
461                                PixelFormat sourceFormat, PixelType sourceType,
462                                void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
463     QT_DEPRECATED void setData(int mipLevel, int layer,
464                                PixelFormat sourceFormat, PixelType sourceType,
465                                void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
466     QT_DEPRECATED void setData(int mipLevel,
467                                PixelFormat sourceFormat, PixelType sourceType,
468                                void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
469     QT_DEPRECATED void setData(PixelFormat sourceFormat, PixelType sourceType,
470                                void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
471 #endif // QT_DEPRECATED_SINCE(5, 3)
472 
473     void setData(int mipLevel, int layer, CubeMapFace cubeFace,
474                  PixelFormat sourceFormat, PixelType sourceType,
475                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
476     void setData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
477                  PixelFormat sourceFormat, PixelType sourceType,
478                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
479     void setData(int mipLevel, int layer,
480                  PixelFormat sourceFormat, PixelType sourceType,
481                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
482     void setData(int mipLevel,
483                  PixelFormat sourceFormat, PixelType sourceType,
484                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
485     void setData(PixelFormat sourceFormat, PixelType sourceType,
486                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
487 
488     void setData(int xOffset, int yOffset, int zOffset,
489                  int width, int height, int depth,
490                  PixelFormat sourceFormat, PixelType sourceType,
491                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
492     void setData(int xOffset, int yOffset, int zOffset,
493                  int width, int height, int depth, int mipLevel,
494                  PixelFormat sourceFormat, PixelType sourceType,
495                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
496     void setData(int xOffset, int yOffset, int zOffset,
497                  int width, int height, int depth,
498                  int mipLevel, int layer,
499                  PixelFormat sourceFormat, PixelType sourceType,
500                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
501     void setData(int xOffset, int yOffset, int zOffset,
502                  int width, int height, int depth,
503                  int mipLevel, int layer,
504                  CubeMapFace cubeFace,
505                  PixelFormat sourceFormat, PixelType sourceType,
506                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
507     void setData(int xOffset, int yOffset, int zOffset,
508                  int width, int height, int depth,
509                  int mipLevel, int layer,
510                  CubeMapFace cubeFace, int layerCount,
511                  PixelFormat sourceFormat, PixelType sourceType,
512                  const void *data, const QOpenGLPixelTransferOptions * const options = nullptr);
513 
514     // Compressed data upload
515     // ### Qt 6: remove the non-const void * overloads
516 #if QT_DEPRECATED_SINCE(5, 3)
517     QT_DEPRECATED void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
518                                          int dataSize, void *data,
519                                          const QOpenGLPixelTransferOptions * const options = nullptr);
520     QT_DEPRECATED void setCompressedData(int mipLevel, int layer,
521                                          int dataSize, void *data,
522                                          const QOpenGLPixelTransferOptions * const options = nullptr);
523     QT_DEPRECATED void setCompressedData(int mipLevel, int dataSize, void *data,
524                                          const QOpenGLPixelTransferOptions * const options = nullptr);
525     QT_DEPRECATED void setCompressedData(int dataSize, void *data,
526                                          const QOpenGLPixelTransferOptions * const options = nullptr);
527 #endif // QT_DEPRECATED_SINCE(5, 3)
528 
529     void setCompressedData(int mipLevel, int layer, CubeMapFace cubeFace,
530                            int dataSize, const void *data,
531                            const QOpenGLPixelTransferOptions * const options = nullptr);
532     void setCompressedData(int mipLevel, int layer, int layerCount, CubeMapFace cubeFace,
533                            int dataSize, const void *data,
534                            const QOpenGLPixelTransferOptions * const options = nullptr);
535     void setCompressedData(int mipLevel, int layer,
536                            int dataSize, const void *data,
537                            const QOpenGLPixelTransferOptions * const options = nullptr);
538     void setCompressedData(int mipLevel, int dataSize, const void *data,
539                            const QOpenGLPixelTransferOptions * const options = nullptr);
540     void setCompressedData(int dataSize, const void *data,
541                            const QOpenGLPixelTransferOptions * const options = nullptr);
542 
543     // Helpful overloads for setData
544     void setData(const QImage& image, MipMapGeneration genMipMaps = GenerateMipMaps);
545 
546     static bool hasFeature(Feature feature);
547 
548     // Texture Parameters
549     void setMipBaseLevel(int baseLevel);
550     int mipBaseLevel() const;
551     void setMipMaxLevel(int maxLevel);
552     int mipMaxLevel() const;
553     void setMipLevelRange(int baseLevel, int maxLevel);
554     QPair<int, int> mipLevelRange() const;
555 
556     void setAutoMipMapGenerationEnabled(bool enabled);
557     bool isAutoMipMapGenerationEnabled() const;
558 
559     void generateMipMaps();
560     void generateMipMaps(int baseLevel, bool resetBaseLevel = true);
561 
562     void setSwizzleMask(SwizzleComponent component, SwizzleValue value);
563     void setSwizzleMask(SwizzleValue r, SwizzleValue g,
564                         SwizzleValue b, SwizzleValue a);
565     SwizzleValue swizzleMask(SwizzleComponent component) const;
566 
567     enum DepthStencilMode {
568         DepthMode   = 0x1902,   // GL_DEPTH_COMPONENT
569         StencilMode = 0x1901    // GL_STENCIL_INDEX
570     };
571     Q_ENUM(DepthStencilMode)
572 
573     void setDepthStencilMode(DepthStencilMode mode);
574     DepthStencilMode depthStencilMode() const;
575 
576     enum ComparisonFunction {
577         CompareLessEqual    = 0x0203,   // GL_LEQUAL
578         CompareGreaterEqual = 0x0206,   // GL_GEQUAL
579         CompareLess         = 0x0201,   // GL_LESS
580         CompareGreater      = 0x0204,   // GL_GREATER
581         CompareEqual        = 0x0202,   // GL_EQUAL
582         CommpareNotEqual    = 0x0205,   // GL_NOTEQUAL
583         CompareAlways       = 0x0207,   // GL_ALWAYS
584         CompareNever        = 0x0200    // GL_NEVER
585     };
586     Q_ENUM(ComparisonFunction)
587 
588     void setComparisonFunction(ComparisonFunction function);
589     ComparisonFunction comparisonFunction() const;
590 
591     enum ComparisonMode {
592         CompareRefToTexture = 0x884E,   // GL_COMPARE_REF_TO_TEXTURE
593         CompareNone         = 0x0000    // GL_NONE
594     };
595 
596     void setComparisonMode(ComparisonMode mode);
597     ComparisonMode comparisonMode() const;
598 
599     // Sampling Parameters
600     enum Filter {
601         Nearest                 = 0x2600,   // GL_NEAREST
602         Linear                  = 0x2601,   // GL_LINEAR
603         NearestMipMapNearest    = 0x2700,   // GL_NEAREST_MIPMAP_NEAREST
604         NearestMipMapLinear     = 0x2702,   // GL_NEAREST_MIPMAP_LINEAR
605         LinearMipMapNearest     = 0x2701,   // GL_LINEAR_MIPMAP_NEAREST
606         LinearMipMapLinear      = 0x2703    // GL_LINEAR_MIPMAP_LINEAR
607     };
608     Q_ENUM(Filter)
609 
610     void setMinificationFilter(Filter filter);
611     Filter minificationFilter() const;
612     void setMagnificationFilter(Filter filter);
613     Filter magnificationFilter() const;
614     void setMinMagFilters(Filter minificationFilter,
615                           Filter magnificationFilter);
616     QPair<Filter, Filter> minMagFilters() const;
617     void setMaximumAnisotropy(float anisotropy);
618     float maximumAnisotropy() const;
619 
620     void setWrapMode(WrapMode mode);
621     void setWrapMode(CoordinateDirection direction, WrapMode mode);
622     WrapMode wrapMode(CoordinateDirection direction) const;
623 
624     void setBorderColor(QColor color);
625     void setBorderColor(float r, float g, float b, float a);
626     void setBorderColor(int r, int g, int b, int a);
627     void setBorderColor(uint r, uint g, uint b, uint a);
628 
629     QColor borderColor() const;
630     void borderColor(float *border) const;
631     void borderColor(int *border) const;
632     void borderColor(unsigned int *border) const;
633 
634     void setMinimumLevelOfDetail(float value);
635     float minimumLevelOfDetail() const;
636     void setMaximumLevelOfDetail(float value);
637     float maximumLevelOfDetail() const;
638     void setLevelOfDetailRange(float min, float max);
639     QPair<float, float> levelOfDetailRange() const;
640     void setLevelofDetailBias(float bias);
641     float levelofDetailBias() const;
642 
643 #ifndef QT_NO_DEBUG_STREAM
644     friend Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QOpenGLTexture *t);
645 #endif
646 
647 private:
648     Q_DISABLE_COPY(QOpenGLTexture)
649     Q_DECLARE_PRIVATE(QOpenGLTexture)
650     QScopedPointer<QOpenGLTexturePrivate> d_ptr;
651 };
652 
653 Q_DECLARE_OPERATORS_FOR_FLAGS(QOpenGLTexture::Features)
654 
655 #ifndef QT_NO_DEBUG_STREAM
656 Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QOpenGLTexture *t);
657 #endif
658 
659 QT_END_NAMESPACE
660 
661 #endif // QT_NO_OPENGL
662 
663 #endif // QOPENGLABSTRACTTEXTURE_H
664