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 #include "r300_texture_desc.h" 25 #include "r300_context.h" 26 27 #include "util/u_format.h" 28 #include <inttypes.h> 29 30 /* Returns the number of pixels that the texture should be aligned to 31 * in the given dimension. */ 32 unsigned r300_get_pixel_alignment(enum pipe_format format, 33 unsigned num_samples, 34 enum radeon_bo_layout microtile, 35 enum radeon_bo_layout macrotile, 36 enum r300_dim dim, boolean is_rs690) 37 { 38 static const unsigned table[2][5][3][2] = 39 { 40 { 41 /* Macro: linear linear linear 42 Micro: linear tiled square-tiled */ 43 {{ 32, 1}, { 8, 4}, { 0, 0}}, /* 8 bits per pixel */ 44 {{ 16, 1}, { 8, 2}, { 4, 4}}, /* 16 bits per pixel */ 45 {{ 8, 1}, { 4, 2}, { 0, 0}}, /* 32 bits per pixel */ 46 {{ 4, 1}, { 2, 2}, { 0, 0}}, /* 64 bits per pixel */ 47 {{ 2, 1}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */ 48 }, 49 { 50 /* Macro: tiled tiled tiled 51 Micro: linear tiled square-tiled */ 52 {{256, 8}, {64, 32}, { 0, 0}}, /* 8 bits per pixel */ 53 {{128, 8}, {64, 16}, {32, 32}}, /* 16 bits per pixel */ 54 {{ 64, 8}, {32, 16}, { 0, 0}}, /* 32 bits per pixel */ 55 {{ 32, 8}, {16, 16}, { 0, 0}}, /* 64 bits per pixel */ 56 {{ 16, 8}, { 0, 0}, { 0, 0}} /* 128 bits per pixel */ 57 } 58 }; 59 60 unsigned tile = 0; 61 unsigned pixsize = util_format_get_blocksize(format); 62 63 assert(macrotile <= RADEON_LAYOUT_TILED); 64 assert(microtile <= RADEON_LAYOUT_SQUARETILED); 65 assert(pixsize <= 16); 66 assert(dim <= DIM_HEIGHT); 67 68 tile = table[macrotile][util_logbase2(pixsize)][microtile][dim]; 69 if (macrotile == 0 && is_rs690 && dim == DIM_WIDTH) { 70 int align; 71 int h_tile; 72 h_tile = table[macrotile][util_logbase2(pixsize)][microtile][DIM_HEIGHT]; 73 align = 64 / (pixsize * h_tile); 74 if (tile < align) 75 tile = align; 76 } 77 78 assert(tile); 79 return tile; 80 } 81 82 /* Return true if macrotiling should be enabled on the miplevel. */ 83 static boolean r300_texture_macro_switch(struct r300_resource *tex, 84 unsigned level, 85 boolean rv350_mode, 86 enum r300_dim dim) 87 { 88 unsigned tile, texdim; 89 90 if (tex->b.b.nr_samples > 1) { 91 return TRUE; 92 } 93 94 tile = r300_get_pixel_alignment(tex->b.b.format, tex->b.b.nr_samples, 95 tex->tex.microtile, RADEON_LAYOUT_TILED, dim, 0); 96 if (dim == DIM_WIDTH) { 97 texdim = u_minify(tex->tex.width0, level); 98 } else { 99 texdim = u_minify(tex->tex.height0, level); 100 } 101 102 /* See TX_FILTER1_n.MACRO_SWITCH. */ 103 if (rv350_mode) { 104 return texdim >= tile; 105 } else { 106 return texdim > tile; 107 } 108 } 109 110 /** 111 * Return the stride, in bytes, of the texture image of the given texture 112 * at the given level. 113 */ 114 static unsigned r300_texture_get_stride(struct r300_screen *screen, 115 struct r300_resource *tex, 116 unsigned level) 117 { 118 unsigned tile_width, width, stride; 119 boolean is_rs690 = (screen->caps.family == CHIP_RS600 || 120 screen->caps.family == CHIP_RS690 || 121 screen->caps.family == CHIP_RS740); 122 123 if (tex->tex.stride_in_bytes_override) 124 return tex->tex.stride_in_bytes_override; 125 126 /* Check the level. */ 127 if (level > tex->b.b.last_level) { 128 SCREEN_DBG(screen, DBG_TEX, "%s: level (%u) > last_level (%u)\n", 129 __FUNCTION__, level, tex->b.b.last_level); 130 return 0; 131 } 132 133 width = u_minify(tex->tex.width0, level); 134 135 if (util_format_is_plain(tex->b.b.format)) { 136 tile_width = r300_get_pixel_alignment(tex->b.b.format, 137 tex->b.b.nr_samples, 138 tex->tex.microtile, 139 tex->tex.macrotile[level], 140 DIM_WIDTH, is_rs690); 141 width = align(width, tile_width); 142 143 stride = util_format_get_stride(tex->b.b.format, width); 144 /* The alignment to 32 bytes is sort of implied by the layout... */ 145 return stride; 146 } else { 147 return align(util_format_get_stride(tex->b.b.format, width), is_rs690 ? 64 : 32); 148 } 149 } 150 151 static unsigned r300_texture_get_nblocksy(struct r300_resource *tex, 152 unsigned level, 153 boolean *out_aligned_for_cbzb) 154 { 155 unsigned height, tile_height; 156 157 height = u_minify(tex->tex.height0, level); 158 159 /* Mipmapped and 3D textures must have their height aligned to POT. */ 160 if ((tex->b.b.target != PIPE_TEXTURE_1D && 161 tex->b.b.target != PIPE_TEXTURE_2D && 162 tex->b.b.target != PIPE_TEXTURE_RECT) || 163 tex->b.b.last_level != 0) { 164 height = util_next_power_of_two(height); 165 } 166 167 if (util_format_is_plain(tex->b.b.format)) { 168 tile_height = r300_get_pixel_alignment(tex->b.b.format, 169 tex->b.b.nr_samples, 170 tex->tex.microtile, 171 tex->tex.macrotile[level], 172 DIM_HEIGHT, 0); 173 height = align(height, tile_height); 174 175 /* See if the CBZB clear can be used on the buffer, 176 * taking the texture size into account. */ 177 if (out_aligned_for_cbzb) { 178 if (tex->tex.macrotile[level]) { 179 /* When clearing, the layer (width*height) is horizontally split 180 * into two, and the upper and lower halves are cleared by the CB 181 * and ZB units, respectively. Therefore, the number of macrotiles 182 * in the Y direction must be even. */ 183 184 /* Align the height so that there is an even number of macrotiles. 185 * Do so for 3 or more macrotiles in the Y direction. */ 186 if (level == 0 && tex->b.b.last_level == 0 && 187 (tex->b.b.target == PIPE_TEXTURE_1D || 188 tex->b.b.target == PIPE_TEXTURE_2D || 189 tex->b.b.target == PIPE_TEXTURE_RECT) && 190 height >= tile_height * 3) { 191 height = align(height, tile_height * 2); 192 } 193 194 *out_aligned_for_cbzb = height % (tile_height * 2) == 0; 195 } else { 196 *out_aligned_for_cbzb = FALSE; 197 } 198 } 199 } 200 201 return util_format_get_nblocksy(tex->b.b.format, height); 202 } 203 204 /* Get a width in pixels from a stride in bytes. */ 205 unsigned r300_stride_to_width(enum pipe_format format, 206 unsigned stride_in_bytes) 207 { 208 return (stride_in_bytes / util_format_get_blocksize(format)) * 209 util_format_get_blockwidth(format); 210 } 211 212 static void r300_setup_miptree(struct r300_screen *screen, 213 struct r300_resource *tex, 214 boolean align_for_cbzb) 215 { 216 struct pipe_resource *base = &tex->b.b; 217 unsigned stride, size, layer_size, nblocksy, i; 218 boolean rv350_mode = screen->caps.family >= CHIP_R350; 219 boolean aligned_for_cbzb; 220 221 tex->tex.size_in_bytes = 0; 222 223 SCREEN_DBG(screen, DBG_TEXALLOC, 224 "r300: Making miptree for texture, format %s\n", 225 util_format_short_name(base->format)); 226 227 for (i = 0; i <= base->last_level; i++) { 228 /* Let's see if this miplevel can be macrotiled. */ 229 tex->tex.macrotile[i] = 230 (tex->tex.macrotile[0] == RADEON_LAYOUT_TILED && 231 r300_texture_macro_switch(tex, i, rv350_mode, DIM_WIDTH) && 232 r300_texture_macro_switch(tex, i, rv350_mode, DIM_HEIGHT)) ? 233 RADEON_LAYOUT_TILED : RADEON_LAYOUT_LINEAR; 234 235 stride = r300_texture_get_stride(screen, tex, i); 236 237 /* Compute the number of blocks in Y, see if the CBZB clear can be 238 * used on the texture. */ 239 aligned_for_cbzb = FALSE; 240 if (align_for_cbzb && tex->tex.cbzb_allowed[i]) 241 nblocksy = r300_texture_get_nblocksy(tex, i, &aligned_for_cbzb); 242 else 243 nblocksy = r300_texture_get_nblocksy(tex, i, NULL); 244 245 layer_size = stride * nblocksy; 246 247 if (base->nr_samples > 1) { 248 layer_size *= base->nr_samples; 249 } 250 251 if (base->target == PIPE_TEXTURE_CUBE) 252 size = layer_size * 6; 253 else 254 size = layer_size * u_minify(tex->tex.depth0, i); 255 256 tex->tex.offset_in_bytes[i] = tex->tex.size_in_bytes; 257 tex->tex.size_in_bytes = tex->tex.offset_in_bytes[i] + size; 258 tex->tex.layer_size_in_bytes[i] = layer_size; 259 tex->tex.stride_in_bytes[i] = stride; 260 tex->tex.cbzb_allowed[i] = tex->tex.cbzb_allowed[i] && aligned_for_cbzb; 261 262 SCREEN_DBG(screen, DBG_TEXALLOC, "r300: Texture miptree: Level %d " 263 "(%dx%dx%d px, pitch %d bytes) %d bytes total, macrotiled %s\n", 264 i, u_minify(tex->tex.width0, i), u_minify(tex->tex.height0, i), 265 u_minify(tex->tex.depth0, i), stride, tex->tex.size_in_bytes, 266 tex->tex.macrotile[i] ? "TRUE" : "FALSE"); 267 } 268 } 269 270 static void r300_setup_flags(struct r300_resource *tex) 271 { 272 tex->tex.uses_stride_addressing = 273 !util_is_power_of_two(tex->b.b.width0) || 274 (tex->tex.stride_in_bytes_override && 275 r300_stride_to_width(tex->b.b.format, 276 tex->tex.stride_in_bytes_override) != tex->b.b.width0); 277 278 tex->tex.is_npot = 279 tex->tex.uses_stride_addressing || 280 !util_is_power_of_two(tex->b.b.height0) || 281 !util_is_power_of_two(tex->b.b.depth0); 282 } 283 284 static void r300_setup_cbzb_flags(struct r300_screen *rscreen, 285 struct r300_resource *tex) 286 { 287 unsigned i, bpp; 288 boolean first_level_valid; 289 290 bpp = util_format_get_blocksizebits(tex->b.b.format); 291 292 /* 1) The texture must be point-sampled, 293 * 2) The depth must be 16 or 32 bits. 294 * 3) If the midpoint ZB offset is not aligned to 2048, it returns garbage 295 * with certain texture sizes. Macrotiling ensures the alignment. */ 296 first_level_valid = tex->b.b.nr_samples <= 1 && 297 (bpp == 16 || bpp == 32) && 298 tex->tex.macrotile[0]; 299 300 if (SCREEN_DBG_ON(rscreen, DBG_NO_CBZB)) 301 first_level_valid = FALSE; 302 303 for (i = 0; i <= tex->b.b.last_level; i++) 304 tex->tex.cbzb_allowed[i] = first_level_valid && tex->tex.macrotile[i]; 305 } 306 307 static unsigned r300_pixels_to_dwords(unsigned stride, 308 unsigned height, 309 unsigned xblock, unsigned yblock) 310 { 311 return (util_align_npot(stride, xblock) * align(height, yblock)) / (xblock * yblock); 312 } 313 314 static void r300_setup_hyperz_properties(struct r300_screen *screen, 315 struct r300_resource *tex) 316 { 317 /* The tile size of 1 DWORD in ZMASK RAM is: 318 * 319 * GPU Pipes 4x4 mode 8x8 mode 320 * ------------------------------------------ 321 * R580 4P/1Z 32x32 64x64 322 * RV570 3P/1Z 48x16 96x32 323 * RV530 1P/2Z 32x16 64x32 324 * 1P/1Z 16x16 32x32 325 */ 326 static unsigned zmask_blocks_x_per_dw[4] = {4, 8, 12, 8}; 327 static unsigned zmask_blocks_y_per_dw[4] = {4, 4, 4, 8}; 328 329 /* In HIZ RAM, one dword is always 8x8 pixels (each byte is 4x4 pixels), 330 * but the blocks have very weird ordering. 331 * 332 * With 2 pipes and an image of size 8xY, where Y >= 1, 333 * clearing 4 dwords clears blocks like this: 334 * 335 * 01012323 336 * 337 * where numbers correspond to dword indices. The blocks are interleaved 338 * in the X direction, so the alignment must be 4x1 blocks (32x8 pixels). 339 * 340 * With 4 pipes and an image of size 8xY, where Y >= 4, 341 * clearing 8 dwords clears blocks like this: 342 * 01012323 343 * 45456767 344 * 01012323 345 * 45456767 346 * where numbers correspond to dword indices. The blocks are interleaved 347 * in both directions, so the alignment must be 4x4 blocks (32x32 pixels) 348 */ 349 static unsigned hiz_align_x[4] = {8, 32, 48, 32}; 350 static unsigned hiz_align_y[4] = {8, 8, 8, 32}; 351 352 if (util_format_is_depth_or_stencil(tex->b.b.format) && 353 util_format_get_blocksizebits(tex->b.b.format) == 32 && 354 tex->tex.microtile) { 355 unsigned i, pipes; 356 357 if (screen->caps.family == CHIP_RV530) { 358 pipes = screen->info.r300_num_z_pipes; 359 } else { 360 pipes = screen->info.r300_num_gb_pipes; 361 } 362 363 for (i = 0; i <= tex->b.b.last_level; i++) { 364 unsigned zcomp_numdw, zcompsize, hiz_numdw, stride, height; 365 366 stride = r300_stride_to_width(tex->b.b.format, 367 tex->tex.stride_in_bytes[i]); 368 stride = align(stride, 16); 369 height = u_minify(tex->b.b.height0, i); 370 371 /* The 8x8 compression mode needs macrotiling. */ 372 zcompsize = screen->caps.z_compress == R300_ZCOMP_8X8 && 373 tex->tex.macrotile[i] && 374 tex->b.b.nr_samples <= 1 ? 8 : 4; 375 376 /* Get the ZMASK buffer size in dwords. */ 377 zcomp_numdw = r300_pixels_to_dwords(stride, height, 378 zmask_blocks_x_per_dw[pipes-1] * zcompsize, 379 zmask_blocks_y_per_dw[pipes-1] * zcompsize); 380 381 /* Check whether we have enough ZMASK memory. */ 382 if (util_format_get_blocksizebits(tex->b.b.format) == 32 && 383 zcomp_numdw <= screen->caps.zmask_ram * pipes) { 384 tex->tex.zmask_dwords[i] = zcomp_numdw; 385 tex->tex.zcomp8x8[i] = zcompsize == 8; 386 387 tex->tex.zmask_stride_in_pixels[i] = 388 util_align_npot(stride, zmask_blocks_x_per_dw[pipes-1] * zcompsize); 389 } else { 390 tex->tex.zmask_dwords[i] = 0; 391 tex->tex.zcomp8x8[i] = FALSE; 392 tex->tex.zmask_stride_in_pixels[i] = 0; 393 } 394 395 /* Now setup HIZ. */ 396 stride = util_align_npot(stride, hiz_align_x[pipes-1]); 397 height = align(height, hiz_align_y[pipes-1]); 398 399 /* Get the HIZ buffer size in dwords. */ 400 hiz_numdw = (stride * height) / (8*8 * pipes); 401 402 /* Check whether we have enough HIZ memory. */ 403 if (hiz_numdw <= screen->caps.hiz_ram * pipes) { 404 tex->tex.hiz_dwords[i] = hiz_numdw; 405 tex->tex.hiz_stride_in_pixels[i] = stride; 406 } else { 407 tex->tex.hiz_dwords[i] = 0; 408 tex->tex.hiz_stride_in_pixels[i] = 0; 409 } 410 } 411 } 412 } 413 414 static void r300_setup_cmask_properties(struct r300_screen *screen, 415 struct r300_resource *tex) 416 { 417 static unsigned cmask_align_x[4] = {16, 32, 48, 32}; 418 static unsigned cmask_align_y[4] = {16, 16, 16, 32}; 419 unsigned pipes, stride, cmask_num_dw, cmask_max_size; 420 421 if (!screen->caps.has_cmask) { 422 return; 423 } 424 425 /* We need an AA colorbuffer, no mipmaps. */ 426 if (tex->b.b.nr_samples <= 1 || 427 tex->b.b.last_level > 0 || 428 util_format_is_depth_or_stencil(tex->b.b.format)) { 429 return; 430 } 431 432 /* FP16 AA needs R500 and a fairly new DRM. */ 433 if ((tex->b.b.format == PIPE_FORMAT_R16G16B16A16_FLOAT || 434 tex->b.b.format == PIPE_FORMAT_R16G16B16X16_FLOAT) && 435 (!screen->caps.is_r500 || screen->info.drm_minor < 29)) { 436 return; 437 } 438 439 if (SCREEN_DBG_ON(screen, DBG_NO_CMASK)) { 440 return; 441 } 442 443 /* CMASK is part of raster pipes. The number of Z pipes doesn't matter. */ 444 pipes = screen->info.r300_num_gb_pipes; 445 446 /* The single-pipe cards have 5120 dwords of CMASK RAM, 447 * the other cards have 4096 dwords of CMASK RAM per pipe. */ 448 cmask_max_size = pipes == 1 ? 5120 : pipes * 4096; 449 450 stride = r300_stride_to_width(tex->b.b.format, 451 tex->tex.stride_in_bytes[0]); 452 stride = align(stride, 16); 453 454 /* Get the CMASK size in dwords. */ 455 cmask_num_dw = r300_pixels_to_dwords(stride, tex->b.b.height0, 456 cmask_align_x[pipes-1], 457 cmask_align_y[pipes-1]); 458 459 /* Check the CMASK size against the CMASK memory limit. */ 460 if (cmask_num_dw <= cmask_max_size) { 461 tex->tex.cmask_dwords = cmask_num_dw; 462 tex->tex.cmask_stride_in_pixels = 463 util_align_npot(stride, cmask_align_x[pipes-1]); 464 } 465 } 466 467 static void r300_setup_tiling(struct r300_screen *screen, 468 struct r300_resource *tex) 469 { 470 enum pipe_format format = tex->b.b.format; 471 boolean rv350_mode = screen->caps.family >= CHIP_R350; 472 boolean is_zb = util_format_is_depth_or_stencil(format); 473 boolean dbg_no_tiling = SCREEN_DBG_ON(screen, DBG_NO_TILING); 474 boolean force_microtiling = 475 (tex->b.b.flags & R300_RESOURCE_FORCE_MICROTILING) != 0; 476 477 if (tex->b.b.nr_samples > 1) { 478 tex->tex.microtile = RADEON_LAYOUT_TILED; 479 tex->tex.macrotile[0] = RADEON_LAYOUT_TILED; 480 return; 481 } 482 483 tex->tex.microtile = RADEON_LAYOUT_LINEAR; 484 tex->tex.macrotile[0] = RADEON_LAYOUT_LINEAR; 485 486 if (tex->b.b.usage == PIPE_USAGE_STAGING) { 487 return; 488 } 489 490 if (!util_format_is_plain(format)) { 491 return; 492 } 493 494 /* If height == 1, disable microtiling except for zbuffer. */ 495 if (!force_microtiling && !is_zb && 496 (tex->b.b.height0 == 1 || dbg_no_tiling)) { 497 return; 498 } 499 500 /* Set microtiling. */ 501 switch (util_format_get_blocksize(format)) { 502 case 1: 503 case 4: 504 case 8: 505 tex->tex.microtile = RADEON_LAYOUT_TILED; 506 break; 507 508 case 2: 509 tex->tex.microtile = RADEON_LAYOUT_SQUARETILED; 510 break; 511 } 512 513 if (dbg_no_tiling) { 514 return; 515 } 516 517 /* Set macrotiling. */ 518 if (r300_texture_macro_switch(tex, 0, rv350_mode, DIM_WIDTH) && 519 r300_texture_macro_switch(tex, 0, rv350_mode, DIM_HEIGHT)) { 520 tex->tex.macrotile[0] = RADEON_LAYOUT_TILED; 521 } 522 } 523 524 static void r300_tex_print_info(struct r300_resource *tex, 525 const char *func) 526 { 527 fprintf(stderr, 528 "r300: %s: Macro: %s, Micro: %s, Pitch: %i, Dim: %ix%ix%i, " 529 "LastLevel: %i, Size: %i, Format: %s, Samples: %i\n", 530 func, 531 tex->tex.macrotile[0] ? "YES" : " NO", 532 tex->tex.microtile ? "YES" : " NO", 533 r300_stride_to_width(tex->b.b.format, tex->tex.stride_in_bytes[0]), 534 tex->b.b.width0, tex->b.b.height0, tex->b.b.depth0, 535 tex->b.b.last_level, tex->tex.size_in_bytes, 536 util_format_short_name(tex->b.b.format), 537 tex->b.b.nr_samples); 538 } 539 540 void r300_texture_desc_init(struct r300_screen *rscreen, 541 struct r300_resource *tex, 542 const struct pipe_resource *base) 543 { 544 tex->b.b.target = base->target; 545 tex->b.b.format = base->format; 546 tex->b.b.width0 = base->width0; 547 tex->b.b.height0 = base->height0; 548 tex->b.b.depth0 = base->depth0; 549 tex->b.b.array_size = base->array_size; 550 tex->b.b.last_level = base->last_level; 551 tex->b.b.nr_samples = base->nr_samples; 552 tex->tex.width0 = base->width0; 553 tex->tex.height0 = base->height0; 554 tex->tex.depth0 = base->depth0; 555 556 /* There is a CB memory addressing hardware bug that limits the width 557 * of the MSAA buffer in some cases in R520. In order to get around it, 558 * the following code lowers the sample count depending on the format and 559 * the width. 560 * 561 * The only catch is that all MSAA colorbuffers and a zbuffer which are 562 * supposed to be used together should always be bound together. Only 563 * then the correct minimum sample count of all bound buffers is used 564 * for rendering. */ 565 if (rscreen->caps.is_r500) { 566 /* FP16 6x MSAA buffers are limited to a width of 1360 pixels. */ 567 if ((tex->b.b.format == PIPE_FORMAT_R16G16B16A16_FLOAT || 568 tex->b.b.format == PIPE_FORMAT_R16G16B16X16_FLOAT) && 569 tex->b.b.nr_samples == 6 && tex->b.b.width0 > 1360) { 570 tex->b.b.nr_samples = 4; 571 } 572 573 /* FP16 4x MSAA buffers are limited to a width of 2048 pixels. */ 574 if ((tex->b.b.format == PIPE_FORMAT_R16G16B16A16_FLOAT || 575 tex->b.b.format == PIPE_FORMAT_R16G16B16X16_FLOAT) && 576 tex->b.b.nr_samples == 4 && tex->b.b.width0 > 2048) { 577 tex->b.b.nr_samples = 2; 578 } 579 } 580 581 /* 32-bit 6x MSAA buffers are limited to a width of 2720 pixels. 582 * This applies to all R300-R500 cards. */ 583 if (util_format_get_blocksizebits(tex->b.b.format) == 32 && 584 !util_format_is_depth_or_stencil(tex->b.b.format) && 585 tex->b.b.nr_samples == 6 && tex->b.b.width0 > 2720) { 586 tex->b.b.nr_samples = 4; 587 } 588 589 r300_setup_flags(tex); 590 591 /* Align a 3D NPOT texture to POT. */ 592 if (base->target == PIPE_TEXTURE_3D && tex->tex.is_npot) { 593 tex->tex.width0 = util_next_power_of_two(tex->tex.width0); 594 tex->tex.height0 = util_next_power_of_two(tex->tex.height0); 595 tex->tex.depth0 = util_next_power_of_two(tex->tex.depth0); 596 } 597 598 /* Setup tiling. */ 599 if (tex->tex.microtile == RADEON_LAYOUT_UNKNOWN) { 600 r300_setup_tiling(rscreen, tex); 601 } 602 603 r300_setup_cbzb_flags(rscreen, tex); 604 605 /* Setup the miptree description. */ 606 r300_setup_miptree(rscreen, tex, TRUE); 607 /* If the required buffer size is larger than the given max size, 608 * try again without the alignment for the CBZB clear. */ 609 if (tex->buf && tex->tex.size_in_bytes > tex->buf->size) { 610 r300_setup_miptree(rscreen, tex, FALSE); 611 612 /* Make sure the buffer we got is large enough. */ 613 if (tex->tex.size_in_bytes > tex->buf->size) { 614 fprintf(stderr, 615 "r300: I got a pre-allocated buffer to use it as a texture " 616 "storage, but the buffer is too small. I'll use the buffer " 617 "anyway, because I can't crash here, but it's dangerous. " 618 "This can be a DDX bug. Got: %"PRIu64"B, Need: %uB, Info:\n", 619 tex->buf->size, tex->tex.size_in_bytes); 620 r300_tex_print_info(tex, "texture_desc_init"); 621 /* Ooops, what now. Apps will break if we fail this, 622 * so just pretend everything's okay. */ 623 } 624 } 625 626 r300_setup_hyperz_properties(rscreen, tex); 627 r300_setup_cmask_properties(rscreen, tex); 628 629 if (SCREEN_DBG_ON(rscreen, DBG_TEX)) 630 r300_tex_print_info(tex, "texture_desc_init"); 631 } 632 633 unsigned r300_texture_get_offset(struct r300_resource *tex, 634 unsigned level, unsigned layer) 635 { 636 unsigned offset = tex->tex.offset_in_bytes[level]; 637 638 switch (tex->b.b.target) { 639 case PIPE_TEXTURE_3D: 640 case PIPE_TEXTURE_CUBE: 641 return offset + layer * tex->tex.layer_size_in_bytes[level]; 642 643 default: 644 assert(layer == 0); 645 return offset; 646 } 647 } 648