1 #include "intel_context.h"
3 #include "main/enums.h"
7 * Choose hardware texture format given the user's glTexImage parameters.
9 * It works out that this function is fine for all the supported
10 * hardware. However, there is still a need to map the formats onto
11 * hardware descriptors.
13 * Note that the i915 can actually support many more formats than
14 * these if we take the step of simply swizzling the colors
15 * immediately after sampling...
18 intelChooseTextureFormat(GLcontext
* ctx
, GLint internalFormat
,
19 GLenum format
, GLenum type
)
21 struct intel_context
*intel
= intel_context(ctx
);
22 const GLboolean do32bpt
= (intel
->ctx
.Visual
.rgbBits
>= 24);
25 printf("%s intFmt=0x%x format=0x%x type=0x%x\n",
26 __FUNCTION__
, internalFormat
, format
, type
);
29 switch (internalFormat
) {
32 case GL_COMPRESSED_RGBA
:
33 if (format
== GL_BGRA
) {
34 if (type
== GL_UNSIGNED_BYTE
|| type
== GL_UNSIGNED_INT_8_8_8_8_REV
) {
35 return MESA_FORMAT_ARGB8888
;
37 else if (type
== GL_UNSIGNED_SHORT_4_4_4_4_REV
) {
38 return MESA_FORMAT_ARGB4444
;
40 else if (type
== GL_UNSIGNED_SHORT_1_5_5_5_REV
) {
41 return MESA_FORMAT_ARGB1555
;
44 return do32bpt
? MESA_FORMAT_ARGB8888
: MESA_FORMAT_ARGB4444
;
48 case GL_COMPRESSED_RGB
:
49 if (format
== GL_RGB
&& type
== GL_UNSIGNED_SHORT_5_6_5
) {
50 return MESA_FORMAT_RGB565
;
52 return do32bpt
? MESA_FORMAT_XRGB8888
: MESA_FORMAT_RGB565
;
58 return do32bpt
? MESA_FORMAT_ARGB8888
: MESA_FORMAT_ARGB4444
;
62 return MESA_FORMAT_ARGB4444
;
65 return MESA_FORMAT_ARGB1555
;
71 return MESA_FORMAT_XRGB8888
;
76 return MESA_FORMAT_RGB565
;
83 case GL_COMPRESSED_ALPHA
:
84 return MESA_FORMAT_A8
;
92 case GL_COMPRESSED_LUMINANCE
:
93 return MESA_FORMAT_L8
;
95 case GL_LUMINANCE12_ALPHA4
:
96 case GL_LUMINANCE12_ALPHA12
:
97 case GL_LUMINANCE16_ALPHA16
:
99 return MESA_FORMAT_AL1616
;
105 case GL_LUMINANCE_ALPHA
:
106 case GL_LUMINANCE4_ALPHA4
:
107 case GL_LUMINANCE6_ALPHA2
:
108 case GL_LUMINANCE8_ALPHA8
:
109 case GL_COMPRESSED_LUMINANCE_ALPHA
:
110 return MESA_FORMAT_AL88
;
117 case GL_COMPRESSED_INTENSITY
:
118 return MESA_FORMAT_I8
;
121 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
|| type
== GL_UNSIGNED_BYTE
)
122 return MESA_FORMAT_YCBCR
;
124 return MESA_FORMAT_YCBCR_REV
;
126 case GL_COMPRESSED_RGB_FXT1_3DFX
:
127 return MESA_FORMAT_RGB_FXT1
;
128 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
129 return MESA_FORMAT_RGBA_FXT1
;
133 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
134 return MESA_FORMAT_RGB_DXT1
;
136 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
137 return MESA_FORMAT_RGBA_DXT1
;
141 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
142 return MESA_FORMAT_RGBA_DXT3
;
144 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
145 return MESA_FORMAT_RGBA_DXT5
;
147 case GL_DEPTH_COMPONENT
:
148 case GL_DEPTH_COMPONENT16
:
149 case GL_DEPTH_COMPONENT24
:
150 case GL_DEPTH_COMPONENT32
:
152 return MESA_FORMAT_Z16
;
155 * 16bpp depth texture can't be paired with a stencil buffer so
156 * always used combined depth/stencil format.
159 case GL_DEPTH_STENCIL_EXT
:
160 case GL_DEPTH24_STENCIL8_EXT
:
161 return MESA_FORMAT_S8_Z24
;
166 case GL_SRGB_ALPHA_EXT
:
167 case GL_SRGB8_ALPHA8_EXT
:
168 case GL_COMPRESSED_SRGB_EXT
:
169 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
170 case GL_COMPRESSED_SLUMINANCE_EXT
:
171 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
172 return MESA_FORMAT_SARGB8
;
173 case GL_SLUMINANCE_EXT
:
174 case GL_SLUMINANCE8_EXT
:
175 if (intel
->has_luminance_srgb
)
176 return MESA_FORMAT_SL8
;
178 return MESA_FORMAT_SARGB8
;
179 case GL_SLUMINANCE_ALPHA_EXT
:
180 case GL_SLUMINANCE8_ALPHA8_EXT
:
181 if (intel
->has_luminance_srgb
)
182 return MESA_FORMAT_SLA8
;
184 return MESA_FORMAT_SARGB8
;
185 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
186 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
187 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
188 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
189 return MESA_FORMAT_SRGB_DXT1
;
191 /* i915 could also do this */
194 return MESA_FORMAT_DUDV8
;
197 return MESA_FORMAT_SIGNED_RGBA8888_REV
;
201 fprintf(stderr
, "unexpected texture format %s in %s\n",
202 _mesa_lookup_enum_by_nr(internalFormat
), __FUNCTION__
);
203 return MESA_FORMAT_NONE
;
206 return MESA_FORMAT_NONE
; /* never get here */
209 int intel_compressed_num_bytes(GLuint mesaFormat
)
214 case MESA_FORMAT_RGB_FXT1
:
215 case MESA_FORMAT_RGBA_FXT1
:
216 case MESA_FORMAT_RGB_DXT1
:
217 case MESA_FORMAT_RGBA_DXT1
:
221 case MESA_FORMAT_RGBA_DXT3
:
222 case MESA_FORMAT_RGBA_DXT5
: