Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 1 | #include "intel_context.h" |
| 2 | #include "intel_tex.h" |
Roland Scheidegger | a693a29 | 2009-03-28 01:43:50 +0100 | [diff] [blame] | 3 | #include "intel_chipset.h" |
Brian Paul | ecadb51 | 2008-09-18 15:17:05 -0600 | [diff] [blame] | 4 | #include "main/enums.h" |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 5 | |
Brian Paul | 645f220 | 2009-02-26 16:44:42 -0700 | [diff] [blame] | 6 | |
| 7 | /** |
| 8 | * Choose hardware texture format given the user's glTexImage parameters. |
| 9 | * |
| 10 | * It works out that this function is fine for all the supported |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 11 | * hardware. However, there is still a need to map the formats onto |
| 12 | * hardware descriptors. |
Brian Paul | 645f220 | 2009-02-26 16:44:42 -0700 | [diff] [blame] | 13 | * |
| 14 | * Note that the i915 can actually support many more formats than |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 15 | * these if we take the step of simply swizzling the colors |
| 16 | * immediately after sampling... |
| 17 | */ |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 18 | gl_format |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 19 | intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat, |
| 20 | GLenum format, GLenum type) |
| 21 | { |
| 22 | struct intel_context *intel = intel_context(ctx); |
Eric Anholt | b2e0991 | 2009-02-04 10:27:13 -0800 | [diff] [blame] | 23 | const GLboolean do32bpt = (intel->ctx.Visual.rgbBits >= 24); |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 24 | |
Brian Paul | 645f220 | 2009-02-26 16:44:42 -0700 | [diff] [blame] | 25 | #if 0 |
| 26 | printf("%s intFmt=0x%x format=0x%x type=0x%x\n", |
| 27 | __FUNCTION__, internalFormat, format, type); |
| 28 | #endif |
| 29 | |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 30 | switch (internalFormat) { |
| 31 | case 4: |
| 32 | case GL_RGBA: |
| 33 | case GL_COMPRESSED_RGBA: |
| 34 | if (format == GL_BGRA) { |
| 35 | if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_INT_8_8_8_8_REV) { |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 36 | return MESA_FORMAT_ARGB8888; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 37 | } |
| 38 | else if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) { |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 39 | return MESA_FORMAT_ARGB4444; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 40 | } |
| 41 | else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 42 | return MESA_FORMAT_ARGB1555; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 43 | } |
| 44 | } |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 45 | return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 46 | |
| 47 | case 3: |
| 48 | case GL_RGB: |
| 49 | case GL_COMPRESSED_RGB: |
| 50 | if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) { |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 51 | return MESA_FORMAT_RGB565; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 52 | } |
Brian Paul | 4a25343 | 2009-10-29 19:12:50 -0600 | [diff] [blame] | 53 | /* XXX use MESA_FORMAT_XRGB8888 someday */ |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 54 | return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_RGB565; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 55 | |
| 56 | case GL_RGBA8: |
| 57 | case GL_RGB10_A2: |
| 58 | case GL_RGBA12: |
| 59 | case GL_RGBA16: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 60 | return do32bpt ? MESA_FORMAT_ARGB8888 : MESA_FORMAT_ARGB4444; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 61 | |
| 62 | case GL_RGBA4: |
| 63 | case GL_RGBA2: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 64 | return MESA_FORMAT_ARGB4444; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 65 | |
| 66 | case GL_RGB5_A1: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 67 | return MESA_FORMAT_ARGB1555; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 68 | |
| 69 | case GL_RGB8: |
| 70 | case GL_RGB10: |
| 71 | case GL_RGB12: |
| 72 | case GL_RGB16: |
Brian Paul | 4a25343 | 2009-10-29 19:12:50 -0600 | [diff] [blame] | 73 | /* XXX use MESA_FORMAT_XRGB8888 someday */ |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 74 | return MESA_FORMAT_ARGB8888; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 75 | |
| 76 | case GL_RGB5: |
| 77 | case GL_RGB4: |
| 78 | case GL_R3_G3_B2: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 79 | return MESA_FORMAT_RGB565; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 80 | |
| 81 | case GL_ALPHA: |
| 82 | case GL_ALPHA4: |
| 83 | case GL_ALPHA8: |
| 84 | case GL_ALPHA12: |
| 85 | case GL_ALPHA16: |
| 86 | case GL_COMPRESSED_ALPHA: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 87 | return MESA_FORMAT_A8; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 88 | |
| 89 | case 1: |
| 90 | case GL_LUMINANCE: |
| 91 | case GL_LUMINANCE4: |
| 92 | case GL_LUMINANCE8: |
| 93 | case GL_LUMINANCE12: |
| 94 | case GL_LUMINANCE16: |
| 95 | case GL_COMPRESSED_LUMINANCE: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 96 | return MESA_FORMAT_L8; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 97 | |
| 98 | case 2: |
| 99 | case GL_LUMINANCE_ALPHA: |
| 100 | case GL_LUMINANCE4_ALPHA4: |
| 101 | case GL_LUMINANCE6_ALPHA2: |
| 102 | case GL_LUMINANCE8_ALPHA8: |
| 103 | case GL_LUMINANCE12_ALPHA4: |
| 104 | case GL_LUMINANCE12_ALPHA12: |
| 105 | case GL_LUMINANCE16_ALPHA16: |
| 106 | case GL_COMPRESSED_LUMINANCE_ALPHA: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 107 | return MESA_FORMAT_AL88; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 108 | |
| 109 | case GL_INTENSITY: |
| 110 | case GL_INTENSITY4: |
| 111 | case GL_INTENSITY8: |
| 112 | case GL_INTENSITY12: |
| 113 | case GL_INTENSITY16: |
| 114 | case GL_COMPRESSED_INTENSITY: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 115 | return MESA_FORMAT_I8; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 116 | |
| 117 | case GL_YCBCR_MESA: |
| 118 | if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE) |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 119 | return MESA_FORMAT_YCBCR; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 120 | else |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 121 | return MESA_FORMAT_YCBCR_REV; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 122 | |
| 123 | case GL_COMPRESSED_RGB_FXT1_3DFX: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 124 | return MESA_FORMAT_RGB_FXT1; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 125 | case GL_COMPRESSED_RGBA_FXT1_3DFX: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 126 | return MESA_FORMAT_RGBA_FXT1; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 127 | |
| 128 | case GL_RGB_S3TC: |
| 129 | case GL_RGB4_S3TC: |
| 130 | case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 131 | return MESA_FORMAT_RGB_DXT1; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 132 | |
| 133 | case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 134 | return MESA_FORMAT_RGBA_DXT1; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 135 | |
| 136 | case GL_RGBA_S3TC: |
| 137 | case GL_RGBA4_S3TC: |
| 138 | case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 139 | return MESA_FORMAT_RGBA_DXT3; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 140 | |
| 141 | case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 142 | return MESA_FORMAT_RGBA_DXT5; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 143 | |
| 144 | case GL_DEPTH_COMPONENT: |
| 145 | case GL_DEPTH_COMPONENT16: |
| 146 | case GL_DEPTH_COMPONENT24: |
| 147 | case GL_DEPTH_COMPONENT32: |
Brian Paul | 947d1c5 | 2009-01-14 16:42:19 -0700 | [diff] [blame] | 148 | #if 0 |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 149 | return MESA_FORMAT_Z16; |
Brian Paul | 947d1c5 | 2009-01-14 16:42:19 -0700 | [diff] [blame] | 150 | #else |
| 151 | /* fall-through. |
| 152 | * 16bpp depth texture can't be paired with a stencil buffer so |
| 153 | * always used combined depth/stencil format. |
| 154 | */ |
| 155 | #endif |
Brian Paul | dd08302 | 2006-11-02 23:16:18 +0000 | [diff] [blame] | 156 | case GL_DEPTH_STENCIL_EXT: |
| 157 | case GL_DEPTH24_STENCIL8_EXT: |
Brian Paul | 68d94a6 | 2009-10-21 20:02:33 -0600 | [diff] [blame] | 158 | return MESA_FORMAT_S8_Z24; |
Brian Paul | dd08302 | 2006-11-02 23:16:18 +0000 | [diff] [blame] | 159 | |
Eric Anholt | 5ad2602 | 2007-12-12 12:09:07 -0800 | [diff] [blame] | 160 | #ifndef I915 |
| 161 | case GL_SRGB_EXT: |
| 162 | case GL_SRGB8_EXT: |
| 163 | case GL_SRGB_ALPHA_EXT: |
| 164 | case GL_SRGB8_ALPHA8_EXT: |
Eric Anholt | 5ad2602 | 2007-12-12 12:09:07 -0800 | [diff] [blame] | 165 | case GL_COMPRESSED_SRGB_EXT: |
| 166 | case GL_COMPRESSED_SRGB_ALPHA_EXT: |
| 167 | case GL_COMPRESSED_SLUMINANCE_EXT: |
| 168 | case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 169 | return MESA_FORMAT_SARGB8; |
Roland Scheidegger | a693a29 | 2009-03-28 01:43:50 +0100 | [diff] [blame] | 170 | case GL_SLUMINANCE_EXT: |
| 171 | case GL_SLUMINANCE8_EXT: |
| 172 | if (IS_G4X(intel->intelScreen->deviceID)) |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 173 | return MESA_FORMAT_SL8; |
Roland Scheidegger | a693a29 | 2009-03-28 01:43:50 +0100 | [diff] [blame] | 174 | else |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 175 | return MESA_FORMAT_SARGB8; |
Roland Scheidegger | a693a29 | 2009-03-28 01:43:50 +0100 | [diff] [blame] | 176 | case GL_SLUMINANCE_ALPHA_EXT: |
| 177 | case GL_SLUMINANCE8_ALPHA8_EXT: |
| 178 | if (IS_G4X(intel->intelScreen->deviceID)) |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 179 | return MESA_FORMAT_SLA8; |
Roland Scheidegger | a693a29 | 2009-03-28 01:43:50 +0100 | [diff] [blame] | 180 | else |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 181 | return MESA_FORMAT_SARGB8; |
Eric Anholt | 5ad2602 | 2007-12-12 12:09:07 -0800 | [diff] [blame] | 182 | case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: |
| 183 | case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: |
| 184 | case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: |
| 185 | case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 186 | return MESA_FORMAT_SRGB_DXT1; |
Roland Scheidegger | 3327cc6 | 2009-03-12 15:06:17 +0100 | [diff] [blame] | 187 | |
Roland Scheidegger | 79e2df6 | 2009-03-27 22:42:19 +0100 | [diff] [blame] | 188 | /* i915 could also do this */ |
Roland Scheidegger | 3327cc6 | 2009-03-12 15:06:17 +0100 | [diff] [blame] | 189 | case GL_DUDV_ATI: |
| 190 | case GL_DU8DV8_ATI: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 191 | return MESA_FORMAT_DUDV8; |
Roland Scheidegger | 79e2df6 | 2009-03-27 22:42:19 +0100 | [diff] [blame] | 192 | case GL_RGBA_SNORM: |
| 193 | case GL_RGBA8_SNORM: |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 194 | return MESA_FORMAT_SIGNED_RGBA8888_REV; |
Eric Anholt | 5ad2602 | 2007-12-12 12:09:07 -0800 | [diff] [blame] | 195 | #endif |
| 196 | |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 197 | default: |
| 198 | fprintf(stderr, "unexpected texture format %s in %s\n", |
| 199 | _mesa_lookup_enum_by_nr(internalFormat), __FUNCTION__); |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 200 | return MESA_FORMAT_NONE; |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 201 | } |
| 202 | |
Brian Paul | 1f7c914 | 2009-09-30 20:28:45 -0600 | [diff] [blame] | 203 | return MESA_FORMAT_NONE; /* never get here */ |
Keith Whitwell | 6b9e31f | 2006-11-01 12:03:11 +0000 | [diff] [blame] | 204 | } |
Dave Airlie | 2862316 | 2006-11-10 00:32:35 +0000 | [diff] [blame] | 205 | |
| 206 | int intel_compressed_num_bytes(GLuint mesaFormat) |
| 207 | { |
| 208 | int bytes = 0; |
| 209 | switch(mesaFormat) { |
| 210 | |
| 211 | case MESA_FORMAT_RGB_FXT1: |
| 212 | case MESA_FORMAT_RGBA_FXT1: |
| 213 | case MESA_FORMAT_RGB_DXT1: |
| 214 | case MESA_FORMAT_RGBA_DXT1: |
| 215 | bytes = 2; |
| 216 | break; |
| 217 | |
| 218 | case MESA_FORMAT_RGBA_DXT3: |
| 219 | case MESA_FORMAT_RGBA_DXT5: |
| 220 | bytes = 4; |
| 221 | default: |
| 222 | break; |
| 223 | } |
| 224 | |
| 225 | return bytes; |
| 226 | } |