1 /* 2 ----------------------------------------------------------------------------- 3 This source file is part of OGRE 4 (Object-oriented Graphics Rendering Engine) 5 For the latest info, see http://www.ogre3d.org 6 7 Copyright (c) 2000-2014 Torus Knot Software Ltd 8 9 Permission is hereby granted, free of charge, to any person obtaining a copy 10 of this software and associated documentation files (the "Software"), to deal 11 in the Software without restriction, including without limitation the rights 12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 copies of the Software, and to permit persons to whom the Software is 14 furnished to do so, subject to the following conditions: 15 16 The above copyright notice and this permission notice shall be included in 17 all copies or substantial portions of the Software. 18 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 THE SOFTWARE. 26 ----------------------------------------------------------------------------- 27 */ 28 29 #include "OgreGLPixelFormat.h" 30 #include "OgreRoot.h" 31 #include "OgreRenderSystem.h" 32 #include "OgreBitwise.h" 33 34 namespace Ogre { 35 36 struct GLPixelFormatDescription { 37 GLenum format; 38 GLenum type; 39 GLenum internalFormat; 40 }; 41 42 static GLPixelFormatDescription _pixelFormats[int(PF_COUNT)] = { 43 {GL_NONE}, // PF_UNKNOWN 44 {GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE8}, // PF_L8 45 {GL_LUMINANCE, GL_UNSIGNED_SHORT, GL_LUMINANCE16}, // PF_L16 46 {GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA8}, // PF_A8 47 {GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE8_ALPHA8},// PF_BYTE_LA 48 {GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB5}, // PF_R5G6B5 49 {GL_BGR, GL_UNSIGNED_SHORT_5_6_5, GL_RGB5}, // PF_B5G6R5 50 {GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_RGBA4}, // PF_A4R4G4B4 51 {GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_RGB5_A1},// PF_A1R5G5B5 52 #if OGRE_ENDIAN == OGRE_ENDIAN_BIG 53 {GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8}, // PF_R8G8B8 54 {GL_BGR, GL_UNSIGNED_BYTE, GL_RGB8}, // PF_B8G8R8 55 #else 56 {GL_BGR, GL_UNSIGNED_BYTE, GL_RGB8}, // PF_R8G8B8 57 {GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8}, // PF_B8G8R8 58 #endif 59 {GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, GL_RGBA8}, // PF_A8R8G8B8 60 {GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, GL_RGBA8}, // PF_A8B8G8R8 61 {GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, GL_RGBA8}, // PF_B8G8R8A8 62 {GL_NONE}, // PF_A2R10G10B10 63 {GL_NONE}, // PF_A2B10G10R10 64 {GL_NONE, GL_NONE, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT},// PF_DXT1 65 {GL_NONE}, // PF_DXT2 66 {GL_NONE, GL_NONE, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT},// PF_DXT3 67 {GL_NONE}, // PF_DXT4 68 {GL_NONE, GL_NONE, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT},// PF_DXT5 69 {GL_RGB, GL_HALF_FLOAT, GL_RGB16F_ARB}, // PF_FLOAT16_RGB 70 {GL_RGBA, GL_HALF_FLOAT, GL_RGBA16F_ARB}, // PF_FLOAT16_RGBA 71 {GL_RGB, GL_FLOAT, GL_RGB32F_ARB}, // PF_FLOAT32_RGB 72 {GL_RGBA, GL_FLOAT, GL_RGBA32F_ARB}, // PF_FLOAT32_RGBA 73 {GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, GL_RGBA8}, // PF_X8R8G8B8 74 {GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, GL_RGBA8}, // PF_X8B8G8R8 75 {GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, GL_RGBA8}, // PF_R8G8B8A8 76 {GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_DEPTH_COMPONENT16}, // PF_DEPTH16 77 {GL_RGBA, GL_UNSIGNED_SHORT, GL_RGBA16}, // PF_SHORT_RGBA 78 {GL_RGB, GL_UNSIGNED_BYTE_3_3_2, GL_R3_G3_B2}, // PF_R3G3B2 79 {GL_LUMINANCE, GL_HALF_FLOAT, GL_LUMINANCE16F_ARB}, // PF_FLOAT16_R 80 {GL_LUMINANCE, GL_FLOAT, GL_LUMINANCE32F_ARB}, // PF_FLOAT32_R 81 {GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT, GL_LUMINANCE16_ALPHA16},// PF_SHORT_GR 82 {GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, GL_LUMINANCE_ALPHA16F_ARB}, // PF_FLOAT16_GR 83 {GL_LUMINANCE_ALPHA, GL_FLOAT, GL_LUMINANCE_ALPHA32F_ARB}, // PF_FLOAT32_GR 84 {GL_RGB, GL_UNSIGNED_SHORT, GL_RGB16}, // PF_SHORT_RGB 85 // limited format support: the rest is PF_NONE 86 }; 87 88 //----------------------------------------------------------------------------- getGLOriginFormat(PixelFormat pf)89 GLenum GLPixelUtil::getGLOriginFormat(PixelFormat pf) 90 { 91 return _pixelFormats[pf].format; 92 } 93 //----------------------------------------------------------------------------- getGLOriginDataType(PixelFormat pf)94 GLenum GLPixelUtil::getGLOriginDataType(PixelFormat pf) 95 { 96 return _pixelFormats[pf].type; 97 } 98 getGLInternalFormat(PixelFormat pf,bool hwGamma)99 GLenum GLPixelUtil::getGLInternalFormat(PixelFormat pf, bool hwGamma) 100 { 101 GLenum ret = _pixelFormats[pf].internalFormat; 102 103 if(!hwGamma) 104 return ret; 105 106 switch(ret) 107 { 108 case GL_RGB8: 109 return GL_SRGB8; 110 case GL_RGBA8: 111 return GL_SRGB8_ALPHA8; 112 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 113 return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT; 114 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 115 return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; 116 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 117 return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; 118 default: 119 return ret; 120 } 121 } 122 123 //----------------------------------------------------------------------------- getClosestOGREFormat(GLenum format)124 PixelFormat GLPixelUtil::getClosestOGREFormat(GLenum format) 125 { 126 switch(format) 127 { 128 case GL_DEPTH_COMPONENT24: 129 case GL_DEPTH_COMPONENT32: 130 case GL_DEPTH_COMPONENT32F: 131 case GL_DEPTH_COMPONENT: 132 return PF_DEPTH16; 133 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 134 return PF_DXT1; 135 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 136 return PF_DXT3; 137 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 138 return PF_DXT5; 139 case GL_SRGB8: 140 case GL_RGB8: // prefer native endian byte format 141 return PF_BYTE_RGB; 142 case GL_SRGB8_ALPHA8: 143 case GL_RGBA8: // prefer native endian byte format 144 return PF_BYTE_RGBA; 145 }; 146 147 for(int pf = 0; pf < PF_COUNT; pf++) { 148 if(_pixelFormats[pf].internalFormat == format) 149 return (PixelFormat)pf; 150 } 151 152 return PF_BYTE_RGBA; 153 } 154 //----------------------------------------------------------------------------- optionalPO2(uint32 value)155 uint32 GLPixelUtil::optionalPO2(uint32 value) 156 { 157 const RenderSystemCapabilities *caps = Root::getSingleton().getRenderSystem()->getCapabilities(); 158 if(caps->hasCapability(RSC_NON_POWER_OF_2_TEXTURES)) 159 return value; 160 else 161 return Bitwise::firstPO2From(value); 162 } 163 164 165 } 166