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