0032465: Visualization, TKOpenGles - invalid enum on GL_RGBA16F initialization in...
[occt.git] / src / OpenGl / OpenGl_TextureFormat.cxx
CommitLineData
ba00aab7 1// Copyright (c) 2017-2019 OPEN CASCADE SAS
2//
3// This file is part of Open CASCADE Technology software library.
4//
5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
10//
11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
13
14#include <OpenGl_TextureFormat.hxx>
15
faff3767 16#include <Image_SupportedFormats.hxx>
ba00aab7 17#include <OpenGl_Context.hxx>
18
a46ab511 19// =======================================================================
20// function : FormatFormat
21// purpose :
22// =======================================================================
23TCollection_AsciiString OpenGl_TextureFormat::FormatFormat (GLint theInternalFormat)
24{
25 switch (theInternalFormat)
26 {
27 // RED variations (GL_RED, OpenGL 3.0+)
28 case GL_RED: return "GL_RED";
29 case GL_R8: return "GL_R8";
30 case 0x822A: return "GL_R16";
31 case GL_R16F: return "GL_R16F"; // half-float
32 case GL_R32F: return "GL_R32F"; // float
33 case GL_R32I: return "GL_R32I";
34 case GL_RED_INTEGER: return "GL_RED_INTEGER";
35 //
36 case GL_RG: return "GL_RG";
37 case GL_RG8: return "GL_RG8";
38 case 0x822C: return "GL_RG16";
39 case GL_RG16F: return "GL_RG16F";
40 case GL_RG32F: return "GL_RG32F";
41 case GL_RG32I: return "GL_RG32I";
42 case GL_RG_INTEGER: return "GL_RG_INTEGER";
43 // RGB variations
44 case GL_RGB: return "GL_RGB";
45 case 0x804F: return "GL_RGB4";
46 case 0x8050: return "GL_RGB5";
47 case GL_RGB8: return "GL_RGB8";
48 case GL_SRGB8: return "GL_SRGB8";
49 case 0x8052: return "GL_RGB10";
50 case 0x8053: return "GL_RGB12";
51 case 0x8054: return "GL_RGB16";
52 case GL_RGB16F: return "GL_RGB16F"; // half-float
53 case GL_RGB32F: return "GL_RGB32F"; // float
54 case GL_RGB32I: return "GL_RGB32I";
55 // RGBA variations
56 case GL_RGBA: return "GL_RGBA";
57 case GL_RGBA8: return "GL_RGBA8";
58 case GL_SRGB8_ALPHA8: return "GL_SRGB8_ALPHA8";
59 case GL_RGB10_A2: return "GL_RGB10_A2";
60 case 0x805A: return "GL_RGBA12";
61 case 0x805B: return "GL_RGBA16";
62 case GL_RGBA16F: return "GL_RGBA16F"; // half-float
63 case GL_RGBA32F: return "GL_RGBA32F"; // float
64 case GL_RGBA32I: return "GL_RGBA32I";
65 //
66 case 0x80E0: return "GL_BGR";
67 case GL_BGRA_EXT: return "GL_BGRA";
68 // ALPHA variations (deprecated)
69 case GL_ALPHA: return "GL_ALPHA";
70 case 0x803C: return "GL_ALPHA8";
71 case 0x803E: return "GL_ALPHA16";
72 case GL_LUMINANCE: return "GL_LUMINANCE";
73 case GL_LUMINANCE_ALPHA: return "GL_LUMINANCE_ALPHA";
74 //
75 case GL_DEPTH_COMPONENT: return "GL_DEPTH_COMPONENT";
76 case GL_DEPTH_COMPONENT16: return "GL_DEPTH_COMPONENT16";
77 case GL_DEPTH_COMPONENT24: return "GL_DEPTH_COMPONENT24";
78 case GL_DEPTH_COMPONENT32F: return "GL_DEPTH_COMPONENT32F";
79 case GL_DEPTH_STENCIL: return "GL_DEPTH_STENCIL";
80 case GL_DEPTH24_STENCIL8: return "GL_DEPTH24_STENCIL8";
81 case GL_DEPTH32F_STENCIL8: return "GL_DEPTH32F_STENCIL8";
82 //
83 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT";
84 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: return "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT";
85 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT";
86 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT";
87 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT";
88 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT";
89 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT";
90 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT";
91 }
92 return OpenGl_Context::FormatGlEnumHex (theInternalFormat);
93}
94
95// =======================================================================
96// function : FormatDataType
97// purpose :
98// =======================================================================
99TCollection_AsciiString OpenGl_TextureFormat::FormatDataType (GLint theDataType)
100{
101 switch (theDataType)
102 {
103 case GL_UNSIGNED_BYTE: return "GL_UNSIGNED_BYTE";
104 case GL_UNSIGNED_SHORT: return "GL_UNSIGNED_SHORT";
105 case GL_INT: return "GL_INT";
106 case GL_UNSIGNED_INT: return "GL_UNSIGNED_INT";
107 case GL_FLOAT: return "GL_FLOAT";
108 case GL_HALF_FLOAT: return "GL_HALF_FLOAT";
109 case 0x8D61: return "GL_HALF_FLOAT_OES";
110 case GL_UNSIGNED_INT_24_8: return "GL_UNSIGNED_INT_24_8";
111 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return "GL_FLOAT_32_UNSIGNED_INT_24_8_REV";
112 }
113 return OpenGl_Context::FormatGlEnumHex (theDataType);
114}
115
ba00aab7 116// =======================================================================
117// function : FindFormat
118// purpose :
119// =======================================================================
120OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Context)& theCtx,
121 Image_Format theFormat,
122 bool theIsColorMap)
123{
124 OpenGl_TextureFormat aFormat;
8f8fe4a9 125 aFormat.SetImageFormat (theFormat);
92996979 126#if defined(GL_ES_VERSION_2_0)
127 const bool useRedRedAlpha = false;
128#else
43eddb47 129 const bool useRedRedAlpha = (theCtx->core11ffp == NULL);
92996979 130#endif
ba00aab7 131 switch (theFormat)
132 {
133 case Image_Format_GrayF:
134 {
135 aFormat.SetNbComponents (1);
92996979 136 if (useRedRedAlpha)
ba00aab7 137 {
67312b79 138 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8);
ba00aab7 139 aFormat.SetPixelFormat (GL_RED);
140 }
141 else
142 {
143 #if !defined(GL_ES_VERSION_2_0)
144 aFormat.SetInternalFormat (GL_LUMINANCE8);
145 #else
146 aFormat.SetInternalFormat (GL_LUMINANCE);
147 #endif
148 aFormat.SetPixelFormat (GL_LUMINANCE);
149 }
150 aFormat.SetDataType (GL_FLOAT);
151 return aFormat;
152 }
153 case Image_Format_AlphaF:
154 {
155 aFormat.SetNbComponents (1);
92996979 156 if (useRedRedAlpha)
ba00aab7 157 {
67312b79 158 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8);
ba00aab7 159 aFormat.SetPixelFormat (GL_RED);
160 }
161 else
162 {
163 #if !defined(GL_ES_VERSION_2_0)
164 aFormat.SetInternalFormat (GL_ALPHA8);
165 #else
166 aFormat.SetInternalFormat (GL_ALPHA);
167 #endif
168 aFormat.SetPixelFormat (GL_ALPHA);
169 }
170 aFormat.SetDataType (GL_FLOAT);
171 return aFormat;
172 }
67312b79 173 case Image_Format_RGF:
174 {
175 if (!theCtx->arbTexRG)
176 {
177 return OpenGl_TextureFormat();
178 }
179 aFormat.SetNbComponents (2);
180 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RG32F : GL_RG8);
181 aFormat.SetPixelFormat (GL_RG);
182 aFormat.SetDataType (GL_FLOAT);
183 return aFormat;
184 }
ba00aab7 185 case Image_Format_RGBAF:
186 {
187 aFormat.SetNbComponents (4);
67312b79 188 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8);
ba00aab7 189 aFormat.SetPixelFormat (GL_RGBA);
190 aFormat.SetDataType (GL_FLOAT);
191 return aFormat;
192 }
193 case Image_Format_BGRAF:
194 {
195 if (!theCtx->IsGlGreaterEqual (1, 2) && !theCtx->extBgra)
196 {
197 return OpenGl_TextureFormat();
198 }
199 aFormat.SetNbComponents (4);
67312b79 200 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8);
ba00aab7 201 aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA
202 aFormat.SetDataType (GL_FLOAT);
203 return aFormat;
204 }
205 case Image_Format_RGBF:
206 {
207 aFormat.SetNbComponents (3);
67312b79 208 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8);
ba00aab7 209 aFormat.SetPixelFormat (GL_RGB);
210 aFormat.SetDataType (GL_FLOAT);
211 return aFormat;
212 }
213 case Image_Format_BGRF:
214 {
215 #if !defined(GL_ES_VERSION_2_0)
216 aFormat.SetNbComponents (3);
67312b79 217 aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8);
ba00aab7 218 aFormat.SetPixelFormat (GL_BGR); // equals to GL_BGR_EXT
219 aFormat.SetDataType (GL_FLOAT);
220 return aFormat;
221 #else
222 return OpenGl_TextureFormat();
223 #endif
224 }
1ac837b2 225 case Image_Format_RGF_half:
226 {
227 aFormat.SetNbComponents (2);
228 aFormat.SetInternalFormat (GL_RG16F);
229 aFormat.SetPixelFormat (GL_RG);
230 aFormat.SetDataType (GL_HALF_FLOAT);
231 if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions)
232 {
233 #if defined(GL_ES_VERSION_2_0)
234 aFormat.SetDataType (GL_HALF_FLOAT_OES);
235 #endif
236 }
237 return aFormat;
238 }
239 case Image_Format_RGBAF_half:
240 {
241 aFormat.SetNbComponents (4);
242 aFormat.SetInternalFormat (GL_RGBA16F);
243 aFormat.SetPixelFormat (GL_RGBA);
244 aFormat.SetDataType (GL_HALF_FLOAT);
245 if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions)
246 {
247 #if defined(GL_ES_VERSION_2_0)
248 aFormat.SetDataType (GL_HALF_FLOAT_OES);
249 #endif
250 }
251 return aFormat;
252 }
ba00aab7 253 case Image_Format_RGBA:
254 {
255 aFormat.SetNbComponents (4);
256 aFormat.SetInternalFormat (GL_RGBA8);
257 aFormat.SetPixelFormat (GL_RGBA);
258 aFormat.SetDataType (GL_UNSIGNED_BYTE);
259 if (theIsColorMap
260 && theCtx->ToRenderSRGB())
261 {
262 aFormat.SetInternalFormat (GL_SRGB8_ALPHA8);
263 }
264 return aFormat;
265 }
266 case Image_Format_BGRA:
267 {
268 #if !defined(GL_ES_VERSION_2_0)
269 if (!theCtx->IsGlGreaterEqual (1, 2)
270 && !theCtx->extBgra)
271 {
272 return OpenGl_TextureFormat();
273 }
274 aFormat.SetNbComponents (4);
275 aFormat.SetInternalFormat (GL_RGBA8);
276 if (theIsColorMap
277 && theCtx->ToRenderSRGB())
278 {
279 aFormat.SetInternalFormat (GL_SRGB8_ALPHA8);
280 }
281 #else
282 if (theIsColorMap
283 && theCtx->ToRenderSRGB())
284 {
285 // GL_SRGB8_ALPHA8 with texture swizzling would be better
286 }
287 if (!theCtx->extBgra)
288 {
289 return OpenGl_TextureFormat();
290 }
291 aFormat.SetNbComponents (4);
faff3767 292 aFormat.SetInternalFormat (GL_BGRA_EXT);
ba00aab7 293 #endif
294 aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA
295 aFormat.SetDataType (GL_UNSIGNED_BYTE);
296 return aFormat;
297 }
298 case Image_Format_RGB32:
299 {
300 #if !defined(GL_ES_VERSION_2_0)
301 // ask driver to convert data to RGB8 to save memory
302 aFormat.SetNbComponents (3);
303 aFormat.SetInternalFormat (GL_RGB8);
304 if (theIsColorMap
305 && theCtx->ToRenderSRGB())
306 {
307 aFormat.SetInternalFormat (GL_SRGB8);
308 }
309 #else
310 // conversion is not supported
311 aFormat.SetNbComponents (4);
312 aFormat.SetInternalFormat (GL_RGBA8);
313 if (theIsColorMap
314 && theCtx->ToRenderSRGB())
315 {
316 aFormat.SetInternalFormat (GL_SRGB8_ALPHA8);
317 }
318 #endif
319 aFormat.SetPixelFormat (GL_RGBA);
320 aFormat.SetDataType (GL_UNSIGNED_BYTE);
321 return aFormat;
322 }
323 case Image_Format_BGR32:
324 {
325 #if !defined(GL_ES_VERSION_2_0)
326 if (!theCtx->IsGlGreaterEqual(1, 2) && !theCtx->extBgra)
327 {
328 return OpenGl_TextureFormat();
329 }
330 aFormat.SetNbComponents (3);
331 aFormat.SetInternalFormat (GL_RGB8);
332 if (theIsColorMap
333 && theCtx->ToRenderSRGB())
334 {
335 aFormat.SetInternalFormat (GL_SRGB8);
336 }
337 #else
338 if (theIsColorMap
339 && theCtx->ToRenderSRGB())
340 {
341 // GL_SRGB8_ALPHA8 with texture swizzling would be better
342 }
343 if (!theCtx->extBgra)
344 {
345 return OpenGl_TextureFormat();
346 }
347 aFormat.SetNbComponents (4);
348 aFormat.SetInternalFormat (GL_BGRA_EXT);
349 #endif
350 aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA
351 aFormat.SetDataType (GL_UNSIGNED_BYTE);
352 return aFormat;
353 }
354 case Image_Format_RGB:
355 {
356 aFormat.SetNbComponents (3);
357 aFormat.SetInternalFormat (GL_RGB8);
358 aFormat.SetPixelFormat (GL_RGB);
359 aFormat.SetDataType (GL_UNSIGNED_BYTE);
360 if (theIsColorMap
361 && theCtx->ToRenderSRGB())
362 {
363 aFormat.SetInternalFormat (GL_SRGB8);
364 }
365 return aFormat;
366 }
367 case Image_Format_BGR:
368 {
369 #if !defined(GL_ES_VERSION_2_0)
370 if (!theCtx->IsGlGreaterEqual (1, 2)
371 && !theCtx->extBgra)
372 {
373 return OpenGl_TextureFormat();
374 }
375 aFormat.SetNbComponents (3);
376 aFormat.SetInternalFormat (GL_RGB8);
377 if (theIsColorMap
378 && theCtx->ToRenderSRGB())
379 {
380 aFormat.SetInternalFormat (GL_SRGB8);
381 }
382 aFormat.SetPixelFormat (GL_BGR); // equals to GL_BGR_EXT
383 aFormat.SetDataType (GL_UNSIGNED_BYTE);
384 #endif
385 return aFormat;
386 }
387 case Image_Format_Gray:
388 {
389 aFormat.SetNbComponents (1);
92996979 390 if (useRedRedAlpha)
ba00aab7 391 {
392 aFormat.SetInternalFormat (GL_R8);
393 aFormat.SetPixelFormat (GL_RED);
394 }
395 else
396 {
397 #if !defined(GL_ES_VERSION_2_0)
398 aFormat.SetInternalFormat (GL_LUMINANCE8);
399 #else
400 aFormat.SetInternalFormat (GL_LUMINANCE);
401 #endif
402 aFormat.SetPixelFormat (GL_LUMINANCE);
403 }
404 aFormat.SetDataType (GL_UNSIGNED_BYTE);
405 return aFormat;
406 }
407 case Image_Format_Alpha:
408 {
409 aFormat.SetNbComponents (1);
92996979 410 if (useRedRedAlpha)
ba00aab7 411 {
412 aFormat.SetInternalFormat (GL_R8);
413 aFormat.SetPixelFormat (GL_RED);
414 }
415 else
416 {
417 #if !defined(GL_ES_VERSION_2_0)
418 aFormat.SetInternalFormat (GL_ALPHA8);
419 #else
420 aFormat.SetInternalFormat (GL_ALPHA);
421 #endif
422 aFormat.SetPixelFormat (GL_ALPHA);
423 }
424 aFormat.SetDataType (GL_UNSIGNED_BYTE);
425 return aFormat;
426 }
427 case Image_Format_UNKNOWN:
428 {
429 return OpenGl_TextureFormat();
430 }
431 }
432 return OpenGl_TextureFormat();
433}
434
435// =======================================================================
436// function : FindSizedFormat
437// purpose :
438// =======================================================================
439OpenGl_TextureFormat OpenGl_TextureFormat::FindSizedFormat (const Handle(OpenGl_Context)& theCtx,
440 GLint theSizedFormat)
441{
442 OpenGl_TextureFormat aFormat;
443 switch (theSizedFormat)
444 {
445 case GL_RGBA32F:
446 {
447 aFormat.SetNbComponents (4);
448 aFormat.SetInternalFormat (theSizedFormat);
449 aFormat.SetPixelFormat (GL_RGBA);
450 aFormat.SetDataType (GL_FLOAT);
8f8fe4a9 451 aFormat.SetImageFormat (Image_Format_RGBAF);
ba00aab7 452 return aFormat;
453 }
454 case GL_R32F:
455 {
456 aFormat.SetNbComponents (1);
457 aFormat.SetInternalFormat (theSizedFormat);
458 aFormat.SetPixelFormat (GL_RED);
459 aFormat.SetDataType (GL_FLOAT);
8f8fe4a9 460 aFormat.SetImageFormat (Image_Format_GrayF);
ba00aab7 461 return aFormat;
462 }
78c4e836 463 case GL_RG32F:
464 {
465 aFormat.SetNbComponents (1);
466 aFormat.SetInternalFormat (theSizedFormat);
467 aFormat.SetPixelFormat (GL_RG);
468 aFormat.SetDataType (GL_FLOAT);
8f8fe4a9 469 aFormat.SetImageFormat (Image_Format_RGF);
78c4e836 470 return aFormat;
471 }
ba00aab7 472 case GL_RGBA16F:
473 {
474 aFormat.SetNbComponents (4);
475 aFormat.SetInternalFormat (theSizedFormat);
476 aFormat.SetPixelFormat (GL_RGBA);
477 aFormat.SetDataType (GL_HALF_FLOAT);
1ac837b2 478 aFormat.SetImageFormat (Image_Format_RGBAF_half);
ba00aab7 479 if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions)
480 {
481 #if defined(GL_ES_VERSION_2_0)
482 aFormat.SetDataType (GL_HALF_FLOAT_OES);
483 #else
484 aFormat.SetDataType (GL_FLOAT);
485 #endif
486 }
487 return aFormat;
488 }
489 case GL_R16F:
490 {
491 aFormat.SetNbComponents (1);
492 aFormat.SetInternalFormat (theSizedFormat);
493 aFormat.SetPixelFormat (GL_RED);
494 aFormat.SetDataType (GL_HALF_FLOAT);
8f8fe4a9 495 aFormat.SetImageFormat (Image_Format_GrayF);
ba00aab7 496 if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions)
497 {
498 #if defined(GL_ES_VERSION_2_0)
499 aFormat.SetDataType (GL_HALF_FLOAT_OES);
500 #else
501 aFormat.SetDataType (GL_FLOAT);
502 #endif
503 }
504 return aFormat;
1ac837b2 505 }
506 case GL_RG16F:
507 {
508 aFormat.SetNbComponents (2);
509 aFormat.SetInternalFormat (theSizedFormat);
510 aFormat.SetPixelFormat (GL_RG);
511 aFormat.SetDataType (GL_HALF_FLOAT);
512 aFormat.SetImageFormat (Image_Format_RGF_half);
513 if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions)
514 {
515 #if defined(GL_ES_VERSION_2_0)
516 aFormat.SetDataType (GL_HALF_FLOAT_OES);
517 #else
518 aFormat.SetDataType (GL_FLOAT);
519 #endif
520 }
521 return aFormat;
ba00aab7 522 }
523 case GL_SRGB8_ALPHA8:
524 case GL_RGBA8:
525 case GL_RGBA:
526 {
527 aFormat.SetNbComponents (4);
528 aFormat.SetInternalFormat (theSizedFormat);
529 aFormat.SetPixelFormat (GL_RGBA);
530 aFormat.SetDataType (GL_UNSIGNED_BYTE);
8f8fe4a9 531 aFormat.SetImageFormat (Image_Format_RGBA);
ba00aab7 532 if (theSizedFormat == GL_SRGB8_ALPHA8
533 && !theCtx->ToRenderSRGB())
534 {
535 aFormat.SetInternalFormat (GL_RGBA8); // fallback format
536 }
537 return aFormat;
538 }
539 case GL_SRGB8:
540 case GL_RGB8:
541 case GL_RGB:
542 {
543 aFormat.SetNbComponents (3);
544 aFormat.SetInternalFormat (theSizedFormat);
545 aFormat.SetPixelFormat (GL_RGB);
546 aFormat.SetDataType (GL_UNSIGNED_BYTE);
8f8fe4a9 547 aFormat.SetImageFormat (Image_Format_RGB);
ba00aab7 548 if (theSizedFormat == GL_SRGB8
549 && !theCtx->ToRenderSRGB())
550 {
551 aFormat.SetInternalFormat (GL_RGB8); // fallback format
552 }
553 return aFormat;
554 }
555 // integer types
556 case GL_R32I:
557 {
558 aFormat.SetNbComponents (1);
559 aFormat.SetInternalFormat (theSizedFormat);
560 aFormat.SetPixelFormat (GL_RED_INTEGER);
561 aFormat.SetDataType (GL_INT);
562 return aFormat;
563 }
564 case GL_RG32I:
565 {
566 aFormat.SetNbComponents (2);
567 aFormat.SetInternalFormat (theSizedFormat);
568 aFormat.SetPixelFormat (GL_RG_INTEGER);
569 aFormat.SetDataType (GL_INT);
570 return aFormat;
571 }
572 // depth formats
573 case GL_DEPTH24_STENCIL8:
574 {
575 aFormat.SetNbComponents (2);
576 aFormat.SetInternalFormat (theSizedFormat);
577 aFormat.SetPixelFormat (GL_DEPTH_STENCIL);
578 aFormat.SetDataType (GL_UNSIGNED_INT_24_8);
579 return aFormat;
580 }
581 case GL_DEPTH32F_STENCIL8:
582 {
583 aFormat.SetNbComponents (2);
584 aFormat.SetInternalFormat (theSizedFormat);
585 aFormat.SetPixelFormat (GL_DEPTH_STENCIL);
586 aFormat.SetDataType (GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
587 return aFormat;
588 }
589 case GL_DEPTH_COMPONENT16:
590 {
591 aFormat.SetNbComponents (1);
592 aFormat.SetInternalFormat (theSizedFormat);
593 aFormat.SetPixelFormat (GL_DEPTH_COMPONENT);
594 aFormat.SetDataType (GL_UNSIGNED_SHORT);
595 return aFormat;
596 }
597 case GL_DEPTH_COMPONENT24:
598 {
599 aFormat.SetNbComponents (1);
600 aFormat.SetInternalFormat (theSizedFormat);
601 aFormat.SetPixelFormat (GL_DEPTH_COMPONENT);
602 aFormat.SetDataType (GL_UNSIGNED_INT);
603 return aFormat;
604 }
605 case GL_DEPTH_COMPONENT32F:
606 {
607 aFormat.SetNbComponents (1);
608 aFormat.SetInternalFormat (theSizedFormat);
609 aFormat.SetPixelFormat (GL_DEPTH_COMPONENT);
610 aFormat.SetDataType (GL_FLOAT);
611 return aFormat;
612 }
613 }
614 return aFormat;
615}
faff3767 616
617// =======================================================================
618// function : FindCompressedFormat
619// purpose :
620// =======================================================================
621OpenGl_TextureFormat OpenGl_TextureFormat::FindCompressedFormat (const Handle(OpenGl_Context)& theCtx,
622 Image_CompressedFormat theFormat,
623 bool theIsColorMap)
624{
625 OpenGl_TextureFormat aFormat;
626 if (!theCtx->SupportedTextureFormats()->IsSupported (theFormat))
627 {
628 return aFormat;
629 }
630
631 switch (theFormat)
632 {
633 case Image_CompressedFormat_UNKNOWN:
634 {
635 return aFormat;
636 }
637 case Image_CompressedFormat_RGB_S3TC_DXT1:
638 {
639 aFormat.SetNbComponents (3);
640 aFormat.SetPixelFormat (GL_RGB);
641 aFormat.SetDataType (GL_UNSIGNED_BYTE);
642 aFormat.SetInternalFormat (GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
643 if (theIsColorMap
644 && theCtx->ToRenderSRGB())
645 {
646 aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_S3TC_DXT1_EXT);
647 }
648 return aFormat;
649 }
650 case Image_CompressedFormat_RGBA_S3TC_DXT1:
651 {
652 aFormat.SetNbComponents (4);
653 aFormat.SetPixelFormat (GL_RGBA);
654 aFormat.SetDataType (GL_UNSIGNED_BYTE);
655 aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
656 if (theIsColorMap
657 && theCtx->ToRenderSRGB())
658 {
659 aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT);
660 }
661 return aFormat;
662 }
663 case Image_CompressedFormat_RGBA_S3TC_DXT3:
664 {
665 aFormat.SetNbComponents (4);
666 aFormat.SetPixelFormat (GL_RGBA);
667 aFormat.SetDataType (GL_UNSIGNED_BYTE);
668 aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT3_EXT);
669 if (theIsColorMap
670 && theCtx->ToRenderSRGB())
671 {
672 aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT);
673 }
674 return aFormat;
675 }
676 case Image_CompressedFormat_RGBA_S3TC_DXT5:
677 {
678 aFormat.SetNbComponents (4);
679 aFormat.SetPixelFormat (GL_RGBA);
680 aFormat.SetDataType (GL_UNSIGNED_BYTE);
681 aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT);
682 if (theIsColorMap
683 && theCtx->ToRenderSRGB())
684 {
685 aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT);
686 }
687 return aFormat;
688 }
689 }
690 return aFormat;
691}