Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qssgrenderbasetypes.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5
7
9{
10 switch (format) {
12 return "R8";
14 return "R16";
16 return "R16F";
18 return "R32I";
20 return "R32UI";
22 return "R32F";
24 return "RG8";
26 return "RGBA8";
28 return "RGB8";
30 return "SRGB8";
32 return "SRGB8A8";
34 return "RGB565";
36 return "RGBA5551";
38 return "Alpha8";
40 return "Luminance8";
42 return "Luminance16";
44 return "LuminanceAlpha8";
46 return "RGBA16F";
48 return "RG16F";
50 return "RG32F";
52 return "RGB32F";
54 return "RGBA32F";
56 return "R11G11B10";
58 return "RGB9E5";
60 return "RGBE8";
62 return "RGBA_DXT1";
64 return "RGB_DXT1";
66 return "RGBA_DXT3";
68 return "RGBA_DXT5";
70 return "R11_EAC_UNorm";
72 return "R11_EAC_SNorm";
74 return "RG11_EAC_UNorm";
76 return "RG11_EAC_SNorm";
78 return "RGB8_ETC2";
80 return "SRGB8_ETC2";
82 return "RGB8_PunchThrough_Alpha1_ETC2";
84 return "SRGB8_PunchThrough_Alpha1_ETC2";
86 return "RGBA8_ETC2_EAC";
88 return "SRGB8_Alpha8_ETC2_EAC";
90 return "RGBA_ASTC_4x4";
92 return "RGBA_ASTC_5x4";
94 return "RGBA_ASTC_5x5";
96 return "RGBA_ASTC_6x5";
98 return "RGBA_ASTC_6x6";
100 return "RGBA_ASTC_8x5";
102 return "RGBA_ASTC_8x6";
104 return "RGBA_ASTC_8x8";
106 return "RGBA_ASTC_10x5";
108 return "RGBA_ASTC_10x6";
110 return "RGBA_ASTC_10x8";
112 return "RGBA_ASTC_10x10";
114 return "RGBA_ASTC_12x10";
116 return "RGBA_ASTC_12x12";
118 return "SRGB8_Alpha8_ASTC_4x4";
120 return "SRGB8_Alpha8_ASTC_5x4";
122 return "SRGB8_Alpha8_ASTC_5x5";
124 return "SRGB8_Alpha8_ASTC_6x5";
126 return "SRGB8_Alpha8_ASTC_6x6";
128 return "SRGB8_Alpha8_ASTC_8x5";
130 return "SRGB8_Alpha8_ASTC_8x6";
132 return "SRGB8_Alpha8_ASTC_8x8";
134 return "SRGB8_Alpha8_ASTC_10x5";
136 return "SRGB8_Alpha8_ASTC_10x6";
138 return "SRGB8_Alpha8_ASTC_10x8";
140 return "SRGB8_Alpha8_ASTC_10x10";
142 return "SRGB8_Alpha8_ASTC_12x10";
144 return "SRGB8_Alpha8_ASTC_12x12";
146 return "BC1";
148 return "BC2";
150 return "BC3";
152 return "BC4";
154 return "BC5";
156 return "BC6H";
158 return "BC7";
160 return "Depth16";
162 return "Depth24";
164 return "Depth32";
166 return "Depth24Stencil8";
168 return "RGB10_A2";
170 return "RGB16F";
172 return "RGBA32UI";
174 return "RGB32UI";
176 return "RGBA16UI";
178 return "RGB16UI";
180 return "RGBA8UI";
182 return "RGB8UI";
184 return "RGBA32I";
186 return "RGB32I";
188 return "RGBA16I";
190 return "RGB16I";
192 return "RGBA8I";
194 return "RGB8I";
196 return "Unknown";
197 }
198
199 Q_UNREACHABLE_RETURN(nullptr);
200}
201
202void QSSGRenderTextureFormat::decodeToFloat(void *inPtr, qint32 byteOfs, float *outPtr) const
203{
204 Q_ASSERT(byteOfs >= 0);
205 outPtr[0] = 0.0f;
206 outPtr[1] = 0.0f;
207 outPtr[2] = 0.0f;
208 outPtr[3] = 0.0f;
209 quint8 *src = reinterpret_cast<quint8 *>(inPtr);
210 switch (format) {
211 case Alpha8:
212 outPtr[0] = (float(src[byteOfs])) / 255.0f;
213 break;
214
215 case Luminance8:
216 case LuminanceAlpha8:
217 case R8:
218 case RG8:
219 case RGB8:
220 case RGBA8:
221 case SRGB8:
222 case SRGB8A8:
223 for (qint32 i = 0; i < getSizeofFormat(); ++i) {
224 float val = (float(src[byteOfs + i])) / 255.0f;
225 outPtr[i] = (i < 3) ? std::pow(val, 0.4545454545f) : val;
226 }
227 break;
228 case RGBE8:
229 {
230 float pwd = powf(2.0f, int(src[byteOfs + 3]) - 128);
231 outPtr[0] = float(src[byteOfs + 0]) * pwd / 255.0;
232 outPtr[1] = float(src[byteOfs + 1]) * pwd / 255.0;
233 outPtr[2] = float(src[byteOfs + 2]) * pwd / 255.0;
234 outPtr[3] = 1.0f;
235 } break;
236
237 case R32F:
238 outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
239 break;
240 case RG32F:
241 outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
242 outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
243 break;
244 case RGBA32F:
245 outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
246 outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
247 outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2];
248 outPtr[3] = reinterpret_cast<float *>(src + byteOfs)[3];
249 break;
250 case RGB32F:
251 outPtr[0] = reinterpret_cast<float *>(src + byteOfs)[0];
252 outPtr[1] = reinterpret_cast<float *>(src + byteOfs)[1];
253 outPtr[2] = reinterpret_cast<float *>(src + byteOfs)[2];
254 break;
255
256 case R16F:
257 case RG16F:
258 case RGBA16F:
259 for (qint32 i = 0; i < (getSizeofFormat() >> 1); ++i) {
260 // NOTE : This only works on the assumption that we don't have any denormals,
261 // Infs or NaNs.
262 // Every pixel in our source image should be "regular"
263 quint16 h = reinterpret_cast<quint16 *>(src + byteOfs)[i];
264 quint32 sign = (h & 0x8000u) << 16u;
265 quint32 exponent = (((((h & 0x7c00u) >> 10) - 15) + 127) << 23);
266 quint32 mantissa = ((h & 0x3ffu) << 13);
267 quint32 result = sign | exponent | mantissa;
268
269 if (h == 0 || h == 0x8000)
270 result = 0;
271 memcpy(outPtr + i, &result, 4);
272 }
273 break;
274
275 case R11G11B10:
276 // place holder
277 Q_ASSERT(false);
278 break;
279
280 default:
281 outPtr[0] = 0.0f;
282 outPtr[1] = 0.0f;
283 outPtr[2] = 0.0f;
284 outPtr[3] = 0.0f;
285 break;
286 }
287}
288void QSSGRenderTextureFormat::encodeToPixel(float *inPtr, void *outPtr, qint32 byteOfs) const
289{
290 Q_ASSERT(byteOfs >= 0);
291 quint8 *dest = reinterpret_cast<quint8 *>(outPtr);
292 switch (format) {
294 dest[byteOfs] = quint8(inPtr[0] * 255.0f);
295 break;
296
297 case Luminance8:
298 case LuminanceAlpha8:
299 case R8:
300 case RG8:
301 case RGB8:
302 case RGBA8:
303 case SRGB8:
304 case SRGB8A8:
305 for (qint32 i = 0; i < getSizeofFormat(); ++i) {
306 inPtr[i] = (inPtr[i] > 1.0f) ? 1.0f : inPtr[i];
307 if (i < 3)
308 dest[byteOfs + i] = quint8(powf(inPtr[i], 2.2f) * 255.0f);
309 else
310 dest[byteOfs + i] = quint8(inPtr[i] * 255.0f);
311 }
312 break;
313 case RGBE8:
314 {
315 float max = qMax(inPtr[0], qMax(inPtr[1], inPtr[2]));
316 M8E8 ex(max);
317 M8E8 a(inPtr[0], ex.e);
318 M8E8 b(inPtr[1], ex.e);
319 M8E8 c(inPtr[2], ex.e);
320 quint8 *dst = reinterpret_cast<quint8 *>(outPtr) + byteOfs;
321 dst[0] = a.m;
322 dst[1] = b.m;
323 dst[2] = c.m;
324 dst[3] = ex.e;
325 } break;
326
327 case R32F:
328 reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
329 break;
330 case RG32F:
331 reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
332 reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
333 break;
334 case RGBA32F:
335 reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
336 reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
337 reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2];
338 reinterpret_cast<float *>(dest + byteOfs)[3] = inPtr[3];
339 break;
340 case RGB32F:
341 reinterpret_cast<float *>(dest + byteOfs)[0] = inPtr[0];
342 reinterpret_cast<float *>(dest + byteOfs)[1] = inPtr[1];
343 reinterpret_cast<float *>(dest + byteOfs)[2] = inPtr[2];
344 break;
345
346 case R16F:
347 case RG16F:
348 case RGBA16F:
349 for (qint32 i = 0; i < (getSizeofFormat() >> 1); ++i) {
350 // NOTE : This also has the limitation of not handling infs, NaNs and
351 // denormals, but it should be
352 // sufficient for our purposes.
353 if (inPtr[i] > 65519.0f)
354 inPtr[i] = 65519.0f;
355 if (std::fabs(inPtr[i]) < 6.10352E-5f)
356 inPtr[i] = 0.0f;
357 quint32 f = reinterpret_cast<quint32 *>(inPtr)[i];
358 quint32 sign = (f & 0x80000000) >> 16;
359 qint32 exponent = (f & 0x7f800000) >> 23;
360 quint32 mantissa = (f >> 13) & 0x3ff;
361 exponent = exponent - 112;
362 if (exponent > 31)
363 exponent = 31;
364 if (exponent < 0)
365 exponent = 0;
366 exponent = exponent << 10;
367 reinterpret_cast<quint16 *>(dest + byteOfs)[i] = quint16(sign | quint32(exponent) | mantissa);
368 }
369 break;
370
371 case R11G11B10:
372 // place holder
373 Q_ASSERT(false);
374 break;
375
376 default:
377 dest[byteOfs] = 0;
378 dest[byteOfs + 1] = 0;
379 dest[byteOfs + 2] = 0;
380 dest[byteOfs + 3] = 0;
381 break;
382 }
383}
384
386{
387 switch (value) {
389 return "Clockwise";
391 return "CounterClockwise";
392 }
393
394 Q_UNREACHABLE_RETURN(nullptr);
395}
396
398{
399 switch (value) {
401 return "Front";
403 return "Back";
405 return "FrontAndBack";
407 return "Unknown";
409 return "Disabled";
410 }
411
412 Q_UNREACHABLE_RETURN(nullptr);
413}
414
416{
417 switch (value) {
419 return "NegX";
421 return "NegZ";
423 return "NegY";
425 return "PosY";
427 return "PosX";
429 return "PosZ";
430 }
431
432 Q_UNREACHABLE_RETURN(nullptr);
433}
434
436{
437 switch (value) {
439 return "Unknown";
441 return "Diffuse";
443 return "Specular";
445 return "Environment";
447 return "Bump";
449 return "Normal";
451 return "Emissive";
453 return "Anisotropy";
455 return "Translucent";
456 }
457
458 Q_UNREACHABLE_RETURN(nullptr);
459}
460
462{
463 switch (value) {
465 return "OpaqueOnly";
467 return "Always";
469 return "Never";
471 return "OpaquePrePass";
472 }
473
474 Q_UNREACHABLE_RETURN(nullptr);
475}
476
478{
479 switch (value) {
481 return "UnsignedInt8";
483 return "Int8";
485 return "UnsignedInt16";
487 return "Int16";
489 return "UnsignedInt32";
491 return "Int32";
493 return "UnsignedInt64";
495 return "Int64";
497 return "Float16";
499 return "Float32";
501 return "Float64";
502 }
503
504 Q_UNREACHABLE_RETURN("Unknown");
505}
506
508{
510}
511
513{
514 switch (value) {
516 return "ClampToEdge";
518 return "MirroredRepeat";
520 return "Repeat";
522 return "Unknown";
523 }
524
525 Q_UNREACHABLE_RETURN(nullptr);
526}
527
529{
530 switch (value) {
532 return "Nearest";
534 return "Linear";
536 return "None";
537 }
538
539 Q_UNREACHABLE_RETURN(nullptr);
540}
541
543{
544 switch (face) {
546 return "-X";
548 return "-Z";
550 return "-Y";
552 return "+Y";
554 return "+X";
556 return "+Z";
557 }
558
559 Q_UNREACHABLE_RETURN(nullptr);
560}
561
563{
564 switch (type) {
566 return sizeof(quint8);
568 return sizeof(qint8);
570 return sizeof(quint16);
572 return sizeof(qint16);
574 return sizeof(quint32);
576 return sizeof(qint32);
578 return sizeof(quint64);
580 return sizeof(qint64);
582 return sizeof(qfloat16);
584 return sizeof(float);
586 return sizeof(double);
587 }
588 Q_UNREACHABLE_RETURN(0);
589}
590
static const char * displayName(QSSGRenderTextureCubeFace face)
static const char * toString(QSSGRenderTextureCubeFace value)
static size_t getSizeOfType(QSSGRenderComponentType type)
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Definition qfloat16.h:46
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum face
GLfloat GLfloat f
GLenum src
GLenum type
GLenum GLenum dst
GLint GLsizei GLsizei GLenum format
GLfloat GLfloat GLfloat GLfloat h
const GLubyte * c
GLuint GLfloat * val
GLint * exponent
GLuint64EXT * result
[6]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QSSGRenderTextureCubeFace
QSSGRenderTextureCoordOp
QSSGRenderTextureFilterOp
QSSGRenderTextureTypeValue
QSSGRenderComponentType
unsigned int quint32
Definition qtypes.h:45
short qint16
Definition qtypes.h:42
unsigned short quint16
Definition qtypes.h:43
int qint32
Definition qtypes.h:44
unsigned long long quint64
Definition qtypes.h:56
long long qint64
Definition qtypes.h:55
QT_BEGIN_NAMESPACE typedef signed char qint8
Definition qtypes.h:40
unsigned char quint8
Definition qtypes.h:41
static int sign(int x)
void decodeToFloat(void *inPtr, qint32 byteOfs, float *outPtr) const
void encodeToPixel(float *inPtr, void *outPtr, qint32 byteOfs) const
const char * toString() const