1 #include "intel_context.h"
3 #include "intel_chipset.h"
4 #include "main/texformat.h"
5 #include "main/enums.h"
9 * Choose hardware texture format given the user's glTexImage parameters.
11 * It works out that this function is fine for all the supported
12 * hardware. However, there is still a need to map the formats onto
13 * hardware descriptors.
15 * Note that the i915 can actually support many more formats than
16 * these if we take the step of simply swizzling the colors
17 * immediately after sampling...
20 intelChooseTextureFormat(GLcontext
* ctx
, GLint internalFormat
,
21 GLenum format
, GLenum type
)
23 struct intel_context
*intel
= intel_context(ctx
);
24 const GLboolean do32bpt
= (intel
->ctx
.Visual
.rgbBits
>= 24);
27 printf("%s intFmt=0x%x format=0x%x type=0x%x\n",
28 __FUNCTION__
, internalFormat
, format
, type
);
31 switch (internalFormat
) {
34 case GL_COMPRESSED_RGBA
:
35 if (format
== GL_BGRA
) {
36 if (type
== GL_UNSIGNED_BYTE
|| type
== GL_UNSIGNED_INT_8_8_8_8_REV
) {
37 return MESA_FORMAT_ARGB8888
;
39 else if (type
== GL_UNSIGNED_SHORT_4_4_4_4_REV
) {
40 return MESA_FORMAT_ARGB4444
;
42 else if (type
== GL_UNSIGNED_SHORT_1_5_5_5_REV
) {
43 return MESA_FORMAT_ARGB1555
;
46 return do32bpt
? MESA_FORMAT_ARGB8888
: MESA_FORMAT_ARGB4444
;
50 case GL_COMPRESSED_RGB
:
51 if (format
== GL_RGB
&& type
== GL_UNSIGNED_SHORT_5_6_5
) {
52 return MESA_FORMAT_RGB565
;
54 return do32bpt
? MESA_FORMAT_ARGB8888
: MESA_FORMAT_RGB565
;
60 return do32bpt
? MESA_FORMAT_ARGB8888
: MESA_FORMAT_ARGB4444
;
64 return MESA_FORMAT_ARGB4444
;
67 return MESA_FORMAT_ARGB1555
;
73 return MESA_FORMAT_ARGB8888
;
78 return MESA_FORMAT_RGB565
;
85 case GL_COMPRESSED_ALPHA
:
86 return MESA_FORMAT_A8
;
94 case GL_COMPRESSED_LUMINANCE
:
95 return MESA_FORMAT_L8
;
98 case GL_LUMINANCE_ALPHA
:
99 case GL_LUMINANCE4_ALPHA4
:
100 case GL_LUMINANCE6_ALPHA2
:
101 case GL_LUMINANCE8_ALPHA8
:
102 case GL_LUMINANCE12_ALPHA4
:
103 case GL_LUMINANCE12_ALPHA12
:
104 case GL_LUMINANCE16_ALPHA16
:
105 case GL_COMPRESSED_LUMINANCE_ALPHA
:
106 return MESA_FORMAT_AL88
;
113 case GL_COMPRESSED_INTENSITY
:
114 return MESA_FORMAT_I8
;
117 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
|| type
== GL_UNSIGNED_BYTE
)
118 return MESA_FORMAT_YCBCR
;
120 return MESA_FORMAT_YCBCR_REV
;
122 case GL_COMPRESSED_RGB_FXT1_3DFX
:
123 return MESA_FORMAT_RGB_FXT1
;
124 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
125 return MESA_FORMAT_RGBA_FXT1
;
129 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
130 return MESA_FORMAT_RGB_DXT1
;
132 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
133 return MESA_FORMAT_RGBA_DXT1
;
137 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
138 return MESA_FORMAT_RGBA_DXT3
;
140 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
141 return MESA_FORMAT_RGBA_DXT5
;
143 case GL_DEPTH_COMPONENT
:
144 case GL_DEPTH_COMPONENT16
:
145 case GL_DEPTH_COMPONENT24
:
146 case GL_DEPTH_COMPONENT32
:
148 return MESA_FORMAT_Z16
;
151 * 16bpp depth texture can't be paired with a stencil buffer so
152 * always used combined depth/stencil format.
155 case GL_DEPTH_STENCIL_EXT
:
156 case GL_DEPTH24_STENCIL8_EXT
:
157 return MESA_FORMAT_S8_Z24
;
162 case GL_SRGB_ALPHA_EXT
:
163 case GL_SRGB8_ALPHA8_EXT
:
164 case GL_COMPRESSED_SRGB_EXT
:
165 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
166 case GL_COMPRESSED_SLUMINANCE_EXT
:
167 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
168 return MESA_FORMAT_SARGB8
;
169 case GL_SLUMINANCE_EXT
:
170 case GL_SLUMINANCE8_EXT
:
171 if (IS_G4X(intel
->intelScreen
->deviceID
))
172 return MESA_FORMAT_SL8
;
174 return MESA_FORMAT_SARGB8
;
175 case GL_SLUMINANCE_ALPHA_EXT
:
176 case GL_SLUMINANCE8_ALPHA8_EXT
:
177 if (IS_G4X(intel
->intelScreen
->deviceID
))
178 return MESA_FORMAT_SLA8
;
180 return MESA_FORMAT_SARGB8
;
181 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
182 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
183 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
184 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
185 return MESA_FORMAT_SRGB_DXT1
;
187 /* i915 could also do this */
190 return MESA_FORMAT_DUDV8
;
193 return MESA_FORMAT_SIGNED_RGBA8888_REV
;
197 fprintf(stderr
, "unexpected texture format %s in %s\n",
198 _mesa_lookup_enum_by_nr(internalFormat
), __FUNCTION__
);
199 return MESA_FORMAT_NONE
;
202 return MESA_FORMAT_NONE
; /* never get here */
205 int intel_compressed_num_bytes(GLuint mesaFormat
)
210 case MESA_FORMAT_RGB_FXT1
:
211 case MESA_FORMAT_RGBA_FXT1
:
212 case MESA_FORMAT_RGB_DXT1
:
213 case MESA_FORMAT_RGBA_DXT1
:
217 case MESA_FORMAT_RGBA_DXT3
:
218 case MESA_FORMAT_RGBA_DXT5
: