1 /* 2 * Copyright 2008 Corbin Simpson <MostAwesomeDude (at) gmail.com> 3 * Copyright 2010 Marek Olk <maraeo (at) gmail.com> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * on the rights to use, copy, modify, merge, publish, distribute, sub 9 * license, and/or sell copies of the Software, and to permit persons to whom 10 * the Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22 * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23 24 /* Always include headers in the reverse order!! ~ M. */ 25 #include "r300_texture.h" 26 27 #include "r300_context.h" 28 #include "r300_reg.h" 29 #include "r300_texture_desc.h" 30 #include "r300_transfer.h" 31 #include "r300_screen.h" 32 33 #include "util/u_format.h" 34 #include "util/u_format_s3tc.h" 35 #include "util/u_math.h" 36 #include "util/u_memory.h" 37 #include "util/u_mm.h" 38 39 #include "pipe/p_screen.h" 40 41 /* These formats are supported by swapping their bytes. 42 * The swizzles must be set exactly like their non-swapped counterparts, 43 * because byte-swapping is what reverses the component order, not swizzling. 44 * 45 * This function returns the format that must be used to program CB and TX 46 * swizzles. 47 */ 48 static enum pipe_format r300_unbyteswap_array_format(enum pipe_format format) 49 { 50 /* FIXME: Disabled on little endian because of a reported regression: 51 * https://bugs.freedesktop.org/show_bug.cgi?id=98869 */ 52 if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG) 53 return format; 54 55 /* Only BGRA 8888 array formats are supported for simplicity of 56 * the implementation. */ 57 switch (format) { 58 case PIPE_FORMAT_A8R8G8B8_UNORM: 59 return PIPE_FORMAT_B8G8R8A8_UNORM; 60 case PIPE_FORMAT_A8R8G8B8_SRGB: 61 return PIPE_FORMAT_B8G8R8A8_SRGB; 62 case PIPE_FORMAT_X8R8G8B8_UNORM: 63 return PIPE_FORMAT_B8G8R8X8_UNORM; 64 case PIPE_FORMAT_X8R8G8B8_SRGB: 65 return PIPE_FORMAT_B8G8R8X8_SRGB; 66 default: 67 return format; 68 } 69 } 70 71 static unsigned r300_get_endian_swap(enum pipe_format format) 72 { 73 const struct util_format_description *desc; 74 unsigned swap_size; 75 76 if (r300_unbyteswap_array_format(format) != format) 77 return R300_SURF_DWORD_SWAP; 78 79 if (PIPE_ENDIAN_NATIVE != PIPE_ENDIAN_BIG) 80 return R300_SURF_NO_SWAP; 81 82 desc = util_format_description(format); 83 if (!desc) 84 return R300_SURF_NO_SWAP; 85 86 /* Compressed formats should be in the little endian format. */ 87 if (desc->block.width != 1 || desc->block.height != 1) 88 return R300_SURF_NO_SWAP; 89 90 swap_size = desc->is_array ? desc->channel[0].size : desc->block.bits; 91 92 switch (swap_size) { 93 default: /* shouldn't happen? */ 94 case 8: 95 return R300_SURF_NO_SWAP; 96 case 16: 97 return R300_SURF_WORD_SWAP; 98 case 32: 99 return R300_SURF_DWORD_SWAP; 100 } 101 } 102 103 unsigned r300_get_swizzle_combined(const unsigned char *swizzle_format, 104 const unsigned char *swizzle_view, 105 boolean dxtc_swizzle) 106 { 107 unsigned i; 108 unsigned char swizzle[4]; 109 unsigned result = 0; 110 const uint32_t swizzle_shift[4] = { 111 R300_TX_FORMAT_R_SHIFT, 112 R300_TX_FORMAT_G_SHIFT, 113 R300_TX_FORMAT_B_SHIFT, 114 R300_TX_FORMAT_A_SHIFT 115 }; 116 uint32_t swizzle_bit[4] = { 117 dxtc_swizzle ? R300_TX_FORMAT_Z : R300_TX_FORMAT_X, 118 R300_TX_FORMAT_Y, 119 dxtc_swizzle ? R300_TX_FORMAT_X : R300_TX_FORMAT_Z, 120 R300_TX_FORMAT_W 121 }; 122 123 if (swizzle_view) { 124 /* Combine two sets of swizzles. */ 125 util_format_compose_swizzles(swizzle_format, swizzle_view, swizzle); 126 } else { 127 memcpy(swizzle, swizzle_format, 4); 128 } 129 130 /* Get swizzle. */ 131 for (i = 0; i < 4; i++) { 132 switch (swizzle[i]) { 133 case PIPE_SWIZZLE_Y: 134 result |= swizzle_bit[1] << swizzle_shift[i]; 135 break; 136 case PIPE_SWIZZLE_Z: 137 result |= swizzle_bit[2] << swizzle_shift[i]; 138 break; 139 case PIPE_SWIZZLE_W: 140 result |= swizzle_bit[3] << swizzle_shift[i]; 141 break; 142 case PIPE_SWIZZLE_0: 143 result |= R300_TX_FORMAT_ZERO << swizzle_shift[i]; 144 break; 145 case PIPE_SWIZZLE_1: 146 result |= R300_TX_FORMAT_ONE << swizzle_shift[i]; 147 break; 148 default: /* PIPE_SWIZZLE_X */ 149 result |= swizzle_bit[0] << swizzle_shift[i]; 150 } 151 } 152 return result; 153 } 154 155 /* Translate a pipe_format into a useful texture format for sampling. 156 * 157 * Some special formats are translated directly using R300_EASY_TX_FORMAT, 158 * but the majority of them is translated in a generic way, automatically 159 * supporting all the formats hw can support. 160 * 161 * R300_EASY_TX_FORMAT swizzles the texture. 162 * Note the signature of R300_EASY_TX_FORMAT: 163 * R300_EASY_TX_FORMAT(B, G, R, A, FORMAT); 164 * 165 * The FORMAT specifies how the texture sampler will treat the texture, and 166 * makes available X, Y, Z, W, ZERO, and ONE for swizzling. */ 167 uint32_t r300_translate_texformat(enum pipe_format format, 168 const unsigned char *swizzle_view, 169 boolean is_r500, 170 boolean dxtc_swizzle) 171 { 172 uint32_t result = 0; 173 const struct util_format_description *desc; 174 unsigned i; 175 boolean uniform = TRUE; 176 const uint32_t sign_bit[4] = { 177 R300_TX_FORMAT_SIGNED_W, 178 R300_TX_FORMAT_SIGNED_Z, 179 R300_TX_FORMAT_SIGNED_Y, 180 R300_TX_FORMAT_SIGNED_X, 181 }; 182 183 format = r300_unbyteswap_array_format(format); 184 desc = util_format_description(format); 185 186 /* Colorspace (return non-RGB formats directly). */ 187 switch (desc->colorspace) { 188 /* Depth stencil formats. 189 * Swizzles are added in r300_merge_textures_and_samplers. */ 190 case UTIL_FORMAT_COLORSPACE_ZS: 191 switch (format) { 192 case PIPE_FORMAT_Z16_UNORM: 193 return R300_TX_FORMAT_X16; 194 case PIPE_FORMAT_X8Z24_UNORM: 195 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 196 if (is_r500) 197 return R500_TX_FORMAT_Y8X24; 198 else 199 return R300_TX_FORMAT_Y16X16; 200 default: 201 return ~0; /* Unsupported. */ 202 } 203 204 /* YUV formats. */ 205 case UTIL_FORMAT_COLORSPACE_YUV: 206 result |= R300_TX_FORMAT_YUV_TO_RGB; 207 208 switch (format) { 209 case PIPE_FORMAT_UYVY: 210 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 211 case PIPE_FORMAT_YUYV: 212 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 213 default: 214 return ~0; /* Unsupported/unknown. */ 215 } 216 217 /* Add gamma correction. */ 218 case UTIL_FORMAT_COLORSPACE_SRGB: 219 result |= R300_TX_FORMAT_GAMMA; 220 break; 221 222 default: 223 switch (format) { 224 /* Same as YUV but without the YUR->RGB conversion. */ 225 case PIPE_FORMAT_R8G8_B8G8_UNORM: 226 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, YVYU422) | result; 227 case PIPE_FORMAT_G8R8_G8B8_UNORM: 228 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, VYUY422) | result; 229 default:; 230 } 231 } 232 233 /* Add swizzling. */ 234 /* The RGTC1_SNORM and LATC1_SNORM swizzle is done in the shader. */ 235 if (util_format_is_compressed(format) && 236 dxtc_swizzle && 237 format != PIPE_FORMAT_RGTC2_UNORM && 238 format != PIPE_FORMAT_RGTC2_SNORM && 239 format != PIPE_FORMAT_LATC2_UNORM && 240 format != PIPE_FORMAT_LATC2_SNORM && 241 format != PIPE_FORMAT_RGTC1_UNORM && 242 format != PIPE_FORMAT_RGTC1_SNORM && 243 format != PIPE_FORMAT_LATC1_UNORM && 244 format != PIPE_FORMAT_LATC1_SNORM) { 245 result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view, 246 TRUE); 247 } else { 248 result |= r300_get_swizzle_combined(desc->swizzle, swizzle_view, 249 FALSE); 250 } 251 252 /* S3TC formats. */ 253 if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 254 if (!util_format_s3tc_enabled) { 255 return ~0; /* Unsupported. */ 256 } 257 258 switch (format) { 259 case PIPE_FORMAT_DXT1_RGB: 260 case PIPE_FORMAT_DXT1_RGBA: 261 case PIPE_FORMAT_DXT1_SRGB: 262 case PIPE_FORMAT_DXT1_SRGBA: 263 return R300_TX_FORMAT_DXT1 | result; 264 case PIPE_FORMAT_DXT3_RGBA: 265 case PIPE_FORMAT_DXT3_SRGBA: 266 return R300_TX_FORMAT_DXT3 | result; 267 case PIPE_FORMAT_DXT5_RGBA: 268 case PIPE_FORMAT_DXT5_SRGBA: 269 return R300_TX_FORMAT_DXT5 | result; 270 default: 271 return ~0; /* Unsupported/unknown. */ 272 } 273 } 274 275 /* RGTC formats. */ 276 if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 277 switch (format) { 278 case PIPE_FORMAT_RGTC1_SNORM: 279 case PIPE_FORMAT_LATC1_SNORM: 280 result |= sign_bit[0]; 281 case PIPE_FORMAT_LATC1_UNORM: 282 case PIPE_FORMAT_RGTC1_UNORM: 283 return R500_TX_FORMAT_ATI1N | result; 284 285 case PIPE_FORMAT_RGTC2_SNORM: 286 case PIPE_FORMAT_LATC2_SNORM: 287 result |= sign_bit[1] | sign_bit[0]; 288 case PIPE_FORMAT_RGTC2_UNORM: 289 case PIPE_FORMAT_LATC2_UNORM: 290 return R400_TX_FORMAT_ATI2N | result; 291 292 default: 293 return ~0; /* Unsupported/unknown. */ 294 } 295 } 296 297 /* This is truly a special format. 298 * It stores R8G8 and B is computed using sqrt(1 - R^2 - G^2) 299 * in the sampler unit. Also known as D3DFMT_CxV8U8. */ 300 if (format == PIPE_FORMAT_R8G8Bx_SNORM) { 301 return R300_TX_FORMAT_CxV8U8 | result; 302 } 303 304 /* Integer and fixed-point 16.16 textures are not supported. */ 305 for (i = 0; i < 4; i++) { 306 if (desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED || 307 ((desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED || 308 desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) && 309 (!desc->channel[i].normalized || 310 desc->channel[i].pure_integer))) { 311 return ~0; /* Unsupported/unknown. */ 312 } 313 } 314 315 /* Add sign. */ 316 for (i = 0; i < desc->nr_channels; i++) { 317 if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 318 result |= sign_bit[i]; 319 } 320 } 321 322 /* See whether the components are of the same size. */ 323 for (i = 1; i < desc->nr_channels; i++) { 324 uniform = uniform && desc->channel[0].size == desc->channel[i].size; 325 } 326 327 /* Non-uniform formats. */ 328 if (!uniform) { 329 switch (desc->nr_channels) { 330 case 3: 331 if (desc->channel[0].size == 5 && 332 desc->channel[1].size == 6 && 333 desc->channel[2].size == 5) { 334 return R300_TX_FORMAT_Z5Y6X5 | result; 335 } 336 if (desc->channel[0].size == 5 && 337 desc->channel[1].size == 5 && 338 desc->channel[2].size == 6) { 339 return R300_TX_FORMAT_Z6Y5X5 | result; 340 } 341 if (desc->channel[0].size == 2 && 342 desc->channel[1].size == 3 && 343 desc->channel[2].size == 3) { 344 return R300_TX_FORMAT_Z3Y3X2 | result; 345 } 346 return ~0; /* Unsupported/unknown. */ 347 348 case 4: 349 if (desc->channel[0].size == 5 && 350 desc->channel[1].size == 5 && 351 desc->channel[2].size == 5 && 352 desc->channel[3].size == 1) { 353 return R300_TX_FORMAT_W1Z5Y5X5 | result; 354 } 355 if (desc->channel[0].size == 10 && 356 desc->channel[1].size == 10 && 357 desc->channel[2].size == 10 && 358 desc->channel[3].size == 2) { 359 return R300_TX_FORMAT_W2Z10Y10X10 | result; 360 } 361 } 362 return ~0; /* Unsupported/unknown. */ 363 } 364 365 /* Find the first non-VOID channel. */ 366 for (i = 0; i < 4; i++) { 367 if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 368 break; 369 } 370 } 371 372 if (i == 4) 373 return ~0; /* Unsupported/unknown. */ 374 375 /* And finally, uniform formats. */ 376 switch (desc->channel[i].type) { 377 case UTIL_FORMAT_TYPE_UNSIGNED: 378 case UTIL_FORMAT_TYPE_SIGNED: 379 if (!desc->channel[i].normalized && 380 desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) { 381 return ~0; 382 } 383 384 switch (desc->channel[i].size) { 385 case 4: 386 switch (desc->nr_channels) { 387 case 2: 388 return R300_TX_FORMAT_Y4X4 | result; 389 case 4: 390 return R300_TX_FORMAT_W4Z4Y4X4 | result; 391 } 392 return ~0; 393 394 case 8: 395 switch (desc->nr_channels) { 396 case 1: 397 return R300_TX_FORMAT_X8 | result; 398 case 2: 399 return R300_TX_FORMAT_Y8X8 | result; 400 case 4: 401 return R300_TX_FORMAT_W8Z8Y8X8 | result; 402 } 403 return ~0; 404 405 case 16: 406 switch (desc->nr_channels) { 407 case 1: 408 return R300_TX_FORMAT_X16 | result; 409 case 2: 410 return R300_TX_FORMAT_Y16X16 | result; 411 case 4: 412 return R300_TX_FORMAT_W16Z16Y16X16 | result; 413 } 414 } 415 return ~0; 416 417 case UTIL_FORMAT_TYPE_FLOAT: 418 switch (desc->channel[i].size) { 419 case 16: 420 switch (desc->nr_channels) { 421 case 1: 422 return R300_TX_FORMAT_16F | result; 423 case 2: 424 return R300_TX_FORMAT_16F_16F | result; 425 case 4: 426 return R300_TX_FORMAT_16F_16F_16F_16F | result; 427 } 428 return ~0; 429 430 case 32: 431 switch (desc->nr_channels) { 432 case 1: 433 return R300_TX_FORMAT_32F | result; 434 case 2: 435 return R300_TX_FORMAT_32F_32F | result; 436 case 4: 437 return R300_TX_FORMAT_32F_32F_32F_32F | result; 438 } 439 } 440 } 441 442 return ~0; /* Unsupported/unknown. */ 443 } 444 445 uint32_t r500_tx_format_msb_bit(enum pipe_format format) 446 { 447 switch (format) { 448 case PIPE_FORMAT_RGTC1_UNORM: 449 case PIPE_FORMAT_RGTC1_SNORM: 450 case PIPE_FORMAT_LATC1_UNORM: 451 case PIPE_FORMAT_LATC1_SNORM: 452 case PIPE_FORMAT_X8Z24_UNORM: 453 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 454 return R500_TXFORMAT_MSB; 455 default: 456 return 0; 457 } 458 } 459 460 /* Buffer formats. */ 461 462 /* Colorbuffer formats. This is the unswizzled format of the RB3D block's 463 * output. For the swizzling of the targets, check the shader's format. */ 464 static uint32_t r300_translate_colorformat(enum pipe_format format) 465 { 466 format = r300_unbyteswap_array_format(format); 467 468 switch (format) { 469 /* 8-bit buffers. */ 470 case PIPE_FORMAT_A8_UNORM: 471 case PIPE_FORMAT_A8_SNORM: 472 case PIPE_FORMAT_I8_UNORM: 473 case PIPE_FORMAT_I8_SNORM: 474 case PIPE_FORMAT_L8_UNORM: 475 case PIPE_FORMAT_L8_SNORM: 476 case PIPE_FORMAT_R8_UNORM: 477 case PIPE_FORMAT_R8_SNORM: 478 return R300_COLOR_FORMAT_I8; 479 480 /* 16-bit buffers. */ 481 case PIPE_FORMAT_L8A8_UNORM: 482 case PIPE_FORMAT_L8A8_SNORM: 483 case PIPE_FORMAT_R8G8_UNORM: 484 case PIPE_FORMAT_R8G8_SNORM: 485 case PIPE_FORMAT_R8A8_UNORM: 486 case PIPE_FORMAT_R8A8_SNORM: 487 /* These formats work fine with UV88 if US_OUT_FMT is set correctly. */ 488 case PIPE_FORMAT_A16_UNORM: 489 case PIPE_FORMAT_A16_SNORM: 490 case PIPE_FORMAT_A16_FLOAT: 491 case PIPE_FORMAT_L16_UNORM: 492 case PIPE_FORMAT_L16_SNORM: 493 case PIPE_FORMAT_L16_FLOAT: 494 case PIPE_FORMAT_I16_UNORM: 495 case PIPE_FORMAT_I16_SNORM: 496 case PIPE_FORMAT_I16_FLOAT: 497 case PIPE_FORMAT_R16_UNORM: 498 case PIPE_FORMAT_R16_SNORM: 499 case PIPE_FORMAT_R16_FLOAT: 500 return R300_COLOR_FORMAT_UV88; 501 502 case PIPE_FORMAT_B5G6R5_UNORM: 503 return R300_COLOR_FORMAT_RGB565; 504 505 case PIPE_FORMAT_B5G5R5A1_UNORM: 506 case PIPE_FORMAT_B5G5R5X1_UNORM: 507 return R300_COLOR_FORMAT_ARGB1555; 508 509 case PIPE_FORMAT_B4G4R4A4_UNORM: 510 case PIPE_FORMAT_B4G4R4X4_UNORM: 511 return R300_COLOR_FORMAT_ARGB4444; 512 513 /* 32-bit buffers. */ 514 case PIPE_FORMAT_B8G8R8A8_UNORM: 515 /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 516 case PIPE_FORMAT_B8G8R8X8_UNORM: 517 /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 518 case PIPE_FORMAT_R8G8B8A8_UNORM: 519 case PIPE_FORMAT_R8G8B8A8_SNORM: 520 case PIPE_FORMAT_R8G8B8X8_UNORM: 521 case PIPE_FORMAT_R8G8B8X8_SNORM: 522 /* These formats work fine with ARGB8888 if US_OUT_FMT is set 523 * correctly. */ 524 case PIPE_FORMAT_R16G16_UNORM: 525 case PIPE_FORMAT_R16G16_SNORM: 526 case PIPE_FORMAT_R16G16_FLOAT: 527 case PIPE_FORMAT_L16A16_UNORM: 528 case PIPE_FORMAT_L16A16_SNORM: 529 case PIPE_FORMAT_L16A16_FLOAT: 530 case PIPE_FORMAT_R16A16_UNORM: 531 case PIPE_FORMAT_R16A16_SNORM: 532 case PIPE_FORMAT_R16A16_FLOAT: 533 case PIPE_FORMAT_A32_FLOAT: 534 case PIPE_FORMAT_L32_FLOAT: 535 case PIPE_FORMAT_I32_FLOAT: 536 case PIPE_FORMAT_R32_FLOAT: 537 return R300_COLOR_FORMAT_ARGB8888; 538 539 case PIPE_FORMAT_R10G10B10A2_UNORM: 540 case PIPE_FORMAT_R10G10B10X2_SNORM: 541 case PIPE_FORMAT_B10G10R10A2_UNORM: 542 case PIPE_FORMAT_B10G10R10X2_UNORM: 543 return R500_COLOR_FORMAT_ARGB2101010; /* R5xx-only? */ 544 545 /* 64-bit buffers. */ 546 case PIPE_FORMAT_R16G16B16A16_UNORM: 547 case PIPE_FORMAT_R16G16B16A16_SNORM: 548 case PIPE_FORMAT_R16G16B16A16_FLOAT: 549 case PIPE_FORMAT_R16G16B16X16_UNORM: 550 case PIPE_FORMAT_R16G16B16X16_SNORM: 551 case PIPE_FORMAT_R16G16B16X16_FLOAT: 552 /* These formats work fine with ARGB16161616 if US_OUT_FMT is set 553 * correctly. */ 554 case PIPE_FORMAT_R32G32_FLOAT: 555 case PIPE_FORMAT_L32A32_FLOAT: 556 case PIPE_FORMAT_R32A32_FLOAT: 557 return R300_COLOR_FORMAT_ARGB16161616; 558 559 /* 128-bit buffers. */ 560 case PIPE_FORMAT_R32G32B32A32_FLOAT: 561 case PIPE_FORMAT_R32G32B32X32_FLOAT: 562 return R300_COLOR_FORMAT_ARGB32323232; 563 564 /* YUV buffers. */ 565 case PIPE_FORMAT_UYVY: 566 return R300_COLOR_FORMAT_YVYU; 567 case PIPE_FORMAT_YUYV: 568 return R300_COLOR_FORMAT_VYUY; 569 default: 570 return ~0; /* Unsupported. */ 571 } 572 } 573 574 /* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */ 575 static uint32_t r300_translate_zsformat(enum pipe_format format) 576 { 577 switch (format) { 578 /* 16-bit depth, no stencil */ 579 case PIPE_FORMAT_Z16_UNORM: 580 return R300_DEPTHFORMAT_16BIT_INT_Z; 581 /* 24-bit depth, ignored stencil */ 582 case PIPE_FORMAT_X8Z24_UNORM: 583 /* 24-bit depth, 8-bit stencil */ 584 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 585 return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 586 default: 587 return ~0; /* Unsupported. */ 588 } 589 } 590 591 /* Shader output formats. This is essentially the swizzle from the shader 592 * to the RB3D block. 593 * 594 * Note that formats are stored from C3 to C0. */ 595 static uint32_t r300_translate_out_fmt(enum pipe_format format) 596 { 597 uint32_t modifier = 0; 598 unsigned i; 599 const struct util_format_description *desc; 600 boolean uniform_sign; 601 602 format = r300_unbyteswap_array_format(format); 603 desc = util_format_description(format); 604 605 /* Find the first non-VOID channel. */ 606 for (i = 0; i < 4; i++) { 607 if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 608 break; 609 } 610 } 611 612 if (i == 4) 613 return ~0; /* Unsupported/unknown. */ 614 615 /* Specifies how the shader output is written to the fog unit. */ 616 switch (desc->channel[i].type) { 617 case UTIL_FORMAT_TYPE_FLOAT: 618 switch (desc->channel[i].size) { 619 case 32: 620 switch (desc->nr_channels) { 621 case 1: 622 modifier |= R300_US_OUT_FMT_C_32_FP; 623 break; 624 case 2: 625 modifier |= R300_US_OUT_FMT_C2_32_FP; 626 break; 627 case 4: 628 modifier |= R300_US_OUT_FMT_C4_32_FP; 629 break; 630 } 631 break; 632 633 case 16: 634 switch (desc->nr_channels) { 635 case 1: 636 modifier |= R300_US_OUT_FMT_C_16_FP; 637 break; 638 case 2: 639 modifier |= R300_US_OUT_FMT_C2_16_FP; 640 break; 641 case 4: 642 modifier |= R300_US_OUT_FMT_C4_16_FP; 643 break; 644 } 645 break; 646 } 647 break; 648 649 default: 650 switch (desc->channel[i].size) { 651 case 16: 652 switch (desc->nr_channels) { 653 case 1: 654 modifier |= R300_US_OUT_FMT_C_16; 655 break; 656 case 2: 657 modifier |= R300_US_OUT_FMT_C2_16; 658 break; 659 case 4: 660 modifier |= R300_US_OUT_FMT_C4_16; 661 break; 662 } 663 break; 664 665 case 10: 666 modifier |= R300_US_OUT_FMT_C4_10; 667 break; 668 669 default: 670 /* C4_8 seems to be used for the formats whose pixel size 671 * is <= 32 bits. */ 672 modifier |= R300_US_OUT_FMT_C4_8; 673 break; 674 } 675 } 676 677 /* Add sign. */ 678 uniform_sign = TRUE; 679 for (i = 0; i < desc->nr_channels; i++) 680 if (desc->channel[i].type != UTIL_FORMAT_TYPE_SIGNED) 681 uniform_sign = FALSE; 682 683 if (uniform_sign) 684 modifier |= R300_OUT_SIGN(0xf); 685 686 /* Add swizzles and return. */ 687 switch (format) { 688 /*** Special cases (non-standard channel mapping) ***/ 689 690 /* X8 691 * COLORFORMAT_I8 stores the Z component (C2). */ 692 case PIPE_FORMAT_A8_UNORM: 693 case PIPE_FORMAT_A8_SNORM: 694 return modifier | R300_C2_SEL_A; 695 case PIPE_FORMAT_I8_UNORM: 696 case PIPE_FORMAT_I8_SNORM: 697 case PIPE_FORMAT_L8_UNORM: 698 case PIPE_FORMAT_L8_SNORM: 699 case PIPE_FORMAT_R8_UNORM: 700 case PIPE_FORMAT_R8_SNORM: 701 return modifier | R300_C2_SEL_R; 702 703 /* X8Y8 704 * COLORFORMAT_UV88 stores ZX (C2 and C0). */ 705 case PIPE_FORMAT_L8A8_SNORM: 706 case PIPE_FORMAT_L8A8_UNORM: 707 case PIPE_FORMAT_R8A8_SNORM: 708 case PIPE_FORMAT_R8A8_UNORM: 709 return modifier | R300_C0_SEL_A | R300_C2_SEL_R; 710 case PIPE_FORMAT_R8G8_SNORM: 711 case PIPE_FORMAT_R8G8_UNORM: 712 return modifier | R300_C0_SEL_G | R300_C2_SEL_R; 713 714 /* X32Y32 715 * ARGB16161616 stores XZ for RG32F */ 716 case PIPE_FORMAT_R32G32_FLOAT: 717 return modifier | R300_C0_SEL_R | R300_C2_SEL_G; 718 719 /*** Generic cases (standard channel mapping) ***/ 720 721 /* BGRA outputs. */ 722 case PIPE_FORMAT_B5G6R5_UNORM: 723 case PIPE_FORMAT_B5G5R5A1_UNORM: 724 case PIPE_FORMAT_B5G5R5X1_UNORM: 725 case PIPE_FORMAT_B4G4R4A4_UNORM: 726 case PIPE_FORMAT_B4G4R4X4_UNORM: 727 case PIPE_FORMAT_B8G8R8A8_UNORM: 728 /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 729 case PIPE_FORMAT_B8G8R8X8_UNORM: 730 /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 731 case PIPE_FORMAT_B10G10R10A2_UNORM: 732 case PIPE_FORMAT_B10G10R10X2_UNORM: 733 return modifier | 734 R300_C0_SEL_B | R300_C1_SEL_G | 735 R300_C2_SEL_R | R300_C3_SEL_A; 736 737 /* ARGB outputs. */ 738 case PIPE_FORMAT_A16_UNORM: 739 case PIPE_FORMAT_A16_SNORM: 740 case PIPE_FORMAT_A16_FLOAT: 741 case PIPE_FORMAT_A32_FLOAT: 742 return modifier | 743 R300_C0_SEL_A | R300_C1_SEL_R | 744 R300_C2_SEL_G | R300_C3_SEL_B; 745 746 /* RGBA outputs. */ 747 case PIPE_FORMAT_R8G8B8X8_UNORM: 748 case PIPE_FORMAT_R8G8B8X8_SNORM: 749 case PIPE_FORMAT_R8G8B8A8_UNORM: 750 case PIPE_FORMAT_R8G8B8A8_SNORM: 751 case PIPE_FORMAT_R10G10B10A2_UNORM: 752 case PIPE_FORMAT_R10G10B10X2_SNORM: 753 case PIPE_FORMAT_R16_UNORM: 754 case PIPE_FORMAT_R16G16_UNORM: 755 case PIPE_FORMAT_R16G16B16A16_UNORM: 756 case PIPE_FORMAT_R16_SNORM: 757 case PIPE_FORMAT_R16G16_SNORM: 758 case PIPE_FORMAT_R16G16B16A16_SNORM: 759 case PIPE_FORMAT_R16_FLOAT: 760 case PIPE_FORMAT_R16G16_FLOAT: 761 case PIPE_FORMAT_R16G16B16A16_FLOAT: 762 case PIPE_FORMAT_R32_FLOAT: 763 case PIPE_FORMAT_R32G32B32A32_FLOAT: 764 case PIPE_FORMAT_R32G32B32X32_FLOAT: 765 case PIPE_FORMAT_L16_UNORM: 766 case PIPE_FORMAT_L16_SNORM: 767 case PIPE_FORMAT_L16_FLOAT: 768 case PIPE_FORMAT_L32_FLOAT: 769 case PIPE_FORMAT_I16_UNORM: 770 case PIPE_FORMAT_I16_SNORM: 771 case PIPE_FORMAT_I16_FLOAT: 772 case PIPE_FORMAT_I32_FLOAT: 773 case PIPE_FORMAT_R16G16B16X16_UNORM: 774 case PIPE_FORMAT_R16G16B16X16_SNORM: 775 case PIPE_FORMAT_R16G16B16X16_FLOAT: 776 return modifier | 777 R300_C0_SEL_R | R300_C1_SEL_G | 778 R300_C2_SEL_B | R300_C3_SEL_A; 779 780 /* LA outputs. */ 781 case PIPE_FORMAT_L16A16_UNORM: 782 case PIPE_FORMAT_L16A16_SNORM: 783 case PIPE_FORMAT_L16A16_FLOAT: 784 case PIPE_FORMAT_R16A16_UNORM: 785 case PIPE_FORMAT_R16A16_SNORM: 786 case PIPE_FORMAT_R16A16_FLOAT: 787 case PIPE_FORMAT_L32A32_FLOAT: 788 case PIPE_FORMAT_R32A32_FLOAT: 789 return modifier | 790 R300_C0_SEL_R | R300_C1_SEL_A; 791 792 default: 793 return ~0; /* Unsupported. */ 794 } 795 } 796 797 static uint32_t r300_translate_colormask_swizzle(enum pipe_format format) 798 { 799 format = r300_unbyteswap_array_format(format); 800 801 switch (format) { 802 case PIPE_FORMAT_A8_UNORM: 803 case PIPE_FORMAT_A8_SNORM: 804 case PIPE_FORMAT_A16_UNORM: 805 case PIPE_FORMAT_A16_SNORM: 806 case PIPE_FORMAT_A16_FLOAT: 807 case PIPE_FORMAT_A32_FLOAT: 808 return COLORMASK_AAAA; 809 810 case PIPE_FORMAT_I8_UNORM: 811 case PIPE_FORMAT_I8_SNORM: 812 case PIPE_FORMAT_L8_UNORM: 813 case PIPE_FORMAT_L8_SNORM: 814 case PIPE_FORMAT_R8_UNORM: 815 case PIPE_FORMAT_R8_SNORM: 816 case PIPE_FORMAT_R32_FLOAT: 817 case PIPE_FORMAT_L32_FLOAT: 818 case PIPE_FORMAT_I32_FLOAT: 819 return COLORMASK_RRRR; 820 821 case PIPE_FORMAT_L8A8_SNORM: 822 case PIPE_FORMAT_L8A8_UNORM: 823 case PIPE_FORMAT_R8A8_UNORM: 824 case PIPE_FORMAT_R8A8_SNORM: 825 case PIPE_FORMAT_L16A16_UNORM: 826 case PIPE_FORMAT_L16A16_SNORM: 827 case PIPE_FORMAT_L16A16_FLOAT: 828 case PIPE_FORMAT_R16A16_UNORM: 829 case PIPE_FORMAT_R16A16_SNORM: 830 case PIPE_FORMAT_R16A16_FLOAT: 831 case PIPE_FORMAT_L32A32_FLOAT: 832 case PIPE_FORMAT_R32A32_FLOAT: 833 return COLORMASK_ARRA; 834 835 case PIPE_FORMAT_R8G8_SNORM: 836 case PIPE_FORMAT_R8G8_UNORM: 837 case PIPE_FORMAT_R16G16_UNORM: 838 case PIPE_FORMAT_R16G16_SNORM: 839 case PIPE_FORMAT_R16G16_FLOAT: 840 case PIPE_FORMAT_R32G32_FLOAT: 841 return COLORMASK_GRRG; 842 843 case PIPE_FORMAT_B5G5R5X1_UNORM: 844 case PIPE_FORMAT_B4G4R4X4_UNORM: 845 case PIPE_FORMAT_B8G8R8X8_UNORM: 846 /*case PIPE_FORMAT_B8G8R8X8_SNORM:*/ 847 case PIPE_FORMAT_B10G10R10X2_UNORM: 848 return COLORMASK_BGRX; 849 850 case PIPE_FORMAT_B5G6R5_UNORM: 851 case PIPE_FORMAT_B5G5R5A1_UNORM: 852 case PIPE_FORMAT_B4G4R4A4_UNORM: 853 case PIPE_FORMAT_B8G8R8A8_UNORM: 854 /*case PIPE_FORMAT_B8G8R8A8_SNORM:*/ 855 case PIPE_FORMAT_B10G10R10A2_UNORM: 856 return COLORMASK_BGRA; 857 858 case PIPE_FORMAT_R8G8B8X8_UNORM: 859 /* RGBX_SNORM formats are broken for an unknown reason */ 860 /*case PIPE_FORMAT_R8G8B8X8_SNORM:*/ 861 /*case PIPE_FORMAT_R10G10B10X2_SNORM:*/ 862 case PIPE_FORMAT_R16G16B16X16_UNORM: 863 /*case PIPE_FORMAT_R16G16B16X16_SNORM:*/ 864 case PIPE_FORMAT_R16G16B16X16_FLOAT: 865 case PIPE_FORMAT_R32G32B32X32_FLOAT: 866 return COLORMASK_RGBX; 867 868 case PIPE_FORMAT_R8G8B8A8_UNORM: 869 case PIPE_FORMAT_R8G8B8A8_SNORM: 870 case PIPE_FORMAT_R10G10B10A2_UNORM: 871 case PIPE_FORMAT_R16_UNORM: 872 case PIPE_FORMAT_R16G16B16A16_UNORM: 873 case PIPE_FORMAT_R16_SNORM: 874 case PIPE_FORMAT_R16G16B16A16_SNORM: 875 case PIPE_FORMAT_R16_FLOAT: 876 case PIPE_FORMAT_R16G16B16A16_FLOAT: 877 case PIPE_FORMAT_R32G32B32A32_FLOAT: 878 case PIPE_FORMAT_L16_UNORM: 879 case PIPE_FORMAT_L16_SNORM: 880 case PIPE_FORMAT_L16_FLOAT: 881 case PIPE_FORMAT_I16_UNORM: 882 case PIPE_FORMAT_I16_SNORM: 883 case PIPE_FORMAT_I16_FLOAT: 884 return COLORMASK_RGBA; 885 886 default: 887 return ~0; /* Unsupported. */ 888 } 889 } 890 891 boolean r300_is_colorbuffer_format_supported(enum pipe_format format) 892 { 893 return r300_translate_colorformat(format) != ~0 && 894 r300_translate_out_fmt(format) != ~0 && 895 r300_translate_colormask_swizzle(format) != ~0; 896 } 897 898 boolean r300_is_zs_format_supported(enum pipe_format format) 899 { 900 return r300_translate_zsformat(format) != ~0; 901 } 902 903 boolean r300_is_sampler_format_supported(enum pipe_format format) 904 { 905 return r300_translate_texformat(format, 0, TRUE, FALSE) != ~0; 906 } 907 908 void r300_texture_setup_format_state(struct r300_screen *screen, 909 struct r300_resource *tex, 910 enum pipe_format format, 911 unsigned level, 912 unsigned width0_override, 913 unsigned height0_override, 914 struct r300_texture_format_state *out) 915 { 916 struct pipe_resource *pt = &tex->b.b; 917 struct r300_texture_desc *desc = &tex->tex; 918 boolean is_r500 = screen->caps.is_r500; 919 unsigned width, height, depth; 920 unsigned txwidth, txheight, txdepth; 921 922 width = u_minify(width0_override, level); 923 height = u_minify(height0_override, level); 924 depth = u_minify(desc->depth0, level); 925 926 txwidth = (width - 1) & 0x7ff; 927 txheight = (height - 1) & 0x7ff; 928 txdepth = util_logbase2(depth) & 0xf; 929 930 /* Mask out all the fields we change. */ 931 out->format0 = 0; 932 out->format1 &= ~R300_TX_FORMAT_TEX_COORD_TYPE_MASK; 933 out->format2 &= R500_TXFORMAT_MSB; 934 out->tile_config = 0; 935 936 /* Set sampler state. */ 937 out->format0 = 938 R300_TX_WIDTH(txwidth) | 939 R300_TX_HEIGHT(txheight) | 940 R300_TX_DEPTH(txdepth); 941 942 if (desc->uses_stride_addressing) { 943 unsigned stride = 944 r300_stride_to_width(format, desc->stride_in_bytes[level]); 945 /* rectangles love this */ 946 out->format0 |= R300_TX_PITCH_EN; 947 out->format2 = (stride - 1) & 0x1fff; 948 } 949 950 if (pt->target == PIPE_TEXTURE_CUBE) { 951 out->format1 |= R300_TX_FORMAT_CUBIC_MAP; 952 } 953 if (pt->target == PIPE_TEXTURE_3D) { 954 out->format1 |= R300_TX_FORMAT_3D; 955 } 956 957 /* large textures on r500 */ 958 if (is_r500) 959 { 960 unsigned us_width = txwidth; 961 unsigned us_height = txheight; 962 unsigned us_depth = txdepth; 963 964 if (width > 2048) { 965 out->format2 |= R500_TXWIDTH_BIT11; 966 } 967 if (height > 2048) { 968 out->format2 |= R500_TXHEIGHT_BIT11; 969 } 970 971 /* The US_FORMAT register fixes an R500 TX addressing bug. 972 * Don't ask why it must be set like this. I don't know it either. */ 973 if (width > 2048) { 974 us_width = (0x000007FF + us_width) >> 1; 975 us_depth |= 0x0000000D; 976 } 977 if (height > 2048) { 978 us_height = (0x000007FF + us_height) >> 1; 979 us_depth |= 0x0000000E; 980 } 981 982 out->us_format0 = 983 R300_TX_WIDTH(us_width) | 984 R300_TX_HEIGHT(us_height) | 985 R300_TX_DEPTH(us_depth); 986 } 987 988 out->tile_config = R300_TXO_MACRO_TILE(desc->macrotile[level]) | 989 R300_TXO_MICRO_TILE(desc->microtile) | 990 R300_TXO_ENDIAN(r300_get_endian_swap(format)); 991 } 992 993 static void r300_texture_setup_fb_state(struct r300_surface *surf) 994 { 995 struct r300_resource *tex = r300_resource(surf->base.texture); 996 unsigned level = surf->base.u.tex.level; 997 unsigned stride = 998 r300_stride_to_width(surf->base.format, tex->tex.stride_in_bytes[level]); 999 1000 /* Set framebuffer state. */ 1001 if (util_format_is_depth_or_stencil(surf->base.format)) { 1002 surf->pitch = 1003 stride | 1004 R300_DEPTHMACROTILE(tex->tex.macrotile[level]) | 1005 R300_DEPTHMICROTILE(tex->tex.microtile) | 1006 R300_DEPTHENDIAN(r300_get_endian_swap(surf->base.format)); 1007 surf->format = r300_translate_zsformat(surf->base.format); 1008 surf->pitch_zmask = tex->tex.zmask_stride_in_pixels[level]; 1009 surf->pitch_hiz = tex->tex.hiz_stride_in_pixels[level]; 1010 } else { 1011 enum pipe_format format = util_format_linear(surf->base.format); 1012 1013 surf->pitch = 1014 stride | 1015 r300_translate_colorformat(format) | 1016 R300_COLOR_TILE(tex->tex.macrotile[level]) | 1017 R300_COLOR_MICROTILE(tex->tex.microtile) | 1018 R300_COLOR_ENDIAN(r300_get_endian_swap(format)); 1019 surf->format = r300_translate_out_fmt(format); 1020 surf->colormask_swizzle = 1021 r300_translate_colormask_swizzle(format); 1022 surf->pitch_cmask = tex->tex.cmask_stride_in_pixels; 1023 } 1024 } 1025 1026 static void r300_texture_destroy(struct pipe_screen *screen, 1027 struct pipe_resource* texture) 1028 { 1029 struct r300_screen *rscreen = r300_screen(screen); 1030 struct r300_resource* tex = (struct r300_resource*)texture; 1031 1032 if (tex->tex.cmask_dwords) { 1033 pipe_mutex_lock(rscreen->cmask_mutex); 1034 if (texture == rscreen->cmask_resource) { 1035 rscreen->cmask_resource = NULL; 1036 } 1037 pipe_mutex_unlock(rscreen->cmask_mutex); 1038 } 1039 pb_reference(&tex->buf, NULL); 1040 FREE(tex); 1041 } 1042 1043 boolean r300_resource_get_handle(struct pipe_screen* screen, 1044 struct pipe_context *ctx, 1045 struct pipe_resource *texture, 1046 struct winsys_handle *whandle, 1047 unsigned usage) 1048 { 1049 struct radeon_winsys *rws = r300_screen(screen)->rws; 1050 struct r300_resource* tex = (struct r300_resource*)texture; 1051 1052 if (!tex) { 1053 return FALSE; 1054 } 1055 1056 return rws->buffer_get_handle(tex->buf, tex->tex.stride_in_bytes[0], 1057 0, 0, whandle); 1058 } 1059 1060 static const struct u_resource_vtbl r300_texture_vtbl = 1061 { 1062 NULL, /* get_handle */ 1063 r300_texture_destroy, /* resource_destroy */ 1064 r300_texture_transfer_map, /* transfer_map */ 1065 NULL, /* transfer_flush_region */ 1066 r300_texture_transfer_unmap, /* transfer_unmap */ 1067 }; 1068 1069 /* The common texture constructor. */ 1070 static struct r300_resource* 1071 r300_texture_create_object(struct r300_screen *rscreen, 1072 const struct pipe_resource *base, 1073 enum radeon_bo_layout microtile, 1074 enum radeon_bo_layout macrotile, 1075 unsigned stride_in_bytes_override, 1076 struct pb_buffer *buffer) 1077 { 1078 struct radeon_winsys *rws = rscreen->rws; 1079 struct r300_resource *tex = NULL; 1080 struct radeon_bo_metadata tiling = {}; 1081 1082 tex = CALLOC_STRUCT(r300_resource); 1083 if (!tex) { 1084 goto fail; 1085 } 1086 1087 pipe_reference_init(&tex->b.b.reference, 1); 1088 tex->b.b.screen = &rscreen->screen; 1089 tex->b.b.usage = base->usage; 1090 tex->b.b.bind = base->bind; 1091 tex->b.b.flags = base->flags; 1092 tex->b.vtbl = &r300_texture_vtbl; 1093 tex->tex.microtile = microtile; 1094 tex->tex.macrotile[0] = macrotile; 1095 tex->tex.stride_in_bytes_override = stride_in_bytes_override; 1096 tex->domain = (base->flags & R300_RESOURCE_FLAG_TRANSFER || 1097 base->usage == PIPE_USAGE_STAGING) ? RADEON_DOMAIN_GTT : 1098 base->nr_samples > 1 ? RADEON_DOMAIN_VRAM : 1099 RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT; 1100 tex->buf = buffer; 1101 1102 r300_texture_desc_init(rscreen, tex, base); 1103 1104 /* Figure out the ideal placement for the texture.. */ 1105 if (tex->domain & RADEON_DOMAIN_VRAM && 1106 tex->tex.size_in_bytes >= rscreen->info.vram_size) { 1107 tex->domain &= ~RADEON_DOMAIN_VRAM; 1108 tex->domain |= RADEON_DOMAIN_GTT; 1109 } 1110 if (tex->domain & RADEON_DOMAIN_GTT && 1111 tex->tex.size_in_bytes >= rscreen->info.gart_size) { 1112 tex->domain &= ~RADEON_DOMAIN_GTT; 1113 } 1114 /* Just fail if the texture is too large. */ 1115 if (!tex->domain) { 1116 goto fail; 1117 } 1118 1119 /* Create the backing buffer if needed. */ 1120 if (!tex->buf) { 1121 tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048, 1122 tex->domain, RADEON_FLAG_HANDLE); 1123 1124 if (!tex->buf) { 1125 goto fail; 1126 } 1127 } 1128 1129 if (SCREEN_DBG_ON(rscreen, DBG_MSAA) && base->nr_samples > 1) { 1130 fprintf(stderr, "r300: %ix MSAA %s buffer created\n", 1131 base->nr_samples, 1132 util_format_is_depth_or_stencil(base->format) ? "depth" : "color"); 1133 } 1134 1135 tiling.microtile = tex->tex.microtile; 1136 tiling.macrotile = tex->tex.macrotile[0]; 1137 tiling.stride = tex->tex.stride_in_bytes[0]; 1138 rws->buffer_set_metadata(tex->buf, &tiling); 1139 1140 return tex; 1141 1142 fail: 1143 FREE(tex); 1144 if (buffer) 1145 pb_reference(&buffer, NULL); 1146 return NULL; 1147 } 1148 1149 /* Create a new texture. */ 1150 struct pipe_resource *r300_texture_create(struct pipe_screen *screen, 1151 const struct pipe_resource *base) 1152 { 1153 struct r300_screen *rscreen = r300_screen(screen); 1154 enum radeon_bo_layout microtile, macrotile; 1155 1156 if ((base->flags & R300_RESOURCE_FLAG_TRANSFER) || 1157 (base->bind & (PIPE_BIND_SCANOUT | PIPE_BIND_LINEAR))) { 1158 microtile = RADEON_LAYOUT_LINEAR; 1159 macrotile = RADEON_LAYOUT_LINEAR; 1160 } else { 1161 /* This will make the texture_create_function select the layout. */ 1162 microtile = RADEON_LAYOUT_UNKNOWN; 1163 macrotile = RADEON_LAYOUT_UNKNOWN; 1164 } 1165 1166 return (struct pipe_resource*) 1167 r300_texture_create_object(rscreen, base, microtile, macrotile, 1168 0, NULL); 1169 } 1170 1171 struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen, 1172 const struct pipe_resource *base, 1173 struct winsys_handle *whandle, 1174 unsigned usage) 1175 { 1176 struct r300_screen *rscreen = r300_screen(screen); 1177 struct radeon_winsys *rws = rscreen->rws; 1178 struct pb_buffer *buffer; 1179 unsigned stride; 1180 struct radeon_bo_metadata tiling = {}; 1181 1182 /* Support only 2D textures without mipmaps */ 1183 if ((base->target != PIPE_TEXTURE_2D && 1184 base->target != PIPE_TEXTURE_RECT) || 1185 base->depth0 != 1 || 1186 base->last_level != 0) { 1187 return NULL; 1188 } 1189 1190 buffer = rws->buffer_from_handle(rws, whandle, &stride, NULL); 1191 if (!buffer) 1192 return NULL; 1193 1194 rws->buffer_get_metadata(buffer, &tiling); 1195 1196 /* Enforce a microtiled zbuffer. */ 1197 if (util_format_is_depth_or_stencil(base->format) && 1198 tiling.microtile == RADEON_LAYOUT_LINEAR) { 1199 switch (util_format_get_blocksize(base->format)) { 1200 case 4: 1201 tiling.microtile = RADEON_LAYOUT_TILED; 1202 break; 1203 1204 case 2: 1205 tiling.microtile = RADEON_LAYOUT_SQUARETILED; 1206 break; 1207 } 1208 } 1209 1210 return (struct pipe_resource*) 1211 r300_texture_create_object(rscreen, base, tiling.microtile, tiling.macrotile, 1212 stride, buffer); 1213 } 1214 1215 /* Not required to implement u_resource_vtbl, consider moving to another file: 1216 */ 1217 struct pipe_surface* r300_create_surface_custom(struct pipe_context * ctx, 1218 struct pipe_resource* texture, 1219 const struct pipe_surface *surf_tmpl, 1220 unsigned width0_override, 1221 unsigned height0_override) 1222 { 1223 struct r300_resource* tex = r300_resource(texture); 1224 struct r300_surface* surface = CALLOC_STRUCT(r300_surface); 1225 unsigned level = surf_tmpl->u.tex.level; 1226 1227 assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer); 1228 1229 if (surface) { 1230 uint32_t offset, tile_height; 1231 1232 pipe_reference_init(&surface->base.reference, 1); 1233 pipe_resource_reference(&surface->base.texture, texture); 1234 surface->base.context = ctx; 1235 surface->base.format = surf_tmpl->format; 1236 surface->base.width = u_minify(width0_override, level); 1237 surface->base.height = u_minify(height0_override, level); 1238 surface->base.u.tex.level = level; 1239 surface->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer; 1240 surface->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer; 1241 1242 surface->buf = tex->buf; 1243 surface->buf = tex->buf; 1244 1245 /* Prefer VRAM if there are multiple domains to choose from. */ 1246 surface->domain = tex->domain; 1247 if (surface->domain & RADEON_DOMAIN_VRAM) 1248 surface->domain &= ~RADEON_DOMAIN_GTT; 1249 1250 surface->offset = r300_texture_get_offset(tex, level, 1251 surf_tmpl->u.tex.first_layer); 1252 r300_texture_setup_fb_state(surface); 1253 1254 /* Parameters for the CBZB clear. */ 1255 surface->cbzb_allowed = tex->tex.cbzb_allowed[level]; 1256 surface->cbzb_width = align(surface->base.width, 64); 1257 1258 /* Height must be aligned to the size of a tile. */ 1259 tile_height = r300_get_pixel_alignment(surface->base.format, 1260 tex->b.b.nr_samples, 1261 tex->tex.microtile, 1262 tex->tex.macrotile[level], 1263 DIM_HEIGHT, 0); 1264 1265 surface->cbzb_height = align((surface->base.height + 1) / 2, 1266 tile_height); 1267 1268 /* Offset must be aligned to 2K and must point at the beginning 1269 * of a scanline. */ 1270 offset = surface->offset + 1271 tex->tex.stride_in_bytes[level] * surface->cbzb_height; 1272 surface->cbzb_midpoint_offset = offset & ~2047; 1273 1274 surface->cbzb_pitch = surface->pitch & 0x1ffffc; 1275 1276 if (util_format_get_blocksizebits(surface->base.format) == 32) 1277 surface->cbzb_format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL; 1278 else 1279 surface->cbzb_format = R300_DEPTHFORMAT_16BIT_INT_Z; 1280 1281 DBG(r300_context(ctx), DBG_CBZB, 1282 "CBZB Allowed: %s, Dim: %ix%i, Misalignment: %i, Micro: %s, Macro: %s\n", 1283 surface->cbzb_allowed ? "YES" : " NO", 1284 surface->cbzb_width, surface->cbzb_height, 1285 offset & 2047, 1286 tex->tex.microtile ? "YES" : " NO", 1287 tex->tex.macrotile[level] ? "YES" : " NO"); 1288 } 1289 1290 return &surface->base; 1291 } 1292 1293 struct pipe_surface* r300_create_surface(struct pipe_context * ctx, 1294 struct pipe_resource* texture, 1295 const struct pipe_surface *surf_tmpl) 1296 { 1297 return r300_create_surface_custom(ctx, texture, surf_tmpl, 1298 texture->width0, 1299 texture->height0); 1300 } 1301 1302 /* Not required to implement u_resource_vtbl, consider moving to another file: 1303 */ 1304 void r300_surface_destroy(struct pipe_context *ctx, struct pipe_surface* s) 1305 { 1306 pipe_resource_reference(&s->texture, NULL); 1307 FREE(s); 1308 } 1309