Merge remote branch 'origin/7.8'
[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
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 return do32bpt ? MESA_FORMAT_XRGB8888 : MESA_FORMAT_RGB565;
53
54 case GL_RGBA8:
55 case GL_RGB10_A2:
56 case GL_RGBA12:
57 case GL_RGBA16:
58 return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444;
59
60 case GL_RGBA4:
61 case GL_RGBA2:
62 return MESA_FORMAT_ARGB4444;
63
64 case GL_RGB5_A1:
65 return MESA_FORMAT_ARGB1555;
66
67 case GL_RGB8:
68 case GL_RGB10:
69 case GL_RGB12:
70 case GL_RGB16:
71 return MESA_FORMAT_XRGB8888;
72
73 case GL_RGB5:
74 case GL_RGB4:
75 case GL_R3_G3_B2:
76 return MESA_FORMAT_RGB565;
77
78 case GL_ALPHA:
79 case GL_ALPHA4:
80 case GL_ALPHA8:
81 case GL_ALPHA12:
82 case GL_ALPHA16:
83 case GL_COMPRESSED_ALPHA:
84 return MESA_FORMAT_A8;
85
86 case 1:
87 case GL_LUMINANCE:
88 case GL_LUMINANCE4:
89 case GL_LUMINANCE8:
90 case GL_LUMINANCE12:
91 case GL_LUMINANCE16:
92 case GL_COMPRESSED_LUMINANCE:
93 return MESA_FORMAT_L8;
94
95 case GL_LUMINANCE12_ALPHA4:
96 case GL_LUMINANCE12_ALPHA12:
97 case GL_LUMINANCE16_ALPHA16:
98 #ifndef I915
99 return MESA_FORMAT_AL1616;
100 #else
101 /* FALLTHROUGH */
102 #endif
103
104 case 2:
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;
111
112 case GL_INTENSITY:
113 case GL_INTENSITY4:
114 case GL_INTENSITY8:
115 case GL_INTENSITY12:
116 case GL_INTENSITY16:
117 case GL_COMPRESSED_INTENSITY:
118 return MESA_FORMAT_I8;
119
120 case GL_YCBCR_MESA:
121 if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE)
122 return MESA_FORMAT_YCBCR;
123 else
124 return MESA_FORMAT_YCBCR_REV;
125
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;
130
131 case GL_RGB_S3TC:
132 case GL_RGB4_S3TC:
133 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
134 return MESA_FORMAT_RGB_DXT1;
135
136 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
137 return MESA_FORMAT_RGBA_DXT1;
138
139 case GL_RGBA_S3TC:
140 case GL_RGBA4_S3TC:
141 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
142 return MESA_FORMAT_RGBA_DXT3;
143
144 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
145 return MESA_FORMAT_RGBA_DXT5;
146
147 case GL_DEPTH_COMPONENT:
148 case GL_DEPTH_COMPONENT16:
149 case GL_DEPTH_COMPONENT24:
150 case GL_DEPTH_COMPONENT32:
151 #if 0
152 return MESA_FORMAT_Z16;
153 #else
154 /* fall-through.
155 * 16bpp depth texture can't be paired with a stencil buffer so
156 * always used combined depth/stencil format.
157 */
158 #endif
159 case GL_DEPTH_STENCIL_EXT:
160 case GL_DEPTH24_STENCIL8_EXT:
161 return MESA_FORMAT_S8_Z24;
162
163 #ifndef I915
164 case GL_SRGB_EXT:
165 case GL_SRGB8_EXT:
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;
177 else
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;
183 else
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;
190
191 /* i915 could also do this */
192 case GL_DUDV_ATI:
193 case GL_DU8DV8_ATI:
194 return MESA_FORMAT_DUDV8;
195 case GL_RGBA_SNORM:
196 case GL_RGBA8_SNORM:
197 return MESA_FORMAT_SIGNED_RGBA8888_REV;
198 #endif
199
200 default:
201 fprintf(stderr, "unexpected texture format %s in %s\n",
202 _mesa_lookup_enum_by_nr(internalFormat), __FUNCTION__);
203 return MESA_FORMAT_NONE;
204 }
205
206 return MESA_FORMAT_NONE; /* never get here */
207 }
208
209 int intel_compressed_num_bytes(GLuint mesaFormat)
210 {
211 int bytes = 0;
212 switch(mesaFormat) {
213
214 case MESA_FORMAT_RGB_FXT1:
215 case MESA_FORMAT_RGBA_FXT1:
216 case MESA_FORMAT_RGB_DXT1:
217 case MESA_FORMAT_RGBA_DXT1:
218 bytes = 2;
219 break;
220
221 case MESA_FORMAT_RGBA_DXT3:
222 case MESA_FORMAT_RGBA_DXT5:
223 bytes = 4;
224 default:
225 break;
226 }
227
228 return bytes;
229 }