1 #include "intel_context.h"
3 #include "main/enums.h"
4 #include "main/formats.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(struct gl_context
* ctx
, GLint internalFormat
,
19 GLenum format
, GLenum type
)
21 struct intel_context
*intel
= intel_context(ctx
);
24 printf("%s intFmt=0x%x format=0x%x type=0x%x\n",
25 __FUNCTION__
, internalFormat
, format
, type
);
28 switch (internalFormat
) {
31 case GL_COMPRESSED_RGBA
:
32 if (type
== GL_UNSIGNED_SHORT_4_4_4_4_REV
)
33 return MESA_FORMAT_ARGB4444
;
34 else if (type
== GL_UNSIGNED_SHORT_1_5_5_5_REV
)
35 return MESA_FORMAT_ARGB1555
;
37 return MESA_FORMAT_ARGB8888
;
41 case GL_COMPRESSED_RGB
:
42 if (type
== GL_UNSIGNED_SHORT_5_6_5
)
43 return MESA_FORMAT_RGB565
;
44 else if (intel
->has_xrgb_textures
)
45 return MESA_FORMAT_XRGB8888
;
47 return MESA_FORMAT_ARGB8888
;
53 return MESA_FORMAT_ARGB8888
;
57 return MESA_FORMAT_ARGB4444
;
60 return MESA_FORMAT_ARGB1555
;
66 if (intel
->has_xrgb_textures
)
67 return MESA_FORMAT_XRGB8888
;
69 return MESA_FORMAT_ARGB8888
;
74 return MESA_FORMAT_RGB565
;
81 case GL_COMPRESSED_ALPHA
:
82 return MESA_FORMAT_A8
;
90 case GL_COMPRESSED_LUMINANCE
:
91 return MESA_FORMAT_L8
;
93 case GL_LUMINANCE12_ALPHA4
:
94 case GL_LUMINANCE12_ALPHA12
:
95 case GL_LUMINANCE16_ALPHA16
:
96 /* i915 could implement this mode using MT_32BIT_RG1616. However, this
97 * would require an extra swizzle instruction in the fragment shader to
98 * convert the { R, G, 1.0, 1.0 } to { R, R, R, G }.
101 return MESA_FORMAT_AL1616
;
107 case GL_LUMINANCE_ALPHA
:
108 case GL_LUMINANCE4_ALPHA4
:
109 case GL_LUMINANCE6_ALPHA2
:
110 case GL_LUMINANCE8_ALPHA8
:
111 case GL_COMPRESSED_LUMINANCE_ALPHA
:
112 return MESA_FORMAT_AL88
;
119 case GL_COMPRESSED_INTENSITY
:
120 return MESA_FORMAT_I8
;
123 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
|| type
== GL_UNSIGNED_BYTE
)
124 return MESA_FORMAT_YCBCR
;
126 return MESA_FORMAT_YCBCR_REV
;
128 case GL_COMPRESSED_RGB_FXT1_3DFX
:
129 return MESA_FORMAT_RGB_FXT1
;
130 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
131 return MESA_FORMAT_RGBA_FXT1
;
135 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
136 return MESA_FORMAT_RGB_DXT1
;
138 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
139 return MESA_FORMAT_RGBA_DXT1
;
143 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
144 return MESA_FORMAT_RGBA_DXT3
;
146 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
147 return MESA_FORMAT_RGBA_DXT5
;
149 case GL_DEPTH_COMPONENT
:
150 case GL_DEPTH_COMPONENT16
:
151 case GL_DEPTH_COMPONENT24
:
152 case GL_DEPTH_COMPONENT32
:
154 return MESA_FORMAT_Z16
;
157 * 16bpp depth texture can't be paired with a stencil buffer so
158 * always used combined depth/stencil format.
161 case GL_DEPTH_STENCIL_EXT
:
162 case GL_DEPTH24_STENCIL8_EXT
:
163 return MESA_FORMAT_S8_Z24
;
168 case GL_SRGB_ALPHA_EXT
:
169 case GL_SRGB8_ALPHA8_EXT
:
170 case GL_COMPRESSED_SRGB_EXT
:
171 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
172 case GL_COMPRESSED_SLUMINANCE_EXT
:
173 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
174 return MESA_FORMAT_SARGB8
;
175 case GL_SLUMINANCE_EXT
:
176 case GL_SLUMINANCE8_EXT
:
177 if (intel
->has_luminance_srgb
)
178 return MESA_FORMAT_SL8
;
180 return MESA_FORMAT_SARGB8
;
181 case GL_SLUMINANCE_ALPHA_EXT
:
182 case GL_SLUMINANCE8_ALPHA8_EXT
:
183 if (intel
->has_luminance_srgb
)
184 return MESA_FORMAT_SLA8
;
186 return MESA_FORMAT_SARGB8
;
187 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
188 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
189 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
190 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
191 return MESA_FORMAT_SRGB_DXT1
;
193 /* i915 could also do this */
196 return MESA_FORMAT_DUDV8
;
199 return MESA_FORMAT_SIGNED_RGBA8888_REV
;
201 /* i915 can do a RG16, but it can't do any of the other RED or RG formats.
202 * In addition, it only implements the broken D3D mode where undefined
203 * components are read as 1.0. I'm not sure who thought reading
204 * { R, G, 1.0, 1.0 } from a red-green texture would be useful.
208 return MESA_FORMAT_R8
;
210 return MESA_FORMAT_R16
;
213 return MESA_FORMAT_RG88
;
215 return MESA_FORMAT_RG1616
;
219 fprintf(stderr
, "unexpected texture format %s in %s\n",
220 _mesa_lookup_enum_by_nr(internalFormat
), __FUNCTION__
);
221 return MESA_FORMAT_NONE
;
224 return MESA_FORMAT_NONE
; /* never get here */
227 int intel_compressed_num_bytes(GLuint mesaFormat
)
232 block_size
= _mesa_get_format_bytes(mesaFormat
);
233 _mesa_get_format_block_size(mesaFormat
, &bw
, &bh
);
235 return block_size
/ bw
;