| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- #include "BsGLPixelFormat.h"
- #include "BsRenderAPI.h"
- #include "BsBitwise.h"
- #include "BsDebug.h"
- namespace bs
- {
- PixelFormat GLPixelUtil::getClosestSupportedPF(PixelFormat pf, TextureType texType, int usage)
- {
- // Check for any obvious issues first
- PixelUtil::checkFormat(pf, texType, usage);
-
- // We don't check for any platform-specific format issues, assumed all are supported
- return pf;
- }
- GLenum GLPixelUtil::getGLOriginFormat(PixelFormat mFormat)
- {
- switch(mFormat)
- {
- case PF_R8:
- return GL_RED;
- case PF_R8G8:
- return GL_RG;
- case PF_R8G8B8:
- return GL_RGB;
- case PF_B8G8R8:
- return GL_BGR;
- case PF_R8G8B8A8:
- return GL_RGBA;
- case PF_B8G8R8A8:
- return GL_BGRA;
- case PF_FLOAT16_R:
- return GL_RED;
- case PF_FLOAT16_RG:
- return GL_RG;
- case PF_FLOAT16_RGB:
- return GL_RGB;
- case PF_FLOAT16_RGBA:
- return GL_RGBA;
- case PF_FLOAT32_R:
- return GL_RED;
- case PF_FLOAT32_RG:
- return GL_RG;
- case PF_FLOAT32_RGB:
- return GL_RGB;
- case PF_FLOAT32_RGBA:
- return GL_RGBA;
- case PF_FLOAT_R11G11B10:
- return GL_RGB;
- case PF_UNORM_R10G10B10A2:
- return GL_RGBA;
- case PF_BC1:
- case PF_BC1a:
- case PF_BC3:
- case PF_BC7:
- return GL_RGBA;
- case PF_BC4:
- return GL_RED;
- case PF_BC5:
- return GL_RG;
- case PF_BC6H:
- return GL_RGB;
- default:
- return 0;
- }
- }
- GLenum GLPixelUtil::getGLOriginDataType(PixelFormat format)
- {
- switch(format)
- {
- case PF_R8:
- case PF_R8G8B8:
- case PF_B8G8R8:
- case PF_R8G8:
- return GL_UNSIGNED_BYTE;
- case PF_B8G8R8A8:
- case PF_R8G8B8A8:
- return GL_UNSIGNED_INT_8_8_8_8_REV;
- case PF_FLOAT16_R:
- case PF_FLOAT16_RG:
- case PF_FLOAT16_RGB:
- case PF_FLOAT16_RGBA:
- return GL_HALF_FLOAT;
- case PF_FLOAT32_R:
- case PF_FLOAT32_RG:
- case PF_FLOAT32_RGB:
- case PF_FLOAT32_RGBA:
- return GL_FLOAT;
- case PF_FLOAT_R11G11B10:
- return GL_UNSIGNED_INT_10F_11F_11F_REV;
- case PF_UNORM_R10G10B10A2:
- return GL_UNSIGNED_INT_2_10_10_10_REV;
- default:
- return 0;
- }
- }
-
- GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
- {
- switch(mFormat) {
- case PF_R8:
- return GL_R8;
- case PF_R8G8:
- return GL_RG8;
- case PF_R8G8B8:
- case PF_B8G8R8:
- if (hwGamma)
- return GL_SRGB8;
- else
- return GL_RGB8;
- case PF_B8G8R8A8:
- case PF_R8G8B8A8:
- if (hwGamma)
- return GL_SRGB8_ALPHA8;
- else
- return GL_RGBA8;
- case PF_FLOAT16_R:
- return GL_R16F;
- case PF_FLOAT16_RGB:
- return GL_RGB16F;
- case PF_FLOAT16_RG:
- return GL_RG16F;
- case PF_FLOAT16_RGBA:
- return GL_RGBA16F;
- case PF_FLOAT32_R:
- return GL_R32F;
- case PF_FLOAT32_RG:
- return GL_RG32F;
- case PF_FLOAT32_RGB:
- return GL_RGB32F;
- case PF_FLOAT32_RGBA:
- return GL_RGBA32F;
- case PF_BC1a:
- case PF_BC1:
- if (hwGamma)
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
- else
- return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
- case PF_BC2:
- if (hwGamma)
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
- else
- return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
- case PF_BC3:
- if (hwGamma)
- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
- else
- return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
- case PF_BC4:
- return GL_COMPRESSED_RED_RGTC1;
- case PF_BC5:
- return GL_COMPRESSED_RG_RGTC2;
- case PF_BC6H:
- return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
- case PF_BC7:
- if (hwGamma)
- return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM;
- else
- return GL_COMPRESSED_RGBA_BPTC_UNORM;
- case PF_D16:
- return GL_DEPTH_COMPONENT16;
- case PF_D32:
- return GL_DEPTH_COMPONENT32F;
- case PF_D24S8:
- return GL_DEPTH24_STENCIL8;
- case PF_D32_S8X24:
- return GL_DEPTH32F_STENCIL8;
- case PF_FLOAT_R11G11B10:
- return GL_R11F_G11F_B10F;
- case PF_UNORM_R10G10B10A2:
- return GL_RGB10_A2;
- default:
- return GL_NONE;
- }
- }
- GLenum GLPixelUtil::getDepthStencilTypeFromFormat(PixelFormat mFormat)
- {
- switch(mFormat)
- {
- case PF_D32_S8X24:
- return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
- case PF_D24S8:
- return GL_UNSIGNED_INT_24_8;
- case PF_D32:
- return GL_FLOAT;
- case PF_D16:
- return GL_UNSIGNED_SHORT;
- default:
- break;
- }
- LOGERR("Invalid depth stencil format");
- return PF_D24S8;
- }
-
- GLenum GLPixelUtil::getBufferFormat(GpuBufferFormat format)
- {
- static bool lookupInitialized = false;
- static GLenum lookup[BF_COUNT];
- if (!lookupInitialized)
- {
- lookup[BF_16X1F] = GL_R16F;
- lookup[BF_16X2F] = GL_RG16F;
- lookup[BF_16X4F] = GL_RGBA16F;
- lookup[BF_32X1F] = GL_R32F;
- lookup[BF_32X2F] = GL_RG32F;
- lookup[BF_32X3F] = GL_RGB32F;
- lookup[BF_32X4F] = GL_RGBA32F;
- lookup[BF_8X1] = GL_R8;
- lookup[BF_8X2] = GL_RG8;
- lookup[BF_8X4] = GL_RGBA8;
- lookup[BF_16X1] = GL_R16;
- lookup[BF_16X2] = GL_RG16;
- lookup[BF_16X4] = GL_RGBA16;
- lookup[BF_8X1S] = GL_R8I;
- lookup[BF_8X2S] = GL_RG8I;
- lookup[BF_8X4S] = GL_RGBA8I;
- lookup[BF_16X1S] = GL_R16I;
- lookup[BF_16X2S] = GL_RG16I;
- lookup[BF_16X4S] = GL_RGBA16I;
- lookup[BF_32X1S] = GL_R32I;
- lookup[BF_32X2S] = GL_RG32I;
- lookup[BF_32X3S] = GL_RGB32I;
- lookup[BF_32X4S] = GL_RGBA32I;
- lookup[BF_8X1U] = GL_R8UI;
- lookup[BF_8X2U] = GL_RG8UI;
- lookup[BF_8X4U] = GL_RGBA8UI;
- lookup[BF_16X1U] = GL_R16UI;
- lookup[BF_16X2U] = GL_RG16UI;
- lookup[BF_16X4U] = GL_RGBA16UI;
- lookup[BF_32X1U] = GL_R32UI;
- lookup[BF_32X2U] = GL_RG32UI;
- lookup[BF_32X3U] = GL_RGB32UI;
- lookup[BF_32X4U] = GL_RGBA32UI;
- lookupInitialized = true;
- }
- if (format >= BF_COUNT)
- return GL_NONE;
- return lookup[(UINT32)format];
- }
- };
|