FCT
载入中...
搜索中...
未找到
Format.h
浏览该文件的文档.
1#ifndef FCT_FORMAT_H
2#define FCT_FORMAT_H
3#include "../ThirdParty.h"
4#include "../Base/string.h"
5namespace FCT {
60 constexpr const char* FormatToString(Format format) noexcept
61 {
62 switch (format) {
64 return "UNDEFINED";
66 return "R8_UNORM";
68 return "R8G8_UNORM";
70 return "R8G8B8_UNORM";
72 return "R8G8B8A8_UNORM";
74 return "B8G8R8A8_UNORM";
76 return "R8G8B8A8_SRGB";
78 return "B8G8R8A8_SRGB";
80 return "R16_SFLOAT";
82 return "R16G16_SFLOAT";
84 return "R16G16B16A16_SFLOAT";
85 case Format::R8_SINT:
86 return "R8_SINT";
88 return "R8G8_SINT";
90 return "R8G8B8_SINT";
92 return "R8G8B8A8_SINT";
94 return "R16_SINT";
96 return "R16G16_SINT";
98 return "R16G16B16_SINT";
100 return "R16G16B16A16_SINT";
101 case Format::R32_SINT:
102 return "R32_SINT";
104 return "R32G32_SINT";
106 return "R32G32B32_SINT";
108 return "R32G32B32A32_SINT";
109 case Format::R8_UINT:
110 return "R8_UINT";
112 return "R8G8_UINT";
114 return "R8G8B8_UINT";
116 return "R8G8B8A8_UINT";
117 case Format::R16_UINT:
118 return "R16_UINT";
120 return "R16G16_UINT";
122 return "R16G16B16_UINT";
124 return "R16G16B16A16_UINT";
125 case Format::R32_UINT:
126 return "R32_UINT";
128 return "R32G32_UINT";
130 return "R32G32B32_UINT";
132 return "R32G32B32A32_UINT";
134 return "R32_SFLOAT";
136 return "R32G32_SFLOAT";
138 return "R32G32B32_SFLOAT";
140 return "R32G32B32A32_SFLOAT";
142 return "D16_UNORM";
144 return "D24_UNORM_S8_UINT";
146 return "D32_SFLOAT";
148 return "D32_SFLOAT_S8_UINT";
149 default:
150 return "UNKNOWN";
151 }
152 }
153 constexpr Format StringToFormat(const char* formatStr) noexcept
154 {
155 if (!formatStr) return Format::UNDEFINED;
156
157 if (StringEquals(formatStr, "UNDEFINED")) return Format::UNDEFINED;
158 if (StringEquals(formatStr, "R8_UNORM")) return Format::R8_UNORM;
159 if (StringEquals(formatStr, "R8G8_UNORM")) return Format::R8G8_UNORM;
160 if (StringEquals(formatStr, "R8G8B8_UNORM")) return Format::R8G8B8_UNORM;
161 if (StringEquals(formatStr, "R8G8B8A8_UNORM")) return Format::R8G8B8A8_UNORM;
162 if (StringEquals(formatStr, "B8G8R8A8_UNORM")) return Format::B8G8R8A8_UNORM;
163 if (StringEquals(formatStr, "R8G8B8A8_SRGB")) return Format::R8G8B8A8_SRGB;
164 if (StringEquals(formatStr, "B8G8R8A8_SRGB")) return Format::B8G8R8A8_SRGB;
165
166 // 16位格式
167 if (StringEquals(formatStr, "R16_SFLOAT")) return Format::R16_SFLOAT;
168 if (StringEquals(formatStr, "R16G16_SFLOAT")) return Format::R16G16_SFLOAT;
169 if (StringEquals(formatStr, "R16G16B16A16_SFLOAT")) return Format::R16G16B16A16_SFLOAT;
170
171 // 有符号整数格式
172 if (StringEquals(formatStr, "R8_SINT")) return Format::R8_SINT;
173 if (StringEquals(formatStr, "R8G8_SINT")) return Format::R8G8_SINT;
174 if (StringEquals(formatStr, "R8G8B8_SINT")) return Format::R8G8B8_SINT;
175 if (StringEquals(formatStr, "R8G8B8A8_SINT")) return Format::R8G8B8A8_SINT;
176 if (StringEquals(formatStr, "R16_SINT")) return Format::R16_SINT;
177 if (StringEquals(formatStr, "R16G16_SINT")) return Format::R16G16_SINT;
178 if (StringEquals(formatStr, "R16G16B16_SINT")) return Format::R16G16B16_SINT;
179 if (StringEquals(formatStr, "R16G16B16A16_SINT")) return Format::R16G16B16A16_SINT;
180 if (StringEquals(formatStr, "R32_SINT")) return Format::R32_SINT;
181 if (StringEquals(formatStr, "R32G32_SINT")) return Format::R32G32_SINT;
182 if (StringEquals(formatStr, "R32G32B32_SINT")) return Format::R32G32B32_SINT;
183 if (StringEquals(formatStr, "R32G32B32A32_SINT")) return Format::R32G32B32A32_SINT;
184
185 // 无符号整数格式
186 if (StringEquals(formatStr, "R8_UINT")) return Format::R8_UINT;
187 if (StringEquals(formatStr, "R8G8_UINT")) return Format::R8G8_UINT;
188 if (StringEquals(formatStr, "R8G8B8_UINT")) return Format::R8G8B8_UINT;
189 if (StringEquals(formatStr, "R8G8B8A8_UINT")) return Format::R8G8B8A8_UINT;
190 if (StringEquals(formatStr, "R16_UINT")) return Format::R16_UINT;
191 if (StringEquals(formatStr, "R16G16_UINT")) return Format::R16G16_UINT;
192 if (StringEquals(formatStr, "R16G16B16_UINT")) return Format::R16G16B16_UINT;
193 if (StringEquals(formatStr, "R16G16B16A16_UINT")) return Format::R16G16B16A16_UINT;
194 if (StringEquals(formatStr, "R32_UINT")) return Format::R32_UINT;
195 if (StringEquals(formatStr, "R32G32_UINT")) return Format::R32G32_UINT;
196 if (StringEquals(formatStr, "R32G32B32_UINT")) return Format::R32G32B32_UINT;
197 if (StringEquals(formatStr, "R32G32B32A32_UINT")) return Format::R32G32B32A32_UINT;
198
199 // 32位浮点格式
200 if (StringEquals(formatStr, "R32_SFLOAT")) return Format::R32_SFLOAT;
201 if (StringEquals(formatStr, "R32G32_SFLOAT")) return Format::R32G32_SFLOAT;
202 if (StringEquals(formatStr, "R32G32B32_SFLOAT")) return Format::R32G32B32_SFLOAT;
203 if (StringEquals(formatStr, "R32G32B32A32_SFLOAT")) return Format::R32G32B32A32_SFLOAT;
204
205 // 深度/模板格式
206 if (StringEquals(formatStr, "D16_UNORM")) return Format::D16_UNORM;
207 if (StringEquals(formatStr, "D24_UNORM_S8_UINT")) return Format::D24_UNORM_S8_UINT;
208 if (StringEquals(formatStr, "D32_SFLOAT")) return Format::D32_SFLOAT;
209 if (StringEquals(formatStr, "D32_SFLOAT_S8_UINT")) return Format::D32_SFLOAT_S8_UINT;
210
211 return Format::UNDEFINED;
212 }
213
214
215 constexpr const char* FormatToShaderType(Format format) noexcept
216 {
217 switch (format) {
218 case Format::R8_UNORM:
221 return "float";
222
226 return "float2";
227
230 return "float3";
231
238 return "float4";
239
240 // 整数类型
241 case Format::R8_SINT:
242 case Format::R16_SINT:
243 case Format::R32_SINT:
244 return "int";
245
249 return "int2";
250
254 return "int3";
255
259 return "int4";
260
261 // 无符号整数类型
262 case Format::R8_UINT:
263 case Format::R16_UINT:
264 case Format::R32_UINT:
265 return "uint";
266
270 return "uint2";
271
275 return "uint3";
276
280 return "uint4";
281
284 return "float";
285
288 return "float";
289
291 default:
292 return "float4";
293 }
294 }
295 constexpr size_t FormatSize(Format format) noexcept {
296 switch (format) {
297
298 case Format::R8_UNORM:
299 case Format::R8_SINT:
300 case Format::R8_UINT:
301 return 1;
302
306 return 2;
307
311 return 3;
312
319 return 4;
320
322 case Format::R16_SINT:
323 case Format::R16_UINT:
324 return 2;
325
329 return 4;
330
333 return 6;
334
338 return 8;
339
341 case Format::R32_SINT:
342 case Format::R32_UINT:
343 return 4;
344
348 return 8;
349
353 return 12;
354
358 return 16;
359
361 return 2;
363 return 4;
365 return 4;
367 return 5;
368
370 default:
371 return 0;
372 }
373 }
384#ifdef FCT_USE_VULKAN
385 inline vk::SampleCountFlagBits ToVkSampleCount(Samples samples) {
386 switch (samples) {
388 return vk::SampleCountFlagBits::e1;
390 return vk::SampleCountFlagBits::e2;
392 return vk::SampleCountFlagBits::e4;
394 return vk::SampleCountFlagBits::e8;
396 return vk::SampleCountFlagBits::e16;
398 return vk::SampleCountFlagBits::e32;
399 default:
400 return vk::SampleCountFlagBits::e1;
401 }
402 }
403
404 inline Samples FromVkSampleCount(vk::SampleCountFlagBits sampleCount) {
405 switch (sampleCount) {
406 case vk::SampleCountFlagBits::e1:
407 return Samples::sample_1;
408 case vk::SampleCountFlagBits::e2:
409 return Samples::sample_2;
410 case vk::SampleCountFlagBits::e4:
411 return Samples::sample_4;
412 case vk::SampleCountFlagBits::e8:
413 return Samples::sample_8;
414 case vk::SampleCountFlagBits::e16:
415 return Samples::sample_16;
416 case vk::SampleCountFlagBits::e32:
417 return Samples::sample_32;
418 default:
419 return Samples::sample_1;
420 }
421 }
422#endif
423#ifdef FCT_USE_VULKAN
424 inline vk::Format ToVkFormat(Format format) {
425 switch (format) {
427 return vk::Format::eUndefined;
428 case Format::R8_UNORM:
429 return vk::Format::eR8Unorm;
431 return vk::Format::eR8G8Unorm;
433 return vk::Format::eR8G8B8Unorm;
435 return vk::Format::eR8G8B8A8Unorm;
437 return vk::Format::eB8G8R8A8Unorm;
439 return vk::Format::eR8G8B8A8Srgb;
441 return vk::Format::eB8G8R8A8Srgb;
443 return vk::Format::eR16Sfloat;
445 return vk::Format::eR16G16Sfloat;
447 return vk::Format::eR16G16B16A16Sfloat;
449 return vk::Format::eR32Sfloat;
451 return vk::Format::eR32G32Sfloat;
453 return vk::Format::eR32G32B32Sfloat;
455 return vk::Format::eR32G32B32A32Sfloat;
456
457 // 有符号整数格式
458 case Format::R8_SINT:
459 return vk::Format::eR8Sint;
461 return vk::Format::eR8G8Sint;
463 return vk::Format::eR8G8B8Sint;
465 return vk::Format::eR8G8B8A8Sint;
466 case Format::R16_SINT:
467 return vk::Format::eR16Sint;
469 return vk::Format::eR16G16Sint;
471 return vk::Format::eR16G16B16Sint;
473 return vk::Format::eR16G16B16A16Sint;
474 case Format::R32_SINT:
475 return vk::Format::eR32Sint;
477 return vk::Format::eR32G32Sint;
479 return vk::Format::eR32G32B32Sint;
481 return vk::Format::eR32G32B32A32Sint;
482
483 // 无符号整数格式
484 case Format::R8_UINT:
485 return vk::Format::eR8Uint;
487 return vk::Format::eR8G8Uint;
489 return vk::Format::eR8G8B8Uint;
491 return vk::Format::eR8G8B8A8Uint;
492 case Format::R16_UINT:
493 return vk::Format::eR16Uint;
495 return vk::Format::eR16G16Uint;
497 return vk::Format::eR16G16B16Uint;
499 return vk::Format::eR16G16B16A16Uint;
500 case Format::R32_UINT:
501 return vk::Format::eR32Uint;
503 return vk::Format::eR32G32Uint;
505 return vk::Format::eR32G32B32Uint;
507 return vk::Format::eR32G32B32A32Uint;
508
510 return vk::Format::eD16Unorm;
512 return vk::Format::eD24UnormS8Uint;
514 return vk::Format::eD32Sfloat;
516 return vk::Format::eD32SfloatS8Uint;
517 default:
518 return vk::Format::eUndefined;
519 }
520 }
521 inline Format FromVkFormat(vk::Format format) {
522 switch (format) {
523 case vk::Format::eUndefined:
524 return Format::UNDEFINED;
525 case vk::Format::eR8Unorm:
526 return Format::R8_UNORM;
527 case vk::Format::eR8G8Unorm:
528 return Format::R8G8_UNORM;
529 case vk::Format::eR8G8B8Unorm:
531 case vk::Format::eR8G8B8A8Unorm:
533 case vk::Format::eB8G8R8A8Unorm:
535 case vk::Format::eR8G8B8A8Srgb:
537 case vk::Format::eB8G8R8A8Srgb:
539 case vk::Format::eR16Sfloat:
540 return Format::R16_SFLOAT;
541 case vk::Format::eR16G16Sfloat:
543 case vk::Format::eR16G16B16A16Sfloat:
545 case vk::Format::eR32Sfloat:
546 return Format::R32_SFLOAT;
547 case vk::Format::eR32G32Sfloat:
549 case vk::Format::eR32G32B32Sfloat:
551 case vk::Format::eR32G32B32A32Sfloat:
553
554 // 有符号整数格式
555 case vk::Format::eR8Sint:
556 return Format::R8_SINT;
557 case vk::Format::eR8G8Sint:
558 return Format::R8G8_SINT;
559 case vk::Format::eR8G8B8Sint:
560 return Format::R8G8B8_SINT;
561 case vk::Format::eR8G8B8A8Sint:
563 case vk::Format::eR16Sint:
564 return Format::R16_SINT;
565 case vk::Format::eR16G16Sint:
566 return Format::R16G16_SINT;
567 case vk::Format::eR16G16B16Sint:
569 case vk::Format::eR16G16B16A16Sint:
571 case vk::Format::eR32Sint:
572 return Format::R32_SINT;
573 case vk::Format::eR32G32Sint:
574 return Format::R32G32_SINT;
575 case vk::Format::eR32G32B32Sint:
577 case vk::Format::eR32G32B32A32Sint:
579
580 // 无符号整数格式
581 case vk::Format::eR8Uint:
582 return Format::R8_UINT;
583 case vk::Format::eR8G8Uint:
584 return Format::R8G8_UINT;
585 case vk::Format::eR8G8B8Uint:
586 return Format::R8G8B8_UINT;
587 case vk::Format::eR8G8B8A8Uint:
589 case vk::Format::eR16Uint:
590 return Format::R16_UINT;
591 case vk::Format::eR16G16Uint:
592 return Format::R16G16_UINT;
593 case vk::Format::eR16G16B16Uint:
595 case vk::Format::eR16G16B16A16Uint:
597 case vk::Format::eR32Uint:
598 return Format::R32_UINT;
599 case vk::Format::eR32G32Uint:
600 return Format::R32G32_UINT;
601 case vk::Format::eR32G32B32Uint:
603 case vk::Format::eR32G32B32A32Uint:
605
606 case vk::Format::eD16Unorm:
607 return Format::D16_UNORM;
608 case vk::Format::eD24UnormS8Uint:
610 case vk::Format::eD32Sfloat:
611 return Format::D32_SFLOAT;
612 case vk::Format::eD32SfloatS8Uint:
614 default:
615 return Format::UNDEFINED;
616 }
617 }
618#endif
619}
620
621
622#endif //FCT_FORMAT_H
constexpr bool StringEquals(const char *a, const char *b) noexcept
定义 string.h:8
constexpr const char * FormatToString(Format format) noexcept
vk::SampleCountFlagBits ToVkSampleCount(Samples samples)
constexpr const char * FormatToShaderType(Format format) noexcept
constexpr Format StringToFormat(const char *formatStr) noexcept
Format FromVkFormat(vk::Format format)
vk::Format ToVkFormat(Format format)
constexpr size_t FormatSize(Format format) noexcept
Samples FromVkSampleCount(vk::SampleCountFlagBits sampleCount)