5f813c0efa2d2c2e23d1d8c70e7d8b13ab75f4d2
[mesa.git] / src / mesa / drivers / dri / intel / intel_tex_format.c
1 #include "intel_context.h"
2 #include "intel_tex.h"
3 #include "main/enums.h"
4 #include "main/formats.h"
5
6 /**
7 * Choose hardware texture format given the user's glTexImage parameters.
8 *
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.
12 *
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...
16 */
17 gl_format
18 intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
19 GLenum format, GLenum type)
20 {
21 struct intel_context *intel = intel_context(ctx);
22 const GLboolean do32bpt = (intel->ctx.Visual.rgbBits >= 24);
23
24 #if 0
25 printf("%s intFmt=0x%x format=0x%x type=0x%x\n",
26 __FUNCTION__, internalFormat, format, type);
27 #endif
28
29 switch (internalFormat) {
30 case 4:
31 case GL_RGBA:
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;
36 }
37 else if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
38 return MESA_FORMAT_ARGB4444;
39 }
40 else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
41 return MESA_FORMAT_ARGB1555;
42 }
43 }
44 return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444;
45
46 case 3:
47 case GL_RGB:
48 case GL_COMPRESSED_RGB:
49 if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
50 return MESA_FORMAT_RGB565;
51 }
52 if (do32bpt) {
53 if (intel->has_xrgb_textures)
54 return MESA_FORMAT_XRGB8888;
55 else
56 return MESA_FORMAT_ARGB8888;
57 } else {
58 return MESA_FORMAT_RGB565;
59 }
60
61 case GL_RGBA8:
62 case GL_RGB10_A2:
63 case GL_RGBA12:
64 case GL_RGBA16:
65 return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444;
66
67 case GL_RGBA4:
68 case GL_RGBA2:
69 return MESA_FORMAT_ARGB4444;
70
71 case GL_RGB5_A1:
72 return MESA_FORMAT_ARGB1555;
73
74 case GL_RGB8:
75 case GL_RGB10:
76 case GL_RGB12:
77 case GL_RGB16:
78 if (intel->has_xrgb_textures)
79 return MESA_FORMAT_XRGB8888;
80 else
81 return MESA_FORMAT_ARGB8888;
82
83 case GL_RGB5:
84 case GL_RGB4:
85 case GL_R3_G3_B2:
86 return MESA_FORMAT_RGB565;
87
88 case GL_ALPHA:
89 case GL_ALPHA4:
90 case GL_ALPHA8:
91 case GL_ALPHA12:
92 case GL_ALPHA16:
93 case GL_COMPRESSED_ALPHA:
94 return MESA_FORMAT_A8;
95
96 case 1:
97 case GL_LUMINANCE:
98 case GL_LUMINANCE4:
99 case GL_LUMINANCE8:
100 case GL_LUMINANCE12:
101 case GL_LUMINANCE16:
102 case GL_COMPRESSED_LUMINANCE:
103 return MESA_FORMAT_L8;
104
105 case GL_LUMINANCE12_ALPHA4:
106 case GL_LUMINANCE12_ALPHA12:
107 case GL_LUMINANCE16_ALPHA16:
108 #ifndef I915
109 return MESA_FORMAT_AL1616;
110 #else
111 /* FALLTHROUGH */
112 #endif
113
114 case 2:
115 case GL_LUMINANCE_ALPHA:
116 case GL_LUMINANCE4_ALPHA4:
117 case GL_LUMINANCE6_ALPHA2:
118 case GL_LUMINANCE8_ALPHA8:
119 case GL_COMPRESSED_LUMINANCE_ALPHA:
120 return MESA_FORMAT_AL88;
121
122 case GL_INTENSITY:
123 case GL_INTENSITY4:
124 case GL_INTENSITY8:
125 case GL_INTENSITY12:
126 case GL_INTENSITY16:
127 case GL_COMPRESSED_INTENSITY:
128 return MESA_FORMAT_I8;
129
130 case GL_YCBCR_MESA:
131 if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE)
132 return MESA_FORMAT_YCBCR;
133 else
134 return MESA_FORMAT_YCBCR_REV;
135
136 case GL_COMPRESSED_RGB_FXT1_3DFX:
137 return MESA_FORMAT_RGB_FXT1;
138 case GL_COMPRESSED_RGBA_FXT1_3DFX:
139 return MESA_FORMAT_RGBA_FXT1;
140
141 case GL_RGB_S3TC:
142 case GL_RGB4_S3TC:
143 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
144 return MESA_FORMAT_RGB_DXT1;
145
146 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
147 return MESA_FORMAT_RGBA_DXT1;
148
149 case GL_RGBA_S3TC:
150 case GL_RGBA4_S3TC:
151 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
152 return MESA_FORMAT_RGBA_DXT3;
153
154 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
155 return MESA_FORMAT_RGBA_DXT5;
156
157 case GL_DEPTH_COMPONENT:
158 case GL_DEPTH_COMPONENT16:
159 case GL_DEPTH_COMPONENT24:
160 case GL_DEPTH_COMPONENT32:
161 #if 0
162 return MESA_FORMAT_Z16;
163 #else
164 /* fall-through.
165 * 16bpp depth texture can't be paired with a stencil buffer so
166 * always used combined depth/stencil format.
167 */
168 #endif
169 case GL_DEPTH_STENCIL_EXT:
170 case GL_DEPTH24_STENCIL8_EXT:
171 return MESA_FORMAT_S8_Z24;
172
173 #ifndef I915
174 case GL_SRGB_EXT:
175 case GL_SRGB8_EXT:
176 case GL_SRGB_ALPHA_EXT:
177 case GL_SRGB8_ALPHA8_EXT:
178 case GL_COMPRESSED_SRGB_EXT:
179 case GL_COMPRESSED_SRGB_ALPHA_EXT:
180 case GL_COMPRESSED_SLUMINANCE_EXT:
181 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
182 return MESA_FORMAT_SARGB8;
183 case GL_SLUMINANCE_EXT:
184 case GL_SLUMINANCE8_EXT:
185 if (intel->has_luminance_srgb)
186 return MESA_FORMAT_SL8;
187 else
188 return MESA_FORMAT_SARGB8;
189 case GL_SLUMINANCE_ALPHA_EXT:
190 case GL_SLUMINANCE8_ALPHA8_EXT:
191 if (intel->has_luminance_srgb)
192 return MESA_FORMAT_SLA8;
193 else
194 return MESA_FORMAT_SARGB8;
195 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
196 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
197 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
198 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
199 return MESA_FORMAT_SRGB_DXT1;
200
201 /* i915 could also do this */
202 case GL_DUDV_ATI:
203 case GL_DU8DV8_ATI:
204 return MESA_FORMAT_DUDV8;
205 case GL_RGBA_SNORM:
206 case GL_RGBA8_SNORM:
207 return MESA_FORMAT_SIGNED_RGBA8888_REV;
208 #endif
209
210 default:
211 fprintf(stderr, "unexpected texture format %s in %s\n",
212 _mesa_lookup_enum_by_nr(internalFormat), __FUNCTION__);
213 return MESA_FORMAT_NONE;
214 }
215
216 return MESA_FORMAT_NONE; /* never get here */
217 }
218
219 int intel_compressed_num_bytes(GLuint mesaFormat)
220 {
221 GLuint bw, bh;
222 GLuint block_size;
223
224 block_size = _mesa_get_format_bytes(mesaFormat);
225 _mesa_get_format_block_size(mesaFormat, &bw, &bh);
226
227 return block_size / bw;
228 }