evergreen_state.c revision c0c979eebc076b95cc8d18a013ce2968fe6311ad
1/* 2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23 24/* TODO: 25 * - fix mask for depth control & cull for query 26 */ 27#include <stdio.h> 28#include <errno.h> 29#include "pipe/p_defines.h" 30#include "pipe/p_state.h" 31#include "pipe/p_context.h" 32#include "tgsi/tgsi_scan.h" 33#include "tgsi/tgsi_parse.h" 34#include "tgsi/tgsi_util.h" 35#include "util/u_blitter.h" 36#include "util/u_double_list.h" 37#include "util/u_transfer.h" 38#include "util/u_surface.h" 39#include "util/u_pack_color.h" 40#include "util/u_memory.h" 41#include "util/u_inlines.h" 42#include "util/u_framebuffer.h" 43#include "pipebuffer/pb_buffer.h" 44#include "r600.h" 45#include "evergreend.h" 46#include "r600_resource.h" 47#include "r600_shader.h" 48#include "r600_pipe.h" 49#include "r600_formats.h" 50 51static uint32_t eg_num_banks(uint32_t nbanks) 52{ 53 switch (nbanks) { 54 case 2: 55 return 0; 56 case 4: 57 return 1; 58 case 8: 59 default: 60 return 2; 61 case 16: 62 return 3; 63 } 64} 65 66 67static unsigned eg_tile_split(unsigned tile_split) 68{ 69 switch (tile_split) { 70 case 64: tile_split = 0; break; 71 case 128: tile_split = 1; break; 72 case 256: tile_split = 2; break; 73 case 512: tile_split = 3; break; 74 default: 75 case 1024: tile_split = 4; break; 76 case 2048: tile_split = 5; break; 77 case 4096: tile_split = 6; break; 78 } 79 return tile_split; 80} 81 82static unsigned eg_macro_tile_aspect(unsigned macro_tile_aspect) 83{ 84 switch (macro_tile_aspect) { 85 default: 86 case 1: macro_tile_aspect = 0; break; 87 case 2: macro_tile_aspect = 1; break; 88 case 4: macro_tile_aspect = 2; break; 89 case 8: macro_tile_aspect = 3; break; 90 } 91 return macro_tile_aspect; 92} 93 94static unsigned eg_bank_wh(unsigned bankwh) 95{ 96 switch (bankwh) { 97 default: 98 case 1: bankwh = 0; break; 99 case 2: bankwh = 1; break; 100 case 4: bankwh = 2; break; 101 case 8: bankwh = 3; break; 102 } 103 return bankwh; 104} 105 106static uint32_t r600_translate_blend_function(int blend_func) 107{ 108 switch (blend_func) { 109 case PIPE_BLEND_ADD: 110 return V_028780_COMB_DST_PLUS_SRC; 111 case PIPE_BLEND_SUBTRACT: 112 return V_028780_COMB_SRC_MINUS_DST; 113 case PIPE_BLEND_REVERSE_SUBTRACT: 114 return V_028780_COMB_DST_MINUS_SRC; 115 case PIPE_BLEND_MIN: 116 return V_028780_COMB_MIN_DST_SRC; 117 case PIPE_BLEND_MAX: 118 return V_028780_COMB_MAX_DST_SRC; 119 default: 120 R600_ERR("Unknown blend function %d\n", blend_func); 121 assert(0); 122 break; 123 } 124 return 0; 125} 126 127static uint32_t r600_translate_blend_factor(int blend_fact) 128{ 129 switch (blend_fact) { 130 case PIPE_BLENDFACTOR_ONE: 131 return V_028780_BLEND_ONE; 132 case PIPE_BLENDFACTOR_SRC_COLOR: 133 return V_028780_BLEND_SRC_COLOR; 134 case PIPE_BLENDFACTOR_SRC_ALPHA: 135 return V_028780_BLEND_SRC_ALPHA; 136 case PIPE_BLENDFACTOR_DST_ALPHA: 137 return V_028780_BLEND_DST_ALPHA; 138 case PIPE_BLENDFACTOR_DST_COLOR: 139 return V_028780_BLEND_DST_COLOR; 140 case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 141 return V_028780_BLEND_SRC_ALPHA_SATURATE; 142 case PIPE_BLENDFACTOR_CONST_COLOR: 143 return V_028780_BLEND_CONST_COLOR; 144 case PIPE_BLENDFACTOR_CONST_ALPHA: 145 return V_028780_BLEND_CONST_ALPHA; 146 case PIPE_BLENDFACTOR_ZERO: 147 return V_028780_BLEND_ZERO; 148 case PIPE_BLENDFACTOR_INV_SRC_COLOR: 149 return V_028780_BLEND_ONE_MINUS_SRC_COLOR; 150 case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 151 return V_028780_BLEND_ONE_MINUS_SRC_ALPHA; 152 case PIPE_BLENDFACTOR_INV_DST_ALPHA: 153 return V_028780_BLEND_ONE_MINUS_DST_ALPHA; 154 case PIPE_BLENDFACTOR_INV_DST_COLOR: 155 return V_028780_BLEND_ONE_MINUS_DST_COLOR; 156 case PIPE_BLENDFACTOR_INV_CONST_COLOR: 157 return V_028780_BLEND_ONE_MINUS_CONST_COLOR; 158 case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 159 return V_028780_BLEND_ONE_MINUS_CONST_ALPHA; 160 case PIPE_BLENDFACTOR_SRC1_COLOR: 161 return V_028780_BLEND_SRC1_COLOR; 162 case PIPE_BLENDFACTOR_SRC1_ALPHA: 163 return V_028780_BLEND_SRC1_ALPHA; 164 case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 165 return V_028780_BLEND_INV_SRC1_COLOR; 166 case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 167 return V_028780_BLEND_INV_SRC1_ALPHA; 168 default: 169 R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 170 assert(0); 171 break; 172 } 173 return 0; 174} 175 176static uint32_t r600_translate_stencil_op(int s_op) 177{ 178 switch (s_op) { 179 case PIPE_STENCIL_OP_KEEP: 180 return V_028800_STENCIL_KEEP; 181 case PIPE_STENCIL_OP_ZERO: 182 return V_028800_STENCIL_ZERO; 183 case PIPE_STENCIL_OP_REPLACE: 184 return V_028800_STENCIL_REPLACE; 185 case PIPE_STENCIL_OP_INCR: 186 return V_028800_STENCIL_INCR; 187 case PIPE_STENCIL_OP_DECR: 188 return V_028800_STENCIL_DECR; 189 case PIPE_STENCIL_OP_INCR_WRAP: 190 return V_028800_STENCIL_INCR_WRAP; 191 case PIPE_STENCIL_OP_DECR_WRAP: 192 return V_028800_STENCIL_DECR_WRAP; 193 case PIPE_STENCIL_OP_INVERT: 194 return V_028800_STENCIL_INVERT; 195 default: 196 R600_ERR("Unknown stencil op %d", s_op); 197 assert(0); 198 break; 199 } 200 return 0; 201} 202 203static uint32_t r600_translate_fill(uint32_t func) 204{ 205 switch(func) { 206 case PIPE_POLYGON_MODE_FILL: 207 return 2; 208 case PIPE_POLYGON_MODE_LINE: 209 return 1; 210 case PIPE_POLYGON_MODE_POINT: 211 return 0; 212 default: 213 assert(0); 214 return 0; 215 } 216} 217 218/* translates straight */ 219static uint32_t r600_translate_ds_func(int func) 220{ 221 return func; 222} 223 224static unsigned r600_tex_wrap(unsigned wrap) 225{ 226 switch (wrap) { 227 default: 228 case PIPE_TEX_WRAP_REPEAT: 229 return V_03C000_SQ_TEX_WRAP; 230 case PIPE_TEX_WRAP_CLAMP: 231 return V_03C000_SQ_TEX_CLAMP_HALF_BORDER; 232 case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 233 return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL; 234 case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 235 return V_03C000_SQ_TEX_CLAMP_BORDER; 236 case PIPE_TEX_WRAP_MIRROR_REPEAT: 237 return V_03C000_SQ_TEX_MIRROR; 238 case PIPE_TEX_WRAP_MIRROR_CLAMP: 239 return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER; 240 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 241 return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL; 242 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 243 return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER; 244 } 245} 246 247static unsigned r600_tex_filter(unsigned filter) 248{ 249 switch (filter) { 250 default: 251 case PIPE_TEX_FILTER_NEAREST: 252 return V_03C000_SQ_TEX_XY_FILTER_POINT; 253 case PIPE_TEX_FILTER_LINEAR: 254 return V_03C000_SQ_TEX_XY_FILTER_BILINEAR; 255 } 256} 257 258static unsigned r600_tex_mipfilter(unsigned filter) 259{ 260 switch (filter) { 261 case PIPE_TEX_MIPFILTER_NEAREST: 262 return V_03C000_SQ_TEX_Z_FILTER_POINT; 263 case PIPE_TEX_MIPFILTER_LINEAR: 264 return V_03C000_SQ_TEX_Z_FILTER_LINEAR; 265 default: 266 case PIPE_TEX_MIPFILTER_NONE: 267 return V_03C000_SQ_TEX_Z_FILTER_NONE; 268 } 269} 270 271static unsigned r600_tex_compare(unsigned compare) 272{ 273 switch (compare) { 274 default: 275 case PIPE_FUNC_NEVER: 276 return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER; 277 case PIPE_FUNC_LESS: 278 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS; 279 case PIPE_FUNC_EQUAL: 280 return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL; 281 case PIPE_FUNC_LEQUAL: 282 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL; 283 case PIPE_FUNC_GREATER: 284 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER; 285 case PIPE_FUNC_NOTEQUAL: 286 return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL; 287 case PIPE_FUNC_GEQUAL: 288 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL; 289 case PIPE_FUNC_ALWAYS: 290 return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS; 291 } 292} 293 294static unsigned r600_tex_dim(unsigned dim) 295{ 296 switch (dim) { 297 default: 298 case PIPE_TEXTURE_1D: 299 return V_030000_SQ_TEX_DIM_1D; 300 case PIPE_TEXTURE_1D_ARRAY: 301 return V_030000_SQ_TEX_DIM_1D_ARRAY; 302 case PIPE_TEXTURE_2D: 303 case PIPE_TEXTURE_RECT: 304 return V_030000_SQ_TEX_DIM_2D; 305 case PIPE_TEXTURE_2D_ARRAY: 306 return V_030000_SQ_TEX_DIM_2D_ARRAY; 307 case PIPE_TEXTURE_3D: 308 return V_030000_SQ_TEX_DIM_3D; 309 case PIPE_TEXTURE_CUBE: 310 return V_030000_SQ_TEX_DIM_CUBEMAP; 311 } 312} 313 314static uint32_t r600_translate_dbformat(enum pipe_format format) 315{ 316 switch (format) { 317 case PIPE_FORMAT_Z16_UNORM: 318 return V_028040_Z_16; 319 case PIPE_FORMAT_Z24X8_UNORM: 320 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 321 return V_028040_Z_24; 322 case PIPE_FORMAT_Z32_FLOAT: 323 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 324 return V_028040_Z_32_FLOAT; 325 default: 326 return ~0U; 327 } 328} 329 330static uint32_t r600_translate_colorswap(enum pipe_format format) 331{ 332 switch (format) { 333 /* 8-bit buffers. */ 334 case PIPE_FORMAT_L4A4_UNORM: 335 case PIPE_FORMAT_A4R4_UNORM: 336 return V_028C70_SWAP_ALT; 337 338 case PIPE_FORMAT_A8_UNORM: 339 case PIPE_FORMAT_A8_UINT: 340 case PIPE_FORMAT_A8_SINT: 341 case PIPE_FORMAT_R4A4_UNORM: 342 return V_028C70_SWAP_ALT_REV; 343 case PIPE_FORMAT_I8_UNORM: 344 case PIPE_FORMAT_L8_UNORM: 345 case PIPE_FORMAT_I8_UINT: 346 case PIPE_FORMAT_I8_SINT: 347 case PIPE_FORMAT_L8_UINT: 348 case PIPE_FORMAT_L8_SINT: 349 case PIPE_FORMAT_L8_SRGB: 350 case PIPE_FORMAT_R8_UNORM: 351 case PIPE_FORMAT_R8_SNORM: 352 case PIPE_FORMAT_R8_UINT: 353 case PIPE_FORMAT_R8_SINT: 354 return V_028C70_SWAP_STD; 355 356 /* 16-bit buffers. */ 357 case PIPE_FORMAT_B5G6R5_UNORM: 358 return V_028C70_SWAP_STD_REV; 359 360 case PIPE_FORMAT_B5G5R5A1_UNORM: 361 case PIPE_FORMAT_B5G5R5X1_UNORM: 362 return V_028C70_SWAP_ALT; 363 364 case PIPE_FORMAT_B4G4R4A4_UNORM: 365 case PIPE_FORMAT_B4G4R4X4_UNORM: 366 return V_028C70_SWAP_ALT; 367 368 case PIPE_FORMAT_Z16_UNORM: 369 return V_028C70_SWAP_STD; 370 371 case PIPE_FORMAT_L8A8_UNORM: 372 case PIPE_FORMAT_L8A8_UINT: 373 case PIPE_FORMAT_L8A8_SINT: 374 case PIPE_FORMAT_L8A8_SRGB: 375 return V_028C70_SWAP_ALT; 376 case PIPE_FORMAT_R8G8_UNORM: 377 case PIPE_FORMAT_R8G8_UINT: 378 case PIPE_FORMAT_R8G8_SINT: 379 return V_028C70_SWAP_STD; 380 381 case PIPE_FORMAT_R16_UNORM: 382 case PIPE_FORMAT_R16_UINT: 383 case PIPE_FORMAT_R16_SINT: 384 case PIPE_FORMAT_R16_FLOAT: 385 return V_028C70_SWAP_STD; 386 387 /* 32-bit buffers. */ 388 case PIPE_FORMAT_A8B8G8R8_SRGB: 389 return V_028C70_SWAP_STD_REV; 390 case PIPE_FORMAT_B8G8R8A8_SRGB: 391 return V_028C70_SWAP_ALT; 392 393 case PIPE_FORMAT_B8G8R8A8_UNORM: 394 case PIPE_FORMAT_B8G8R8X8_UNORM: 395 return V_028C70_SWAP_ALT; 396 397 case PIPE_FORMAT_A8R8G8B8_UNORM: 398 case PIPE_FORMAT_X8R8G8B8_UNORM: 399 return V_028C70_SWAP_ALT_REV; 400 case PIPE_FORMAT_R8G8B8A8_SNORM: 401 case PIPE_FORMAT_R8G8B8A8_UNORM: 402 case PIPE_FORMAT_R8G8B8A8_SSCALED: 403 case PIPE_FORMAT_R8G8B8A8_USCALED: 404 case PIPE_FORMAT_R8G8B8A8_SINT: 405 case PIPE_FORMAT_R8G8B8A8_UINT: 406 case PIPE_FORMAT_R8G8B8X8_UNORM: 407 return V_028C70_SWAP_STD; 408 409 case PIPE_FORMAT_A8B8G8R8_UNORM: 410 case PIPE_FORMAT_X8B8G8R8_UNORM: 411 /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 412 return V_028C70_SWAP_STD_REV; 413 414 case PIPE_FORMAT_Z24X8_UNORM: 415 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 416 return V_028C70_SWAP_STD; 417 418 case PIPE_FORMAT_X8Z24_UNORM: 419 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 420 return V_028C70_SWAP_STD; 421 422 case PIPE_FORMAT_R10G10B10A2_UNORM: 423 case PIPE_FORMAT_R10G10B10X2_SNORM: 424 case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 425 return V_028C70_SWAP_STD; 426 427 case PIPE_FORMAT_B10G10R10A2_UNORM: 428 case PIPE_FORMAT_B10G10R10A2_UINT: 429 return V_028C70_SWAP_ALT; 430 431 case PIPE_FORMAT_R11G11B10_FLOAT: 432 case PIPE_FORMAT_R32_FLOAT: 433 case PIPE_FORMAT_R32_UINT: 434 case PIPE_FORMAT_R32_SINT: 435 case PIPE_FORMAT_Z32_FLOAT: 436 case PIPE_FORMAT_R16G16_FLOAT: 437 case PIPE_FORMAT_R16G16_UNORM: 438 case PIPE_FORMAT_R16G16_UINT: 439 case PIPE_FORMAT_R16G16_SINT: 440 return V_028C70_SWAP_STD; 441 442 /* 64-bit buffers. */ 443 case PIPE_FORMAT_R32G32_FLOAT: 444 case PIPE_FORMAT_R32G32_UINT: 445 case PIPE_FORMAT_R32G32_SINT: 446 case PIPE_FORMAT_R16G16B16A16_UNORM: 447 case PIPE_FORMAT_R16G16B16A16_SNORM: 448 case PIPE_FORMAT_R16G16B16A16_USCALED: 449 case PIPE_FORMAT_R16G16B16A16_SSCALED: 450 case PIPE_FORMAT_R16G16B16A16_UINT: 451 case PIPE_FORMAT_R16G16B16A16_SINT: 452 case PIPE_FORMAT_R16G16B16A16_FLOAT: 453 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 454 455 /* 128-bit buffers. */ 456 case PIPE_FORMAT_R32G32B32A32_FLOAT: 457 case PIPE_FORMAT_R32G32B32A32_SNORM: 458 case PIPE_FORMAT_R32G32B32A32_UNORM: 459 case PIPE_FORMAT_R32G32B32A32_SSCALED: 460 case PIPE_FORMAT_R32G32B32A32_USCALED: 461 case PIPE_FORMAT_R32G32B32A32_SINT: 462 case PIPE_FORMAT_R32G32B32A32_UINT: 463 return V_028C70_SWAP_STD; 464 default: 465 R600_ERR("unsupported colorswap format %d\n", format); 466 return ~0U; 467 } 468 return ~0U; 469} 470 471static uint32_t r600_translate_colorformat(enum pipe_format format) 472{ 473 switch (format) { 474 /* 8-bit buffers. */ 475 case PIPE_FORMAT_A8_UNORM: 476 case PIPE_FORMAT_A8_UINT: 477 case PIPE_FORMAT_A8_SINT: 478 case PIPE_FORMAT_I8_UNORM: 479 case PIPE_FORMAT_I8_UINT: 480 case PIPE_FORMAT_I8_SINT: 481 case PIPE_FORMAT_L8_UNORM: 482 case PIPE_FORMAT_L8_UINT: 483 case PIPE_FORMAT_L8_SINT: 484 case PIPE_FORMAT_L8_SRGB: 485 case PIPE_FORMAT_R8_UNORM: 486 case PIPE_FORMAT_R8_SNORM: 487 case PIPE_FORMAT_R8_UINT: 488 case PIPE_FORMAT_R8_SINT: 489 return V_028C70_COLOR_8; 490 491 /* 16-bit buffers. */ 492 case PIPE_FORMAT_B5G6R5_UNORM: 493 return V_028C70_COLOR_5_6_5; 494 495 case PIPE_FORMAT_B5G5R5A1_UNORM: 496 case PIPE_FORMAT_B5G5R5X1_UNORM: 497 return V_028C70_COLOR_1_5_5_5; 498 499 case PIPE_FORMAT_B4G4R4A4_UNORM: 500 case PIPE_FORMAT_B4G4R4X4_UNORM: 501 return V_028C70_COLOR_4_4_4_4; 502 503 case PIPE_FORMAT_Z16_UNORM: 504 return V_028C70_COLOR_16; 505 506 case PIPE_FORMAT_L8A8_UNORM: 507 case PIPE_FORMAT_L8A8_UINT: 508 case PIPE_FORMAT_L8A8_SINT: 509 case PIPE_FORMAT_L8A8_SRGB: 510 case PIPE_FORMAT_R8G8_UNORM: 511 case PIPE_FORMAT_R8G8_UINT: 512 case PIPE_FORMAT_R8G8_SINT: 513 return V_028C70_COLOR_8_8; 514 515 case PIPE_FORMAT_R16_UNORM: 516 case PIPE_FORMAT_R16_UINT: 517 case PIPE_FORMAT_R16_SINT: 518 return V_028C70_COLOR_16; 519 520 case PIPE_FORMAT_R16_FLOAT: 521 return V_028C70_COLOR_16_FLOAT; 522 523 /* 32-bit buffers. */ 524 case PIPE_FORMAT_A8B8G8R8_SRGB: 525 case PIPE_FORMAT_A8B8G8R8_UNORM: 526 case PIPE_FORMAT_A8R8G8B8_UNORM: 527 case PIPE_FORMAT_B8G8R8A8_SRGB: 528 case PIPE_FORMAT_B8G8R8A8_UNORM: 529 case PIPE_FORMAT_B8G8R8X8_UNORM: 530 case PIPE_FORMAT_R8G8B8A8_SNORM: 531 case PIPE_FORMAT_R8G8B8A8_UNORM: 532 case PIPE_FORMAT_R8G8B8X8_UNORM: 533 case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 534 case PIPE_FORMAT_X8B8G8R8_UNORM: 535 case PIPE_FORMAT_X8R8G8B8_UNORM: 536 case PIPE_FORMAT_R8G8B8_UNORM: 537 case PIPE_FORMAT_R8G8B8A8_SSCALED: 538 case PIPE_FORMAT_R8G8B8A8_USCALED: 539 case PIPE_FORMAT_R8G8B8A8_SINT: 540 case PIPE_FORMAT_R8G8B8A8_UINT: 541 return V_028C70_COLOR_8_8_8_8; 542 543 case PIPE_FORMAT_R10G10B10A2_UNORM: 544 case PIPE_FORMAT_R10G10B10X2_SNORM: 545 case PIPE_FORMAT_B10G10R10A2_UNORM: 546 case PIPE_FORMAT_B10G10R10A2_UINT: 547 case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 548 return V_028C70_COLOR_2_10_10_10; 549 550 case PIPE_FORMAT_Z24X8_UNORM: 551 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 552 return V_028C70_COLOR_8_24; 553 554 case PIPE_FORMAT_X8Z24_UNORM: 555 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 556 return V_028C70_COLOR_24_8; 557 558 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 559 return V_028C70_COLOR_X24_8_32_FLOAT; 560 561 case PIPE_FORMAT_R32_UINT: 562 case PIPE_FORMAT_R32_SINT: 563 return V_028C70_COLOR_32; 564 565 case PIPE_FORMAT_R32_FLOAT: 566 case PIPE_FORMAT_Z32_FLOAT: 567 return V_028C70_COLOR_32_FLOAT; 568 569 case PIPE_FORMAT_R16G16_FLOAT: 570 return V_028C70_COLOR_16_16_FLOAT; 571 572 case PIPE_FORMAT_R16G16_SSCALED: 573 case PIPE_FORMAT_R16G16_UNORM: 574 case PIPE_FORMAT_R16G16_UINT: 575 case PIPE_FORMAT_R16G16_SINT: 576 return V_028C70_COLOR_16_16; 577 578 case PIPE_FORMAT_R11G11B10_FLOAT: 579 return V_028C70_COLOR_10_11_11_FLOAT; 580 581 /* 64-bit buffers. */ 582 case PIPE_FORMAT_R16G16B16_USCALED: 583 case PIPE_FORMAT_R16G16B16_SSCALED: 584 case PIPE_FORMAT_R16G16B16A16_UINT: 585 case PIPE_FORMAT_R16G16B16A16_SINT: 586 case PIPE_FORMAT_R16G16B16A16_USCALED: 587 case PIPE_FORMAT_R16G16B16A16_SSCALED: 588 case PIPE_FORMAT_R16G16B16A16_UNORM: 589 case PIPE_FORMAT_R16G16B16A16_SNORM: 590 return V_028C70_COLOR_16_16_16_16; 591 592 case PIPE_FORMAT_R16G16B16_FLOAT: 593 case PIPE_FORMAT_R16G16B16A16_FLOAT: 594 return V_028C70_COLOR_16_16_16_16_FLOAT; 595 596 case PIPE_FORMAT_R32G32_FLOAT: 597 return V_028C70_COLOR_32_32_FLOAT; 598 599 case PIPE_FORMAT_R32G32_USCALED: 600 case PIPE_FORMAT_R32G32_SSCALED: 601 case PIPE_FORMAT_R32G32_SINT: 602 case PIPE_FORMAT_R32G32_UINT: 603 return V_028C70_COLOR_32_32; 604 605 /* 96-bit buffers. */ 606 case PIPE_FORMAT_R32G32B32_FLOAT: 607 return V_028C70_COLOR_32_32_32_FLOAT; 608 609 /* 128-bit buffers. */ 610 case PIPE_FORMAT_R32G32B32A32_SNORM: 611 case PIPE_FORMAT_R32G32B32A32_UNORM: 612 case PIPE_FORMAT_R32G32B32A32_SSCALED: 613 case PIPE_FORMAT_R32G32B32A32_USCALED: 614 case PIPE_FORMAT_R32G32B32A32_SINT: 615 case PIPE_FORMAT_R32G32B32A32_UINT: 616 return V_028C70_COLOR_32_32_32_32; 617 case PIPE_FORMAT_R32G32B32A32_FLOAT: 618 return V_028C70_COLOR_32_32_32_32_FLOAT; 619 620 /* YUV buffers. */ 621 case PIPE_FORMAT_UYVY: 622 case PIPE_FORMAT_YUYV: 623 default: 624 return ~0U; /* Unsupported. */ 625 } 626} 627 628static uint32_t r600_colorformat_endian_swap(uint32_t colorformat) 629{ 630 if (R600_BIG_ENDIAN) { 631 switch(colorformat) { 632 633 /* 8-bit buffers. */ 634 case V_028C70_COLOR_8: 635 return ENDIAN_NONE; 636 637 /* 16-bit buffers. */ 638 case V_028C70_COLOR_5_6_5: 639 case V_028C70_COLOR_1_5_5_5: 640 case V_028C70_COLOR_4_4_4_4: 641 case V_028C70_COLOR_16: 642 case V_028C70_COLOR_8_8: 643 return ENDIAN_8IN16; 644 645 /* 32-bit buffers. */ 646 case V_028C70_COLOR_8_8_8_8: 647 case V_028C70_COLOR_2_10_10_10: 648 case V_028C70_COLOR_8_24: 649 case V_028C70_COLOR_24_8: 650 case V_028C70_COLOR_32_FLOAT: 651 case V_028C70_COLOR_16_16_FLOAT: 652 case V_028C70_COLOR_16_16: 653 return ENDIAN_8IN32; 654 655 /* 64-bit buffers. */ 656 case V_028C70_COLOR_16_16_16_16: 657 case V_028C70_COLOR_16_16_16_16_FLOAT: 658 return ENDIAN_8IN16; 659 660 case V_028C70_COLOR_32_32_FLOAT: 661 case V_028C70_COLOR_32_32: 662 case V_028C70_COLOR_X24_8_32_FLOAT: 663 return ENDIAN_8IN32; 664 665 /* 96-bit buffers. */ 666 case V_028C70_COLOR_32_32_32_FLOAT: 667 /* 128-bit buffers. */ 668 case V_028C70_COLOR_32_32_32_32_FLOAT: 669 case V_028C70_COLOR_32_32_32_32: 670 return ENDIAN_8IN32; 671 default: 672 return ENDIAN_NONE; /* Unsupported. */ 673 } 674 } else { 675 return ENDIAN_NONE; 676 } 677} 678 679static bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 680{ 681 return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U; 682} 683 684static bool r600_is_colorbuffer_format_supported(enum pipe_format format) 685{ 686 return r600_translate_colorformat(format) != ~0U && 687 r600_translate_colorswap(format) != ~0U; 688} 689 690static bool r600_is_zs_format_supported(enum pipe_format format) 691{ 692 return r600_translate_dbformat(format) != ~0U; 693} 694 695boolean evergreen_is_format_supported(struct pipe_screen *screen, 696 enum pipe_format format, 697 enum pipe_texture_target target, 698 unsigned sample_count, 699 unsigned usage) 700{ 701 unsigned retval = 0; 702 703 if (target >= PIPE_MAX_TEXTURE_TYPES) { 704 R600_ERR("r600: unsupported texture type %d\n", target); 705 return FALSE; 706 } 707 708 if (!util_format_is_supported(format, usage)) 709 return FALSE; 710 711 /* Multisample */ 712 if (sample_count > 1) 713 return FALSE; 714 715 if ((usage & PIPE_BIND_SAMPLER_VIEW) && 716 r600_is_sampler_format_supported(screen, format)) { 717 retval |= PIPE_BIND_SAMPLER_VIEW; 718 } 719 720 if ((usage & (PIPE_BIND_RENDER_TARGET | 721 PIPE_BIND_DISPLAY_TARGET | 722 PIPE_BIND_SCANOUT | 723 PIPE_BIND_SHARED)) && 724 r600_is_colorbuffer_format_supported(format)) { 725 retval |= usage & 726 (PIPE_BIND_RENDER_TARGET | 727 PIPE_BIND_DISPLAY_TARGET | 728 PIPE_BIND_SCANOUT | 729 PIPE_BIND_SHARED); 730 } 731 732 if ((usage & PIPE_BIND_DEPTH_STENCIL) && 733 r600_is_zs_format_supported(format)) { 734 retval |= PIPE_BIND_DEPTH_STENCIL; 735 } 736 737 if ((usage & PIPE_BIND_VERTEX_BUFFER) && 738 r600_is_vertex_format_supported(format)) { 739 retval |= PIPE_BIND_VERTEX_BUFFER; 740 } 741 742 if (usage & PIPE_BIND_TRANSFER_READ) 743 retval |= PIPE_BIND_TRANSFER_READ; 744 if (usage & PIPE_BIND_TRANSFER_WRITE) 745 retval |= PIPE_BIND_TRANSFER_WRITE; 746 747 return retval == usage; 748} 749 750static void evergreen_set_blend_color(struct pipe_context *ctx, 751 const struct pipe_blend_color *state) 752{ 753 struct r600_context *rctx = (struct r600_context *)ctx; 754 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 755 756 if (rstate == NULL) 757 return; 758 759 rstate->id = R600_PIPE_STATE_BLEND_COLOR; 760 r600_pipe_state_add_reg(rstate, R_028414_CB_BLEND_RED, fui(state->color[0]), NULL, 0); 761 r600_pipe_state_add_reg(rstate, R_028418_CB_BLEND_GREEN, fui(state->color[1]), NULL, 0); 762 r600_pipe_state_add_reg(rstate, R_02841C_CB_BLEND_BLUE, fui(state->color[2]), NULL, 0); 763 r600_pipe_state_add_reg(rstate, R_028420_CB_BLEND_ALPHA, fui(state->color[3]), NULL, 0); 764 765 free(rctx->states[R600_PIPE_STATE_BLEND_COLOR]); 766 rctx->states[R600_PIPE_STATE_BLEND_COLOR] = rstate; 767 r600_context_pipe_state_set(rctx, rstate); 768} 769 770static void *evergreen_create_blend_state(struct pipe_context *ctx, 771 const struct pipe_blend_state *state) 772{ 773 struct r600_context *rctx = (struct r600_context *)ctx; 774 struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend); 775 struct r600_pipe_state *rstate; 776 uint32_t color_control, target_mask; 777 /* FIXME there is more then 8 framebuffer */ 778 unsigned blend_cntl[8]; 779 780 if (blend == NULL) { 781 return NULL; 782 } 783 784 rstate = &blend->rstate; 785 786 rstate->id = R600_PIPE_STATE_BLEND; 787 788 target_mask = 0; 789 color_control = S_028808_MODE(1); 790 if (state->logicop_enable) { 791 color_control |= (state->logicop_func << 16) | (state->logicop_func << 20); 792 } else { 793 color_control |= (0xcc << 16); 794 } 795 /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 796 if (state->independent_blend_enable) { 797 for (int i = 0; i < 8; i++) { 798 target_mask |= (state->rt[i].colormask << (4 * i)); 799 } 800 } else { 801 for (int i = 0; i < 8; i++) { 802 target_mask |= (state->rt[0].colormask << (4 * i)); 803 } 804 } 805 blend->cb_target_mask = target_mask; 806 807 r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL, 808 color_control, NULL, 0); 809 810 if (rctx->chip_class != CAYMAN) 811 r600_pipe_state_add_reg(rstate, R_028C3C_PA_SC_AA_MASK, ~0, NULL, 0); 812 else { 813 r600_pipe_state_add_reg(rstate, CM_R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0, NULL, 0); 814 r600_pipe_state_add_reg(rstate, CM_R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0, NULL, 0); 815 } 816 817 for (int i = 0; i < 8; i++) { 818 /* state->rt entries > 0 only written if independent blending */ 819 const int j = state->independent_blend_enable ? i : 0; 820 821 unsigned eqRGB = state->rt[j].rgb_func; 822 unsigned srcRGB = state->rt[j].rgb_src_factor; 823 unsigned dstRGB = state->rt[j].rgb_dst_factor; 824 unsigned eqA = state->rt[j].alpha_func; 825 unsigned srcA = state->rt[j].alpha_src_factor; 826 unsigned dstA = state->rt[j].alpha_dst_factor; 827 828 blend_cntl[i] = 0; 829 if (!state->rt[j].blend_enable) 830 continue; 831 832 blend_cntl[i] |= S_028780_BLEND_CONTROL_ENABLE(1); 833 blend_cntl[i] |= S_028780_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB)); 834 blend_cntl[i] |= S_028780_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB)); 835 blend_cntl[i] |= S_028780_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB)); 836 837 if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 838 blend_cntl[i] |= S_028780_SEPARATE_ALPHA_BLEND(1); 839 blend_cntl[i] |= S_028780_ALPHA_COMB_FCN(r600_translate_blend_function(eqA)); 840 blend_cntl[i] |= S_028780_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA)); 841 blend_cntl[i] |= S_028780_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA)); 842 } 843 } 844 for (int i = 0; i < 8; i++) { 845 r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl[i], NULL, 0); 846 } 847 848 return rstate; 849} 850 851static void *evergreen_create_dsa_state(struct pipe_context *ctx, 852 const struct pipe_depth_stencil_alpha_state *state) 853{ 854 struct r600_context *rctx = (struct r600_context *)ctx; 855 struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa); 856 unsigned db_depth_control, alpha_test_control, alpha_ref; 857 unsigned db_render_override, db_render_control; 858 struct r600_pipe_state *rstate; 859 860 if (dsa == NULL) { 861 return NULL; 862 } 863 864 dsa->valuemask[0] = state->stencil[0].valuemask; 865 dsa->valuemask[1] = state->stencil[1].valuemask; 866 dsa->writemask[0] = state->stencil[0].writemask; 867 dsa->writemask[1] = state->stencil[1].writemask; 868 869 rstate = &dsa->rstate; 870 871 rstate->id = R600_PIPE_STATE_DSA; 872 db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 873 S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 874 S_028800_ZFUNC(state->depth.func); 875 876 /* stencil */ 877 if (state->stencil[0].enabled) { 878 db_depth_control |= S_028800_STENCIL_ENABLE(1); 879 db_depth_control |= S_028800_STENCILFUNC(r600_translate_ds_func(state->stencil[0].func)); 880 db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op)); 881 db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op)); 882 db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op)); 883 884 if (state->stencil[1].enabled) { 885 db_depth_control |= S_028800_BACKFACE_ENABLE(1); 886 db_depth_control |= S_028800_STENCILFUNC_BF(r600_translate_ds_func(state->stencil[1].func)); 887 db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op)); 888 db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op)); 889 db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op)); 890 } 891 } 892 893 /* alpha */ 894 alpha_test_control = 0; 895 alpha_ref = 0; 896 if (state->alpha.enabled) { 897 alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 898 alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 899 alpha_ref = fui(state->alpha.ref_value); 900 } 901 dsa->alpha_ref = alpha_ref; 902 903 /* misc */ 904 db_render_control = 0; 905 db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) | 906 S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) | 907 S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE); 908 /* TODO db_render_override depends on query */ 909 r600_pipe_state_add_reg(rstate, R_028028_DB_STENCIL_CLEAR, 0x00000000, NULL, 0); 910 r600_pipe_state_add_reg(rstate, R_02802C_DB_DEPTH_CLEAR, 0x3F800000, NULL, 0); 911 r600_pipe_state_add_reg(rstate, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control, NULL, 0); 912 r600_pipe_state_add_reg(rstate, R_0286DC_SPI_FOG_CNTL, 0x00000000, NULL, 0); 913 r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control, NULL, 0); 914 /* The DB_SHADER_CONTROL mask is 0xFFFFFFBC since Z_EXPORT_ENABLE, 915 * STENCIL_EXPORT_ENABLE and KILL_ENABLE are controlled by 916 * evergreen_pipe_shader_ps().*/ 917 r600_pipe_state_add_reg(rstate, R_028000_DB_RENDER_CONTROL, db_render_control, NULL, 0); 918 r600_pipe_state_add_reg(rstate, R_02800C_DB_RENDER_OVERRIDE, db_render_override, NULL, 0); 919 r600_pipe_state_add_reg(rstate, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0, NULL, 0); 920 r600_pipe_state_add_reg(rstate, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0, NULL, 0); 921 r600_pipe_state_add_reg(rstate, R_028AC8_DB_PRELOAD_CONTROL, 0x0, NULL, 0); 922 r600_pipe_state_add_reg(rstate, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00, NULL, 0); 923 dsa->db_render_override = db_render_override; 924 925 return rstate; 926} 927 928static void *evergreen_create_rs_state(struct pipe_context *ctx, 929 const struct pipe_rasterizer_state *state) 930{ 931 struct r600_context *rctx = (struct r600_context *)ctx; 932 struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer); 933 struct r600_pipe_state *rstate; 934 unsigned tmp; 935 unsigned prov_vtx = 1, polygon_dual_mode; 936 unsigned clip_rule; 937 float psize_min, psize_max; 938 939 if (rs == NULL) { 940 return NULL; 941 } 942 943 polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 944 state->fill_back != PIPE_POLYGON_MODE_FILL); 945 946 if (state->flatshade_first) 947 prov_vtx = 0; 948 949 rstate = &rs->rstate; 950 rs->flatshade = state->flatshade; 951 rs->sprite_coord_enable = state->sprite_coord_enable; 952 rs->two_side = state->light_twoside; 953 rs->clip_plane_enable = state->clip_plane_enable; 954 rs->pa_sc_line_stipple = state->line_stipple_enable ? 955 S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 956 S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 957 rs->pa_su_sc_mode_cntl = 958 S_028814_PROVOKING_VTX_LAST(prov_vtx) | 959 S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) | 960 S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) | 961 S_028814_FACE(!state->front_ccw) | 962 S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 963 S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 964 S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 965 S_028814_POLY_MODE(polygon_dual_mode) | 966 S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) | 967 S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back)); 968 rs->pa_cl_clip_cntl = 969 S_028810_PS_UCP_MODE(3) | 970 S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 971 S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 972 S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 973 974 clip_rule = state->scissor ? 0xAAAA : 0xFFFF; 975 976 /* offset */ 977 rs->offset_units = state->offset_units; 978 rs->offset_scale = state->offset_scale * 12.0f; 979 980 rstate->id = R600_PIPE_STATE_RASTERIZER; 981 tmp = S_0286D4_FLAT_SHADE_ENA(1); 982 if (state->sprite_coord_enable) { 983 tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 984 S_0286D4_PNT_SPRITE_OVRD_X(2) | 985 S_0286D4_PNT_SPRITE_OVRD_Y(3) | 986 S_0286D4_PNT_SPRITE_OVRD_Z(0) | 987 S_0286D4_PNT_SPRITE_OVRD_W(1); 988 if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 989 tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 990 } 991 } 992 r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp, NULL, 0); 993 994 r600_pipe_state_add_reg(rstate, R_028820_PA_CL_NANINF_CNTL, 0x00000000, NULL, 0); 995 /* point size 12.4 fixed point */ 996 tmp = (unsigned)(state->point_size * 8.0); 997 r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp), NULL, 0); 998 999 if (state->point_size_per_vertex) { 1000 psize_min = util_get_min_point_size(state); 1001 psize_max = 8192; 1002 } else { 1003 /* Force the point size to be as if the vertex output was disabled. */ 1004 psize_min = state->point_size; 1005 psize_max = state->point_size; 1006 } 1007 /* Divide by two, because 0.5 = 1 pixel. */ 1008 r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 1009 S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 1010 S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)), 1011 NULL, 0); 1012 1013 tmp = (unsigned)state->line_width * 8; 1014 r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), NULL, 0); 1015 r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MODE_CNTL_0, 1016 S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable), 1017 NULL, 0); 1018 1019 if (rctx->chip_class == CAYMAN) { 1020 r600_pipe_state_add_reg(rstate, CM_R_028BDC_PA_SC_LINE_CNTL, 0x00000400, NULL, 0); 1021 r600_pipe_state_add_reg(rstate, CM_R_028BE4_PA_SU_VTX_CNTL, 1022 S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules), 1023 NULL, 0); 1024 r600_pipe_state_add_reg(rstate, CM_R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000, NULL, 0); 1025 r600_pipe_state_add_reg(rstate, CM_R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000, NULL, 0); 1026 r600_pipe_state_add_reg(rstate, CM_R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000, NULL, 0); 1027 r600_pipe_state_add_reg(rstate, CM_R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000, NULL, 0); 1028 1029 1030 } else { 1031 r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, 0x00000400, NULL, 0); 1032 1033 r600_pipe_state_add_reg(rstate, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000, NULL, 0); 1034 r600_pipe_state_add_reg(rstate, R_028C10_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000, NULL, 0); 1035 r600_pipe_state_add_reg(rstate, R_028C14_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000, NULL, 0); 1036 r600_pipe_state_add_reg(rstate, R_028C18_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000, NULL, 0); 1037 1038 r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL, 1039 S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules), 1040 NULL, 0); 1041 } 1042 r600_pipe_state_add_reg(rstate, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp), NULL, 0); 1043 r600_pipe_state_add_reg(rstate, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule, NULL, 0); 1044 return rstate; 1045} 1046 1047static void *evergreen_create_sampler_state(struct pipe_context *ctx, 1048 const struct pipe_sampler_state *state) 1049{ 1050 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1051 union util_color uc; 1052 unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0; 1053 1054 if (rstate == NULL) { 1055 return NULL; 1056 } 1057 1058 rstate->id = R600_PIPE_STATE_SAMPLER; 1059 util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 1060 r600_pipe_state_add_reg_noblock(rstate, R_03C000_SQ_TEX_SAMPLER_WORD0_0, 1061 S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) | 1062 S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) | 1063 S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) | 1064 S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) | 1065 S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) | 1066 S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) | 1067 S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) | 1068 S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) | 1069 S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), NULL, 0); 1070 r600_pipe_state_add_reg_noblock(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0, 1071 S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) | 1072 S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)), 1073 NULL, 0); 1074 r600_pipe_state_add_reg_noblock(rstate, R_03C008_SQ_TEX_SAMPLER_WORD2_0, 1075 S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) | 1076 (state->seamless_cube_map ? 0 : S_03C008_DISABLE_CUBE_WRAP(1)) | 1077 S_03C008_TYPE(1), 1078 NULL, 0); 1079 1080 if (uc.ui) { 1081 r600_pipe_state_add_reg_noblock(rstate, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]), NULL, 0); 1082 r600_pipe_state_add_reg_noblock(rstate, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]), NULL, 0); 1083 r600_pipe_state_add_reg_noblock(rstate, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]), NULL, 0); 1084 r600_pipe_state_add_reg_noblock(rstate, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]), NULL, 0); 1085 } 1086 return rstate; 1087} 1088 1089static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_context *ctx, 1090 struct pipe_resource *texture, 1091 const struct pipe_sampler_view *state) 1092{ 1093 struct r600_screen *rscreen = (struct r600_screen*)ctx->screen; 1094 struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view); 1095 struct r600_pipe_resource_state *rstate; 1096 struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture; 1097 unsigned format, endian; 1098 uint32_t word4 = 0, yuv_format = 0, pitch = 0; 1099 unsigned char swizzle[4], array_mode = 0, tile_type = 0; 1100 unsigned height, depth, width; 1101 unsigned macro_aspect, tile_split, bankh, bankw, nbanks; 1102 1103 if (view == NULL) 1104 return NULL; 1105 rstate = &view->state; 1106 1107 /* initialize base object */ 1108 view->base = *state; 1109 view->base.texture = NULL; 1110 pipe_reference(NULL, &texture->reference); 1111 view->base.texture = texture; 1112 view->base.reference.count = 1; 1113 view->base.context = ctx; 1114 1115 swizzle[0] = state->swizzle_r; 1116 swizzle[1] = state->swizzle_g; 1117 swizzle[2] = state->swizzle_b; 1118 swizzle[3] = state->swizzle_a; 1119 1120 format = r600_translate_texformat(ctx->screen, state->format, 1121 swizzle, 1122 &word4, &yuv_format); 1123 if (format == ~0) { 1124 format = 0; 1125 } 1126 1127 if (tmp->depth && !tmp->is_flushing_texture) { 1128 r600_texture_depth_flush(ctx, texture, TRUE); 1129 tmp = tmp->flushed_depth_texture; 1130 } 1131 1132 endian = r600_colorformat_endian_swap(format); 1133 1134 if (!rscreen->use_surface) { 1135 height = texture->height0; 1136 depth = texture->depth0; 1137 width = texture->width0; 1138 pitch = align(tmp->pitch_in_blocks[0] * 1139 util_format_get_blockwidth(state->format), 8); 1140 array_mode = tmp->array_mode[0]; 1141 tile_type = tmp->tile_type; 1142 tile_split = 0; 1143 macro_aspect = 0; 1144 bankw = 0; 1145 bankh = 0; 1146 } else { 1147 width = tmp->surface.level[0].npix_x; 1148 height = tmp->surface.level[0].npix_y; 1149 depth = tmp->surface.level[0].npix_z; 1150 pitch = tmp->surface.level[0].nblk_x * util_format_get_blockwidth(state->format); 1151 tile_type = tmp->tile_type; 1152 1153 switch (tmp->surface.level[0].mode) { 1154 case RADEON_SURF_MODE_LINEAR_ALIGNED: 1155 array_mode = V_028C70_ARRAY_LINEAR_ALIGNED; 1156 break; 1157 case RADEON_SURF_MODE_2D: 1158 array_mode = V_028C70_ARRAY_2D_TILED_THIN1; 1159 break; 1160 case RADEON_SURF_MODE_1D: 1161 array_mode = V_028C70_ARRAY_1D_TILED_THIN1; 1162 break; 1163 case RADEON_SURF_MODE_LINEAR: 1164 default: 1165 array_mode = V_028C70_ARRAY_LINEAR_GENERAL; 1166 break; 1167 } 1168 tile_split = tmp->surface.tile_split; 1169 macro_aspect = tmp->surface.mtilea; 1170 bankw = tmp->surface.bankw; 1171 bankh = tmp->surface.bankh; 1172 tile_split = eg_tile_split(tile_split); 1173 macro_aspect = eg_macro_tile_aspect(macro_aspect); 1174 bankw = eg_bank_wh(bankw); 1175 bankh = eg_bank_wh(bankh); 1176 } 1177 nbanks = eg_num_banks(rscreen->tiling_info.num_banks); 1178 1179 if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 1180 height = 1; 1181 depth = texture->array_size; 1182 } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 1183 depth = texture->array_size; 1184 } 1185 1186 rstate->bo[0] = &tmp->resource; 1187 rstate->bo[1] = &tmp->resource; 1188 rstate->bo_usage[0] = RADEON_USAGE_READ; 1189 rstate->bo_usage[1] = RADEON_USAGE_READ; 1190 1191 rstate->val[0] = (S_030000_DIM(r600_tex_dim(texture->target)) | 1192 S_030000_PITCH((pitch / 8) - 1) | 1193 S_030000_NON_DISP_TILING_ORDER(tile_type) | 1194 S_030000_TEX_WIDTH(width - 1)); 1195 rstate->val[1] = (S_030004_TEX_HEIGHT(height - 1) | 1196 S_030004_TEX_DEPTH(depth - 1) | 1197 S_030004_ARRAY_MODE(array_mode)); 1198 rstate->val[2] = (tmp->offset[0] + r600_resource_va(ctx->screen, texture)) >> 8; 1199 if (state->u.tex.last_level) { 1200 rstate->val[3] = (tmp->offset[1] + r600_resource_va(ctx->screen, texture)) >> 8; 1201 } else { 1202 rstate->val[3] = (tmp->offset[0] + r600_resource_va(ctx->screen, texture)) >> 8; 1203 } 1204 rstate->val[4] = (word4 | 1205 S_030010_SRF_MODE_ALL(V_030010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) | 1206 S_030010_ENDIAN_SWAP(endian) | 1207 S_030010_BASE_LEVEL(state->u.tex.first_level)); 1208 rstate->val[5] = (S_030014_LAST_LEVEL(state->u.tex.last_level) | 1209 S_030014_BASE_ARRAY(state->u.tex.first_layer) | 1210 S_030014_LAST_ARRAY(state->u.tex.last_layer)); 1211 /* aniso max 16 samples */ 1212 rstate->val[6] = (S_030018_MAX_ANISO(4)) | 1213 (S_030018_TILE_SPLIT(tile_split)); 1214 rstate->val[7] = S_03001C_DATA_FORMAT(format) | 1215 S_03001C_TYPE(V_03001C_SQ_TEX_VTX_VALID_TEXTURE) | 1216 S_03001C_BANK_WIDTH(bankw) | 1217 S_03001C_BANK_HEIGHT(bankh) | 1218 S_03001C_MACRO_TILE_ASPECT(macro_aspect) | 1219 S_03001C_NUM_BANKS(nbanks); 1220 1221 return &view->base; 1222} 1223 1224static void evergreen_set_vs_sampler_view(struct pipe_context *ctx, unsigned count, 1225 struct pipe_sampler_view **views) 1226{ 1227 struct r600_context *rctx = (struct r600_context *)ctx; 1228 struct r600_pipe_sampler_view **resource = (struct r600_pipe_sampler_view **)views; 1229 1230 for (int i = 0; i < count; i++) { 1231 if (resource[i]) { 1232 evergreen_context_pipe_state_set_vs_resource(rctx, &resource[i]->state, 1233 i + R600_MAX_CONST_BUFFERS); 1234 } 1235 } 1236} 1237 1238static void evergreen_set_ps_sampler_view(struct pipe_context *ctx, unsigned count, 1239 struct pipe_sampler_view **views) 1240{ 1241 struct r600_context *rctx = (struct r600_context *)ctx; 1242 struct r600_pipe_sampler_view **resource = (struct r600_pipe_sampler_view **)views; 1243 int i; 1244 int has_depth = 0; 1245 1246 for (i = 0; i < count; i++) { 1247 if (&rctx->ps_samplers.views[i]->base != views[i]) { 1248 if (resource[i]) { 1249 if (((struct r600_resource_texture *)resource[i]->base.texture)->depth) 1250 has_depth = 1; 1251 evergreen_context_pipe_state_set_ps_resource(rctx, &resource[i]->state, 1252 i + R600_MAX_CONST_BUFFERS); 1253 } else 1254 evergreen_context_pipe_state_set_ps_resource(rctx, NULL, 1255 i + R600_MAX_CONST_BUFFERS); 1256 1257 pipe_sampler_view_reference( 1258 (struct pipe_sampler_view **)&rctx->ps_samplers.views[i], 1259 views[i]); 1260 } else { 1261 if (resource[i]) { 1262 if (((struct r600_resource_texture *)resource[i]->base.texture)->depth) 1263 has_depth = 1; 1264 } 1265 } 1266 } 1267 for (i = count; i < NUM_TEX_UNITS; i++) { 1268 if (rctx->ps_samplers.views[i]) { 1269 evergreen_context_pipe_state_set_ps_resource(rctx, NULL, 1270 i + R600_MAX_CONST_BUFFERS); 1271 pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL); 1272 } 1273 } 1274 rctx->have_depth_texture = has_depth; 1275 rctx->ps_samplers.n_views = count; 1276} 1277 1278static void evergreen_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states) 1279{ 1280 struct r600_context *rctx = (struct r600_context *)ctx; 1281 struct r600_pipe_state **rstates = (struct r600_pipe_state **)states; 1282 1283 if (count) 1284 r600_inval_texture_cache(rctx); 1285 1286 memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count); 1287 rctx->ps_samplers.n_samplers = count; 1288 1289 for (int i = 0; i < count; i++) { 1290 evergreen_context_pipe_state_set_ps_sampler(rctx, rstates[i], i); 1291 } 1292} 1293 1294static void evergreen_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states) 1295{ 1296 struct r600_context *rctx = (struct r600_context *)ctx; 1297 struct r600_pipe_state **rstates = (struct r600_pipe_state **)states; 1298 1299 if (count) 1300 r600_inval_texture_cache(rctx); 1301 1302 for (int i = 0; i < count; i++) { 1303 evergreen_context_pipe_state_set_vs_sampler(rctx, rstates[i], i); 1304 } 1305} 1306 1307static void evergreen_set_clip_state(struct pipe_context *ctx, 1308 const struct pipe_clip_state *state) 1309{ 1310 struct r600_context *rctx = (struct r600_context *)ctx; 1311 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1312 struct pipe_resource *cbuf; 1313 1314 if (rstate == NULL) 1315 return; 1316 1317 rctx->clip = *state; 1318 rstate->id = R600_PIPE_STATE_CLIP; 1319 for (int i = 0; i < 6; i++) { 1320 r600_pipe_state_add_reg(rstate, 1321 R_0285BC_PA_CL_UCP0_X + i * 16, 1322 fui(state->ucp[i][0]), NULL, 0); 1323 r600_pipe_state_add_reg(rstate, 1324 R_0285C0_PA_CL_UCP0_Y + i * 16, 1325 fui(state->ucp[i][1]) , NULL, 0); 1326 r600_pipe_state_add_reg(rstate, 1327 R_0285C4_PA_CL_UCP0_Z + i * 16, 1328 fui(state->ucp[i][2]), NULL, 0); 1329 r600_pipe_state_add_reg(rstate, 1330 R_0285C8_PA_CL_UCP0_W + i * 16, 1331 fui(state->ucp[i][3]), NULL, 0); 1332 } 1333 1334 free(rctx->states[R600_PIPE_STATE_CLIP]); 1335 rctx->states[R600_PIPE_STATE_CLIP] = rstate; 1336 r600_context_pipe_state_set(rctx, rstate); 1337 1338 cbuf = pipe_user_buffer_create(ctx->screen, 1339 state->ucp, 1340 4*4*8, /* 8*4 floats */ 1341 PIPE_BIND_CONSTANT_BUFFER); 1342 r600_set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 1, cbuf); 1343 pipe_resource_reference(&cbuf, NULL); 1344} 1345 1346static void evergreen_set_polygon_stipple(struct pipe_context *ctx, 1347 const struct pipe_poly_stipple *state) 1348{ 1349} 1350 1351static void evergreen_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 1352{ 1353} 1354 1355static void evergreen_set_scissor_state(struct pipe_context *ctx, 1356 const struct pipe_scissor_state *state) 1357{ 1358 struct r600_context *rctx = (struct r600_context *)ctx; 1359 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1360 uint32_t tl, br; 1361 1362 if (rstate == NULL) 1363 return; 1364 1365 rstate->id = R600_PIPE_STATE_SCISSOR; 1366 tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny); 1367 br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 1368 r600_pipe_state_add_reg(rstate, 1369 R_028210_PA_SC_CLIPRECT_0_TL, tl, 1370 NULL, 0); 1371 r600_pipe_state_add_reg(rstate, 1372 R_028214_PA_SC_CLIPRECT_0_BR, br, 1373 NULL, 0); 1374 r600_pipe_state_add_reg(rstate, 1375 R_028218_PA_SC_CLIPRECT_1_TL, tl, 1376 NULL, 0); 1377 r600_pipe_state_add_reg(rstate, 1378 R_02821C_PA_SC_CLIPRECT_1_BR, br, 1379 NULL, 0); 1380 r600_pipe_state_add_reg(rstate, 1381 R_028220_PA_SC_CLIPRECT_2_TL, tl, 1382 NULL, 0); 1383 r600_pipe_state_add_reg(rstate, 1384 R_028224_PA_SC_CLIPRECT_2_BR, br, 1385 NULL, 0); 1386 r600_pipe_state_add_reg(rstate, 1387 R_028228_PA_SC_CLIPRECT_3_TL, tl, 1388 NULL, 0); 1389 r600_pipe_state_add_reg(rstate, 1390 R_02822C_PA_SC_CLIPRECT_3_BR, br, 1391 NULL, 0); 1392 1393 free(rctx->states[R600_PIPE_STATE_SCISSOR]); 1394 rctx->states[R600_PIPE_STATE_SCISSOR] = rstate; 1395 r600_context_pipe_state_set(rctx, rstate); 1396} 1397 1398static void evergreen_set_viewport_state(struct pipe_context *ctx, 1399 const struct pipe_viewport_state *state) 1400{ 1401 struct r600_context *rctx = (struct r600_context *)ctx; 1402 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1403 1404 if (rstate == NULL) 1405 return; 1406 1407 rctx->viewport = *state; 1408 rstate->id = R600_PIPE_STATE_VIEWPORT; 1409 r600_pipe_state_add_reg(rstate, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000, NULL, 0); 1410 r600_pipe_state_add_reg(rstate, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000, NULL, 0); 1411 r600_pipe_state_add_reg(rstate, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]), NULL, 0); 1412 r600_pipe_state_add_reg(rstate, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]), NULL, 0); 1413 r600_pipe_state_add_reg(rstate, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]), NULL, 0); 1414 r600_pipe_state_add_reg(rstate, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]), NULL, 0); 1415 r600_pipe_state_add_reg(rstate, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]), NULL, 0); 1416 r600_pipe_state_add_reg(rstate, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]), NULL, 0); 1417 r600_pipe_state_add_reg(rstate, R_028818_PA_CL_VTE_CNTL, 0x0000043F, NULL, 0); 1418 1419 free(rctx->states[R600_PIPE_STATE_VIEWPORT]); 1420 rctx->states[R600_PIPE_STATE_VIEWPORT] = rstate; 1421 r600_context_pipe_state_set(rctx, rstate); 1422} 1423 1424static void evergreen_cb(struct r600_context *rctx, struct r600_pipe_state *rstate, 1425 const struct pipe_framebuffer_state *state, int cb) 1426{ 1427 struct r600_screen *rscreen = rctx->screen; 1428 struct r600_resource_texture *rtex; 1429 struct r600_surface *surf; 1430 unsigned level = state->cbufs[cb]->u.tex.level; 1431 unsigned pitch, slice; 1432 unsigned color_info, color_attrib; 1433 unsigned format, swap, ntype, endian; 1434 uint64_t offset; 1435 unsigned tile_type, macro_aspect, tile_split, bankh, bankw, nbanks; 1436 const struct util_format_description *desc; 1437 int i; 1438 unsigned blend_clamp = 0, blend_bypass = 0; 1439 1440 surf = (struct r600_surface *)state->cbufs[cb]; 1441 rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; 1442 1443 if (rtex->depth) 1444 rctx->have_depth_fb = TRUE; 1445 1446 if (rtex->depth && !rtex->is_flushing_texture) { 1447 r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE); 1448 rtex = rtex->flushed_depth_texture; 1449 } 1450 1451 /* XXX quite sure for dx10+ hw don't need any offset hacks */ 1452 if (!rscreen->use_surface) { 1453 offset = r600_texture_get_offset(rtex, 1454 level, state->cbufs[cb]->u.tex.first_layer); 1455 pitch = rtex->pitch_in_blocks[level] / 8 - 1; 1456 slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64; 1457 if (slice) { 1458 slice = slice - 1; 1459 } 1460 color_info = S_028C70_ARRAY_MODE(rtex->array_mode[level]); 1461 tile_split = 0; 1462 macro_aspect = 0; 1463 bankw = 0; 1464 bankh = 0; 1465 if (rtex->array_mode[level] > V_028C70_ARRAY_LINEAR_ALIGNED) { 1466 tile_type = rtex->tile_type; 1467 } else { 1468 /* workaround for linear buffers */ 1469 tile_type = 1; 1470 } 1471 } else { 1472 offset = rtex->surface.level[level].offset; 1473 if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1474 offset += rtex->surface.level[level].slice_size * 1475 state->cbufs[cb]->u.tex.first_layer; 1476 } 1477 pitch = (rtex->surface.level[level].nblk_x) / 8 - 1; 1478 slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1479 if (slice) { 1480 slice = slice - 1; 1481 } 1482 color_info = 0; 1483 switch (rtex->surface.level[level].mode) { 1484 case RADEON_SURF_MODE_LINEAR_ALIGNED: 1485 color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED); 1486 tile_type = 1; 1487 break; 1488 case RADEON_SURF_MODE_1D: 1489 color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_1D_TILED_THIN1); 1490 tile_type = rtex->tile_type; 1491 break; 1492 case RADEON_SURF_MODE_2D: 1493 color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_2D_TILED_THIN1); 1494 tile_type = rtex->tile_type; 1495 break; 1496 case RADEON_SURF_MODE_LINEAR: 1497 default: 1498 color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_GENERAL); 1499 tile_type = 1; 1500 break; 1501 } 1502 tile_split = rtex->surface.tile_split; 1503 macro_aspect = rtex->surface.mtilea; 1504 bankw = rtex->surface.bankw; 1505 bankh = rtex->surface.bankh; 1506 tile_split = eg_tile_split(tile_split); 1507 macro_aspect = eg_macro_tile_aspect(macro_aspect); 1508 bankw = eg_bank_wh(bankw); 1509 bankh = eg_bank_wh(bankh); 1510 } 1511 nbanks = eg_num_banks(rscreen->tiling_info.num_banks); 1512 desc = util_format_description(surf->base.format); 1513 for (i = 0; i < 4; i++) { 1514 if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 1515 break; 1516 } 1517 } 1518 1519 color_attrib = S_028C74_TILE_SPLIT(tile_split)| 1520 S_028C74_NUM_BANKS(nbanks) | 1521 S_028C74_BANK_WIDTH(bankw) | 1522 S_028C74_BANK_HEIGHT(bankh) | 1523 S_028C74_MACRO_TILE_ASPECT(macro_aspect) | 1524 S_028C74_NON_DISP_TILING_ORDER(tile_type); 1525 1526 ntype = V_028C70_NUMBER_UNORM; 1527 if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 1528 ntype = V_028C70_NUMBER_SRGB; 1529 else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 1530 if (desc->channel[i].normalized) 1531 ntype = V_028C70_NUMBER_SNORM; 1532 else if (desc->channel[i].pure_integer) 1533 ntype = V_028C70_NUMBER_SINT; 1534 } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 1535 if (desc->channel[i].normalized) 1536 ntype = V_028C70_NUMBER_UNORM; 1537 else if (desc->channel[i].pure_integer) 1538 ntype = V_028C70_NUMBER_UINT; 1539 } 1540 1541 format = r600_translate_colorformat(surf->base.format); 1542 swap = r600_translate_colorswap(surf->base.format); 1543 if (rtex->resource.b.b.b.usage == PIPE_USAGE_STAGING) { 1544 endian = ENDIAN_NONE; 1545 } else { 1546 endian = r600_colorformat_endian_swap(format); 1547 } 1548 1549 /* blend clamp should be set for all NORM/SRGB types */ 1550 if (ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM || 1551 ntype == V_028C70_NUMBER_SRGB) 1552 blend_clamp = 1; 1553 1554 /* set blend bypass according to docs if SINT/UINT or 1555 8/24 COLOR variants */ 1556 if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT || 1557 format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 || 1558 format == V_028C70_COLOR_X24_8_32_FLOAT) { 1559 blend_clamp = 0; 1560 blend_bypass = 1; 1561 } 1562 1563 color_info |= S_028C70_FORMAT(format) | 1564 S_028C70_COMP_SWAP(swap) | 1565 S_028C70_BLEND_CLAMP(blend_clamp) | 1566 S_028C70_BLEND_BYPASS(blend_bypass) | 1567 S_028C70_NUMBER_TYPE(ntype) | 1568 S_028C70_ENDIAN(endian); 1569 1570 /* EXPORT_NORM is an optimzation that can be enabled for better 1571 * performance in certain cases. 1572 * EXPORT_NORM can be enabled if: 1573 * - 11-bit or smaller UNORM/SNORM/SRGB 1574 * - 16-bit or smaller FLOAT 1575 */ 1576 /* FIXME: This should probably be the same for all CBs if we want 1577 * useful alpha tests. */ 1578 if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 1579 ((desc->channel[i].size < 12 && 1580 desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 1581 ntype != V_028C70_NUMBER_UINT && ntype != V_028C70_NUMBER_SINT) || 1582 (desc->channel[i].size < 17 && 1583 desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) { 1584 color_info |= S_028C70_SOURCE_FORMAT(V_028C70_EXPORT_4C_16BPC); 1585 rctx->export_16bpc = true; 1586 } else { 1587 rctx->export_16bpc = false; 1588 } 1589 rctx->alpha_ref_dirty = true; 1590 1591 1592 offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture); 1593 offset >>= 8; 1594 1595 /* FIXME handle enabling of CB beyond BASE8 which has different offset */ 1596 r600_pipe_state_add_reg(rstate, 1597 R_028C60_CB_COLOR0_BASE + cb * 0x3C, 1598 offset, &rtex->resource, RADEON_USAGE_READWRITE); 1599 r600_pipe_state_add_reg(rstate, 1600 R_028C78_CB_COLOR0_DIM + cb * 0x3C, 1601 0x0, NULL, 0); 1602 r600_pipe_state_add_reg(rstate, 1603 R_028C70_CB_COLOR0_INFO + cb * 0x3C, 1604 color_info, &rtex->resource, RADEON_USAGE_READWRITE); 1605 r600_pipe_state_add_reg(rstate, 1606 R_028C64_CB_COLOR0_PITCH + cb * 0x3C, 1607 S_028C64_PITCH_TILE_MAX(pitch), 1608 NULL, 0); 1609 r600_pipe_state_add_reg(rstate, 1610 R_028C68_CB_COLOR0_SLICE + cb * 0x3C, 1611 S_028C68_SLICE_TILE_MAX(slice), 1612 NULL, 0); 1613 if (!rscreen->use_surface) { 1614 r600_pipe_state_add_reg(rstate, 1615 R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1616 0x00000000, NULL, 0); 1617 } else { 1618 if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1619 r600_pipe_state_add_reg(rstate, 1620 R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1621 0x00000000, NULL, 0); 1622 } else { 1623 r600_pipe_state_add_reg(rstate, 1624 R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 1625 S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) | 1626 S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer), 1627 NULL, 0); 1628 } 1629 } 1630 r600_pipe_state_add_reg(rstate, 1631 R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, 1632 color_attrib, 1633 &rtex->resource, RADEON_USAGE_READWRITE); 1634} 1635 1636static void evergreen_db(struct r600_context *rctx, struct r600_pipe_state *rstate, 1637 const struct pipe_framebuffer_state *state) 1638{ 1639 struct r600_screen *rscreen = rctx->screen; 1640 struct r600_resource_texture *rtex; 1641 struct r600_surface *surf; 1642 uint64_t offset; 1643 unsigned level, first_layer, pitch, slice, format, array_mode; 1644 unsigned macro_aspect, tile_split, bankh, bankw, z_info, nbanks; 1645 1646 if (state->zsbuf == NULL) 1647 return; 1648 1649 surf = (struct r600_surface *)state->zsbuf; 1650 level = surf->base.u.tex.level; 1651 rtex = (struct r600_resource_texture*)surf->base.texture; 1652 first_layer = surf->base.u.tex.first_layer; 1653 format = r600_translate_dbformat(rtex->real_format); 1654 1655 offset = r600_resource_va(rctx->context.screen, surf->base.texture); 1656 /* XXX remove this once tiling is properly supported */ 1657 if (!rscreen->use_surface) { 1658 /* XXX remove this once tiling is properly supported */ 1659 array_mode = rtex->array_mode[level] ? rtex->array_mode[level] : 1660 V_028C70_ARRAY_1D_TILED_THIN1; 1661 1662 offset += r600_texture_get_offset(rtex, level, first_layer); 1663 pitch = (rtex->pitch_in_blocks[level] / 8) - 1; 1664 slice = ((rtex->pitch_in_blocks[level] * surf->aligned_height) / 64); 1665 if (slice) { 1666 slice = slice - 1; 1667 } 1668 tile_split = 0; 1669 macro_aspect = 0; 1670 bankw = 0; 1671 bankh = 0; 1672 } else { 1673 offset += rtex->surface.level[level].offset; 1674 pitch = (rtex->surface.level[level].nblk_x / 8) - 1; 1675 slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1676 if (slice) { 1677 slice = slice - 1; 1678 } 1679 switch (rtex->surface.level[level].mode) { 1680 case RADEON_SURF_MODE_2D: 1681 array_mode = V_028C70_ARRAY_2D_TILED_THIN1; 1682 break; 1683 case RADEON_SURF_MODE_1D: 1684 case RADEON_SURF_MODE_LINEAR_ALIGNED: 1685 case RADEON_SURF_MODE_LINEAR: 1686 default: 1687 array_mode = V_028C70_ARRAY_1D_TILED_THIN1; 1688 break; 1689 } 1690 tile_split = rtex->surface.tile_split; 1691 macro_aspect = rtex->surface.mtilea; 1692 bankw = rtex->surface.bankw; 1693 bankh = rtex->surface.bankh; 1694 tile_split = eg_tile_split(tile_split); 1695 macro_aspect = eg_macro_tile_aspect(macro_aspect); 1696 bankw = eg_bank_wh(bankw); 1697 bankh = eg_bank_wh(bankh); 1698 } 1699 nbanks = eg_num_banks(rscreen->tiling_info.num_banks); 1700 offset >>= 8; 1701 1702 z_info = S_028040_ARRAY_MODE(array_mode) | 1703 S_028040_FORMAT(format) | 1704 S_028040_TILE_SPLIT(tile_split)| 1705 S_028040_NUM_BANKS(nbanks) | 1706 S_028040_BANK_WIDTH(bankw) | 1707 S_028040_BANK_HEIGHT(bankh) | 1708 S_028040_MACRO_TILE_ASPECT(macro_aspect); 1709 1710 r600_pipe_state_add_reg(rstate, R_028048_DB_Z_READ_BASE, 1711 offset, &rtex->resource, RADEON_USAGE_READWRITE); 1712 r600_pipe_state_add_reg(rstate, R_028050_DB_Z_WRITE_BASE, 1713 offset, &rtex->resource, RADEON_USAGE_READWRITE); 1714 if (!rscreen->use_surface) { 1715 r600_pipe_state_add_reg(rstate, R_028008_DB_DEPTH_VIEW, 1716 0x00000000, NULL, 0); 1717 } else { 1718 r600_pipe_state_add_reg(rstate, R_028008_DB_DEPTH_VIEW, 1719 S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) | 1720 S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer), 1721 NULL, 0); 1722 } 1723 1724 if (rtex->stencil) { 1725 uint64_t stencil_offset = 1726 r600_texture_get_offset(rtex->stencil, level, first_layer); 1727 unsigned stile_split; 1728 1729 stile_split = eg_tile_split(rtex->stencil->surface.tile_split); 1730 stencil_offset += r600_resource_va(rctx->context.screen, (void*)rtex->stencil); 1731 stencil_offset >>= 8; 1732 1733 r600_pipe_state_add_reg(rstate, R_02804C_DB_STENCIL_READ_BASE, 1734 stencil_offset, &rtex->stencil->resource, RADEON_USAGE_READWRITE); 1735 r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE, 1736 stencil_offset, &rtex->stencil->resource, RADEON_USAGE_READWRITE); 1737 r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO, 1738 1 | S_028044_TILE_SPLIT(stile_split), 1739 &rtex->stencil->resource, RADEON_USAGE_READWRITE); 1740 } else { 1741 if (rscreen->use_surface && rtex->surface.flags & RADEON_SURF_SBUFFER) { 1742 uint64_t stencil_offset = rtex->surface.stencil_offset; 1743 unsigned stile_split = rtex->surface.stencil_tile_split; 1744 1745 stile_split = eg_tile_split(stile_split); 1746 stencil_offset += r600_resource_va(rctx->context.screen, surf->base.texture); 1747 stencil_offset += rtex->surface.level[level].offset / 4; 1748 stencil_offset >>= 8; 1749 1750 r600_pipe_state_add_reg(rstate, R_02804C_DB_STENCIL_READ_BASE, 1751 stencil_offset, &rtex->resource, 1752 RADEON_USAGE_READWRITE); 1753 r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE, 1754 stencil_offset, &rtex->resource, 1755 RADEON_USAGE_READWRITE); 1756 r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO, 1757 1 | S_028044_TILE_SPLIT(stile_split), 1758 &rtex->resource, 1759 RADEON_USAGE_READWRITE); 1760 } else { 1761 r600_pipe_state_add_reg(rstate, R_02804C_DB_STENCIL_READ_BASE, 1762 offset, &rtex->resource, 1763 RADEON_USAGE_READWRITE); 1764 r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE, 1765 offset, &rtex->resource, 1766 RADEON_USAGE_READWRITE); 1767 r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO, 1768 0, NULL, RADEON_USAGE_READWRITE); 1769 } 1770 } 1771 1772 r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO, z_info, 1773 &rtex->resource, RADEON_USAGE_READWRITE); 1774 r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE, 1775 S_028058_PITCH_TILE_MAX(pitch), 1776 NULL, 0); 1777 r600_pipe_state_add_reg(rstate, R_02805C_DB_DEPTH_SLICE, 1778 S_02805C_SLICE_TILE_MAX(slice), 1779 NULL, 0); 1780} 1781 1782static void evergreen_set_framebuffer_state(struct pipe_context *ctx, 1783 const struct pipe_framebuffer_state *state) 1784{ 1785 struct r600_context *rctx = (struct r600_context *)ctx; 1786 struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1787 uint32_t shader_mask, tl, br; 1788 int tl_x, tl_y, br_x, br_y; 1789 1790 if (rstate == NULL) 1791 return; 1792 1793 r600_flush_framebuffer(rctx, false); 1794 1795 /* unreference old buffer and reference new one */ 1796 rstate->id = R600_PIPE_STATE_FRAMEBUFFER; 1797 1798 util_copy_framebuffer_state(&rctx->framebuffer, state); 1799 1800 /* build states */ 1801 rctx->have_depth_fb = 0; 1802 rctx->nr_cbufs = state->nr_cbufs; 1803 for (int i = 0; i < state->nr_cbufs; i++) { 1804 evergreen_cb(rctx, rstate, state, i); 1805 } 1806 if (state->zsbuf) { 1807 evergreen_db(rctx, rstate, state); 1808 } 1809 1810 shader_mask = 0; 1811 for (int i = 0; i < state->nr_cbufs; i++) { 1812 shader_mask |= 0xf << (i * 4); 1813 } 1814 tl_x = 0; 1815 tl_y = 0; 1816 br_x = state->width; 1817 br_y = state->height; 1818 /* EG hw workaround */ 1819 if (br_x == 0) 1820 tl_x = 1; 1821 if (br_y == 0) 1822 tl_y = 1; 1823 /* cayman hw workaround */ 1824 if (rctx->chip_class == CAYMAN) { 1825 if (br_x == 1 && br_y == 1) 1826 br_x = 2; 1827 } 1828 tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y); 1829 br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y); 1830 1831 r600_pipe_state_add_reg(rstate, 1832 R_028240_PA_SC_GENERIC_SCISSOR_TL, tl, 1833 NULL, 0); 1834 r600_pipe_state_add_reg(rstate, 1835 R_028244_PA_SC_GENERIC_SCISSOR_BR, br, 1836 NULL, 0); 1837 r600_pipe_state_add_reg(rstate, 1838 R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl, 1839 NULL, 0); 1840 r600_pipe_state_add_reg(rstate, 1841 R_028254_PA_SC_VPORT_SCISSOR_0_BR, br, 1842 NULL, 0); 1843 r600_pipe_state_add_reg(rstate, 1844 R_028030_PA_SC_SCREEN_SCISSOR_TL, tl, 1845 NULL, 0); 1846 r600_pipe_state_add_reg(rstate, 1847 R_028034_PA_SC_SCREEN_SCISSOR_BR, br, 1848 NULL, 0); 1849 r600_pipe_state_add_reg(rstate, 1850 R_028204_PA_SC_WINDOW_SCISSOR_TL, tl, 1851 NULL, 0); 1852 r600_pipe_state_add_reg(rstate, 1853 R_028208_PA_SC_WINDOW_SCISSOR_BR, br, 1854 NULL, 0); 1855 r600_pipe_state_add_reg(rstate, 1856 R_028200_PA_SC_WINDOW_OFFSET, 0x00000000, 1857 NULL, 0); 1858 r600_pipe_state_add_reg(rstate, 1859 R_028230_PA_SC_EDGERULE, 0xAAAAAAAA, 1860 NULL, 0); 1861 r600_pipe_state_add_reg(rstate, R_02823C_CB_SHADER_MASK, 1862 shader_mask, NULL, 0); 1863 1864 1865 if (rctx->chip_class == CAYMAN) { 1866 r600_pipe_state_add_reg(rstate, CM_R_028BE0_PA_SC_AA_CONFIG, 1867 0x00000000, NULL, 0); 1868 } else { 1869 r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG, 1870 0x00000000, NULL, 0); 1871 r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_0, 1872 0x00000000, NULL, 0); 1873 } 1874 1875 free(rctx->states[R600_PIPE_STATE_FRAMEBUFFER]); 1876 rctx->states[R600_PIPE_STATE_FRAMEBUFFER] = rstate; 1877 r600_context_pipe_state_set(rctx, rstate); 1878 1879 if (state->zsbuf) { 1880 evergreen_polygon_offset_update(rctx); 1881 } 1882} 1883 1884void evergreen_init_state_functions(struct r600_context *rctx) 1885{ 1886 rctx->context.create_blend_state = evergreen_create_blend_state; 1887 rctx->context.create_depth_stencil_alpha_state = evergreen_create_dsa_state; 1888 rctx->context.create_fs_state = r600_create_shader_state; 1889 rctx->context.create_rasterizer_state = evergreen_create_rs_state; 1890 rctx->context.create_sampler_state = evergreen_create_sampler_state; 1891 rctx->context.create_sampler_view = evergreen_create_sampler_view; 1892 rctx->context.create_vertex_elements_state = r600_create_vertex_elements; 1893 rctx->context.create_vs_state = r600_create_shader_state; 1894 rctx->context.bind_blend_state = r600_bind_blend_state; 1895 rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state; 1896 rctx->context.bind_fragment_sampler_states = evergreen_bind_ps_sampler; 1897 rctx->context.bind_fs_state = r600_bind_ps_shader; 1898 rctx->context.bind_rasterizer_state = r600_bind_rs_state; 1899 rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements; 1900 rctx->context.bind_vertex_sampler_states = evergreen_bind_vs_sampler; 1901 rctx->context.bind_vs_state = r600_bind_vs_shader; 1902 rctx->context.delete_blend_state = r600_delete_state; 1903 rctx->context.delete_depth_stencil_alpha_state = r600_delete_state; 1904 rctx->context.delete_fs_state = r600_delete_ps_shader; 1905 rctx->context.delete_rasterizer_state = r600_delete_rs_state; 1906 rctx->context.delete_sampler_state = r600_delete_state; 1907 rctx->context.delete_vertex_elements_state = r600_delete_vertex_element; 1908 rctx->context.delete_vs_state = r600_delete_vs_shader; 1909 rctx->context.set_blend_color = evergreen_set_blend_color; 1910 rctx->context.set_clip_state = evergreen_set_clip_state; 1911 rctx->context.set_constant_buffer = r600_set_constant_buffer; 1912 rctx->context.set_fragment_sampler_views = evergreen_set_ps_sampler_view; 1913 rctx->context.set_framebuffer_state = evergreen_set_framebuffer_state; 1914 rctx->context.set_polygon_stipple = evergreen_set_polygon_stipple; 1915 rctx->context.set_sample_mask = evergreen_set_sample_mask; 1916 rctx->context.set_scissor_state = evergreen_set_scissor_state; 1917 rctx->context.set_stencil_ref = r600_set_pipe_stencil_ref; 1918 rctx->context.set_vertex_buffers = r600_set_vertex_buffers; 1919 rctx->context.set_index_buffer = r600_set_index_buffer; 1920 rctx->context.set_vertex_sampler_views = evergreen_set_vs_sampler_view; 1921 rctx->context.set_viewport_state = evergreen_set_viewport_state; 1922 rctx->context.sampler_view_destroy = r600_sampler_view_destroy; 1923 rctx->context.redefine_user_buffer = u_default_redefine_user_buffer; 1924 rctx->context.texture_barrier = r600_texture_barrier; 1925 rctx->context.create_stream_output_target = r600_create_so_target; 1926 rctx->context.stream_output_target_destroy = r600_so_target_destroy; 1927 rctx->context.set_stream_output_targets = r600_set_so_targets; 1928} 1929 1930static void cayman_init_config(struct r600_context *rctx) 1931{ 1932 struct r600_pipe_state *rstate = &rctx->config; 1933 unsigned tmp; 1934 1935 tmp = 0x00000000; 1936 tmp |= S_008C00_EXPORT_SRC_C(1); 1937 r600_pipe_state_add_reg(rstate, R_008C00_SQ_CONFIG, tmp, NULL, 0); 1938 1939 /* always set the temp clauses */ 1940 r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, S_008C04_NUM_CLAUSE_TEMP_GPRS(4), NULL, 0); 1941 r600_pipe_state_add_reg(rstate, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 0, NULL, 0); 1942 r600_pipe_state_add_reg(rstate, R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2, 0, NULL, 0); 1943 r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8), NULL, 0); 1944 1945 r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL_1, 0x0, NULL, 0); 1946 1947 r600_pipe_state_add_reg(rstate, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0, NULL, 0); 1948 r600_pipe_state_add_reg(rstate, R_028A14_VGT_HOS_CNTL, 0x0, NULL, 0); 1949 r600_pipe_state_add_reg(rstate, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0, NULL, 0); 1950 r600_pipe_state_add_reg(rstate, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0, NULL, 0); 1951 r600_pipe_state_add_reg(rstate, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0, NULL, 0); 1952 r600_pipe_state_add_reg(rstate, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0, NULL, 0); 1953 r600_pipe_state_add_reg(rstate, R_028A28_VGT_GROUP_FIRST_DECR, 0x0, NULL, 0); 1954 r600_pipe_state_add_reg(rstate, R_028A2C_VGT_GROUP_DECR, 0x0, NULL, 0); 1955 r600_pipe_state_add_reg(rstate, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0, NULL, 0); 1956 r600_pipe_state_add_reg(rstate, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0, NULL, 0); 1957 r600_pipe_state_add_reg(rstate, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0, NULL, 0); 1958 r600_pipe_state_add_reg(rstate, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0, NULL, 0); 1959 r600_pipe_state_add_reg(rstate, R_028A40_VGT_GS_MODE, 0x0, NULL, 0); 1960 r600_pipe_state_add_reg(rstate, R_028B94_VGT_STRMOUT_CONFIG, 0x0, NULL, 0); 1961 r600_pipe_state_add_reg(rstate, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0, NULL, 0); 1962 r600_pipe_state_add_reg(rstate, CM_R_028AA8_IA_MULTI_VGT_PARAM, S_028AA8_SWITCH_ON_EOP(1) | S_028AA8_PARTIAL_VS_WAVE_ON(1) | S_028AA8_PRIMGROUP_SIZE(63), NULL, 0); 1963 r600_pipe_state_add_reg(rstate, R_028AB4_VGT_REUSE_OFF, 0x00000000, NULL, 0); 1964 r600_pipe_state_add_reg(rstate, R_028AB8_VGT_VTX_CNT_EN, 0x0, NULL, 0); 1965 r600_pipe_state_add_reg(rstate, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1, NULL, 0); 1966 1967 r600_pipe_state_add_reg(rstate, R_028380_SQ_VTX_SEMANTIC_0, 0x0, NULL, 0); 1968 r600_pipe_state_add_reg(rstate, R_028384_SQ_VTX_SEMANTIC_1, 0x0, NULL, 0); 1969 r600_pipe_state_add_reg(rstate, R_028388_SQ_VTX_SEMANTIC_2, 0x0, NULL, 0); 1970 r600_pipe_state_add_reg(rstate, R_02838C_SQ_VTX_SEMANTIC_3, 0x0, NULL, 0); 1971 r600_pipe_state_add_reg(rstate, R_028390_SQ_VTX_SEMANTIC_4, 0x0, NULL, 0); 1972 r600_pipe_state_add_reg(rstate, R_028394_SQ_VTX_SEMANTIC_5, 0x0, NULL, 0); 1973 r600_pipe_state_add_reg(rstate, R_028398_SQ_VTX_SEMANTIC_6, 0x0, NULL, 0); 1974 r600_pipe_state_add_reg(rstate, R_02839C_SQ_VTX_SEMANTIC_7, 0x0, NULL, 0); 1975 r600_pipe_state_add_reg(rstate, R_0283A0_SQ_VTX_SEMANTIC_8, 0x0, NULL, 0); 1976 r600_pipe_state_add_reg(rstate, R_0283A4_SQ_VTX_SEMANTIC_9, 0x0, NULL, 0); 1977 r600_pipe_state_add_reg(rstate, R_0283A8_SQ_VTX_SEMANTIC_10, 0x0, NULL, 0); 1978 r600_pipe_state_add_reg(rstate, R_0283AC_SQ_VTX_SEMANTIC_11, 0x0, NULL, 0); 1979 r600_pipe_state_add_reg(rstate, R_0283B0_SQ_VTX_SEMANTIC_12, 0x0, NULL, 0); 1980 r600_pipe_state_add_reg(rstate, R_0283B4_SQ_VTX_SEMANTIC_13, 0x0, NULL, 0); 1981 r600_pipe_state_add_reg(rstate, R_0283B8_SQ_VTX_SEMANTIC_14, 0x0, NULL, 0); 1982 r600_pipe_state_add_reg(rstate, R_0283BC_SQ_VTX_SEMANTIC_15, 0x0, NULL, 0); 1983 r600_pipe_state_add_reg(rstate, R_0283C0_SQ_VTX_SEMANTIC_16, 0x0, NULL, 0); 1984 r600_pipe_state_add_reg(rstate, R_0283C4_SQ_VTX_SEMANTIC_17, 0x0, NULL, 0); 1985 r600_pipe_state_add_reg(rstate, R_0283C8_SQ_VTX_SEMANTIC_18, 0x0, NULL, 0); 1986 r600_pipe_state_add_reg(rstate, R_0283CC_SQ_VTX_SEMANTIC_19, 0x0, NULL, 0); 1987 r600_pipe_state_add_reg(rstate, R_0283D0_SQ_VTX_SEMANTIC_20, 0x0, NULL, 0); 1988 r600_pipe_state_add_reg(rstate, R_0283D4_SQ_VTX_SEMANTIC_21, 0x0, NULL, 0); 1989 r600_pipe_state_add_reg(rstate, R_0283D8_SQ_VTX_SEMANTIC_22, 0x0, NULL, 0); 1990 r600_pipe_state_add_reg(rstate, R_0283DC_SQ_VTX_SEMANTIC_23, 0x0, NULL, 0); 1991 r600_pipe_state_add_reg(rstate, R_0283E0_SQ_VTX_SEMANTIC_24, 0x0, NULL, 0); 1992 r600_pipe_state_add_reg(rstate, R_0283E4_SQ_VTX_SEMANTIC_25, 0x0, NULL, 0); 1993 r600_pipe_state_add_reg(rstate, R_0283E8_SQ_VTX_SEMANTIC_26, 0x0, NULL, 0); 1994 r600_pipe_state_add_reg(rstate, R_0283EC_SQ_VTX_SEMANTIC_27, 0x0, NULL, 0); 1995 r600_pipe_state_add_reg(rstate, R_0283F0_SQ_VTX_SEMANTIC_28, 0x0, NULL, 0); 1996 r600_pipe_state_add_reg(rstate, R_0283F4_SQ_VTX_SEMANTIC_29, 0x0, NULL, 0); 1997 r600_pipe_state_add_reg(rstate, R_0283F8_SQ_VTX_SEMANTIC_30, 0x0, NULL, 0); 1998 r600_pipe_state_add_reg(rstate, R_0283FC_SQ_VTX_SEMANTIC_31, 0x0, NULL, 0); 1999 2000 r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL, 0x0, NULL, 0); 2001 2002 r600_pipe_state_add_reg(rstate, CM_R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210, NULL, 0); 2003 r600_pipe_state_add_reg(rstate, CM_R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98, NULL, 0); 2004 2005 r600_pipe_state_add_reg(rstate, CM_R_0288E8_SQ_LDS_ALLOC, 0, NULL, 0); 2006 r600_pipe_state_add_reg(rstate, R_0288EC_SQ_LDS_ALLOC_PS, 0, NULL, 0); 2007 2008 r600_pipe_state_add_reg(rstate, CM_R_028804_DB_EQAA, 0x110000, NULL, 0); 2009 r600_context_pipe_state_set(rctx, rstate); 2010} 2011 2012void evergreen_init_config(struct r600_context *rctx) 2013{ 2014 struct r600_pipe_state *rstate = &rctx->config; 2015 int ps_prio; 2016 int vs_prio; 2017 int gs_prio; 2018 int es_prio; 2019 int hs_prio, cs_prio, ls_prio; 2020 int num_ps_gprs; 2021 int num_vs_gprs; 2022 int num_gs_gprs; 2023 int num_es_gprs; 2024 int num_hs_gprs; 2025 int num_ls_gprs; 2026 int num_temp_gprs; 2027 int num_ps_threads; 2028 int num_vs_threads; 2029 int num_gs_threads; 2030 int num_es_threads; 2031 int num_hs_threads; 2032 int num_ls_threads; 2033 int num_ps_stack_entries; 2034 int num_vs_stack_entries; 2035 int num_gs_stack_entries; 2036 int num_es_stack_entries; 2037 int num_hs_stack_entries; 2038 int num_ls_stack_entries; 2039 enum radeon_family family; 2040 unsigned tmp; 2041 2042 family = rctx->family; 2043 2044 if (rctx->chip_class == CAYMAN) { 2045 cayman_init_config(rctx); 2046 return; 2047 } 2048 2049 ps_prio = 0; 2050 vs_prio = 1; 2051 gs_prio = 2; 2052 es_prio = 3; 2053 hs_prio = 0; 2054 ls_prio = 0; 2055 cs_prio = 0; 2056 2057 switch (family) { 2058 case CHIP_CEDAR: 2059 default: 2060 num_ps_gprs = 93; 2061 num_vs_gprs = 46; 2062 num_temp_gprs = 4; 2063 num_gs_gprs = 31; 2064 num_es_gprs = 31; 2065 num_hs_gprs = 23; 2066 num_ls_gprs = 23; 2067 num_ps_threads = 96; 2068 num_vs_threads = 16; 2069 num_gs_threads = 16; 2070 num_es_threads = 16; 2071 num_hs_threads = 16; 2072 num_ls_threads = 16; 2073 num_ps_stack_entries = 42; 2074 num_vs_stack_entries = 42; 2075 num_gs_stack_entries = 42; 2076 num_es_stack_entries = 42; 2077 num_hs_stack_entries = 42; 2078 num_ls_stack_entries = 42; 2079 break; 2080 case CHIP_REDWOOD: 2081 num_ps_gprs = 93; 2082 num_vs_gprs = 46; 2083 num_temp_gprs = 4; 2084 num_gs_gprs = 31; 2085 num_es_gprs = 31; 2086 num_hs_gprs = 23; 2087 num_ls_gprs = 23; 2088 num_ps_threads = 128; 2089 num_vs_threads = 20; 2090 num_gs_threads = 20; 2091 num_es_threads = 20; 2092 num_hs_threads = 20; 2093 num_ls_threads = 20; 2094 num_ps_stack_entries = 42; 2095 num_vs_stack_entries = 42; 2096 num_gs_stack_entries = 42; 2097 num_es_stack_entries = 42; 2098 num_hs_stack_entries = 42; 2099 num_ls_stack_entries = 42; 2100 break; 2101 case CHIP_JUNIPER: 2102 num_ps_gprs = 93; 2103 num_vs_gprs = 46; 2104 num_temp_gprs = 4; 2105 num_gs_gprs = 31; 2106 num_es_gprs = 31; 2107 num_hs_gprs = 23; 2108 num_ls_gprs = 23; 2109 num_ps_threads = 128; 2110 num_vs_threads = 20; 2111 num_gs_threads = 20; 2112 num_es_threads = 20; 2113 num_hs_threads = 20; 2114 num_ls_threads = 20; 2115 num_ps_stack_entries = 85; 2116 num_vs_stack_entries = 85; 2117 num_gs_stack_entries = 85; 2118 num_es_stack_entries = 85; 2119 num_hs_stack_entries = 85; 2120 num_ls_stack_entries = 85; 2121 break; 2122 case CHIP_CYPRESS: 2123 case CHIP_HEMLOCK: 2124 num_ps_gprs = 93; 2125 num_vs_gprs = 46; 2126 num_temp_gprs = 4; 2127 num_gs_gprs = 31; 2128 num_es_gprs = 31; 2129 num_hs_gprs = 23; 2130 num_ls_gprs = 23; 2131 num_ps_threads = 128; 2132 num_vs_threads = 20; 2133 num_gs_threads = 20; 2134 num_es_threads = 20; 2135 num_hs_threads = 20; 2136 num_ls_threads = 20; 2137 num_ps_stack_entries = 85; 2138 num_vs_stack_entries = 85; 2139 num_gs_stack_entries = 85; 2140 num_es_stack_entries = 85; 2141 num_hs_stack_entries = 85; 2142 num_ls_stack_entries = 85; 2143 break; 2144 case CHIP_PALM: 2145 num_ps_gprs = 93; 2146 num_vs_gprs = 46; 2147 num_temp_gprs = 4; 2148 num_gs_gprs = 31; 2149 num_es_gprs = 31; 2150 num_hs_gprs = 23; 2151 num_ls_gprs = 23; 2152 num_ps_threads = 96; 2153 num_vs_threads = 16; 2154 num_gs_threads = 16; 2155 num_es_threads = 16; 2156 num_hs_threads = 16; 2157 num_ls_threads = 16; 2158 num_ps_stack_entries = 42; 2159 num_vs_stack_entries = 42; 2160 num_gs_stack_entries = 42; 2161 num_es_stack_entries = 42; 2162 num_hs_stack_entries = 42; 2163 num_ls_stack_entries = 42; 2164 break; 2165 case CHIP_SUMO: 2166 num_ps_gprs = 93; 2167 num_vs_gprs = 46; 2168 num_temp_gprs = 4; 2169 num_gs_gprs = 31; 2170 num_es_gprs = 31; 2171 num_hs_gprs = 23; 2172 num_ls_gprs = 23; 2173 num_ps_threads = 96; 2174 num_vs_threads = 25; 2175 num_gs_threads = 25; 2176 num_es_threads = 25; 2177 num_hs_threads = 25; 2178 num_ls_threads = 25; 2179 num_ps_stack_entries = 42; 2180 num_vs_stack_entries = 42; 2181 num_gs_stack_entries = 42; 2182 num_es_stack_entries = 42; 2183 num_hs_stack_entries = 42; 2184 num_ls_stack_entries = 42; 2185 break; 2186 case CHIP_SUMO2: 2187 num_ps_gprs = 93; 2188 num_vs_gprs = 46; 2189 num_temp_gprs = 4; 2190 num_gs_gprs = 31; 2191 num_es_gprs = 31; 2192 num_hs_gprs = 23; 2193 num_ls_gprs = 23; 2194 num_ps_threads = 96; 2195 num_vs_threads = 25; 2196 num_gs_threads = 25; 2197 num_es_threads = 25; 2198 num_hs_threads = 25; 2199 num_ls_threads = 25; 2200 num_ps_stack_entries = 85; 2201 num_vs_stack_entries = 85; 2202 num_gs_stack_entries = 85; 2203 num_es_stack_entries = 85; 2204 num_hs_stack_entries = 85; 2205 num_ls_stack_entries = 85; 2206 break; 2207 case CHIP_BARTS: 2208 num_ps_gprs = 93; 2209 num_vs_gprs = 46; 2210 num_temp_gprs = 4; 2211 num_gs_gprs = 31; 2212 num_es_gprs = 31; 2213 num_hs_gprs = 23; 2214 num_ls_gprs = 23; 2215 num_ps_threads = 128; 2216 num_vs_threads = 20; 2217 num_gs_threads = 20; 2218 num_es_threads = 20; 2219 num_hs_threads = 20; 2220 num_ls_threads = 20; 2221 num_ps_stack_entries = 85; 2222 num_vs_stack_entries = 85; 2223 num_gs_stack_entries = 85; 2224 num_es_stack_entries = 85; 2225 num_hs_stack_entries = 85; 2226 num_ls_stack_entries = 85; 2227 break; 2228 case CHIP_TURKS: 2229 num_ps_gprs = 93; 2230 num_vs_gprs = 46; 2231 num_temp_gprs = 4; 2232 num_gs_gprs = 31; 2233 num_es_gprs = 31; 2234 num_hs_gprs = 23; 2235 num_ls_gprs = 23; 2236 num_ps_threads = 128; 2237 num_vs_threads = 20; 2238 num_gs_threads = 20; 2239 num_es_threads = 20; 2240 num_hs_threads = 20; 2241 num_ls_threads = 20; 2242 num_ps_stack_entries = 42; 2243 num_vs_stack_entries = 42; 2244 num_gs_stack_entries = 42; 2245 num_es_stack_entries = 42; 2246 num_hs_stack_entries = 42; 2247 num_ls_stack_entries = 42; 2248 break; 2249 case CHIP_CAICOS: 2250 num_ps_gprs = 93; 2251 num_vs_gprs = 46; 2252 num_temp_gprs = 4; 2253 num_gs_gprs = 31; 2254 num_es_gprs = 31; 2255 num_hs_gprs = 23; 2256 num_ls_gprs = 23; 2257 num_ps_threads = 128; 2258 num_vs_threads = 10; 2259 num_gs_threads = 10; 2260 num_es_threads = 10; 2261 num_hs_threads = 10; 2262 num_ls_threads = 10; 2263 num_ps_stack_entries = 42; 2264 num_vs_stack_entries = 42; 2265 num_gs_stack_entries = 42; 2266 num_es_stack_entries = 42; 2267 num_hs_stack_entries = 42; 2268 num_ls_stack_entries = 42; 2269 break; 2270 } 2271 2272 tmp = 0x00000000; 2273 switch (family) { 2274 case CHIP_CEDAR: 2275 case CHIP_PALM: 2276 case CHIP_SUMO: 2277 case CHIP_SUMO2: 2278 case CHIP_CAICOS: 2279 break; 2280 default: 2281 tmp |= S_008C00_VC_ENABLE(1); 2282 break; 2283 } 2284 tmp |= S_008C00_EXPORT_SRC_C(1); 2285 tmp |= S_008C00_CS_PRIO(cs_prio); 2286 tmp |= S_008C00_LS_PRIO(ls_prio); 2287 tmp |= S_008C00_HS_PRIO(hs_prio); 2288 tmp |= S_008C00_PS_PRIO(ps_prio); 2289 tmp |= S_008C00_VS_PRIO(vs_prio); 2290 tmp |= S_008C00_GS_PRIO(gs_prio); 2291 tmp |= S_008C00_ES_PRIO(es_prio); 2292 r600_pipe_state_add_reg(rstate, R_008C00_SQ_CONFIG, tmp, NULL, 0); 2293 2294 /* enable dynamic GPR resource management */ 2295 if (rctx->screen->info.drm_minor >= 7) { 2296 /* always set temp clauses */ 2297 r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, 2298 S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs), NULL, 0); 2299 r600_pipe_state_add_reg(rstate, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 0, NULL, 0); 2300 r600_pipe_state_add_reg(rstate, R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2, 0, NULL, 0); 2301 r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8), NULL, 0); 2302 r600_pipe_state_add_reg(rstate, R_028838_SQ_DYN_GPR_RESOURCE_LIMIT_1, 2303 S_028838_PS_GPRS(0x1e) | 2304 S_028838_VS_GPRS(0x1e) | 2305 S_028838_GS_GPRS(0x1e) | 2306 S_028838_ES_GPRS(0x1e) | 2307 S_028838_HS_GPRS(0x1e) | 2308 S_028838_LS_GPRS(0x1e), NULL, 0); /* workaround for hw issues with dyn gpr - must set all limits to 240 instead of 0, 0x1e == 240 / 8*/ 2309 } else { 2310 tmp = 0; 2311 tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs); 2312 tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs); 2313 tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs); 2314 r600_pipe_state_add_reg(rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, tmp, NULL, 0); 2315 2316 tmp = 0; 2317 tmp |= S_008C08_NUM_GS_GPRS(num_gs_gprs); 2318 tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs); 2319 r600_pipe_state_add_reg(rstate, R_008C08_SQ_GPR_RESOURCE_MGMT_2, tmp, NULL, 0); 2320 2321 tmp = 0; 2322 tmp |= S_008C0C_NUM_HS_GPRS(num_hs_gprs); 2323 tmp |= S_008C0C_NUM_HS_GPRS(num_ls_gprs); 2324 r600_pipe_state_add_reg(rstate, R_008C0C_SQ_GPR_RESOURCE_MGMT_3, tmp, NULL, 0); 2325 } 2326 2327 tmp = 0; 2328 tmp |= S_008C18_NUM_PS_THREADS(num_ps_threads); 2329 tmp |= S_008C18_NUM_VS_THREADS(num_vs_threads); 2330 tmp |= S_008C18_NUM_GS_THREADS(num_gs_threads); 2331 tmp |= S_008C18_NUM_ES_THREADS(num_es_threads); 2332 r600_pipe_state_add_reg(rstate, R_008C18_SQ_THREAD_RESOURCE_MGMT_1, tmp, NULL, 0); 2333 2334 tmp = 0; 2335 tmp |= S_008C1C_NUM_HS_THREADS(num_hs_threads); 2336 tmp |= S_008C1C_NUM_LS_THREADS(num_ls_threads); 2337 r600_pipe_state_add_reg(rstate, R_008C1C_SQ_THREAD_RESOURCE_MGMT_2, tmp, NULL, 0); 2338 2339 tmp = 0; 2340 tmp |= S_008C20_NUM_PS_STACK_ENTRIES(num_ps_stack_entries); 2341 tmp |= S_008C20_NUM_VS_STACK_ENTRIES(num_vs_stack_entries); 2342 r600_pipe_state_add_reg(rstate, R_008C20_SQ_STACK_RESOURCE_MGMT_1, tmp, NULL, 0); 2343 2344 tmp = 0; 2345 tmp |= S_008C24_NUM_GS_STACK_ENTRIES(num_gs_stack_entries); 2346 tmp |= S_008C24_NUM_ES_STACK_ENTRIES(num_es_stack_entries); 2347 r600_pipe_state_add_reg(rstate, R_008C24_SQ_STACK_RESOURCE_MGMT_2, tmp, NULL, 0); 2348 2349 tmp = 0; 2350 tmp |= S_008C28_NUM_HS_STACK_ENTRIES(num_hs_stack_entries); 2351 tmp |= S_008C28_NUM_LS_STACK_ENTRIES(num_ls_stack_entries); 2352 r600_pipe_state_add_reg(rstate, R_008C28_SQ_STACK_RESOURCE_MGMT_3, tmp, NULL, 0); 2353 2354 tmp = 0; 2355 tmp |= S_008E2C_NUM_PS_LDS(0x1000); 2356 tmp |= S_008E2C_NUM_LS_LDS(0x1000); 2357 r600_pipe_state_add_reg(rstate, R_008E2C_SQ_LDS_RESOURCE_MGMT, tmp, NULL, 0); 2358 2359 r600_pipe_state_add_reg(rstate, R_009100_SPI_CONFIG_CNTL, 0x0, NULL, 0); 2360 r600_pipe_state_add_reg(rstate, R_00913C_SPI_CONFIG_CNTL_1, S_00913C_VTX_DONE_DELAY(4), NULL, 0); 2361 2362#if 0 2363 r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, 0x0, NULL, 0); 2364 2365 r600_pipe_state_add_reg(rstate, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x0, NULL, 0); 2366#endif 2367 r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL_1, 0x0, NULL, 0); 2368 2369 r600_pipe_state_add_reg(rstate, R_028900_SQ_ESGS_RING_ITEMSIZE, 0x0, NULL, 0); 2370 r600_pipe_state_add_reg(rstate, R_028904_SQ_GSVS_RING_ITEMSIZE, 0x0, NULL, 0); 2371 r600_pipe_state_add_reg(rstate, R_028908_SQ_ESTMP_RING_ITEMSIZE, 0x0, NULL, 0); 2372 r600_pipe_state_add_reg(rstate, R_02890C_SQ_GSTMP_RING_ITEMSIZE, 0x0, NULL, 0); 2373 r600_pipe_state_add_reg(rstate, R_028910_SQ_VSTMP_RING_ITEMSIZE, 0x0, NULL, 0); 2374 r600_pipe_state_add_reg(rstate, R_028914_SQ_PSTMP_RING_ITEMSIZE, 0x0, NULL, 0); 2375 2376 r600_pipe_state_add_reg(rstate, R_02891C_SQ_GS_VERT_ITEMSIZE, 0x0, NULL, 0); 2377 r600_pipe_state_add_reg(rstate, R_028920_SQ_GS_VERT_ITEMSIZE_1, 0x0, NULL, 0); 2378 r600_pipe_state_add_reg(rstate, R_028924_SQ_GS_VERT_ITEMSIZE_2, 0x0, NULL, 0); 2379 r600_pipe_state_add_reg(rstate, R_028928_SQ_GS_VERT_ITEMSIZE_3, 0x0, NULL, 0); 2380 2381 r600_pipe_state_add_reg(rstate, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0, NULL, 0); 2382 r600_pipe_state_add_reg(rstate, R_028A14_VGT_HOS_CNTL, 0x0, NULL, 0); 2383 r600_pipe_state_add_reg(rstate, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0, NULL, 0); 2384 r600_pipe_state_add_reg(rstate, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0, NULL, 0); 2385 r600_pipe_state_add_reg(rstate, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0, NULL, 0); 2386 r600_pipe_state_add_reg(rstate, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0, NULL, 0); 2387 r600_pipe_state_add_reg(rstate, R_028A28_VGT_GROUP_FIRST_DECR, 0x0, NULL, 0); 2388 r600_pipe_state_add_reg(rstate, R_028A2C_VGT_GROUP_DECR, 0x0, NULL, 0); 2389 r600_pipe_state_add_reg(rstate, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0, NULL, 0); 2390 r600_pipe_state_add_reg(rstate, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0, NULL, 0); 2391 r600_pipe_state_add_reg(rstate, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0, NULL, 0); 2392 r600_pipe_state_add_reg(rstate, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0, NULL, 0); 2393 r600_pipe_state_add_reg(rstate, R_028A40_VGT_GS_MODE, 0x0, NULL, 0); 2394 r600_pipe_state_add_reg(rstate, R_028B94_VGT_STRMOUT_CONFIG, 0x0, NULL, 0); 2395 r600_pipe_state_add_reg(rstate, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0, NULL, 0); 2396 r600_pipe_state_add_reg(rstate, R_028AB4_VGT_REUSE_OFF, 0x00000000, NULL, 0); 2397 r600_pipe_state_add_reg(rstate, R_028AB8_VGT_VTX_CNT_EN, 0x0, NULL, 0); 2398 r600_pipe_state_add_reg(rstate, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1, NULL, 0); 2399 2400 r600_pipe_state_add_reg(rstate, R_028380_SQ_VTX_SEMANTIC_0, 0x0, NULL, 0); 2401 r600_pipe_state_add_reg(rstate, R_028384_SQ_VTX_SEMANTIC_1, 0x0, NULL, 0); 2402 r600_pipe_state_add_reg(rstate, R_028388_SQ_VTX_SEMANTIC_2, 0x0, NULL, 0); 2403 r600_pipe_state_add_reg(rstate, R_02838C_SQ_VTX_SEMANTIC_3, 0x0, NULL, 0); 2404 r600_pipe_state_add_reg(rstate, R_028390_SQ_VTX_SEMANTIC_4, 0x0, NULL, 0); 2405 r600_pipe_state_add_reg(rstate, R_028394_SQ_VTX_SEMANTIC_5, 0x0, NULL, 0); 2406 r600_pipe_state_add_reg(rstate, R_028398_SQ_VTX_SEMANTIC_6, 0x0, NULL, 0); 2407 r600_pipe_state_add_reg(rstate, R_02839C_SQ_VTX_SEMANTIC_7, 0x0, NULL, 0); 2408 r600_pipe_state_add_reg(rstate, R_0283A0_SQ_VTX_SEMANTIC_8, 0x0, NULL, 0); 2409 r600_pipe_state_add_reg(rstate, R_0283A4_SQ_VTX_SEMANTIC_9, 0x0, NULL, 0); 2410 r600_pipe_state_add_reg(rstate, R_0283A8_SQ_VTX_SEMANTIC_10, 0x0, NULL, 0); 2411 r600_pipe_state_add_reg(rstate, R_0283AC_SQ_VTX_SEMANTIC_11, 0x0, NULL, 0); 2412 r600_pipe_state_add_reg(rstate, R_0283B0_SQ_VTX_SEMANTIC_12, 0x0, NULL, 0); 2413 r600_pipe_state_add_reg(rstate, R_0283B4_SQ_VTX_SEMANTIC_13, 0x0, NULL, 0); 2414 r600_pipe_state_add_reg(rstate, R_0283B8_SQ_VTX_SEMANTIC_14, 0x0, NULL, 0); 2415 r600_pipe_state_add_reg(rstate, R_0283BC_SQ_VTX_SEMANTIC_15, 0x0, NULL, 0); 2416 r600_pipe_state_add_reg(rstate, R_0283C0_SQ_VTX_SEMANTIC_16, 0x0, NULL, 0); 2417 r600_pipe_state_add_reg(rstate, R_0283C4_SQ_VTX_SEMANTIC_17, 0x0, NULL, 0); 2418 r600_pipe_state_add_reg(rstate, R_0283C8_SQ_VTX_SEMANTIC_18, 0x0, NULL, 0); 2419 r600_pipe_state_add_reg(rstate, R_0283CC_SQ_VTX_SEMANTIC_19, 0x0, NULL, 0); 2420 r600_pipe_state_add_reg(rstate, R_0283D0_SQ_VTX_SEMANTIC_20, 0x0, NULL, 0); 2421 r600_pipe_state_add_reg(rstate, R_0283D4_SQ_VTX_SEMANTIC_21, 0x0, NULL, 0); 2422 r600_pipe_state_add_reg(rstate, R_0283D8_SQ_VTX_SEMANTIC_22, 0x0, NULL, 0); 2423 r600_pipe_state_add_reg(rstate, R_0283DC_SQ_VTX_SEMANTIC_23, 0x0, NULL, 0); 2424 r600_pipe_state_add_reg(rstate, R_0283E0_SQ_VTX_SEMANTIC_24, 0x0, NULL, 0); 2425 r600_pipe_state_add_reg(rstate, R_0283E4_SQ_VTX_SEMANTIC_25, 0x0, NULL, 0); 2426 r600_pipe_state_add_reg(rstate, R_0283E8_SQ_VTX_SEMANTIC_26, 0x0, NULL, 0); 2427 r600_pipe_state_add_reg(rstate, R_0283EC_SQ_VTX_SEMANTIC_27, 0x0, NULL, 0); 2428 r600_pipe_state_add_reg(rstate, R_0283F0_SQ_VTX_SEMANTIC_28, 0x0, NULL, 0); 2429 r600_pipe_state_add_reg(rstate, R_0283F4_SQ_VTX_SEMANTIC_29, 0x0, NULL, 0); 2430 r600_pipe_state_add_reg(rstate, R_0283F8_SQ_VTX_SEMANTIC_30, 0x0, NULL, 0); 2431 r600_pipe_state_add_reg(rstate, R_0283FC_SQ_VTX_SEMANTIC_31, 0x0, NULL, 0); 2432 2433 r600_pipe_state_add_reg(rstate, R_028810_PA_CL_CLIP_CNTL, 0x0, NULL, 0); 2434 2435 r600_context_pipe_state_set(rctx, rstate); 2436} 2437 2438void evergreen_polygon_offset_update(struct r600_context *rctx) 2439{ 2440 struct r600_pipe_state state; 2441 2442 state.id = R600_PIPE_STATE_POLYGON_OFFSET; 2443 state.nregs = 0; 2444 if (rctx->rasterizer && rctx->framebuffer.zsbuf) { 2445 float offset_units = rctx->rasterizer->offset_units; 2446 unsigned offset_db_fmt_cntl = 0, depth; 2447 2448 switch (rctx->framebuffer.zsbuf->texture->format) { 2449 case PIPE_FORMAT_Z24X8_UNORM: 2450 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 2451 depth = -24; 2452 offset_units *= 2.0f; 2453 break; 2454 case PIPE_FORMAT_Z32_FLOAT: 2455 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 2456 depth = -23; 2457 offset_units *= 1.0f; 2458 offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 2459 break; 2460 case PIPE_FORMAT_Z16_UNORM: 2461 depth = -16; 2462 offset_units *= 4.0f; 2463 break; 2464 default: 2465 return; 2466 } 2467 /* FIXME some of those reg can be computed with cso */ 2468 offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 2469 r600_pipe_state_add_reg(&state, 2470 R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE, 2471 fui(rctx->rasterizer->offset_scale), NULL, 0); 2472 r600_pipe_state_add_reg(&state, 2473 R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, 2474 fui(offset_units), NULL, 0); 2475 r600_pipe_state_add_reg(&state, 2476 R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE, 2477 fui(rctx->rasterizer->offset_scale), NULL, 0); 2478 r600_pipe_state_add_reg(&state, 2479 R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, 2480 fui(offset_units), NULL, 0); 2481 r600_pipe_state_add_reg(&state, 2482 R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 2483 offset_db_fmt_cntl, NULL, 0); 2484 r600_context_pipe_state_set(rctx, &state); 2485 } 2486} 2487 2488void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2489{ 2490 struct r600_context *rctx = (struct r600_context *)ctx; 2491 struct r600_pipe_state *rstate = &shader->rstate; 2492 struct r600_shader *rshader = &shader->shader; 2493 unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control; 2494 int pos_index = -1, face_index = -1; 2495 int ninterp = 0; 2496 boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE; 2497 unsigned spi_baryc_cntl, sid, tmp, idx = 0; 2498 2499 rstate->nregs = 0; 2500 2501 db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); 2502 for (i = 0; i < rshader->ninput; i++) { 2503 /* evergreen NUM_INTERP only contains values interpolated into the LDS, 2504 POSITION goes via GPRs from the SC so isn't counted */ 2505 if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 2506 pos_index = i; 2507 else if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 2508 face_index = i; 2509 else { 2510 ninterp++; 2511 if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) 2512 have_linear = TRUE; 2513 if (rshader->input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE) 2514 have_perspective = TRUE; 2515 if (rshader->input[i].centroid) 2516 have_centroid = TRUE; 2517 } 2518 2519 sid = rshader->input[i].spi_sid; 2520 2521 if (sid) { 2522 2523 tmp = S_028644_SEMANTIC(sid); 2524 2525 if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || 2526 rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 2527 (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && 2528 rctx->rasterizer && rctx->rasterizer->flatshade)) { 2529 tmp |= S_028644_FLAT_SHADE(1); 2530 } 2531 2532 if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 2533 (rctx->sprite_coord_enable & (1 << rshader->input[i].sid))) { 2534 tmp |= S_028644_PT_SPRITE_TEX(1); 2535 } 2536 2537 r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + idx * 4, 2538 tmp, NULL, 0); 2539 2540 idx++; 2541 } 2542 } 2543 2544 for (i = 0; i < rshader->noutput; i++) { 2545 if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 2546 db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1); 2547 if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2548 db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(1); 2549 } 2550 if (rshader->uses_kill) 2551 db_shader_control |= S_02880C_KILL_ENABLE(1); 2552 2553 exports_ps = 0; 2554 num_cout = 0; 2555 for (i = 0; i < rshader->noutput; i++) { 2556 if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || 2557 rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2558 exports_ps |= 1; 2559 else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 2560 if (rshader->fs_write_all) 2561 num_cout = rshader->nr_cbufs; 2562 else 2563 num_cout++; 2564 } 2565 } 2566 exports_ps |= S_02884C_EXPORT_COLORS(num_cout); 2567 if (!exports_ps) { 2568 /* always at least export 1 component per pixel */ 2569 exports_ps = 2; 2570 } 2571 2572 if (ninterp == 0) { 2573 ninterp = 1; 2574 have_perspective = TRUE; 2575 } 2576 2577 if (!have_perspective && !have_linear) 2578 have_perspective = TRUE; 2579 2580 spi_ps_in_control_0 = S_0286CC_NUM_INTERP(ninterp) | 2581 S_0286CC_PERSP_GRADIENT_ENA(have_perspective) | 2582 S_0286CC_LINEAR_GRADIENT_ENA(have_linear); 2583 spi_input_z = 0; 2584 if (pos_index != -1) { 2585 spi_ps_in_control_0 |= S_0286CC_POSITION_ENA(1) | 2586 S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 2587 S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr); 2588 spi_input_z |= 1; 2589 } 2590 2591 spi_ps_in_control_1 = 0; 2592 if (face_index != -1) { 2593 spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 2594 S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 2595 } 2596 2597 spi_baryc_cntl = 0; 2598 if (have_perspective) 2599 spi_baryc_cntl |= S_0286E0_PERSP_CENTER_ENA(1) | 2600 S_0286E0_PERSP_CENTROID_ENA(have_centroid); 2601 if (have_linear) 2602 spi_baryc_cntl |= S_0286E0_LINEAR_CENTER_ENA(1) | 2603 S_0286E0_LINEAR_CENTROID_ENA(have_centroid); 2604 2605 r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, 2606 spi_ps_in_control_0, NULL, 0); 2607 r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, 2608 spi_ps_in_control_1, NULL, 0); 2609 r600_pipe_state_add_reg(rstate, R_0286E4_SPI_PS_IN_CONTROL_2, 2610 0, NULL, 0); 2611 r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, NULL, 0); 2612 r600_pipe_state_add_reg(rstate, 2613 R_0286E0_SPI_BARYC_CNTL, 2614 spi_baryc_cntl, 2615 NULL, 0); 2616 2617 r600_pipe_state_add_reg(rstate, 2618 R_028840_SQ_PGM_START_PS, 2619 r600_resource_va(ctx->screen, (void *)shader->bo) >> 8, 2620 shader->bo, RADEON_USAGE_READ); 2621 r600_pipe_state_add_reg(rstate, 2622 R_028844_SQ_PGM_RESOURCES_PS, 2623 S_028844_NUM_GPRS(rshader->bc.ngpr) | 2624 S_028844_PRIME_CACHE_ON_DRAW(1) | 2625 S_028844_STACK_SIZE(rshader->bc.nstack), 2626 NULL, 0); 2627 r600_pipe_state_add_reg(rstate, 2628 R_028848_SQ_PGM_RESOURCES_2_PS, 2629 S_028848_SINGLE_ROUND(V_SQ_ROUND_TO_ZERO), 2630 NULL, 0); 2631 r600_pipe_state_add_reg(rstate, 2632 R_02884C_SQ_PGM_EXPORTS_PS, 2633 exports_ps, NULL, 0); 2634 r600_pipe_state_add_reg(rstate, R_02880C_DB_SHADER_CONTROL, 2635 db_shader_control, 2636 NULL, 0); 2637 r600_pipe_state_add_reg(rstate, 2638 R_03A200_SQ_LOOP_CONST_0, 0x01000FFF, 2639 NULL, 0); 2640 2641 shader->sprite_coord_enable = rctx->sprite_coord_enable; 2642 if (rctx->rasterizer) 2643 shader->flatshade = rctx->rasterizer->flatshade; 2644} 2645 2646void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2647{ 2648 struct r600_context *rctx = (struct r600_context *)ctx; 2649 struct r600_pipe_state *rstate = &shader->rstate; 2650 struct r600_shader *rshader = &shader->shader; 2651 unsigned spi_vs_out_id[10] = {}; 2652 unsigned i, tmp, nparams = 0; 2653 2654 /* clear previous register */ 2655 rstate->nregs = 0; 2656 2657 for (i = 0; i < rshader->noutput; i++) { 2658 if (rshader->output[i].spi_sid) { 2659 tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); 2660 spi_vs_out_id[nparams / 4] |= tmp; 2661 nparams++; 2662 } 2663 } 2664 2665 for (i = 0; i < 10; i++) { 2666 r600_pipe_state_add_reg(rstate, 2667 R_02861C_SPI_VS_OUT_ID_0 + i * 4, 2668 spi_vs_out_id[i], NULL, 0); 2669 } 2670 2671 /* Certain attributes (position, psize, etc.) don't count as params. 2672 * VS is required to export at least one param and r600_shader_from_tgsi() 2673 * takes care of adding a dummy export. 2674 */ 2675 if (nparams < 1) 2676 nparams = 1; 2677 2678 r600_pipe_state_add_reg(rstate, 2679 R_0286C4_SPI_VS_OUT_CONFIG, 2680 S_0286C4_VS_EXPORT_COUNT(nparams - 1), 2681 NULL, 0); 2682 r600_pipe_state_add_reg(rstate, 2683 R_028860_SQ_PGM_RESOURCES_VS, 2684 S_028860_NUM_GPRS(rshader->bc.ngpr) | 2685 S_028860_STACK_SIZE(rshader->bc.nstack), 2686 NULL, 0); 2687 r600_pipe_state_add_reg(rstate, 2688 R_028864_SQ_PGM_RESOURCES_2_VS, 2689 S_028864_SINGLE_ROUND(V_SQ_ROUND_TO_ZERO), 2690 NULL, 0); 2691 r600_pipe_state_add_reg(rstate, 2692 R_02885C_SQ_PGM_START_VS, 2693 r600_resource_va(ctx->screen, (void *)shader->bo) >> 8, 2694 shader->bo, RADEON_USAGE_READ); 2695 2696 r600_pipe_state_add_reg(rstate, 2697 R_03A200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF, 2698 NULL, 0); 2699 2700 shader->pa_cl_vs_out_cntl = 2701 S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) | 2702 S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) | 2703 S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) | 2704 S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size); 2705} 2706 2707void evergreen_fetch_shader(struct pipe_context *ctx, 2708 struct r600_vertex_element *ve) 2709{ 2710 struct r600_context *rctx = (struct r600_context *)ctx; 2711 struct r600_pipe_state *rstate = &ve->rstate; 2712 rstate->id = R600_PIPE_STATE_FETCH_SHADER; 2713 rstate->nregs = 0; 2714 r600_pipe_state_add_reg(rstate, R_0288A8_SQ_PGM_RESOURCES_FS, 2715 0x00000000, NULL, 0); 2716 r600_pipe_state_add_reg(rstate, R_0288A4_SQ_PGM_START_FS, 2717 r600_resource_va(ctx->screen, (void *)ve->fetch_shader) >> 8, 2718 ve->fetch_shader, RADEON_USAGE_READ); 2719} 2720 2721void *evergreen_create_db_flush_dsa(struct r600_context *rctx) 2722{ 2723 struct pipe_depth_stencil_alpha_state dsa; 2724 struct r600_pipe_state *rstate; 2725 2726 memset(&dsa, 0, sizeof(dsa)); 2727 2728 rstate = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 2729 r600_pipe_state_add_reg(rstate, 2730 R_028000_DB_RENDER_CONTROL, 2731 S_028000_DEPTH_COPY_ENABLE(1) | 2732 S_028000_STENCIL_COPY_ENABLE(1) | 2733 S_028000_COPY_CENTROID(1), 2734 NULL, 0); 2735 return rstate; 2736} 2737 2738void evergreen_pipe_init_buffer_resource(struct r600_context *rctx, 2739 struct r600_pipe_resource_state *rstate) 2740{ 2741 rstate->id = R600_PIPE_STATE_RESOURCE; 2742 2743 rstate->val[0] = 0; 2744 rstate->bo[0] = NULL; 2745 rstate->val[1] = 0; 2746 rstate->val[2] = S_030008_ENDIAN_SWAP(r600_endian_swap(32)); 2747 rstate->val[3] = S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) | 2748 S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) | 2749 S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) | 2750 S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W); 2751 rstate->val[4] = 0; 2752 rstate->val[5] = 0; 2753 rstate->val[6] = 0; 2754 rstate->val[7] = 0xc0000000; 2755} 2756 2757 2758void evergreen_pipe_mod_buffer_resource(struct pipe_context *ctx, 2759 struct r600_pipe_resource_state *rstate, 2760 struct r600_resource *rbuffer, 2761 unsigned offset, unsigned stride, 2762 enum radeon_bo_usage usage) 2763{ 2764 uint64_t va; 2765 2766 va = r600_resource_va(ctx->screen, (void *)rbuffer); 2767 rstate->bo[0] = rbuffer; 2768 rstate->bo_usage[0] = usage; 2769 rstate->val[0] = (offset + va) & 0xFFFFFFFFUL; 2770 rstate->val[1] = rbuffer->buf->size - offset - 1; 2771 rstate->val[2] = S_030008_ENDIAN_SWAP(r600_endian_swap(32)) | 2772 S_030008_STRIDE(stride) | 2773 (((va + offset) >> 32UL) & 0xFF); 2774} 2775