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