1/************************************************************************** 2 * 3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * Copyright (c) 2008-2010 VMware, Inc. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29 30/** 31 * Mesa / Gallium format conversion and format selection code. 32 * \author Brian Paul 33 */ 34 35#include "main/imports.h" 36#include "main/context.h" 37#include "main/glformats.h" 38#include "main/texstore.h" 39#include "main/image.h" 40#include "main/macros.h" 41#include "main/mfeatures.h" 42 43#include "pipe/p_context.h" 44#include "pipe/p_defines.h" 45#include "pipe/p_screen.h" 46#include "util/u_format.h" 47#include "st_context.h" 48#include "st_format.h" 49 50 51/** 52 * Translate Mesa format to Gallium format. 53 */ 54enum pipe_format 55st_mesa_format_to_pipe_format(gl_format mesaFormat) 56{ 57 switch (mesaFormat) { 58 case MESA_FORMAT_RGBA8888: 59 return PIPE_FORMAT_A8B8G8R8_UNORM; 60 case MESA_FORMAT_RGBA8888_REV: 61 return PIPE_FORMAT_R8G8B8A8_UNORM; 62 case MESA_FORMAT_ARGB8888: 63 return PIPE_FORMAT_B8G8R8A8_UNORM; 64 case MESA_FORMAT_ARGB8888_REV: 65 return PIPE_FORMAT_A8R8G8B8_UNORM; 66 case MESA_FORMAT_RGBX8888: 67 return PIPE_FORMAT_X8B8G8R8_UNORM; 68 case MESA_FORMAT_RGBX8888_REV: 69 return PIPE_FORMAT_R8G8B8X8_UNORM; 70 case MESA_FORMAT_XRGB8888: 71 return PIPE_FORMAT_B8G8R8X8_UNORM; 72 case MESA_FORMAT_XRGB8888_REV: 73 return PIPE_FORMAT_X8R8G8B8_UNORM; 74 case MESA_FORMAT_ARGB1555: 75 return PIPE_FORMAT_B5G5R5A1_UNORM; 76 case MESA_FORMAT_ARGB4444: 77 return PIPE_FORMAT_B4G4R4A4_UNORM; 78 case MESA_FORMAT_RGB565: 79 return PIPE_FORMAT_B5G6R5_UNORM; 80 case MESA_FORMAT_RGB332: 81 return PIPE_FORMAT_B2G3R3_UNORM; 82 case MESA_FORMAT_ARGB2101010: 83 return PIPE_FORMAT_B10G10R10A2_UNORM; 84 case MESA_FORMAT_AL44: 85 return PIPE_FORMAT_L4A4_UNORM; 86 case MESA_FORMAT_AL88: 87 return PIPE_FORMAT_L8A8_UNORM; 88 case MESA_FORMAT_AL1616: 89 return PIPE_FORMAT_L16A16_UNORM; 90 case MESA_FORMAT_A8: 91 return PIPE_FORMAT_A8_UNORM; 92 case MESA_FORMAT_A16: 93 return PIPE_FORMAT_A16_UNORM; 94 case MESA_FORMAT_L8: 95 return PIPE_FORMAT_L8_UNORM; 96 case MESA_FORMAT_L16: 97 return PIPE_FORMAT_L16_UNORM; 98 case MESA_FORMAT_I8: 99 return PIPE_FORMAT_I8_UNORM; 100 case MESA_FORMAT_I16: 101 return PIPE_FORMAT_I16_UNORM; 102 case MESA_FORMAT_Z16: 103 return PIPE_FORMAT_Z16_UNORM; 104 case MESA_FORMAT_Z32: 105 return PIPE_FORMAT_Z32_UNORM; 106 case MESA_FORMAT_Z24_S8: 107 return PIPE_FORMAT_S8_UINT_Z24_UNORM; 108 case MESA_FORMAT_S8_Z24: 109 return PIPE_FORMAT_Z24_UNORM_S8_UINT; 110 case MESA_FORMAT_Z24_X8: 111 return PIPE_FORMAT_X8Z24_UNORM; 112 case MESA_FORMAT_X8_Z24: 113 return PIPE_FORMAT_Z24X8_UNORM; 114 case MESA_FORMAT_S8: 115 return PIPE_FORMAT_S8_UINT; 116 case MESA_FORMAT_Z32_FLOAT: 117 return PIPE_FORMAT_Z32_FLOAT; 118 case MESA_FORMAT_Z32_FLOAT_X24S8: 119 return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT; 120 case MESA_FORMAT_YCBCR: 121 return PIPE_FORMAT_UYVY; 122#if FEATURE_texture_s3tc 123 case MESA_FORMAT_RGB_DXT1: 124 return PIPE_FORMAT_DXT1_RGB; 125 case MESA_FORMAT_RGBA_DXT1: 126 return PIPE_FORMAT_DXT1_RGBA; 127 case MESA_FORMAT_RGBA_DXT3: 128 return PIPE_FORMAT_DXT3_RGBA; 129 case MESA_FORMAT_RGBA_DXT5: 130 return PIPE_FORMAT_DXT5_RGBA; 131#if FEATURE_EXT_texture_sRGB 132 case MESA_FORMAT_SRGB_DXT1: 133 return PIPE_FORMAT_DXT1_SRGB; 134 case MESA_FORMAT_SRGBA_DXT1: 135 return PIPE_FORMAT_DXT1_SRGBA; 136 case MESA_FORMAT_SRGBA_DXT3: 137 return PIPE_FORMAT_DXT3_SRGBA; 138 case MESA_FORMAT_SRGBA_DXT5: 139 return PIPE_FORMAT_DXT5_SRGBA; 140#endif 141#endif 142#if FEATURE_EXT_texture_sRGB 143 case MESA_FORMAT_SLA8: 144 return PIPE_FORMAT_L8A8_SRGB; 145 case MESA_FORMAT_SL8: 146 return PIPE_FORMAT_L8_SRGB; 147 case MESA_FORMAT_SRGB8: 148 return PIPE_FORMAT_R8G8B8_SRGB; 149 case MESA_FORMAT_SRGBA8: 150 return PIPE_FORMAT_A8B8G8R8_SRGB; 151 case MESA_FORMAT_SARGB8: 152 return PIPE_FORMAT_B8G8R8A8_SRGB; 153#endif 154 case MESA_FORMAT_RGBA_FLOAT32: 155 return PIPE_FORMAT_R32G32B32A32_FLOAT; 156 case MESA_FORMAT_RGBA_FLOAT16: 157 return PIPE_FORMAT_R16G16B16A16_FLOAT; 158 case MESA_FORMAT_RGB_FLOAT32: 159 return PIPE_FORMAT_R32G32B32_FLOAT; 160 case MESA_FORMAT_RGB_FLOAT16: 161 return PIPE_FORMAT_R16G16B16_FLOAT; 162 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: 163 return PIPE_FORMAT_L32A32_FLOAT; 164 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: 165 return PIPE_FORMAT_L16A16_FLOAT; 166 case MESA_FORMAT_LUMINANCE_FLOAT32: 167 return PIPE_FORMAT_L32_FLOAT; 168 case MESA_FORMAT_LUMINANCE_FLOAT16: 169 return PIPE_FORMAT_L16_FLOAT; 170 case MESA_FORMAT_ALPHA_FLOAT32: 171 return PIPE_FORMAT_A32_FLOAT; 172 case MESA_FORMAT_ALPHA_FLOAT16: 173 return PIPE_FORMAT_A16_FLOAT; 174 case MESA_FORMAT_INTENSITY_FLOAT32: 175 return PIPE_FORMAT_I32_FLOAT; 176 case MESA_FORMAT_INTENSITY_FLOAT16: 177 return PIPE_FORMAT_I16_FLOAT; 178 case MESA_FORMAT_R_FLOAT32: 179 return PIPE_FORMAT_R32_FLOAT; 180 case MESA_FORMAT_R_FLOAT16: 181 return PIPE_FORMAT_R16_FLOAT; 182 case MESA_FORMAT_RG_FLOAT32: 183 return PIPE_FORMAT_R32G32_FLOAT; 184 case MESA_FORMAT_RG_FLOAT16: 185 return PIPE_FORMAT_R16G16_FLOAT; 186 187 case MESA_FORMAT_R8: 188 return PIPE_FORMAT_R8_UNORM; 189 case MESA_FORMAT_R16: 190 return PIPE_FORMAT_R16_UNORM; 191 case MESA_FORMAT_GR88: 192 return PIPE_FORMAT_R8G8_UNORM; 193 case MESA_FORMAT_RG1616: 194 return PIPE_FORMAT_R16G16_UNORM; 195 case MESA_FORMAT_RGBA_16: 196 return PIPE_FORMAT_R16G16B16A16_UNORM; 197 198 /* signed int formats */ 199 case MESA_FORMAT_ALPHA_UINT8: 200 return PIPE_FORMAT_A8_UINT; 201 case MESA_FORMAT_ALPHA_UINT16: 202 return PIPE_FORMAT_A16_UINT; 203 case MESA_FORMAT_ALPHA_UINT32: 204 return PIPE_FORMAT_A32_UINT; 205 206 case MESA_FORMAT_ALPHA_INT8: 207 return PIPE_FORMAT_A8_SINT; 208 case MESA_FORMAT_ALPHA_INT16: 209 return PIPE_FORMAT_A16_SINT; 210 case MESA_FORMAT_ALPHA_INT32: 211 return PIPE_FORMAT_A32_SINT; 212 213 case MESA_FORMAT_INTENSITY_UINT8: 214 return PIPE_FORMAT_I8_UINT; 215 case MESA_FORMAT_INTENSITY_UINT16: 216 return PIPE_FORMAT_I16_UINT; 217 case MESA_FORMAT_INTENSITY_UINT32: 218 return PIPE_FORMAT_I32_UINT; 219 220 case MESA_FORMAT_INTENSITY_INT8: 221 return PIPE_FORMAT_I8_SINT; 222 case MESA_FORMAT_INTENSITY_INT16: 223 return PIPE_FORMAT_I16_SINT; 224 case MESA_FORMAT_INTENSITY_INT32: 225 return PIPE_FORMAT_I32_SINT; 226 227 case MESA_FORMAT_LUMINANCE_UINT8: 228 return PIPE_FORMAT_L8_UINT; 229 case MESA_FORMAT_LUMINANCE_UINT16: 230 return PIPE_FORMAT_L16_UINT; 231 case MESA_FORMAT_LUMINANCE_UINT32: 232 return PIPE_FORMAT_L32_UINT; 233 234 case MESA_FORMAT_LUMINANCE_INT8: 235 return PIPE_FORMAT_L8_SINT; 236 case MESA_FORMAT_LUMINANCE_INT16: 237 return PIPE_FORMAT_L16_SINT; 238 case MESA_FORMAT_LUMINANCE_INT32: 239 return PIPE_FORMAT_L32_SINT; 240 241 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8: 242 return PIPE_FORMAT_L8A8_UINT; 243 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16: 244 return PIPE_FORMAT_L16A16_UINT; 245 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32: 246 return PIPE_FORMAT_L32A32_UINT; 247 248 case MESA_FORMAT_LUMINANCE_ALPHA_INT8: 249 return PIPE_FORMAT_L8A8_SINT; 250 case MESA_FORMAT_LUMINANCE_ALPHA_INT16: 251 return PIPE_FORMAT_L16A16_SINT; 252 case MESA_FORMAT_LUMINANCE_ALPHA_INT32: 253 return PIPE_FORMAT_L32A32_SINT; 254 255 case MESA_FORMAT_R_INT8: 256 return PIPE_FORMAT_R8_SINT; 257 case MESA_FORMAT_RG_INT8: 258 return PIPE_FORMAT_R8G8_SINT; 259 case MESA_FORMAT_RGB_INT8: 260 return PIPE_FORMAT_R8G8B8_SINT; 261 case MESA_FORMAT_RGBA_INT8: 262 return PIPE_FORMAT_R8G8B8A8_SINT; 263 case MESA_FORMAT_R_INT16: 264 return PIPE_FORMAT_R16_SINT; 265 case MESA_FORMAT_RG_INT16: 266 return PIPE_FORMAT_R16G16_SINT; 267 case MESA_FORMAT_RGB_INT16: 268 return PIPE_FORMAT_R16G16B16_SINT; 269 case MESA_FORMAT_RGBA_INT16: 270 return PIPE_FORMAT_R16G16B16A16_SINT; 271 case MESA_FORMAT_R_INT32: 272 return PIPE_FORMAT_R32_SINT; 273 case MESA_FORMAT_RG_INT32: 274 return PIPE_FORMAT_R32G32_SINT; 275 case MESA_FORMAT_RGB_INT32: 276 return PIPE_FORMAT_R32G32B32_SINT; 277 case MESA_FORMAT_RGBA_INT32: 278 return PIPE_FORMAT_R32G32B32A32_SINT; 279 280 /* unsigned int formats */ 281 case MESA_FORMAT_R_UINT8: 282 return PIPE_FORMAT_R8_UINT; 283 case MESA_FORMAT_RG_UINT8: 284 return PIPE_FORMAT_R8G8_UINT; 285 case MESA_FORMAT_RGB_UINT8: 286 return PIPE_FORMAT_R8G8B8_UINT; 287 case MESA_FORMAT_RGBA_UINT8: 288 return PIPE_FORMAT_R8G8B8A8_UINT; 289 case MESA_FORMAT_R_UINT16: 290 return PIPE_FORMAT_R16_UINT; 291 case MESA_FORMAT_RG_UINT16: 292 return PIPE_FORMAT_R16G16_UINT; 293 case MESA_FORMAT_RGB_UINT16: 294 return PIPE_FORMAT_R16G16B16_UINT; 295 case MESA_FORMAT_RGBA_UINT16: 296 return PIPE_FORMAT_R16G16B16A16_UINT; 297 case MESA_FORMAT_R_UINT32: 298 return PIPE_FORMAT_R32_UINT; 299 case MESA_FORMAT_RG_UINT32: 300 return PIPE_FORMAT_R32G32_UINT; 301 case MESA_FORMAT_RGB_UINT32: 302 return PIPE_FORMAT_R32G32B32_UINT; 303 case MESA_FORMAT_RGBA_UINT32: 304 return PIPE_FORMAT_R32G32B32A32_UINT; 305 306 case MESA_FORMAT_RED_RGTC1: 307 return PIPE_FORMAT_RGTC1_UNORM; 308 case MESA_FORMAT_SIGNED_RED_RGTC1: 309 return PIPE_FORMAT_RGTC1_SNORM; 310 case MESA_FORMAT_RG_RGTC2: 311 return PIPE_FORMAT_RGTC2_UNORM; 312 case MESA_FORMAT_SIGNED_RG_RGTC2: 313 return PIPE_FORMAT_RGTC2_SNORM; 314 315 case MESA_FORMAT_L_LATC1: 316 return PIPE_FORMAT_LATC1_UNORM; 317 case MESA_FORMAT_SIGNED_L_LATC1: 318 return PIPE_FORMAT_LATC1_SNORM; 319 case MESA_FORMAT_LA_LATC2: 320 return PIPE_FORMAT_LATC2_UNORM; 321 case MESA_FORMAT_SIGNED_LA_LATC2: 322 return PIPE_FORMAT_LATC2_SNORM; 323 324 case MESA_FORMAT_ETC1_RGB8: 325 return PIPE_FORMAT_ETC1_RGB8; 326 327 /* signed normalized formats */ 328 case MESA_FORMAT_SIGNED_R8: 329 return PIPE_FORMAT_R8_SNORM; 330 case MESA_FORMAT_SIGNED_RG88_REV: 331 return PIPE_FORMAT_R8G8_SNORM; 332 case MESA_FORMAT_SIGNED_RGBA8888_REV: 333 return PIPE_FORMAT_R8G8B8A8_SNORM; 334 335 case MESA_FORMAT_SIGNED_A8: 336 return PIPE_FORMAT_A8_SNORM; 337 case MESA_FORMAT_SIGNED_L8: 338 return PIPE_FORMAT_L8_SNORM; 339 case MESA_FORMAT_SIGNED_AL88: 340 return PIPE_FORMAT_L8A8_SNORM; 341 case MESA_FORMAT_SIGNED_I8: 342 return PIPE_FORMAT_I8_SNORM; 343 344 case MESA_FORMAT_SIGNED_R16: 345 return PIPE_FORMAT_R16_SNORM; 346 case MESA_FORMAT_SIGNED_GR1616: 347 return PIPE_FORMAT_R16G16_SNORM; 348 case MESA_FORMAT_SIGNED_RGBA_16: 349 return PIPE_FORMAT_R16G16B16A16_SNORM; 350 351 case MESA_FORMAT_SIGNED_A16: 352 return PIPE_FORMAT_A16_SNORM; 353 case MESA_FORMAT_SIGNED_L16: 354 return PIPE_FORMAT_L16_SNORM; 355 case MESA_FORMAT_SIGNED_AL1616: 356 return PIPE_FORMAT_L16A16_SNORM; 357 case MESA_FORMAT_SIGNED_I16: 358 return PIPE_FORMAT_I16_SNORM; 359 360 case MESA_FORMAT_RGB9_E5_FLOAT: 361 return PIPE_FORMAT_R9G9B9E5_FLOAT; 362 case MESA_FORMAT_R11_G11_B10_FLOAT: 363 return PIPE_FORMAT_R11G11B10_FLOAT; 364 case MESA_FORMAT_ARGB2101010_UINT: 365 return PIPE_FORMAT_B10G10R10A2_UINT; 366 default: 367 assert(0); 368 return PIPE_FORMAT_NONE; 369 } 370} 371 372 373/** 374 * Translate Gallium format to Mesa format. 375 */ 376gl_format 377st_pipe_format_to_mesa_format(enum pipe_format format) 378{ 379 switch (format) { 380 case PIPE_FORMAT_A8B8G8R8_UNORM: 381 return MESA_FORMAT_RGBA8888; 382 case PIPE_FORMAT_R8G8B8A8_UNORM: 383 return MESA_FORMAT_RGBA8888_REV; 384 case PIPE_FORMAT_B8G8R8A8_UNORM: 385 return MESA_FORMAT_ARGB8888; 386 case PIPE_FORMAT_A8R8G8B8_UNORM: 387 return MESA_FORMAT_ARGB8888_REV; 388 case PIPE_FORMAT_X8B8G8R8_UNORM: 389 return MESA_FORMAT_RGBX8888; 390 case PIPE_FORMAT_R8G8B8X8_UNORM: 391 return MESA_FORMAT_RGBX8888_REV; 392 case PIPE_FORMAT_B8G8R8X8_UNORM: 393 return MESA_FORMAT_XRGB8888; 394 case PIPE_FORMAT_X8R8G8B8_UNORM: 395 return MESA_FORMAT_XRGB8888_REV; 396 case PIPE_FORMAT_B5G5R5A1_UNORM: 397 return MESA_FORMAT_ARGB1555; 398 case PIPE_FORMAT_B4G4R4A4_UNORM: 399 return MESA_FORMAT_ARGB4444; 400 case PIPE_FORMAT_B5G6R5_UNORM: 401 return MESA_FORMAT_RGB565; 402 case PIPE_FORMAT_B2G3R3_UNORM: 403 return MESA_FORMAT_RGB332; 404 case PIPE_FORMAT_B10G10R10A2_UNORM: 405 return MESA_FORMAT_ARGB2101010; 406 case PIPE_FORMAT_L4A4_UNORM: 407 return MESA_FORMAT_AL44; 408 case PIPE_FORMAT_L8A8_UNORM: 409 return MESA_FORMAT_AL88; 410 case PIPE_FORMAT_L16A16_UNORM: 411 return MESA_FORMAT_AL1616; 412 case PIPE_FORMAT_A8_UNORM: 413 return MESA_FORMAT_A8; 414 case PIPE_FORMAT_A16_UNORM: 415 return MESA_FORMAT_A16; 416 case PIPE_FORMAT_L8_UNORM: 417 return MESA_FORMAT_L8; 418 case PIPE_FORMAT_L16_UNORM: 419 return MESA_FORMAT_L16; 420 case PIPE_FORMAT_I8_UNORM: 421 return MESA_FORMAT_I8; 422 case PIPE_FORMAT_I16_UNORM: 423 return MESA_FORMAT_I16; 424 case PIPE_FORMAT_S8_UINT: 425 return MESA_FORMAT_S8; 426 427 case PIPE_FORMAT_R16G16B16A16_UNORM: 428 return MESA_FORMAT_RGBA_16; 429 430 case PIPE_FORMAT_Z16_UNORM: 431 return MESA_FORMAT_Z16; 432 case PIPE_FORMAT_Z32_UNORM: 433 return MESA_FORMAT_Z32; 434 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 435 return MESA_FORMAT_Z24_S8; 436 case PIPE_FORMAT_X8Z24_UNORM: 437 return MESA_FORMAT_Z24_X8; 438 case PIPE_FORMAT_Z24X8_UNORM: 439 return MESA_FORMAT_X8_Z24; 440 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 441 return MESA_FORMAT_S8_Z24; 442 case PIPE_FORMAT_Z32_FLOAT: 443 return MESA_FORMAT_Z32_FLOAT; 444 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 445 return MESA_FORMAT_Z32_FLOAT_X24S8; 446 447 case PIPE_FORMAT_UYVY: 448 return MESA_FORMAT_YCBCR; 449 case PIPE_FORMAT_YUYV: 450 return MESA_FORMAT_YCBCR_REV; 451 452#if FEATURE_texture_s3tc 453 case PIPE_FORMAT_DXT1_RGB: 454 return MESA_FORMAT_RGB_DXT1; 455 case PIPE_FORMAT_DXT1_RGBA: 456 return MESA_FORMAT_RGBA_DXT1; 457 case PIPE_FORMAT_DXT3_RGBA: 458 return MESA_FORMAT_RGBA_DXT3; 459 case PIPE_FORMAT_DXT5_RGBA: 460 return MESA_FORMAT_RGBA_DXT5; 461#if FEATURE_EXT_texture_sRGB 462 case PIPE_FORMAT_DXT1_SRGB: 463 return MESA_FORMAT_SRGB_DXT1; 464 case PIPE_FORMAT_DXT1_SRGBA: 465 return MESA_FORMAT_SRGBA_DXT1; 466 case PIPE_FORMAT_DXT3_SRGBA: 467 return MESA_FORMAT_SRGBA_DXT3; 468 case PIPE_FORMAT_DXT5_SRGBA: 469 return MESA_FORMAT_SRGBA_DXT5; 470#endif 471#endif 472 473#if FEATURE_EXT_texture_sRGB 474 case PIPE_FORMAT_L8A8_SRGB: 475 return MESA_FORMAT_SLA8; 476 case PIPE_FORMAT_L8_SRGB: 477 return MESA_FORMAT_SL8; 478 case PIPE_FORMAT_R8G8B8_SRGB: 479 return MESA_FORMAT_SRGB8; 480 case PIPE_FORMAT_A8B8G8R8_SRGB: 481 return MESA_FORMAT_SRGBA8; 482 case PIPE_FORMAT_B8G8R8A8_SRGB: 483 return MESA_FORMAT_SARGB8; 484#endif 485 case PIPE_FORMAT_R32G32B32A32_FLOAT: 486 return MESA_FORMAT_RGBA_FLOAT32; 487 case PIPE_FORMAT_R16G16B16A16_FLOAT: 488 return MESA_FORMAT_RGBA_FLOAT16; 489 case PIPE_FORMAT_R32G32B32_FLOAT: 490 return MESA_FORMAT_RGB_FLOAT32; 491 case PIPE_FORMAT_R16G16B16_FLOAT: 492 return MESA_FORMAT_RGB_FLOAT16; 493 case PIPE_FORMAT_L32A32_FLOAT: 494 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32; 495 case PIPE_FORMAT_L16A16_FLOAT: 496 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16; 497 case PIPE_FORMAT_L32_FLOAT: 498 return MESA_FORMAT_LUMINANCE_FLOAT32; 499 case PIPE_FORMAT_L16_FLOAT: 500 return MESA_FORMAT_LUMINANCE_FLOAT16; 501 case PIPE_FORMAT_A32_FLOAT: 502 return MESA_FORMAT_ALPHA_FLOAT32; 503 case PIPE_FORMAT_A16_FLOAT: 504 return MESA_FORMAT_ALPHA_FLOAT16; 505 case PIPE_FORMAT_I32_FLOAT: 506 return MESA_FORMAT_INTENSITY_FLOAT32; 507 case PIPE_FORMAT_I16_FLOAT: 508 return MESA_FORMAT_INTENSITY_FLOAT16; 509 case PIPE_FORMAT_R32_FLOAT: 510 return MESA_FORMAT_R_FLOAT32; 511 case PIPE_FORMAT_R16_FLOAT: 512 return MESA_FORMAT_R_FLOAT16; 513 case PIPE_FORMAT_R32G32_FLOAT: 514 return MESA_FORMAT_RG_FLOAT32; 515 case PIPE_FORMAT_R16G16_FLOAT: 516 return MESA_FORMAT_RG_FLOAT16; 517 518 case PIPE_FORMAT_R8_UNORM: 519 return MESA_FORMAT_R8; 520 case PIPE_FORMAT_R16_UNORM: 521 return MESA_FORMAT_R16; 522 case PIPE_FORMAT_R8G8_UNORM: 523 return MESA_FORMAT_GR88; 524 case PIPE_FORMAT_R16G16_UNORM: 525 return MESA_FORMAT_RG1616; 526 527 case PIPE_FORMAT_A8_UINT: 528 return MESA_FORMAT_ALPHA_UINT8; 529 case PIPE_FORMAT_A16_UINT: 530 return MESA_FORMAT_ALPHA_UINT16; 531 case PIPE_FORMAT_A32_UINT: 532 return MESA_FORMAT_ALPHA_UINT32; 533 case PIPE_FORMAT_A8_SINT: 534 return MESA_FORMAT_ALPHA_INT8; 535 case PIPE_FORMAT_A16_SINT: 536 return MESA_FORMAT_ALPHA_INT16; 537 case PIPE_FORMAT_A32_SINT: 538 return MESA_FORMAT_ALPHA_INT32; 539 540 case PIPE_FORMAT_I8_UINT: 541 return MESA_FORMAT_INTENSITY_UINT8; 542 case PIPE_FORMAT_I16_UINT: 543 return MESA_FORMAT_INTENSITY_UINT16; 544 case PIPE_FORMAT_I32_UINT: 545 return MESA_FORMAT_INTENSITY_UINT32; 546 case PIPE_FORMAT_I8_SINT: 547 return MESA_FORMAT_INTENSITY_INT8; 548 case PIPE_FORMAT_I16_SINT: 549 return MESA_FORMAT_INTENSITY_INT16; 550 case PIPE_FORMAT_I32_SINT: 551 return MESA_FORMAT_INTENSITY_INT32; 552 553 case PIPE_FORMAT_L8_UINT: 554 return MESA_FORMAT_LUMINANCE_UINT8; 555 case PIPE_FORMAT_L16_UINT: 556 return MESA_FORMAT_LUMINANCE_UINT16; 557 case PIPE_FORMAT_L32_UINT: 558 return MESA_FORMAT_LUMINANCE_UINT32; 559 case PIPE_FORMAT_L8_SINT: 560 return MESA_FORMAT_LUMINANCE_INT8; 561 case PIPE_FORMAT_L16_SINT: 562 return MESA_FORMAT_LUMINANCE_INT16; 563 case PIPE_FORMAT_L32_SINT: 564 return MESA_FORMAT_LUMINANCE_INT32; 565 566 case PIPE_FORMAT_L8A8_UINT: 567 return MESA_FORMAT_LUMINANCE_ALPHA_UINT8; 568 case PIPE_FORMAT_L16A16_UINT: 569 return MESA_FORMAT_LUMINANCE_ALPHA_UINT16; 570 case PIPE_FORMAT_L32A32_UINT: 571 return MESA_FORMAT_LUMINANCE_ALPHA_UINT32; 572 case PIPE_FORMAT_L8A8_SINT: 573 return MESA_FORMAT_LUMINANCE_ALPHA_INT8; 574 case PIPE_FORMAT_L16A16_SINT: 575 return MESA_FORMAT_LUMINANCE_ALPHA_INT16; 576 case PIPE_FORMAT_L32A32_SINT: 577 return MESA_FORMAT_LUMINANCE_ALPHA_INT32; 578 579 case PIPE_FORMAT_R8_SINT: 580 return MESA_FORMAT_R_INT8; 581 case PIPE_FORMAT_R8G8_SINT: 582 return MESA_FORMAT_RG_INT8; 583 case PIPE_FORMAT_R8G8B8_SINT: 584 return MESA_FORMAT_RGB_INT8; 585 case PIPE_FORMAT_R8G8B8A8_SINT: 586 return MESA_FORMAT_RGBA_INT8; 587 588 case PIPE_FORMAT_R16_SINT: 589 return MESA_FORMAT_R_INT16; 590 case PIPE_FORMAT_R16G16_SINT: 591 return MESA_FORMAT_RG_INT16; 592 case PIPE_FORMAT_R16G16B16_SINT: 593 return MESA_FORMAT_RGB_INT16; 594 case PIPE_FORMAT_R16G16B16A16_SINT: 595 return MESA_FORMAT_RGBA_INT16; 596 597 case PIPE_FORMAT_R32_SINT: 598 return MESA_FORMAT_R_INT32; 599 case PIPE_FORMAT_R32G32_SINT: 600 return MESA_FORMAT_RG_INT32; 601 case PIPE_FORMAT_R32G32B32_SINT: 602 return MESA_FORMAT_RGB_INT32; 603 case PIPE_FORMAT_R32G32B32A32_SINT: 604 return MESA_FORMAT_RGBA_INT32; 605 606 /* unsigned int formats */ 607 case PIPE_FORMAT_R8_UINT: 608 return MESA_FORMAT_R_UINT8; 609 case PIPE_FORMAT_R8G8_UINT: 610 return MESA_FORMAT_RG_UINT8; 611 case PIPE_FORMAT_R8G8B8_UINT: 612 return MESA_FORMAT_RGB_UINT8; 613 case PIPE_FORMAT_R8G8B8A8_UINT: 614 return MESA_FORMAT_RGBA_UINT8; 615 616 case PIPE_FORMAT_R16_UINT: 617 return MESA_FORMAT_R_UINT16; 618 case PIPE_FORMAT_R16G16_UINT: 619 return MESA_FORMAT_RG_UINT16; 620 case PIPE_FORMAT_R16G16B16_UINT: 621 return MESA_FORMAT_RGB_UINT16; 622 case PIPE_FORMAT_R16G16B16A16_UINT: 623 return MESA_FORMAT_RGBA_UINT16; 624 625 case PIPE_FORMAT_R32_UINT: 626 return MESA_FORMAT_R_UINT32; 627 case PIPE_FORMAT_R32G32_UINT: 628 return MESA_FORMAT_RG_UINT32; 629 case PIPE_FORMAT_R32G32B32_UINT: 630 return MESA_FORMAT_RGB_UINT32; 631 case PIPE_FORMAT_R32G32B32A32_UINT: 632 return MESA_FORMAT_RGBA_UINT32; 633 634 case PIPE_FORMAT_RGTC1_UNORM: 635 return MESA_FORMAT_RED_RGTC1; 636 case PIPE_FORMAT_RGTC1_SNORM: 637 return MESA_FORMAT_SIGNED_RED_RGTC1; 638 case PIPE_FORMAT_RGTC2_UNORM: 639 return MESA_FORMAT_RG_RGTC2; 640 case PIPE_FORMAT_RGTC2_SNORM: 641 return MESA_FORMAT_SIGNED_RG_RGTC2; 642 643 case PIPE_FORMAT_LATC1_UNORM: 644 return MESA_FORMAT_L_LATC1; 645 case PIPE_FORMAT_LATC1_SNORM: 646 return MESA_FORMAT_SIGNED_L_LATC1; 647 case PIPE_FORMAT_LATC2_UNORM: 648 return MESA_FORMAT_LA_LATC2; 649 case PIPE_FORMAT_LATC2_SNORM: 650 return MESA_FORMAT_SIGNED_LA_LATC2; 651 652 case PIPE_FORMAT_ETC1_RGB8: 653 return MESA_FORMAT_ETC1_RGB8; 654 655 /* signed normalized formats */ 656 case PIPE_FORMAT_R8_SNORM: 657 return MESA_FORMAT_SIGNED_R8; 658 case PIPE_FORMAT_R8G8_SNORM: 659 return MESA_FORMAT_SIGNED_RG88_REV; 660 case PIPE_FORMAT_R8G8B8A8_SNORM: 661 return MESA_FORMAT_SIGNED_RGBA8888_REV; 662 663 case PIPE_FORMAT_A8_SNORM: 664 return MESA_FORMAT_SIGNED_A8; 665 case PIPE_FORMAT_L8_SNORM: 666 return MESA_FORMAT_SIGNED_L8; 667 case PIPE_FORMAT_L8A8_SNORM: 668 return MESA_FORMAT_SIGNED_AL88; 669 case PIPE_FORMAT_I8_SNORM: 670 return MESA_FORMAT_SIGNED_I8; 671 672 case PIPE_FORMAT_R16_SNORM: 673 return MESA_FORMAT_SIGNED_R16; 674 case PIPE_FORMAT_R16G16_SNORM: 675 return MESA_FORMAT_SIGNED_GR1616; 676 case PIPE_FORMAT_R16G16B16A16_SNORM: 677 return MESA_FORMAT_SIGNED_RGBA_16; 678 679 case PIPE_FORMAT_A16_SNORM: 680 return MESA_FORMAT_SIGNED_A16; 681 case PIPE_FORMAT_L16_SNORM: 682 return MESA_FORMAT_SIGNED_L16; 683 case PIPE_FORMAT_L16A16_SNORM: 684 return MESA_FORMAT_SIGNED_AL1616; 685 case PIPE_FORMAT_I16_SNORM: 686 return MESA_FORMAT_SIGNED_I16; 687 688 case PIPE_FORMAT_R9G9B9E5_FLOAT: 689 return MESA_FORMAT_RGB9_E5_FLOAT; 690 case PIPE_FORMAT_R11G11B10_FLOAT: 691 return MESA_FORMAT_R11_G11_B10_FLOAT; 692 693 case PIPE_FORMAT_B10G10R10A2_UINT: 694 return MESA_FORMAT_ARGB2101010_UINT; 695 default: 696 assert(0); 697 return MESA_FORMAT_NONE; 698 } 699} 700 701 702/** 703 * Map GL texture formats to Gallium pipe formats. 704 */ 705struct format_mapping 706{ 707 GLenum glFormats[18]; /**< list of GLenum formats, 0-terminated */ 708 enum pipe_format pipeFormats[10]; /**< list of pipe formats, 0-terminated */ 709}; 710 711 712#define DEFAULT_RGBA_FORMATS \ 713 PIPE_FORMAT_B8G8R8A8_UNORM, \ 714 PIPE_FORMAT_A8R8G8B8_UNORM, \ 715 PIPE_FORMAT_A8B8G8R8_UNORM, \ 716 PIPE_FORMAT_B5G6R5_UNORM, \ 717 0 718 719#define DEFAULT_RGB_FORMATS \ 720 PIPE_FORMAT_B8G8R8X8_UNORM, \ 721 PIPE_FORMAT_X8R8G8B8_UNORM, \ 722 PIPE_FORMAT_X8B8G8R8_UNORM, \ 723 PIPE_FORMAT_B8G8R8A8_UNORM, \ 724 PIPE_FORMAT_A8R8G8B8_UNORM, \ 725 PIPE_FORMAT_A8B8G8R8_UNORM, \ 726 PIPE_FORMAT_B5G6R5_UNORM, \ 727 0 728 729#define DEFAULT_SRGBA_FORMATS \ 730 PIPE_FORMAT_B8G8R8A8_SRGB, \ 731 PIPE_FORMAT_A8R8G8B8_SRGB, \ 732 PIPE_FORMAT_A8B8G8R8_SRGB, \ 733 0 734 735#define DEFAULT_DEPTH_FORMATS \ 736 PIPE_FORMAT_Z24X8_UNORM, \ 737 PIPE_FORMAT_X8Z24_UNORM, \ 738 PIPE_FORMAT_Z16_UNORM, \ 739 PIPE_FORMAT_Z24_UNORM_S8_UINT, \ 740 PIPE_FORMAT_S8_UINT_Z24_UNORM, \ 741 0 742 743#define DEFAULT_SNORM8_RGBA_FORMATS \ 744 PIPE_FORMAT_R8G8B8A8_SNORM, \ 745 0 746 747#define DEFAULT_UNORM16_RGBA_FORMATS \ 748 PIPE_FORMAT_R16G16B16A16_UNORM, \ 749 DEFAULT_RGBA_FORMATS 750 751 752/** 753 * This table maps OpenGL texture format enums to Gallium pipe_format enums. 754 * Multiple GL enums might map to multiple pipe_formats. 755 * The first pipe format in the list that's supported is the one that's chosen. 756 */ 757static const struct format_mapping format_map[] = { 758 /* Basic RGB, RGBA formats */ 759 { 760 { GL_RGB10, GL_RGB10_A2, 0 }, 761 { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS } 762 }, 763 { 764 { 4, GL_RGBA, GL_RGBA8, 0 }, 765 { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS } 766 }, 767 { 768 { GL_BGRA, 0 }, 769 { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS } 770 }, 771 { 772 { 3, GL_RGB, GL_RGB8, 0 }, 773 { DEFAULT_RGB_FORMATS } 774 }, 775 { 776 { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 }, 777 { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS } 778 }, 779 { 780 { GL_RGBA4, GL_RGBA2, 0 }, 781 { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS } 782 }, 783 { 784 { GL_RGB5_A1, 0 }, 785 { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS } 786 }, 787 { 788 { GL_R3_G3_B2, 0 }, 789 { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM, 790 PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS } 791 }, 792 { 793 { GL_RGB5, GL_RGB4 }, 794 { PIPE_FORMAT_B5G6R5_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM, 795 DEFAULT_RGBA_FORMATS } 796 }, 797 { 798 { GL_RGB565 }, 799 { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGBA_FORMATS } 800 }, 801 802 /* basic Alpha formats */ 803 { 804 { GL_ALPHA12, GL_ALPHA16, 0 }, 805 { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM, 806 DEFAULT_RGBA_FORMATS } 807 }, 808 { 809 { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 }, 810 { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS } 811 }, 812 813 /* basic Luminance formats */ 814 { 815 { GL_LUMINANCE12, GL_LUMINANCE16, 0 }, 816 { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS } 817 }, 818 { 819 { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 }, 820 { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS } 821 }, 822 823 /* basic Luminance/Alpha formats */ 824 { 825 { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12, 826 GL_LUMINANCE16_ALPHA16, 0}, 827 { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM, 828 DEFAULT_RGBA_FORMATS } 829 }, 830 { 831 { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 }, 832 { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS } 833 }, 834 { 835 { GL_LUMINANCE4_ALPHA4, 0 }, 836 { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM, 837 DEFAULT_RGBA_FORMATS } 838 }, 839 840 /* basic Intensity formats */ 841 { 842 { GL_INTENSITY12, GL_INTENSITY16, 0 }, 843 { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS } 844 }, 845 { 846 { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8, 847 GL_COMPRESSED_INTENSITY, 0 }, 848 { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS } 849 }, 850 851 /* YCbCr */ 852 { 853 { GL_YCBCR_MESA, 0 }, 854 { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 } 855 }, 856 857 /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */ 858 { 859 { GL_COMPRESSED_RGB, 0 }, 860 { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS } 861 }, 862 { 863 { GL_COMPRESSED_RGBA, 0 }, 864 { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS } 865 }, 866 { 867 { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 }, 868 { PIPE_FORMAT_DXT1_RGB, 0 } 869 }, 870 { 871 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 }, 872 { PIPE_FORMAT_DXT1_RGBA, 0 } 873 }, 874 { 875 { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 }, 876 { PIPE_FORMAT_DXT3_RGBA, 0 } 877 }, 878 { 879 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 }, 880 { PIPE_FORMAT_DXT5_RGBA, 0 } 881 }, 882 883#if 0 884 { 885 { GL_COMPRESSED_RGB_FXT1_3DFX, 0 }, 886 { PIPE_FORMAT_RGB_FXT1, 0 } 887 }, 888 { 889 { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 }, 890 { PIPE_FORMAT_RGBA_FXT1, 0 } 891 }, 892#endif 893 894 /* Depth formats */ 895 { 896 { GL_DEPTH_COMPONENT16, 0 }, 897 { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS } 898 }, 899 { 900 { GL_DEPTH_COMPONENT24, 0 }, 901 { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM, 902 DEFAULT_DEPTH_FORMATS } 903 }, 904 { 905 { GL_DEPTH_COMPONENT32, 0 }, 906 { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS } 907 }, 908 { 909 { GL_DEPTH_COMPONENT, 0 }, 910 { DEFAULT_DEPTH_FORMATS } 911 }, 912 { 913 { GL_DEPTH_COMPONENT32F, 0 }, 914 { PIPE_FORMAT_Z32_FLOAT, 0 } 915 }, 916 917 /* stencil formats */ 918 { 919 { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT, 920 GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 }, 921 { 922 PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT, 923 PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 924 } 925 }, 926 927 /* Depth / Stencil formats */ 928 { 929 { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 }, 930 { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 } 931 }, 932 { 933 { GL_DEPTH32F_STENCIL8, 0 }, 934 { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 } 935 }, 936 937 /* sRGB formats */ 938 { 939 { GL_SRGB_EXT, GL_SRGB8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 }, 940 { DEFAULT_SRGBA_FORMATS } 941 }, 942 { 943 { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 }, 944 { PIPE_FORMAT_DXT1_SRGB, DEFAULT_SRGBA_FORMATS } 945 }, 946 { 947 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 }, 948 { PIPE_FORMAT_DXT1_SRGBA, 0 } 949 }, 950 { 951 { GL_COMPRESSED_SRGB_ALPHA_EXT, 952 GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 }, 953 { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS } 954 }, 955 { 956 { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 }, 957 { PIPE_FORMAT_DXT5_SRGBA, 0 } 958 }, 959 { 960 { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT, 961 GL_COMPRESSED_SLUMINANCE_EXT, GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 }, 962 { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS } 963 }, 964 { 965 { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, 0 }, 966 { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS } 967 }, 968 969 /* 16-bit float formats */ 970 { 971 { GL_RGBA16F_ARB, 0 }, 972 { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 973 }, 974 { 975 { GL_RGB16F_ARB, 0 }, 976 { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 977 PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 978 }, 979 { 980 { GL_LUMINANCE_ALPHA16F_ARB, 0 }, 981 { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 982 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 983 }, 984 { 985 { GL_ALPHA16F_ARB, 0 }, 986 { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT, 987 PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 988 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 989 }, 990 { 991 { GL_INTENSITY16F_ARB, 0 }, 992 { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT, 993 PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 994 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 995 }, 996 { 997 { GL_LUMINANCE16F_ARB, 0 }, 998 { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT, 999 PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 1000 PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 1001 }, 1002 { 1003 { GL_R16F, 0 }, 1004 { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT, 1005 PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 1006 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 1007 }, 1008 { 1009 { GL_RG16F, 0 }, 1010 { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 1011 PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 } 1012 }, 1013 1014 /* 32-bit float formats */ 1015 { 1016 { GL_RGBA32F_ARB, 0 }, 1017 { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1018 }, 1019 { 1020 { GL_RGB32F_ARB, 0 }, 1021 { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 1022 PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1023 }, 1024 { 1025 { GL_LUMINANCE_ALPHA32F_ARB, 0 }, 1026 { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 1027 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1028 }, 1029 { 1030 { GL_ALPHA32F_ARB, 0 }, 1031 { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT, 1032 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT, 1033 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1034 }, 1035 { 1036 { GL_INTENSITY32F_ARB, 0 }, 1037 { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT, 1038 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT, 1039 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1040 }, 1041 { 1042 { GL_LUMINANCE32F_ARB, 0 }, 1043 { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT, 1044 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT, 1045 PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1046 }, 1047 { 1048 { GL_R32F, 0 }, 1049 { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT, 1050 PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT, 1051 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1052 }, 1053 { 1054 { GL_RG32F, 0 }, 1055 { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 1056 PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 } 1057 }, 1058 1059 /* R, RG formats */ 1060 { 1061 { GL_RED, GL_R8, 0 }, 1062 { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS } 1063 }, 1064 { 1065 { GL_RG, GL_RG8, 0 }, 1066 { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS } 1067 }, 1068 { 1069 { GL_R16, 0 }, 1070 { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM, 1071 DEFAULT_UNORM16_RGBA_FORMATS } 1072 }, 1073 { 1074 { GL_RG16, 0 }, 1075 { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS } 1076 }, 1077 1078 /* compressed R, RG formats */ 1079 { 1080 { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 }, 1081 { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS } 1082 }, 1083 { 1084 { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 }, 1085 { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS } 1086 }, 1087 { 1088 { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 }, 1089 { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS } 1090 }, 1091 { 1092 { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 }, 1093 { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS } 1094 }, 1095 { 1096 { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 }, 1097 { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS } 1098 }, 1099 { 1100 { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 }, 1101 { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS } 1102 }, 1103 { 1104 { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT, 1105 GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 }, 1106 { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS } 1107 }, 1108 { 1109 { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 }, 1110 { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS } 1111 }, 1112 1113 /* ETC1 */ 1114 { 1115 { GL_ETC1_RGB8_OES, 0 }, 1116 { PIPE_FORMAT_ETC1_RGB8, 0 } 1117 }, 1118 1119 /* signed/unsigned integer formats. 1120 */ 1121 { 1122 { GL_RED_INTEGER_EXT, 1123 GL_GREEN_INTEGER_EXT, 1124 GL_BLUE_INTEGER_EXT, 1125 GL_RGBA_INTEGER_EXT, 1126 GL_BGRA_INTEGER_EXT, 1127 GL_RGBA8I_EXT, 0 }, 1128 { PIPE_FORMAT_R8G8B8A8_SINT, 0 } 1129 }, 1130 { 1131 { GL_RGB_INTEGER_EXT, 1132 GL_BGR_INTEGER_EXT, 1133 GL_RGB8I_EXT, 0 }, 1134 { PIPE_FORMAT_R8G8B8_SINT, 1135 PIPE_FORMAT_R8G8B8A8_SINT, 0 } 1136 }, 1137 { 1138 { GL_ALPHA_INTEGER_EXT, 1139 GL_ALPHA8I_EXT, 0 }, 1140 { PIPE_FORMAT_A8_SINT, 0 } 1141 }, 1142 { 1143 { GL_ALPHA16I_EXT, 0 }, 1144 { PIPE_FORMAT_A16_SINT, 0 } 1145 }, 1146 { 1147 { GL_ALPHA32I_EXT, 0 }, 1148 { PIPE_FORMAT_A32_SINT, 0 } 1149 }, 1150 { 1151 { GL_ALPHA8UI_EXT, 0 }, 1152 { PIPE_FORMAT_A8_UINT, 0 } 1153 }, 1154 { 1155 { GL_ALPHA16UI_EXT, 0 }, 1156 { PIPE_FORMAT_A16_UINT, 0 } 1157 }, 1158 { 1159 { GL_ALPHA32UI_EXT, 0 }, 1160 { PIPE_FORMAT_A32_UINT, 0 } 1161 }, 1162 { 1163 { GL_INTENSITY8I_EXT, 0 }, 1164 { PIPE_FORMAT_I8_SINT, 0 } 1165 }, 1166 { 1167 { GL_INTENSITY16I_EXT, 0 }, 1168 { PIPE_FORMAT_I16_SINT, 0 } 1169 }, 1170 { 1171 { GL_INTENSITY32I_EXT, 0 }, 1172 { PIPE_FORMAT_I32_SINT, 0 } 1173 }, 1174 { 1175 { GL_INTENSITY8UI_EXT, 0 }, 1176 { PIPE_FORMAT_I8_UINT, 0 } 1177 }, 1178 { 1179 { GL_INTENSITY16UI_EXT, 0 }, 1180 { PIPE_FORMAT_I16_UINT, 0 } 1181 }, 1182 { 1183 { GL_INTENSITY32UI_EXT, 0 }, 1184 { PIPE_FORMAT_I32_UINT, 0 } 1185 }, 1186 { 1187 { GL_LUMINANCE8I_EXT, 0 }, 1188 { PIPE_FORMAT_L8_SINT, 0 } 1189 }, 1190 { 1191 { GL_LUMINANCE16I_EXT, 0 }, 1192 { PIPE_FORMAT_L16_SINT, 0 } 1193 }, 1194 { 1195 { GL_LUMINANCE32I_EXT, 0 }, 1196 { PIPE_FORMAT_L32_SINT, 0 } 1197 }, 1198 { 1199 { GL_LUMINANCE_INTEGER_EXT, 1200 GL_LUMINANCE8UI_EXT, 0 }, 1201 { PIPE_FORMAT_L8_UINT, 0 } 1202 }, 1203 { 1204 { GL_LUMINANCE16UI_EXT, 0 }, 1205 { PIPE_FORMAT_L16_UINT, 0 } 1206 }, 1207 { 1208 { GL_LUMINANCE32UI_EXT, 0 }, 1209 { PIPE_FORMAT_L32_UINT, 0 } 1210 }, 1211 { 1212 { GL_LUMINANCE_ALPHA_INTEGER_EXT, 1213 GL_LUMINANCE_ALPHA8I_EXT, 0 }, 1214 { PIPE_FORMAT_L8A8_SINT, 0 } 1215 }, 1216 { 1217 { GL_LUMINANCE_ALPHA16I_EXT, 0 }, 1218 { PIPE_FORMAT_L16A16_SINT, 0 } 1219 }, 1220 { 1221 { GL_LUMINANCE_ALPHA32I_EXT, 0 }, 1222 { PIPE_FORMAT_L32A32_SINT, 0 } 1223 }, 1224 { 1225 { GL_LUMINANCE_ALPHA8UI_EXT, 0 }, 1226 { PIPE_FORMAT_L8A8_UINT, 0 } 1227 }, 1228 { 1229 { GL_LUMINANCE_ALPHA16UI_EXT, 0 }, 1230 { PIPE_FORMAT_L16A16_UINT, 0 } 1231 }, 1232 { 1233 { GL_LUMINANCE_ALPHA32UI_EXT, 0 }, 1234 { PIPE_FORMAT_L32A32_UINT, 0 } 1235 }, 1236 { 1237 { GL_RGB16I_EXT, 0 }, 1238 { PIPE_FORMAT_R16G16B16_SINT, 1239 PIPE_FORMAT_R16G16B16A16_SINT, 0 }, 1240 }, 1241 { 1242 { GL_RGBA16I_EXT, 0 }, 1243 { PIPE_FORMAT_R16G16B16A16_SINT, 0 }, 1244 }, 1245 { 1246 { GL_RGB32I_EXT, 0 }, 1247 { PIPE_FORMAT_R32G32B32_SINT, 1248 PIPE_FORMAT_R32G32B32A32_SINT, 0 }, 1249 }, 1250 { 1251 { GL_RGBA32I_EXT, 0 }, 1252 { PIPE_FORMAT_R32G32B32A32_SINT, 0 } 1253 }, 1254 { 1255 { GL_RGBA8UI_EXT, 0 }, 1256 { PIPE_FORMAT_R8G8B8A8_UINT, 0 } 1257 }, 1258 { 1259 { GL_RGB8UI_EXT, 0 }, 1260 { PIPE_FORMAT_R8G8B8_UINT, 1261 PIPE_FORMAT_R8G8B8A8_UINT, 0 } 1262 }, 1263 { 1264 { GL_RGB16UI_EXT, 0 }, 1265 { PIPE_FORMAT_R16G16B16_UINT, 1266 PIPE_FORMAT_R16G16B16A16_UINT, 0 } 1267 }, 1268 { 1269 { GL_RGBA16UI_EXT, 0 }, 1270 { PIPE_FORMAT_R16G16B16A16_UINT, 0 } 1271 }, 1272 { 1273 { GL_RGB32UI_EXT, 0}, 1274 { PIPE_FORMAT_R32G32B32_UINT, 1275 PIPE_FORMAT_R32G32B32A32_UINT, 0 } 1276 }, 1277 { 1278 { GL_RGBA32UI_EXT, 0}, 1279 { PIPE_FORMAT_R32G32B32A32_UINT, 0 } 1280 }, 1281 { 1282 { GL_R8I, 0}, 1283 { PIPE_FORMAT_R8_SINT, 0}, 1284 }, 1285 { 1286 { GL_R16I, 0}, 1287 { PIPE_FORMAT_R16_SINT, 0}, 1288 }, 1289 { 1290 { GL_R32I, 0}, 1291 { PIPE_FORMAT_R32_SINT, 0}, 1292 }, 1293 { 1294 { GL_R8UI, 0}, 1295 { PIPE_FORMAT_R8_UINT, 0}, 1296 }, 1297 { 1298 { GL_R16UI, 0}, 1299 { PIPE_FORMAT_R16_UINT, 0}, 1300 }, 1301 { 1302 { GL_R32UI, 0}, 1303 { PIPE_FORMAT_R32_UINT, 0}, 1304 }, 1305 { 1306 { GL_RG8I, 0}, 1307 { PIPE_FORMAT_R8G8_SINT, 0}, 1308 }, 1309 { 1310 { GL_RG16I, 0}, 1311 { PIPE_FORMAT_R16G16_SINT, 0}, 1312 }, 1313 { 1314 { GL_RG32I, 0}, 1315 { PIPE_FORMAT_R32G32_SINT, 0}, 1316 }, 1317 { 1318 { GL_RG8UI, 0}, 1319 { PIPE_FORMAT_R8G8_UINT, 0}, 1320 }, 1321 { 1322 { GL_RG16UI, 0}, 1323 { PIPE_FORMAT_R16G16_UINT, 0}, 1324 }, 1325 { 1326 { GL_RG32UI, 0}, 1327 { PIPE_FORMAT_R32G32_UINT, 0}, 1328 }, 1329 /* signed normalized formats */ 1330 { 1331 { GL_RED_SNORM, GL_R8_SNORM, 0 }, 1332 { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM, 1333 PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1334 }, 1335 { 1336 { GL_R16_SNORM, 0 }, 1337 { PIPE_FORMAT_R16_SNORM, 1338 PIPE_FORMAT_R16G16_SNORM, 1339 PIPE_FORMAT_R16G16B16A16_SNORM, 1340 PIPE_FORMAT_R8_SNORM, 1341 PIPE_FORMAT_R8G8_SNORM, 1342 PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1343 }, 1344 { 1345 { GL_RG_SNORM, GL_RG8_SNORM, 0 }, 1346 { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1347 }, 1348 { 1349 { GL_RG16_SNORM, 0 }, 1350 { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM, 1351 PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1352 }, 1353 { 1354 { GL_RGB_SNORM, GL_RGB8_SNORM, GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 }, 1355 { PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1356 }, 1357 { 1358 { GL_RGB16_SNORM, GL_RGBA16_SNORM, 0 }, 1359 { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1360 }, 1361 { 1362 { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 }, 1363 { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1364 }, 1365 { 1366 { GL_ALPHA16_SNORM, 0 }, 1367 { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM, 1368 PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1369 }, 1370 { 1371 { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 }, 1372 { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1373 }, 1374 { 1375 { GL_LUMINANCE16_SNORM, 0 }, 1376 { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM, 1377 PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1378 }, 1379 { 1380 { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 }, 1381 { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1382 }, 1383 { 1384 { GL_LUMINANCE16_ALPHA16_SNORM, 0 }, 1385 { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM, 1386 PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1387 }, 1388 { 1389 { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 }, 1390 { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1391 }, 1392 { 1393 { GL_INTENSITY16_SNORM, 0 }, 1394 { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM, 1395 PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 } 1396 }, 1397 { 1398 { GL_RGB9_E5, 0 }, 1399 { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 } 1400 }, 1401 { 1402 { GL_R11F_G11F_B10F, 0 }, 1403 { PIPE_FORMAT_R11G11B10_FLOAT, 0 } 1404 }, 1405 { 1406 { GL_RGB10_A2UI, 0 }, 1407 { PIPE_FORMAT_B10G10R10A2_UINT, 0 } 1408 }, 1409}; 1410 1411 1412/** 1413 * Return first supported format from the given list. 1414 */ 1415static enum pipe_format 1416find_supported_format(struct pipe_screen *screen, 1417 const enum pipe_format formats[], 1418 enum pipe_texture_target target, 1419 unsigned sample_count, 1420 unsigned tex_usage) 1421{ 1422 uint i; 1423 for (i = 0; formats[i]; i++) { 1424 if (screen->is_format_supported(screen, formats[i], target, 1425 sample_count, tex_usage)) { 1426 return formats[i]; 1427 } 1428 } 1429 return PIPE_FORMAT_NONE; 1430} 1431 1432struct exact_format_mapping 1433{ 1434 GLenum format; 1435 GLenum type; 1436 enum pipe_format pformat; 1437}; 1438 1439static const struct exact_format_mapping rgba8888_tbl[] = 1440{ 1441 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8B8G8R8_UNORM }, 1442 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_A8B8G8R8_UNORM }, 1443 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8A8_UNORM }, 1444 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8A8_UNORM }, 1445 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_A8R8G8B8_UNORM }, 1446 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8A8_UNORM }, 1447 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8A8_UNORM }, 1448 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_A8B8G8R8_UNORM }, 1449 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8A8_UNORM }, 1450 { 0, 0, 0 } 1451}; 1452 1453static const struct exact_format_mapping rgbx8888_tbl[] = 1454{ 1455 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8R8G8B8_UNORM }, 1456 { GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_B8G8R8X8_UNORM }, 1457 { GL_BGRA, GL_UNSIGNED_BYTE, PIPE_FORMAT_B8G8R8X8_UNORM }, 1458 /* No Mesa formats for these Gallium formats: 1459 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_X8B8G8R8_UNORM }, 1460 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_X8B8G8R8_UNORM }, 1461 { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, PIPE_FORMAT_R8G8B8X8_UNORM }, 1462 { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8, PIPE_FORMAT_R8G8B8X8_UNORM }, 1463 { GL_RGBA, GL_UNSIGNED_BYTE, PIPE_FORMAT_R8G8B8X8_UNORM }, 1464 { GL_ABGR_EXT, GL_UNSIGNED_BYTE, PIPE_FORMAT_X8B8G8R8_UNORM }, 1465 */ 1466 { 0, 0, 0 } 1467}; 1468 1469static const struct exact_format_mapping rgba1010102_tbl[] = 1470{ 1471 { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM }, 1472 /* No Mesa formats for these Gallium formats: 1473 { GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM }, 1474 { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM }, 1475 { GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM }, 1476 */ 1477 { 0, 0, 0 } 1478}; 1479 1480/** 1481 * If there is an exact pipe_format match for {internalFormat, format, type} 1482 * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching. 1483 */ 1484static enum pipe_format 1485find_exact_format(GLint internalFormat, GLenum format, GLenum type) 1486{ 1487 uint i; 1488 const struct exact_format_mapping* tbl; 1489 1490 if (format == GL_NONE || type == GL_NONE) 1491 return PIPE_FORMAT_NONE; 1492 1493 switch (internalFormat) { 1494 case 4: 1495 case GL_RGBA: 1496 case GL_RGBA8: 1497 tbl = rgba8888_tbl; 1498 break; 1499 case 3: 1500 case GL_RGB: 1501 case GL_RGB8: 1502 tbl = rgbx8888_tbl; 1503 break; 1504 case GL_RGB10_A2: 1505 tbl = rgba1010102_tbl; 1506 break; 1507 default: 1508 return PIPE_FORMAT_NONE; 1509 } 1510 1511 for (i = 0; tbl[i].format; i++) 1512 if (tbl[i].format == format && tbl[i].type == type) 1513 return tbl[i].pformat; 1514 1515 return PIPE_FORMAT_NONE; 1516} 1517 1518/** 1519 * Given an OpenGL internalFormat value for a texture or surface, return 1520 * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match. 1521 * This is called during glTexImage2D, for example. 1522 * 1523 * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus 1524 * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if 1525 * we want render-to-texture ability. 1526 * 1527 * \param internalFormat the user value passed to glTexImage2D 1528 * \param target one of PIPE_TEXTURE_x 1529 * \param bindings bitmask of PIPE_BIND_x flags. 1530 */ 1531enum pipe_format 1532st_choose_format(struct pipe_screen *screen, GLenum internalFormat, 1533 GLenum format, GLenum type, 1534 enum pipe_texture_target target, unsigned sample_count, 1535 unsigned bindings) 1536{ 1537 GET_CURRENT_CONTEXT(ctx); /* XXX this should be a function parameter */ 1538 int i, j; 1539 enum pipe_format pf; 1540 1541 /* can't render to compressed formats at this time */ 1542 if (_mesa_is_compressed_format(ctx, internalFormat) 1543 && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) { 1544 return PIPE_FORMAT_NONE; 1545 } 1546 1547 /* search for exact matches */ 1548 pf = find_exact_format(internalFormat, format, type); 1549 if (pf != PIPE_FORMAT_NONE && 1550 screen->is_format_supported(screen, pf, 1551 target, sample_count, bindings)) 1552 return pf; 1553 1554 /* search table for internalFormat */ 1555 for (i = 0; i < Elements(format_map); i++) { 1556 const struct format_mapping *mapping = &format_map[i]; 1557 for (j = 0; mapping->glFormats[j]; j++) { 1558 if (mapping->glFormats[j] == internalFormat) { 1559 /* Found the desired internal format. Find first pipe format 1560 * which is supported by the driver. 1561 */ 1562 return find_supported_format(screen, mapping->pipeFormats, 1563 target, sample_count, bindings); 1564 } 1565 } 1566 } 1567 1568 _mesa_problem(NULL, "unhandled format!\n"); 1569 return PIPE_FORMAT_NONE; 1570} 1571 1572 1573/** 1574 * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces. 1575 */ 1576enum pipe_format 1577st_choose_renderbuffer_format(struct pipe_screen *screen, 1578 GLenum internalFormat, unsigned sample_count) 1579{ 1580 uint usage; 1581 if (_mesa_is_depth_or_stencil_format(internalFormat)) 1582 usage = PIPE_BIND_DEPTH_STENCIL; 1583 else 1584 usage = PIPE_BIND_RENDER_TARGET; 1585 return st_choose_format(screen, internalFormat, GL_NONE, GL_NONE, PIPE_TEXTURE_2D, 1586 sample_count, usage); 1587} 1588 1589 1590gl_format 1591st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat, 1592 GLenum format, GLenum type, GLboolean renderable) 1593{ 1594 struct pipe_screen *screen = st_context(ctx)->pipe->screen; 1595 enum pipe_format pFormat; 1596 uint bindings; 1597 1598 (void) format; 1599 (void) type; 1600 1601 /* GL textures may wind up being render targets, but we don't know 1602 * that in advance. Specify potential render target flags now. 1603 */ 1604 bindings = PIPE_BIND_SAMPLER_VIEW; 1605 if (renderable) { 1606 if (_mesa_is_depth_or_stencil_format(internalFormat)) 1607 bindings |= PIPE_BIND_DEPTH_STENCIL; 1608 else 1609 bindings |= PIPE_BIND_RENDER_TARGET; 1610 } 1611 1612 pFormat = st_choose_format(screen, internalFormat, format, type, 1613 PIPE_TEXTURE_2D, 0, bindings); 1614 1615 if (pFormat == PIPE_FORMAT_NONE) { 1616 /* try choosing format again, this time without render target bindings */ 1617 pFormat = st_choose_format(screen, internalFormat, format, type, 1618 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW); 1619 } 1620 1621 if (pFormat == PIPE_FORMAT_NONE) { 1622 /* no luck at all */ 1623 return MESA_FORMAT_NONE; 1624 } 1625 1626 return st_pipe_format_to_mesa_format(pFormat); 1627} 1628 1629 1630/** 1631 * Called via ctx->Driver.ChooseTextureFormat(). 1632 */ 1633gl_format 1634st_ChooseTextureFormat(struct gl_context *ctx, GLenum target, 1635 GLint internalFormat, 1636 GLenum format, GLenum type) 1637{ 1638 boolean want_renderable = 1639 internalFormat == 3 || internalFormat == 4 || 1640 internalFormat == GL_RGB || internalFormat == GL_RGBA || 1641 internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 || 1642 internalFormat == GL_BGRA; 1643 1644 if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) { 1645 /* We don't do compression for these texture targets because of 1646 * difficulty with sub-texture updates on non-block boundaries, etc. 1647 * So change the internal format request to an uncompressed format. 1648 */ 1649 internalFormat = 1650 _mesa_generic_compressed_format_to_uncompressed_format(internalFormat); 1651 } 1652 1653 return st_ChooseTextureFormat_renderable(ctx, internalFormat, 1654 format, type, want_renderable); 1655} 1656 1657 1658GLboolean 1659st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2) 1660{ 1661 if (format1 == format2) 1662 return GL_TRUE; 1663 1664 if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM && 1665 format2 == PIPE_FORMAT_B8G8R8X8_UNORM) 1666 return GL_TRUE; 1667 1668 if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM && 1669 format2 == PIPE_FORMAT_B8G8R8A8_UNORM) 1670 return GL_TRUE; 1671 1672 if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM && 1673 format2 == PIPE_FORMAT_X8B8G8R8_UNORM) 1674 return GL_TRUE; 1675 1676 if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM && 1677 format2 == PIPE_FORMAT_A8B8G8R8_UNORM) 1678 return GL_TRUE; 1679 1680 if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM && 1681 format2 == PIPE_FORMAT_X8R8G8B8_UNORM) 1682 return GL_TRUE; 1683 1684 if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM && 1685 format2 == PIPE_FORMAT_A8R8G8B8_UNORM) 1686 return GL_TRUE; 1687 1688 return GL_FALSE; 1689} 1690 1691 1692 1693/** 1694 * This is used for translating texture border color and the clear 1695 * color. For example, the clear color is interpreted according to 1696 * the renderbuffer's base format. For example, if clearing a 1697 * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] = 1698 * colorOut[2] = colorIn[0]. 1699 * Similarly for texture border colors. 1700 */ 1701void 1702st_translate_color(union gl_color_union *colorIn, 1703 union pipe_color_union *colorOut, 1704 GLenum baseFormat, GLboolean is_integer) 1705{ 1706 if (is_integer) { 1707 int *in = colorIn->i; 1708 int *out = colorOut->i; 1709 1710 switch (baseFormat) { 1711 case GL_RED: 1712 out[0] = in[0]; 1713 out[1] = 0; 1714 out[2] = 0; 1715 out[3] = 1; 1716 break; 1717 case GL_RG: 1718 out[0] = in[0]; 1719 out[1] = in[1]; 1720 out[2] = 0; 1721 out[3] = 1; 1722 break; 1723 case GL_RGB: 1724 out[0] = in[0]; 1725 out[1] = in[1]; 1726 out[2] = in[2]; 1727 out[3] = 1; 1728 break; 1729 case GL_ALPHA: 1730 out[0] = out[1] = out[2] = 0; 1731 out[3] = in[3]; 1732 break; 1733 case GL_LUMINANCE: 1734 out[0] = out[1] = out[2] = in[0]; 1735 out[3] = 1; 1736 break; 1737 case GL_LUMINANCE_ALPHA: 1738 out[0] = out[1] = out[2] = in[0]; 1739 out[3] = in[3]; 1740 break; 1741 case GL_INTENSITY: 1742 out[0] = out[1] = out[2] = out[3] = in[0]; 1743 break; 1744 default: 1745 COPY_4V(out, in); 1746 } 1747 } 1748 else { 1749 float *in = colorIn->f; 1750 float *out = colorOut->f; 1751 1752 switch (baseFormat) { 1753 case GL_RED: 1754 out[0] = in[0]; 1755 out[1] = 0.0F; 1756 out[2] = 0.0F; 1757 out[3] = 1.0F; 1758 break; 1759 case GL_RG: 1760 out[0] = in[0]; 1761 out[1] = in[1]; 1762 out[2] = 0.0F; 1763 out[3] = 1.0F; 1764 break; 1765 case GL_RGB: 1766 out[0] = in[0]; 1767 out[1] = in[1]; 1768 out[2] = in[2]; 1769 out[3] = 1.0F; 1770 break; 1771 case GL_ALPHA: 1772 out[0] = out[1] = out[2] = 0.0F; 1773 out[3] = in[3]; 1774 break; 1775 case GL_LUMINANCE: 1776 out[0] = out[1] = out[2] = in[0]; 1777 out[3] = 1.0F; 1778 break; 1779 case GL_LUMINANCE_ALPHA: 1780 out[0] = out[1] = out[2] = in[0]; 1781 out[3] = in[3]; 1782 break; 1783 case GL_INTENSITY: 1784 out[0] = out[1] = out[2] = out[3] = in[0]; 1785 break; 1786 default: 1787 COPY_4V(out, in); 1788 } 1789 } 1790} 1791