r600_state.c revision fc887d687b0598e09de76be885652d96e20ae07e
1fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse/* 2fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 3fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * 4fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 5fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * copy of this software and associated documentation files (the "Software"), 6fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * to deal in the Software without restriction, including without limitation 7fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 8fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 9fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * the Software is furnished to do so, subject to the following conditions: 10fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * 11fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * The above copyright notice and this permission notice (including the next 12fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the 13fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * Software. 14fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * 15fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 22fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse */ 23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "r600_formats.h" 24330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "r600d.h" 25fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 26330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "pipe/p_shader_tokens.h" 278fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_pack_color.h" 288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_memory.h" 298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_framebuffer.h" 30d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie#include "util/u_dual_blend.h" 313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_function(int blend_func) 333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_func) { 353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_ADD: 363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_PLUS_SRC; 373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_SUBTRACT: 383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_SRC_MINUS_DST; 393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_REVERSE_SUBTRACT: 403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_MINUS_SRC; 413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MIN: 423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MIN_DST_SRC; 433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MAX: 443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MAX_DST_SRC; 453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Unknown blend function %d\n", blend_func); 473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_factor(int blend_fact) 543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_fact) { 563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ONE: 573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE; 583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_COLOR: 593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_COLOR; 603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA: 613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA; 623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_ALPHA: 633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_ALPHA; 643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_COLOR: 653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_COLOR; 663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA_SATURATE; 683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_COLOR: 693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_COLOR; 703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_ALPHA: 713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_ALPHA; 723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ZERO: 733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ZERO; 743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_COLOR: 753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_COLOR; 763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_ALPHA; 783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_ALPHA: 793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_ALPHA; 803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_COLOR: 813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_COLOR; 823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_COLOR: 833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_COLOR; 843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_ALPHA; 863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_COLOR: 873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_COLOR; 883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_ALPHA: 893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_ALPHA; 903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_COLOR; 923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_ALPHA; 943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic unsigned r600_tex_dim(unsigned dim, unsigned nr_samples) 1033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (dim) { 1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D: 1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D; 1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D_ARRAY: 1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D_ARRAY; 1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D: 1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_RECT: 1128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_MSAA : 1138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák V_038000_SQ_TEX_DIM_2D; 1143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D_ARRAY: 1158698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA : 1168698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák V_038000_SQ_TEX_DIM_2D_ARRAY; 1173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_3D: 1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_3D; 1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_CUBE: 1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_CUBEMAP; 1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_dbformat(enum pipe_format format) 1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_16; 1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_X8_24; 131866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_8_24; 13389954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 13489954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_32_FLOAT; 135866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 13689954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_X24_8_32_FLOAT; 1373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorswap(enum pipe_format format) 1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 147914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A8_SNORM: 1488d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 1498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 150914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UNORM: 151914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SNORM: 152914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UINT: 153914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SINT: 154914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_FLOAT: 155914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_UINT: 156914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_SINT: 157914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_FLOAT: 1580d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 1593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 161914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I8_SNORM: 1628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 1638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 164914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_UNORM: 165914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_SNORM: 1668d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 1678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 1683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 169914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UNORM: 170914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SNORM: 171914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UINT: 172914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SINT: 173914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_FLOAT: 174914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_UINT: 175914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_SINT: 176914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_FLOAT: 177914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UNORM: 178914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SNORM: 179914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UINT: 180914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SINT: 181914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_FLOAT: 182914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_UINT: 183914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_SINT: 184914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_FLOAT: 1853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 1863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 18777058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_UINT: 18877058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_SINT: 1893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 1903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 1920d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 1933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 1973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 2003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 2013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 2043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 2053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 2083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 211914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8A8_SNORM: 2128d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 2138d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 2143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 215914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 216914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 217914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UINT: 218914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SINT: 219914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 220914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_UINT: 221914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_SINT: 222914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 2233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 225914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 2268d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 2278d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 2283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 231914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16_SNORM: 2328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 2338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 2343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 2353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 2383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 2403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 2423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 2453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 2463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 2548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 2558d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 2563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 2613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 264866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 2653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 268866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 2693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 2723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 2733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 2743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 2779608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 2783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 2813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 282914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 2833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 2848d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 2858d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 2868d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_UINT: 2878d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_SINT: 2883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 28989954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 2903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 2948d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 2958d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 2963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 2988d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 2998d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 3003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 301866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 3023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 3043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 3053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 3063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 3078d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 3088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 3093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 3103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 3113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("unsupported colorswap format %d\n", format); 3123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 3133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 3143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 3153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 3163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorformat(enum pipe_format format) 3183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 3193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 3203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 3210d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 3220d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 3233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4; 3243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 3263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 327914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A8_SNORM: 3288d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 3298d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 3303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 331914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I8_SNORM: 3328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 3338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 3343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_UNORM: 335914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_SNORM: 3368d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 3378d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 3383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 3393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 3403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 3418d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_UINT: 3428d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_SINT: 3433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8; 3443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 3463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 3473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_5_6_5; 3483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 3503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 3513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_1_5_5_5; 3523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 3543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 3553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4_4_4; 3563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 3583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 361914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8A8_SNORM: 3628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 3638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 3643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 3653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 366914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 3678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 3688d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 3693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8; 3703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 372914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16_SNORM: 3738d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 3748d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 375914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UNORM: 376914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SNORM: 377914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UINT: 378914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SINT: 379914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UNORM: 380914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SNORM: 381914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UINT: 382914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SINT: 383914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UNORM: 384914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SNORM: 385914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UINT: 386914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SINT: 3873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 390914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_FLOAT: 391914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_FLOAT: 392914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_FLOAT: 3933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_FLOAT; 3943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 3963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 3973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 3983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 3993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 4003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 4013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 4023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 4033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 4043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 4053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 4063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 4073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 4088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 4098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 4103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8_8_8; 4113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 4133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 4143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 4159608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 4163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 4173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_2_10_10_10; 4183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 420866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 4213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_24; 4223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 424866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 4253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_24_8; 4263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 427866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 42889954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_0280A0_COLOR_X24_8_32_FLOAT; 42989954723bfeef59d055d2332ff112f0204b48130Marek Olšák 4305250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_UINT: 4315250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_SINT: 432914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_UINT: 433914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_SINT: 434914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_UINT: 435914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_SINT: 436914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_UINT: 437914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_SINT: 4385250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie return V_0280A0_COLOR_32; 4395250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie 4403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 441914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_FLOAT: 442914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_FLOAT: 443914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_FLOAT: 44489954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 4453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_FLOAT; 4463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 448914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 4493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_FLOAT; 4503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 452914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 4538d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 4548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 455914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 456914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 457914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UINT: 458914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SINT: 4593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16; 4603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 4623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_10_11_11_FLOAT; 4633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 4658d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 4668d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 4673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 4683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 4693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16; 4703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 4723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16_FLOAT; 4733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 475914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 4763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_FLOAT; 4773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4788d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 4798d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 480914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_UINT: 481914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_SINT: 4823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32; 4833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 4853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 4863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32_FLOAT; 4873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 4883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 4898d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 4908d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 4913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32; 4923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* YUV buffers. */ 4943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_UYVY: 4953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_YUYV: 4963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 4973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; /* Unsupported. */ 4983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 4993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_colorformat_endian_swap(uint32_t colorformat) 5023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet if (R600_BIG_ENDIAN) { 5043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch(colorformat) { 5053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4: 5067e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 5073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 5093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8: 5107e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 5113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 5133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_5_6_5: 5143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_1_5_5_5: 5153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4_4_4: 5163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16: 5173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8: 5187e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 5193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 5213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8_8_8: 5223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_2_10_10_10: 5233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_24: 5243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_24_8: 5253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_FLOAT: 5263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_FLOAT: 5273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16: 5287e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 5313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16: 5323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16_FLOAT: 5337e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 5343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_FLOAT: 5363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32: 53789954723bfeef59d055d2332ff112f0204b48130Marek Olšák case V_0280A0_COLOR_X24_8_32_FLOAT: 5387e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 5413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_FLOAT: 5423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32_FLOAT: 5433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32: 5447e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 5463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; /* Unsupported. */ 5473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } else { 5493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; 5503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 5543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U; 5563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_colorbuffer_format_supported(enum pipe_format format) 5593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_colorformat(format) != ~0U && 5613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet r600_translate_colorswap(format) != ~0U; 5623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_zs_format_supported(enum pipe_format format) 5653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_dbformat(format) != ~0U; 5673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 568fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 56918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetboolean r600_is_format_supported(struct pipe_screen *screen, 57018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_format format, 57118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_texture_target target, 57218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned sample_count, 57318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned usage) 57418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet{ 5758698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_screen *rscreen = (struct r600_screen*)screen; 57618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned retval = 0; 57718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 57818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (target >= PIPE_MAX_TEXTURE_TYPES) { 57918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet R600_ERR("r600: unsupported texture type %d\n", target); 58018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 58118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 58218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 58318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (!util_format_is_supported(format, usage)) 58418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 58518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 5868698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (sample_count > 1) { 587c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák if (rscreen->info.drm_minor < 22) 5888698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 589c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák 590c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák /* R11G11B10 is broken on R6xx. */ 591c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák if (rscreen->chip_class == R600 && 592c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák format == PIPE_FORMAT_R11G11B10_FLOAT) 5938698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 5948698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 595df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák /* MSAA integer colorbuffers hang. */ 596fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák if (util_format_is_pure_integer(format) && 597fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák !util_format_is_depth_or_stencil(format)) 598df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák return FALSE; 599df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák 6008698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák switch (sample_count) { 6018698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 2: 6028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 4: 6038698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 8: 6048698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák break; 6058698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák default: 6068698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 6078698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 6088698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 60918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 61018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_SAMPLER_VIEW) && 61118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_sampler_format_supported(screen, format)) { 61218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_SAMPLER_VIEW; 61318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 61418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 61518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & (PIPE_BIND_RENDER_TARGET | 61618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 61718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 61818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED)) && 61918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_colorbuffer_format_supported(format)) { 62018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= usage & 62118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet (PIPE_BIND_RENDER_TARGET | 62218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 62318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 62418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED); 62518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 62618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 62718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_DEPTH_STENCIL) && 62818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_zs_format_supported(format)) { 62918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_DEPTH_STENCIL; 63018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 63118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 63218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_VERTEX_BUFFER) && 63318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_vertex_format_supported(format)) { 63418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_VERTEX_BUFFER; 63518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 63618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 63718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_READ) 63818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_READ; 63918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_WRITE) 64018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_WRITE; 64118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 64218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return retval == usage; 64318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet} 64418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 645e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_polygon_offset_update(struct r600_context *rctx) 6460b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse{ 6470b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse struct r600_pipe_state state; 6480b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 6490b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse state.id = R600_PIPE_STATE_POLYGON_OFFSET; 6500b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse state.nregs = 0; 651c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->rasterizer && rctx->framebuffer.state.zsbuf) { 6520b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse float offset_units = rctx->rasterizer->offset_units; 6530b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse unsigned offset_db_fmt_cntl = 0, depth; 6540b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 655c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák switch (rctx->framebuffer.state.zsbuf->format) { 6560b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z24X8_UNORM: 657866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 6580b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -24; 6590b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 2.0f; 6600b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6610b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z32_FLOAT: 662866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 6630b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -23; 6640b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 1.0f; 6650b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 6660b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6670b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z16_UNORM: 6680b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -16; 6690b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 4.0f; 6700b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6710b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse default: 6720b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse return; 6730b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 674370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák /* XXX some of those reg can be computed with cso */ 6750b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 6760b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6770b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E00_PA_SU_POLY_OFFSET_FRONT_SCALE, 67862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie fui(rctx->rasterizer->offset_scale)); 6790b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6800b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E04_PA_SU_POLY_OFFSET_FRONT_OFFSET, 68162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie fui(offset_units)); 6820b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6830b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E08_PA_SU_POLY_OFFSET_BACK_SCALE, 68462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie fui(rctx->rasterizer->offset_scale)); 6850b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6860b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E0C_PA_SU_POLY_OFFSET_BACK_OFFSET, 68762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie fui(offset_units)); 6880b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6890b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028DF8_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 69062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie offset_db_fmt_cntl); 691e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, &state); 6920b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 6930b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse} 6940b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 6958698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic void *r600_create_blend_state_mode(struct pipe_context *ctx, 6968698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák const struct pipe_blend_state *state, 6978698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák int mode) 698fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 699e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 700fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend); 701fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate; 7028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák uint32_t color_control = 0, target_mask = 0; 703fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 704fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (blend == NULL) { 705fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 706fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 707fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate = &blend->rstate; 708fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 709fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_BLEND; 710fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7113e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher /* R600 does not support per-MRT blends */ 7123e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (rctx->family > CHIP_R600) 7133e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher color_control |= S_028808_PER_MRT_BLEND(1); 7148698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 715fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->logicop_enable) { 716fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (state->logicop_func << 16) | (state->logicop_func << 20); 717fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 718fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (0xcc << 16); 719fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 720fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 721fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->independent_blend_enable) { 722fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 723fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[i].blend_enable) { 724fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 725fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 726fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[i].colormask << (4 * i)); 727fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 728fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 729fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 730fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[0].blend_enable) { 731fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 732fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 733fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[0].colormask << (4 * i)); 734fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 735fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 73643e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák 73743e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák if (target_mask) 7388698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_control |= S_028808_SPECIAL_OP(mode); 73943e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák else 74043e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák color_control |= S_028808_SPECIAL_OP(V_028808_DISABLE); 74143e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák 742fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse blend->cb_target_mask = target_mask; 74384b4b2a8aacf6655d3f2a9f03dec3913a00aabdbMarek Olšák blend->cb_color_control = color_control; 744d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie /* only MRT0 has dual src blend */ 745d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie blend->dual_src_blend = util_blend_state_is_dual(state, 0); 746fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 7473f8455d07b129062885f58237516ae0d1aa339eaJulian Adams /* state->rt entries > 0 only written if independent blending */ 7483f8455d07b129062885f58237516ae0d1aa339eaJulian Adams const int j = state->independent_blend_enable ? i : 0; 7497ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 7503f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned eqRGB = state->rt[j].rgb_func; 7513f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned srcRGB = state->rt[j].rgb_src_factor; 7523f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned dstRGB = state->rt[j].rgb_dst_factor; 7533f8455d07b129062885f58237516ae0d1aa339eaJulian Adams 7543f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned eqA = state->rt[j].alpha_func; 7553f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned srcA = state->rt[j].alpha_src_factor; 7563f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned dstA = state->rt[j].alpha_dst_factor; 757fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse uint32_t bc = 0; 758fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7593f8455d07b129062885f58237516ae0d1aa339eaJulian Adams if (!state->rt[j].blend_enable) 760fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse continue; 761fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 762fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB)); 763fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB)); 764fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB)); 765fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 766fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 767fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_SEPARATE_ALPHA_BLEND(1); 768fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_COMB_FCN(r600_translate_blend_function(eqA)); 769fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA)); 770fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA)); 771fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 772fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7733e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher /* R600 does not support per-MRT blends */ 7743e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (rctx->family > CHIP_R600) 77562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, bc); 7763e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (i == 0) 77762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028804_CB_BLEND_CONTROL, bc); 778fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 77926cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák 7806517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák r600_pipe_state_add_reg(rstate, R_028D44_DB_ALPHA_TO_MASK, 7816517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák S_028D44_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) | 7826517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák S_028D44_ALPHA_TO_MASK_OFFSET0(2) | 7836517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák S_028D44_ALPHA_TO_MASK_OFFSET1(2) | 7846517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák S_028D44_ALPHA_TO_MASK_OFFSET2(2) | 7856517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák S_028D44_ALPHA_TO_MASK_OFFSET3(2)); 7866517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák 78726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák blend->alpha_to_one = state->alpha_to_one; 788fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 789fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 790fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7918698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 7928698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic void *r600_create_blend_state(struct pipe_context *ctx, 7938698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák const struct pipe_blend_state *state) 7948698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 7958698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return r600_create_blend_state_mode(ctx, state, V_028808_SPECIAL_NORMAL); 7968698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 7978698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 798fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_dsa_state(struct pipe_context *ctx, 799fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_depth_stencil_alpha_state *state) 800fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 801e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 802f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa); 8033d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák unsigned db_depth_control, alpha_test_control, alpha_ref; 804f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet struct r600_pipe_state *rstate; 805fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 806f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet if (dsa == NULL) { 807fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 808fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 809fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 810a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[0] = state->stencil[0].valuemask; 811a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[1] = state->stencil[1].valuemask; 812a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[0] = state->stencil[0].writemask; 813a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[1] = state->stencil[1].writemask; 814a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák 815f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet rstate = &dsa->rstate; 816f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet 817fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_DSA; 818fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 819fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 820fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_ZFUNC(state->depth.func); 821fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 822fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* stencil */ 823fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[0].enabled) { 824fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCIL_ENABLE(1); 825d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); /* translates straight */ 826fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op)); 827fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op)); 828fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op)); 829fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 830fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[1].enabled) { 831fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_BACKFACE_ENABLE(1); 832d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); /* translates straight */ 833fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op)); 834fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op)); 835fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op)); 836fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 837fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 838fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 839fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* alpha */ 840fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = 0; 841fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = 0; 842fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->alpha.enabled) { 843fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 844fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 845fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = fui(state->alpha.ref_value); 846fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 8474a26454e979251db25bab68685835fa32c099429Dave Airlie dsa->sx_alpha_test_control = alpha_test_control & 0xff; 848f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet dsa->alpha_ref = alpha_ref; 849fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 85062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control); 851fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 852fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 853fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 854fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_rs_state(struct pipe_context *ctx, 855543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák const struct pipe_rasterizer_state *state) 856fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 857e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 858fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer); 859fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate; 860fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned tmp; 861b534eb16a298ce02e723c53c1d021f35a4a873a2Jerome Glisse unsigned prov_vtx = 1, polygon_dual_mode; 862391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie unsigned sc_mode_cntl; 863f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák float psize_min, psize_max; 864fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 865fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rs == NULL) { 866fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 867fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 868fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 869a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 870a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák state->fill_back != PIPE_POLYGON_MODE_FILL); 871a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák 872a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák if (state->flatshade_first) 873a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák prov_vtx = 0; 874a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák 875fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate = &rs->rstate; 876fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->flatshade = state->flatshade; 877fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->sprite_coord_enable = state->sprite_coord_enable; 878725a820b926575265e6790601a0defd9c30947dcVadim Girlin rs->two_side = state->light_twoside; 87991d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin rs->clip_plane_enable = state->clip_plane_enable; 8802000086fcd5174f121f61dd6df5948c67101e148Marek Olšák rs->pa_sc_line_stipple = state->line_stipple_enable ? 8812000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 8822000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 883a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák rs->pa_cl_clip_cntl = 884a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_PS_UCP_MODE(3) | 885a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 886a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 887a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 88826cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák rs->multisample_enable = state->multisample; 889fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 89058c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse /* offset */ 89158c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_units = state->offset_units; 89258c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_scale = state->offset_scale * 12.0f; 89358c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse 894fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_RASTERIZER; 8951a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin tmp = S_0286D4_FLAT_SHADE_ENA(1); 896fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->sprite_coord_enable) { 897fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 898fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_X(2) | 899fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_Y(3) | 900fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_Z(0) | 901fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_W(1); 902fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 903fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 904fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 905fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 90662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp); 907fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 908fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* point size 12.4 fixed point */ 909a2e7629e688b6c258baf01e14dddf8c5ce645ee2Marek Olšák tmp = r600_pack_float_12p4(state->point_size/2); 91062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp)); 911f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák 912c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák if (state->point_size_per_vertex) { 913e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = util_get_min_point_size(state); 914e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = 8192; 915e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } else { 916e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák /* Force the point size to be as if the vertex output was disabled. */ 917e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = state->point_size; 918e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = state->point_size; 919e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } 920f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák /* Divide by two, because 0.5 = 1 pixel. */ 921f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 922f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 92362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2))); 924c28f7645722ed3da1a04d3187f9cfa5d8e5e489dKeith Whitwell 925c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák tmp = r600_pack_float_12p4(state->line_width/2); 92662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp)); 927c28f7645722ed3da1a04d3187f9cfa5d8e5e489dKeith Whitwell 928aacd653834264b70a2537aff7914762b39f0683fMarek Olšák if (rctx->chip_class >= R700) { 929aacd653834264b70a2537aff7914762b39f0683fMarek Olšák sc_mode_cntl = 9308698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028A4C_MSAA_ENABLE(state->multisample) | 931aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) | 932aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_FORCE_EOV_REZ_ENABLE(1) | 933aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_R700_ZMM_LINE_OFFSET(1) | 934aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_R700_VPORT_SCISSOR_ENABLE(state->scissor); 935aacd653834264b70a2537aff7914762b39f0683fMarek Olšák } else { 936aacd653834264b70a2537aff7914762b39f0683fMarek Olšák sc_mode_cntl = 9378698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028A4C_MSAA_ENABLE(state->multisample) | 938aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_WALK_ALIGN8_PRIM_FITS_ST(1) | 939aacd653834264b70a2537aff7914762b39f0683fMarek Olšák S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1); 940aacd653834264b70a2537aff7914762b39f0683fMarek Olšák rs->scissor_enable = state->scissor; 941aacd653834264b70a2537aff7914762b39f0683fMarek Olšák } 942391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie sc_mode_cntl |= S_028A4C_LINE_STIPPLE_ENABLE(state->line_stipple_enable); 943391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie 94462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL, sc_mode_cntl); 9457ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 946c3974dc837b4a11a30603bb00fa1d346e721af59Keith Whitwell r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL, 947f44bda17f515c411071ca8744ebd96039d9c583bVadim Girlin S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules) | 948f44bda17f515c411071ca8744ebd96039d9c583bVadim Girlin S_028C08_QUANT_MODE(V_028C08_X_1_256TH)); 9494a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 95062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028DFC_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp)); 951b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák r600_pipe_state_add_reg(rstate, R_028814_PA_SU_SC_MODE_CNTL, 952b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_PROVOKING_VTX_LAST(prov_vtx) | 953f6546535c9c8ce001e081487b8cd30b6703c0f4dMarek Olšák S_028814_CULL_FRONT(state->cull_face & PIPE_FACE_FRONT ? 1 : 0) | 954f6546535c9c8ce001e081487b8cd30b6703c0f4dMarek Olšák S_028814_CULL_BACK(state->cull_face & PIPE_FACE_BACK ? 1 : 0) | 955b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_FACE(!state->front_ccw) | 956b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 957b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 958b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 959b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_MODE(polygon_dual_mode) | 960b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) | 96162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back))); 96262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, S_028350_MULTIPASS(state->rasterizer_discard)); 963fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 964fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 965fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 966fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_sampler_state(struct pipe_context *ctx, 967fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_sampler_state *state) 968fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 969badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state); 970fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse union util_color uc; 971b9e8ea6a2717422ea71887beda093fe1dfbd1200Jerome Glisse unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0; 972fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 973badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák if (ss == NULL) { 974fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 975fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 976fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 977badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák ss->seamless_cube_map = state->seamless_cube_map; 9782df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color_use = false; 9799f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 9802df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */ 9812df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->tex_sampler_words[0] = S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) | 9822df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) | 9832df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) | 9842df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) | 9852df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) | 9862df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) | 9872df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) | 9882df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) | 9892df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0); 9902df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */ 9912df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->tex_sampler_words[1] = S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 6)) | 9922df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 6)) | 9932df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_03C004_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 6)); 9942df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C008_SQ_TEX_SAMPLER_WORD2_0 */ 9952df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->tex_sampler_words[2] = S_03C008_TYPE(1); 996fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (uc.ui) { 9972df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color_use = true; 9982df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_00A400_TD_PS_SAMPLER0_BORDER_RED */ 9992df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color[0] = fui(state->border_color.f[0]); 10002df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_00A404_TD_PS_SAMPLER0_BORDER_GREEN */ 10012df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color[1] = fui(state->border_color.f[1]); 10022df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_00A408_TD_PS_SAMPLER0_BORDER_BLUE */ 10032df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color[2] = fui(state->border_color.f[2]); 10042df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_00A40C_TD_PS_SAMPLER0_BORDER_ALPHA */ 10052df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->border_color[3] = fui(state->border_color.f[3]); 1006fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 10072df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse return ss; 1008fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1009fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1010fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *ctx, 1011fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct pipe_resource *texture, 1012fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_sampler_view *state) 1013fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1014565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view); 1015951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *tmp = (struct r600_texture*)texture; 1016843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, endian; 1017fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse uint32_t word4 = 0, yuv_format = 0, pitch = 0; 1018fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned char swizzle[4], array_mode = 0, tile_type = 0; 1019677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák unsigned width, height, depth, offset_level, last_level; 1020fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1021565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák if (view == NULL) 1022fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 1023fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1024fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* initialize base object */ 1025565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base = *state; 1026565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = NULL; 1027fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse pipe_reference(NULL, &texture->reference); 1028565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = texture; 1029565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.reference.count = 1; 1030565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.context = ctx; 1031fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1032fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[0] = state->swizzle_r; 1033fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[1] = state->swizzle_g; 1034fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[2] = state->swizzle_b; 1035fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[3] = state->swizzle_a; 1036565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1037929be6eb95c33d5885a89b36dbc82db64c1344feDave Airlie format = r600_translate_texformat(ctx->screen, state->format, 1038fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle, 1039fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse &word4, &yuv_format); 1040a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1041fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (format == ~0) { 1042a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák FREE(view); 1043a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák return NULL; 1044fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1045565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1046d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák if (tmp->is_depth && !tmp->is_flushing_texture) { 1047611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák if (!r600_init_flushed_depth_texture(ctx, texture, NULL)) { 1048da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák FREE(view); 1049da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák return NULL; 1050da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák } 1051611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák tmp = tmp->flushed_depth_texture; 1052fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1053565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1054843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 1055231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 1056677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák offset_level = state->u.tex.first_level; 1057677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák last_level = state->u.tex.last_level - offset_level; 1058581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák width = tmp->surface.level[offset_level].npix_x; 1059581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák height = tmp->surface.level[offset_level].npix_y; 1060581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = tmp->surface.level[offset_level].npix_z; 1061581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format); 1062581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák tile_type = tmp->tile_type; 1063581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák 1064581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 1065581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák height = 1; 1066581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = texture->array_size; 1067581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 1068581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = texture->array_size; 1069581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1070581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (tmp->surface.level[offset_level].mode) { 1071581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1072581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_LINEAR_ALIGNED; 1073581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1074581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1075581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_1D_TILED_THIN1; 1076581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1077581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1078581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_2D_TILED_THIN1; 1079581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1080581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1081581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1082581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_LINEAR_GENERAL; 1083581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1084581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 108569d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 1086581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource = &tmp->resource; 10878698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[0] = (S_038000_DIM(r600_tex_dim(texture->target, texture->nr_samples)) | 1088581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TILE_MODE(array_mode) | 1089581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TILE_TYPE(tile_type) | 1090581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_PITCH((pitch / 8) - 1) | 1091581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TEX_WIDTH(width - 1)); 1092581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[1] = (S_038004_TEX_HEIGHT(height - 1) | 1093581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038004_TEX_DEPTH(depth - 1) | 1094581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038004_DATA_FORMAT(format)); 1095581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[2] = tmp->surface.level[offset_level].offset >> 8; 1096581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (offset_level >= tmp->surface.last_level) { 1097581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[3] = tmp->surface.level[offset_level].offset >> 8; 1098c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1099581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[3] = tmp->surface.level[offset_level + 1].offset >> 8; 1100c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1101581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[4] = (word4 | 1102581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) | 1103581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_REQUEST_SIZE(1) | 1104581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_ENDIAN_SWAP(endian) | 1105581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_BASE_LEVEL(0)); 11068698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] = (S_038014_BASE_ARRAY(state->u.tex.first_layer) | 1107581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038014_LAST_ARRAY(state->u.tex.last_layer)); 11088698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (texture->nr_samples > 1) { 11098698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* LAST_LEVEL holds log2(nr_samples) for multisample textures */ 11108698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] |= S_038014_LAST_LEVEL(util_logbase2(texture->nr_samples)); 11118698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { 11128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] |= S_038014_LAST_LEVEL(last_level); 11138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1114581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[6] = (S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) | 1115581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038018_MAX_ANISO(4 /* max 16 samples */)); 1116565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák return &view->base; 1117fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1118fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 11192b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšákstatic void r600_emit_clip_state(struct r600_context *rctx, struct r600_atom *atom) 1120fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 11212b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 11222b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák struct pipe_clip_state *state = &rctx->clip_state.state; 112354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 11242b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_write_context_reg_seq(cs, R_028E20_PA_CL_UCP0_X, 6*4); 11252b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_write_array(cs, 6*4, (unsigned*)state); 1126fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1127fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1128fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_polygon_stipple(struct pipe_context *ctx, 1129fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_poly_stipple *state) 1130fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1131fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1132fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1133aacd653834264b70a2537aff7914762b39f0683fMarek Olšákvoid r600_set_scissor_state(struct r600_context *rctx, 1134aacd653834264b70a2537aff7914762b39f0683fMarek Olšák const struct pipe_scissor_state *state) 1135fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1136fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 113778293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t tl, br; 1138fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1139fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rstate == NULL) 1140fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1141fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1142fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_SCISSOR; 1143fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny) | S_028240_WINDOW_OFFSET_DISABLE(1); 1144fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 11455646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 114662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl); 11475646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 114862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028254_PA_SC_VPORT_SCISSOR_0_BR, br); 1149fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1150fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse free(rctx->states[R600_PIPE_STATE_SCISSOR]); 1151fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->states[R600_PIPE_STATE_SCISSOR] = rstate; 1152e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 1153fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1154fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1155aacd653834264b70a2537aff7914762b39f0683fMarek Olšákstatic void r600_pipe_set_scissor_state(struct pipe_context *ctx, 1156aacd653834264b70a2537aff7914762b39f0683fMarek Olšák const struct pipe_scissor_state *state) 1157aacd653834264b70a2537aff7914762b39f0683fMarek Olšák{ 1158aacd653834264b70a2537aff7914762b39f0683fMarek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1159aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 1160fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák rctx->scissor = *state; 1161aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 1162fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák if (rctx->chip_class == R600 && !rctx->scissor_enable) 1163fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák return; 1164aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 1165aacd653834264b70a2537aff7914762b39f0683fMarek Olšák r600_set_scissor_state(rctx, state); 1166aacd653834264b70a2537aff7914762b39f0683fMarek Olšák} 1167aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 116878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšákstatic struct r600_resource *r600_buffer_create_helper(struct r600_screen *rscreen, 116978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák unsigned size, unsigned alignment) 117078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 117178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_resource buffer; 117278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 117378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(&buffer, 0, sizeof buffer); 117478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.target = PIPE_BUFFER; 117578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.format = PIPE_FORMAT_R8_UNORM; 117678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.bind = PIPE_BIND_CUSTOM; 117778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.usage = PIPE_USAGE_STATIC; 117878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.flags = 0; 117978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.width0 = size; 118078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.height0 = 1; 118178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.depth0 = 1; 118278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.array_size = 1; 118378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 118478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák return (struct r600_resource*) 118578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_buffer_create(&rscreen->screen, &buffer, alignment); 118678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 118778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 1188cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšákstatic void r600_init_color_surface(struct r600_context *rctx, 118978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_surface *surf, 119078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák bool force_cmask_fmask) 1191fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 119278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_screen *rscreen = rctx->screen; 1193951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)surf->base.texture; 1194cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák unsigned level = surf->base.u.tex.level; 1195fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned pitch, slice; 1196fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned color_info; 1197843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, swap, ntype, endian; 11984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned offset; 1199fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct util_format_description *desc; 12000d851f6e9c6046052ddce3860e625537832530a0Dave Airlie int i; 1201cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák bool blend_bypass = 0, blend_clamp = 1; 12023e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 1203d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák if (rtex->is_depth && !rtex->is_flushing_texture) { 1204cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák r600_init_flushed_depth_texture(&rctx->context, surf->base.texture, NULL); 12053e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie rtex = rtex->flushed_depth_texture; 1206cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák assert(rtex); 12073e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie } 12083e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 1209581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset = rtex->surface.level[level].offset; 1210581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1211581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset += rtex->surface.level[level].slice_size * 1212cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->base.u.tex.first_layer; 1213581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1214581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1215581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1216581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (slice) { 1217581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = slice - 1; 1218581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1219581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = 0; 1220581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (rtex->surface.level[level].mode) { 1221581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1222581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_ALIGNED); 1223581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1224581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1225581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_1D_TILED_THIN1); 1226581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1227581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1228581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_2D_TILED_THIN1); 1229581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1230581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1231581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1232581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_GENERAL); 1233581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1234c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1235581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák 1236780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie desc = util_format_description(surf->base.format); 1237fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 12380d851f6e9c6046052ddce3860e625537832530a0Dave Airlie for (i = 0; i < 4; i++) { 12390d851f6e9c6046052ddce3860e625537832530a0Dave Airlie if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 12400d851f6e9c6046052ddce3860e625537832530a0Dave Airlie break; 12410d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 12420d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 12438d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie 124466866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 124566866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 124666866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_SRGB; 12478d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 12488d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 12498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SNORM; 12508d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 12518d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SINT; 12528d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 12538d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 12548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 12558d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 12568d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UINT; 12578d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } 12580d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 1259780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie format = r600_translate_colorformat(surf->base.format); 1260a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1261a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák 1262780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie swap = r600_translate_colorswap(surf->base.format); 1263a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(swap != ~0); 1264a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák 1265a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { 1266843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = ENDIAN_NONE; 1267843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } else { 1268843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 1269843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 1270231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 1271a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie /* set blend bypass according to docs if SINT/UINT or 1272a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 8/24 COLOR variants */ 1273a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie if (ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT || 1274a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_8_24 || format == V_0280A0_COLOR_24_8 || 1275a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_X24_8_32_FLOAT) { 1276a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_clamp = 0; 1277a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_bypass = 1; 1278a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie } 1279a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 1280cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->alphatest_bypass = ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT; 12814a26454e979251db25bab68685835fa32c099429Dave Airlie 1282c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info |= S_0280A0_FORMAT(format) | 1283fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0280A0_COMP_SWAP(swap) | 1284a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_BYPASS(blend_bypass) | 1285a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_CLAMP(blend_clamp) | 1286843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_NUMBER_TYPE(ntype) | 1287843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_ENDIAN(endian); 12880d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 12895939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM is an optimzation that can be enabled for better 12905939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * performance in certain cases 12915939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 1292b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class == R600) { 12935939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 12945939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 12955939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_CLAMP is enabled 12965939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_FLOAT32 is disabled 12975939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 12985939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 12995939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 12 && 13005939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 13015939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && 13025939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_SINT) && 13035939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher G_0280A0_BLEND_CLAMP(color_info) && 1304b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse !G_0280A0_BLEND_FLOAT32(color_info)) { 13055939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 1306cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->export_16bpc = true; 1307b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 13085939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } else { 13095939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 13105939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 13115939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 16-bit or smaller FLOAT 13125939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 13135939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 13145939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ((desc->channel[i].size < 12 && 13155939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 13165939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && ntype != V_0280A0_NUMBER_SINT) || 13175939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 17 && 1318b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) { 13195939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 1320cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->export_16bpc = true; 1321b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 13225939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } 1323fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 132478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* These might not always be initialized to zero. */ 1325cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_base = offset >> 8; 1326cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_size = S_028060_PITCH_TILE_MAX(pitch) | 1327cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák S_028060_SLICE_TILE_MAX(slice); 13288698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_fmask = surf->cb_color_base; 13298698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_cmask = surf->cb_color_base; 133078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_mask = 0; 133178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 133278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask, 133378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rtex->resource.b.b); 133478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask, 133578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rtex->resource.b.b); 13368698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 13378698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->cmask_size) { 13388698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_cmask = rtex->cmask_offset >> 8; 13398698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_mask |= S_028100_CMASK_BLOCK_MAX(rtex->cmask_slice_tile_max); 13408698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 13418698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->fmask_size) { 13428698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE); 13438698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_fmask = rtex->fmask_offset >> 8; 13448698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_mask |= S_028100_FMASK_TILE_MAX(slice); 13458698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { /* cmask only */ 13468698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_CLEAR_ENABLE); 13478698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 134878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } else if (force_cmask_fmask) { 134978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Allocate dummy FMASK and CMASK if they aren't allocated already. 135078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * 135178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * R6xx needs FMASK and CMASK for the destination buffer of color resolve, 135278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * otherwise it hangs. We don't have FMASK and CMASK pre-allocated, 135378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * because it's not an MSAA buffer. 135478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák */ 135578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_cmask_info cmask; 135678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_fmask_info fmask; 135778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 135878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_texture_get_cmask_info(rscreen, rtex, &cmask); 135978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_texture_get_fmask_info(rscreen, rtex, 8, &fmask); 136078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 136178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* CMASK. */ 136278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!rctx->dummy_cmask || 136378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask->buf->size < cmask.size || 136478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask->buf->alignment % cmask.alignment != 0) { 136578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_transfer *transfer; 136678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák void *ptr; 136778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 136878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&rctx->dummy_cmask, NULL); 136978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask = r600_buffer_create_helper(rscreen, cmask.size, cmask.alignment); 137078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 137178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Set the contents to 0xCC. */ 137278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák ptr = pipe_buffer_map(&rctx->context, &rctx->dummy_cmask->b.b, PIPE_TRANSFER_WRITE, &transfer); 137378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(ptr, 0xCC, cmask.size); 137478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_buffer_unmap(&rctx->context, transfer); 137578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 137678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask, 137778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rctx->dummy_cmask->b.b); 137878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 137978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* FMASK. */ 138078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!rctx->dummy_fmask || 138178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask->buf->size < fmask.size || 138278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask->buf->alignment % fmask.alignment != 0) { 138378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&rctx->dummy_fmask, NULL); 138478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask = r600_buffer_create_helper(rscreen, fmask.size, fmask.alignment); 138578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 138678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 138778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask, 138878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rctx->dummy_fmask->b.b); 138978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 139078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Init the registers. */ 139178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE); 139278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_cmask = 0; 139378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_fmask = 0; 139478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_mask = S_028100_CMASK_BLOCK_MAX(cmask.slice_tile_max) | 139578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák S_028100_FMASK_TILE_MAX(slice); 13968698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 139778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 13988698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_info = color_info; 13998698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1400581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1401cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_view = 0; 1402c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1403cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_view = S_028080_SLICE_START(surf->base.u.tex.first_layer) | 1404cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák S_028080_SLICE_MAX(surf->base.u.tex.last_layer); 1405c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1406cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1407cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->color_initialized = true; 1408fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1409fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1410cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšákstatic void r600_init_depth_surface(struct r600_context *rctx, 1411cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák struct r600_surface *surf) 1412fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1413951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)surf->base.texture; 1414faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák unsigned level, pitch, slice, format, offset, array_mode; 1415fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1416cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák level = surf->base.u.tex.level; 1417581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset = rtex->surface.level[level].offset; 1418581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1419581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1420581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (slice) { 1421581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = slice - 1; 1422581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1423581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (rtex->surface.level[level].mode) { 1424581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1425581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_0280A0_ARRAY_2D_TILED_THIN1; 1426581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1427581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1428581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1429581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1430581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1431581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_0280A0_ARRAY_1D_TILED_THIN1; 1432581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1433c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1434faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák 1435cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák format = r600_translate_dbformat(surf->base.format); 1436a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1437fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1438cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_info = S_028010_ARRAY_MODE(array_mode) | S_028010_FORMAT(format); 1439cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_base = offset >> 8; 1440cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_view = S_028004_SLICE_START(surf->base.u.tex.first_layer) | 1441cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák S_028004_SLICE_MAX(surf->base.u.tex.last_layer); 1442cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_size = S_028000_PITCH_TILE_MAX(pitch) | S_028000_SLICE_TILE_MAX(slice); 1443cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_prefetch_limit = (rtex->surface.level[level].nblk_y / 8) - 1; 1444cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1445cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->depth_initialized = true; 1446fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1447fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1448fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_framebuffer_state(struct pipe_context *ctx, 1449fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_framebuffer_state *state) 1450fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1451e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1452cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák struct r600_surface *surf; 14538698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_texture *rtex; 1454c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned i; 1455fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1456c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.nr_cbufs) { 1457fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_CB_FLUSH; 1458933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák 1459933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák if (rctx->chip_class >= R700 && 1460933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák rctx->framebuffer.state.cbufs[0]->texture->nr_samples > 1) { 1461933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák rctx->flags |= R600_CONTEXT_FLUSH_AND_INV_CB_META; 1462933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák } 1463fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 1464c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.zsbuf) { 1465fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_DB_FLUSH; 1466fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 1467fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák /* R6xx errata */ 1468fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák if (rctx->chip_class == R600) { 1469fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_FLUSH_AND_INV; 1470fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 14716067a2a67f9a7aab2aee051469bea8af03747a95Fredrik Höglund 1472c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Set the new state. */ 1473c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák util_copy_framebuffer_state(&rctx->framebuffer.state, state); 1474c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 1475c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.export_16bpc = state->nr_cbufs != 0; 1476c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.cb0_is_integer = state->nr_cbufs && 1477c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák util_format_is_pure_integer(state->cbufs[0]->format); 1478c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.compressed_cb_mask = 0; 1479c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.is_msaa_resolve = state->nr_cbufs == 2 && 1480c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák state->cbufs[0]->texture->nr_samples > 1 && 1481c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák state->cbufs[1]->texture->nr_samples <= 1; 14827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1483c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (state->nr_cbufs) 1484c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = state->cbufs[0]->texture->nr_samples; 1485c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák else if (state->zsbuf) 1486c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = state->zsbuf->texture->nr_samples; 1487c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák else 1488c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = 0; 1489fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák 14908698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* Colorbuffers. */ 1491cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák for (i = 0; i < state->nr_cbufs; i++) { 1492c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* The resolve buffer must have CMASK and FMASK to prevent hardlocks on R6xx. */ 1493c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák bool force_cmask_fmask = rctx->chip_class == R600 && 1494c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.is_msaa_resolve && 1495c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák i == 1; 1496c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1497cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf = (struct r600_surface*)state->cbufs[i]; 1498c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rtex = (struct r600_texture*)surf->base.texture; 1499cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 150078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!surf->color_initialized || force_cmask_fmask) { 150178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_init_color_surface(rctx, surf, force_cmask_fmask); 150278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (force_cmask_fmask) { 150378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* re-initialize later without compression */ 150478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->color_initialized = false; 150578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 1506cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1507cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1508cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (!surf->export_16bpc) { 1509c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.export_16bpc = false; 1510cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1511cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 15128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->fmask_size && rtex->cmask_size) { 1513c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.compressed_cb_mask |= 1 << i; 15148698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1515cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1516cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1517cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák /* Update alpha-test state dependencies. 1518cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák * Alpha-test is done on the first colorbuffer only. */ 1519cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (state->nr_cbufs) { 1520cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf = (struct r600_surface*)state->cbufs[0]; 1521cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (rctx->alphatest_state.bypass != surf->alphatest_bypass) { 1522cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák rctx->alphatest_state.bypass = surf->alphatest_bypass; 1523cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák r600_atom_dirty(rctx, &rctx->alphatest_state.atom); 1524cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1525cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1526cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 15278698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* ZS buffer. */ 1528fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->zsbuf) { 1529cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf = (struct r600_surface*)state->zsbuf; 1530cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1531cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák if (!surf->depth_initialized) { 1532cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák r600_init_depth_surface(rctx, surf); 1533cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák } 1534cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1535c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_polygon_offset_update(rctx); 1536fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1537fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1538c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) { 1539c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->cb_misc_state.nr_cbufs = state->nr_cbufs; 1540c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_atom_dirty(rctx, &rctx->cb_misc_state.atom); 1541c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1542fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1543c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) { 1544c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->alphatest_state.bypass = false; 1545c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_atom_dirty(rctx, &rctx->alphatest_state.atom); 1546c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1547fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1548c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Calculate the CS size. */ 1549c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw = 1550c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 10 /*COLOR_INFO*/ + 4 /*SCISSOR*/ + 3 /*SHADER_CONTROL*/ + 8 /*MSAA*/; 1551c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1552c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.nr_cbufs) { 1553c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 6 * (2 + rctx->framebuffer.state.nr_cbufs); 1554c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 6 * rctx->framebuffer.state.nr_cbufs; /* relocs */ 1555c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1556c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1557c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.zsbuf) { 1558c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 13; 15599f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák } else if (rctx->screen->info.drm_minor >= 18) { 15609f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák rctx->framebuffer.atom.num_dw += 3; 1561c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1562c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family > CHIP_R600 && rctx->family < CHIP_RV770) { 1563c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 2; 15648698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 15658698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1566c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_atom_dirty(rctx, &rctx->framebuffer.atom); 1567c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák} 1568c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1569c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák#define FILL_SREG(s0x, s0y, s1x, s1y, s2x, s2y, s3x, s3y) \ 1570c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s0x) & 0xf) | (((s0y) & 0xf) << 4) | \ 1571c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s1x) & 0xf) << 8) | (((s1y) & 0xf) << 12) | \ 1572c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s2x) & 0xf) << 16) | (((s2y) & 0xf) << 20) | \ 1573c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s3x) & 0xf) << 24) | (((s3y) & 0xf) << 28)) 1574c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1575c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšákstatic void r600_emit_msaa_state(struct r600_context *rctx, int nr_samples) 1576c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák{ 1577c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_2x[] = { 1578c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4), 1579c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4), 1580c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1581c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_2x = 4; 1582c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_4x[] = { 1583c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6), 1584c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6), 1585c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1586c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_4x = 6; 1587c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_8x[] = { 1588c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2), 1589c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG( 6, 0, 0, 0, -5, 3, 4, 4), 1590c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1591c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_8x = 8; 159282a1d241754a52934b41bd152d25741b0c9c6294Marek Olšák 1593c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1594c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned max_dist = 0; 1595c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1596c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family == CHIP_R600) { 1597c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák switch (nr_samples) { 1598c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák default: 1599c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák nr_samples = 0; 1600c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1601c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 2: 1602c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg(cs, R_008B40_PA_SC_AA_SAMPLE_LOCS_2S, sample_locs_2x[0]); 1603c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_2x; 1604c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1605c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 4: 1606c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg(cs, R_008B44_PA_SC_AA_SAMPLE_LOCS_4S, sample_locs_4x[0]); 1607c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_4x; 1608c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1609c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 8: 1610c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg_seq(cs, R_008B48_PA_SC_AA_SAMPLE_LOCS_8S_WD0, 2); 1611c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[0]); /* R_008B48_PA_SC_AA_SAMPLE_LOCS_8S_WD0 */ 1612c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[1]); /* R_008B4C_PA_SC_AA_SAMPLE_LOCS_8S_WD1 */ 1613c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_8x; 1614c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1615c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1616c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } else { 1617c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák switch (nr_samples) { 1618c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák default: 1619c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1620c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1621c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1622c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák nr_samples = 0; 1623c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1624c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 2: 1625c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1626c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_2x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1627c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_2x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1628c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_2x; 1629c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1630c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 4: 1631c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1632c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_4x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1633c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_4x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1634c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_4x; 1635c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1636c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 8: 1637c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1638c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1639c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1640c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_8x; 1641c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1642c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1643c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 16448698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 16458698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (nr_samples > 1) { 1646c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C00_PA_SC_LINE_CNTL, 2); 1647c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C00_LAST_PIXEL(1) | 1648c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028C00_EXPAND_LINE_WIDTH(1)); /* R_028C00_PA_SC_LINE_CNTL */ 1649c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C04_MSAA_NUM_SAMPLES(util_logbase2(nr_samples)) | 1650c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028C04_MAX_SAMPLE_DIST(max_dist)); /* R_028C04_PA_SC_AA_CONFIG */ 16518698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { 1652c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C00_PA_SC_LINE_CNTL, 2); 1653c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C00_LAST_PIXEL(1)); /* R_028C00_PA_SC_LINE_CNTL */ 1654c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C04_PA_SC_AA_CONFIG */ 165582a1d241754a52934b41bd152d25741b0c9c6294Marek Olšák } 1656c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák} 1657fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1658c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšákstatic void r600_emit_framebuffer_state(struct r600_context *rctx, struct r600_atom *atom) 1659c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák{ 1660c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1661c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct pipe_framebuffer_state *state = &rctx->framebuffer.state; 1662c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned nr_cbufs = state->nr_cbufs; 1663c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct r600_surface **cb = (struct r600_surface**)&state->cbufs[0]; 1664c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned i, sbu = 0; 16650b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 1666c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Colorbuffers. */ 1667c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280A0_CB_COLOR0_INFO, 8); 1668c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1669c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_info); 1670c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1671c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* set CB_COLOR1_INFO for possible dual-src blending */ 1672c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (i == 1) { 1673c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[0]->cb_color_info); 1674c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák i++; 1675c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1676c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (; i < 8; i++) { 1677c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); 1678c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1679c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1680c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (nr_cbufs) { 1681c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* COLOR_BASE */ 1682c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028040_CB_COLOR0_BASE, nr_cbufs); 1683c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1684c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_base); 1685c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1686c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1687c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1688c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1689c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1690c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (struct r600_resource*)cb[i]->base.texture, 1691c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1692c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1693c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1694c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1695c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1696c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028060_CB_COLOR0_SIZE, nr_cbufs); 1697c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1698c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_size); 1699c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1700c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1701c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028080_CB_COLOR0_VIEW, nr_cbufs); 1702c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1703c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_view); 1704c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1705c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1706c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028100_CB_COLOR0_MASK, nr_cbufs); 1707c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1708c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_mask); 1709c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1710c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1711c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* FMASK. */ 1712c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280E0_CB_COLOR0_FRAG, nr_cbufs); 1713c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1714c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_fmask); 1715c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1716c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1717c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1718c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1719c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák cb[i]->cb_buffer_fmask, 1720c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1721c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1722c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1723c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1724c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1725c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* CMASK. */ 1726c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280C0_CB_COLOR0_TILE, nr_cbufs); 1727c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1728c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_cmask); 1729c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1730c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1731c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1732c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1733c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák cb[i]->cb_buffer_cmask, 1734c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1735c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1736c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1737c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1738c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1739c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák sbu |= SURFACE_BASE_UPDATE_COLOR_NUM(nr_cbufs); 1740c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1741c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1742c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Zbuffer. */ 17430b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse if (state->zsbuf) { 1744c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct r600_surface *surf = (struct r600_surface*)state->zsbuf; 1745c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1746c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (struct r600_resource*)state->zsbuf->texture, 1747c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1748c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1749c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028000_DB_DEPTH_SIZE, 2); 1750c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_size); /* R_028000_DB_DEPTH_SIZE */ 1751c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_view); /* R_028004_DB_DEPTH_VIEW */ 1752c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_02800C_DB_DEPTH_BASE, 2); 1753c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_base); /* R_02800C_DB_DEPTH_BASE */ 1754c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_info); /* R_028010_DB_DEPTH_INFO */ 1755c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1756c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1757c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1758c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1759c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_028D34_DB_PREFETCH_LIMIT, surf->db_prefetch_limit); 1760c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1761c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák sbu |= SURFACE_BASE_UPDATE_DEPTH; 17629f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák } else if (rctx->screen->info.drm_minor >= 18) { 17639f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák /* DRM 2.6.18 allows the INVALID format to disable depth/stencil. 17649f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák * Older kernels are out of luck. */ 17659f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák r600_write_context_reg(cs, R_028010_DB_DEPTH_INFO, S_028010_FORMAT(V_028010_DEPTH_INVALID)); 17660b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 17670ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák 1768c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* SURFACE_BASE_UPDATE */ 1769c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family > CHIP_R600 && rctx->family < CHIP_RV770 && sbu) { 1770c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_SURFACE_BASE_UPDATE, 0, 0)); 1771c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sbu); 17720ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák } 17738698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1774c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Framebuffer dimensions. */ 1775c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028204_PA_SC_WINDOW_SCISSOR_TL, 2); 1776c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028240_TL_X(0) | S_028240_TL_Y(0) | 1777c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028240_WINDOW_OFFSET_DISABLE(1)); /* R_028204_PA_SC_WINDOW_SCISSOR_TL */ 1778c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028244_BR_X(state->width) | 1779c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028244_BR_Y(state->height)); /* R_028208_PA_SC_WINDOW_SCISSOR_BR */ 1780c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1781c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.is_msaa_resolve) { 1782c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_0287A0_CB_SHADER_CONTROL, 1); 1783c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } else { 1784c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Always enable the first colorbuffer in CB_SHADER_CONTROL. This 1785c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák * will assure that the alpha-test will work even if there is 1786c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák * no colorbuffer bound. */ 1787c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_0287A0_CB_SHADER_CONTROL, 1788c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (1ull << MAX2(nr_cbufs, 1)) - 1); 17898698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1790c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1791c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_emit_msaa_state(rctx, rctx->framebuffer.nr_samples); 17920ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák} 17930ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák 17940ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšákstatic void r600_emit_cb_misc_state(struct r600_context *rctx, struct r600_atom *atom) 17950ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák{ 17960ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 17970ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák struct r600_cb_misc_state *a = (struct r600_cb_misc_state*)atom; 1798863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák 1799863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák if (G_028808_SPECIAL_OP(a->cb_color_control) == V_028808_SPECIAL_RESOLVE_BOX) { 1800863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2); 1801863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák if (rctx->chip_class == R600) { 1802863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xff); /* R_028238_CB_TARGET_MASK */ 1803863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xff); /* R_02823C_CB_SHADER_MASK */ 1804863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } else { 1805863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf); /* R_028238_CB_TARGET_MASK */ 1806863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf); /* R_02823C_CB_SHADER_MASK */ 1807863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } 1808863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL, a->cb_color_control); 1809863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } else { 1810863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned fb_colormask = (1ULL << ((unsigned)a->nr_cbufs * 4)) - 1; 1811863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned ps_colormask = (1ULL << ((unsigned)a->nr_ps_color_outputs * 4)) - 1; 1812863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned multiwrite = a->multiwrite && a->nr_cbufs > 1; 1813863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák 1814863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2); 1815863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, a->blend_colormask & fb_colormask); /* R_028238_CB_TARGET_MASK */ 1816863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák /* Always enable the first color output to make sure alpha-test works even without one. */ 1817863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf | (multiwrite ? fb_colormask : ps_colormask)); /* R_02823C_CB_SHADER_MASK */ 1818863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL, 1819863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák a->cb_color_control | 1820863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák S_028808_MULTIWRITE_ENABLE(multiwrite)); 1821863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } 1822fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1823fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1824e2809849ecac69615ece294a55ee355afaac33d3Marek Olšákstatic void r600_emit_db_misc_state(struct r600_context *rctx, struct r600_atom *atom) 1825e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák{ 1826e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1827e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák struct r600_db_misc_state *a = (struct r600_db_misc_state*)atom; 1828e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák unsigned db_render_control = 0; 1829e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák unsigned db_render_override = 1830e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIZ_ENABLE(V_028D10_FORCE_DISABLE) | 1831e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIS_ENABLE0(V_028D10_FORCE_DISABLE) | 1832e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIS_ENABLE1(V_028D10_FORCE_DISABLE); 1833e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 1834e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák if (a->occlusion_query_enabled) { 1835e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák if (rctx->chip_class >= R700) { 1836e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák db_render_control |= S_028D0C_R700_PERFECT_ZPASS_COUNTS(1); 1837e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1838e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák db_render_override |= S_028D10_NOOP_CULL_DISABLE(1); 1839e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1840df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák if (a->flush_depthstencil_through_cb) { 1841e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák assert(a->copy_depth || a->copy_stencil); 1842e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák 1843e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(a->copy_depth) | 1844e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák S_028D0C_STENCIL_COPY_ENABLE(a->copy_stencil) | 18458698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028D0C_COPY_CENTROID(1) | 18468698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028D0C_COPY_SAMPLE(a->copy_sample); 1847e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1848e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 1849e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_context_reg_seq(cs, R_028D0C_DB_RENDER_CONTROL, 2); 1850e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_value(cs, db_render_control); /* R_028D0C_DB_RENDER_CONTROL */ 1851e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_value(cs, db_render_override); /* R_028D10_DB_RENDER_OVERRIDE */ 1852e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák} 1853e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 1854c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšákstatic void r600_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom *atom) 1855c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák{ 1856c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1857585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák uint32_t dirty_mask = rctx->vertex_buffer_state.dirty_mask; 1858c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1859585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák while (dirty_mask) { 1860585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák struct pipe_vertex_buffer *vb; 1861585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák struct r600_resource *rbuffer; 1862585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák unsigned offset; 1863585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák unsigned buffer_index = u_bit_scan(&dirty_mask); 1864c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1865585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák vb = &rctx->vertex_buffer_state.vb[buffer_index]; 1866585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák rbuffer = (struct r600_resource*)vb->buffer; 1867585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák assert(rbuffer); 1868c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1869585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák offset = vb->buffer_offset; 1870c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1871c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák /* fetch resources start at index 320 */ 1872c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 1873585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák r600_write_value(cs, (320 + buffer_index) * 7); 1874c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, offset); /* RESOURCEi_WORD0 */ 1875c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */ 1876c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, /* RESOURCEi_WORD2 */ 1877c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák S_038008_ENDIAN_SWAP(r600_endian_swap(32)) | 1878585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák S_038008_STRIDE(vb->stride)); 1879c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD3 */ 1880c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD4 */ 1881c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD5 */ 1882c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */ 1883c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1884c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1885c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ)); 1886c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák } 1887c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák} 1888c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 188968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšákstatic void r600_emit_constant_buffers(struct r600_context *rctx, 189068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct r600_constbuf_state *state, 189168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned buffer_id_base, 189268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned reg_alu_constbuf_size, 189368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned reg_alu_const_cache) 189468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 189568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 189668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák uint32_t dirty_mask = state->dirty_mask; 189768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 189868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák while (dirty_mask) { 1899507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák struct pipe_constant_buffer *cb; 190068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct r600_resource *rbuffer; 190168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned offset; 190268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned buffer_index = ffs(dirty_mask) - 1; 190368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 190468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák cb = &state->cb[buffer_index]; 190568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák rbuffer = (struct r600_resource*)cb->buffer; 190668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák assert(rbuffer); 190768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 190868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák offset = cb->buffer_offset; 190968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 191068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_context_reg(cs, reg_alu_constbuf_size + buffer_index * 4, 191168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák ALIGN_DIVUP(cb->buffer_size >> 4, 16)); 191268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_context_reg(cs, reg_alu_const_cache + buffer_index * 4, offset >> 8); 191368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 191468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 191568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ)); 191668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 191768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 191868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, (buffer_id_base + buffer_index) * 7); 191968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, offset); /* RESOURCEi_WORD0 */ 192068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */ 192168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, /* RESOURCEi_WORD2 */ 192268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák S_038008_ENDIAN_SWAP(r600_endian_swap(32)) | 192368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák S_038008_STRIDE(16)); 192468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD3 */ 192568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD4 */ 192668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD5 */ 192768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */ 192868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 192968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 193068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ)); 193168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 193268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák dirty_mask &= ~(1 << buffer_index); 193368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák } 193468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák state->dirty_mask = 0; 193568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 193668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 19370b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void r600_emit_vs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 193868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 19391bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX], 160, 194068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028180_ALU_CONST_BUFFER_SIZE_VS_0, 194168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028980_ALU_CONST_CACHE_VS_0); 194268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 194368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 1944263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 1945263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 1946263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY], 336, 1947263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák R_0281C0_ALU_CONST_BUFFER_SIZE_GS_0, 1948263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák R_0289C0_ALU_CONST_CACHE_GS_0); 1949263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 1950263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 19510b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void r600_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 195268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 19531bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT], 0, 195468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028140_ALU_CONST_BUFFER_SIZE_PS_0, 195568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028940_ALU_CONST_CACHE_PS_0); 195668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 195768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 19585d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_sampler_views(struct r600_context *rctx, 19595d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct r600_samplerview_state *state, 19605d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned resource_id_base) 19615d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 19625d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 19635d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák uint32_t dirty_mask = state->dirty_mask; 19645d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19655d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák while (dirty_mask) { 19665d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct r600_pipe_sampler_view *rview; 19675d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned resource_index = u_bit_scan(&dirty_mask); 19685d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned reloc; 19695d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19705d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák rview = state->views[resource_index]; 19715d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák assert(rview); 19725d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19735d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 19745d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, (resource_id_base + resource_index) * 7); 19755d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_array(cs, 7, rview->tex_resource_words); 19765d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19775d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák /* XXX The kernel needs two relocations. This is stupid. */ 19785d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák reloc = r600_context_bo_reloc(rctx, rview->tex_resource, 19795d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák RADEON_USAGE_READ); 19805d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 19815d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, reloc); 19825d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 19835d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, reloc); 19845d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák } 19855d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák state->dirty_mask = 0; 19865d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 19875d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 1988263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák/* Resource IDs: 1989263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * PS: 0 .. +160 1990263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * VS: 160 .. +160 1991263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * FS: 320 .. +16 1992263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * GS: 336 .. +160 1993263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák */ 1994263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 19955d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 19965d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 1997f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, 160 + R600_MAX_CONST_BUFFERS); 19985d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 19995d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 2000263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 2001263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 2002263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, 336 + R600_MAX_CONST_BUFFERS); 2003263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 2004263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 20055d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 20065d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 2007f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, R600_MAX_CONST_BUFFERS); 20085d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 20095d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 20103bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_sampler_states(struct r600_context *rctx, 20112df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct r600_textures_info *texinfo, 20122df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned resource_id_base, 20132df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned border_color_reg) 20142df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 20152df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct radeon_winsys_cs *cs = rctx->cs; 20163fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák uint32_t dirty_mask = texinfo->states.dirty_mask; 20172df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20183fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák while (dirty_mask) { 20193fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák struct r600_pipe_sampler_state *rstate; 20203fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák struct r600_pipe_sampler_view *rview; 20213fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák unsigned i = u_bit_scan(&dirty_mask); 20222df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20233fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate = texinfo->states.states[i]; 20243fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák assert(rstate); 20253fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rview = texinfo->views.views[i]; 20262df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20272df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* TEX_ARRAY_OVERRIDE must be set for array textures to disable 20282df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse * filtering between layers. 20292df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse * Don't update TEX_ARRAY_OVERRIDE if we don't have the sampler view. 20302df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse */ 20313fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (rview) { 20323fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák enum pipe_texture_target target = rview->base.texture->target; 20333fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (target == PIPE_TEXTURE_1D_ARRAY || 20343fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák target == PIPE_TEXTURE_2D_ARRAY) { 20353fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate->tex_sampler_words[0] |= S_03C000_TEX_ARRAY_OVERRIDE(1); 20362df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse texinfo->is_array_sampler[i] = true; 20372df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } else { 20383fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate->tex_sampler_words[0] &= C_03C000_TEX_ARRAY_OVERRIDE; 20392df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse texinfo->is_array_sampler[i] = false; 20402df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20412df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20422df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20432df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_value(cs, PKT3(PKT3_SET_SAMPLER, 3, 0)); 20442df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_value(cs, (resource_id_base + i) * 3); 20453fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák r600_write_array(cs, 3, rstate->tex_sampler_words); 20462df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20473fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (rstate->border_color_use) { 20482df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned offset; 20492df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20502df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse offset = border_color_reg; 20512df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse offset += i * 16; 20522df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_config_reg_seq(cs, offset, 4); 20533fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák r600_write_array(cs, 4, rstate->border_color); 20542df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20552df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20563fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák texinfo->states.dirty_mask = 0; 20572df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20582df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20593bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_vs_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 20602df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 2061f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_VERTEX], 18, R_00A600_TD_VS_SAMPLER0_BORDER_RED); 20622df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20632df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 2064263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 2065263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 2066263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY], 36, R_00A800_TD_GS_SAMPLER0_BORDER_RED); 2067263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 2068263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 20693bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_ps_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 20702df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 2071f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT], 0, R_00A400_TD_PS_SAMPLER0_BORDER_RED); 20722df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20732df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20742df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissestatic void r600_emit_seamless_cube_map(struct r600_context *rctx, struct r600_atom *atom) 20752df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 20762df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct radeon_winsys_cs *cs = rctx->cs; 20772df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned tmp; 20782df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20792df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse tmp = S_009508_DISABLE_CUBE_ANISO(1) | 20802df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_GRADIENT(1) | 20812df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_WALKER(1) | 20822df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_ALIGNER(1); 20832df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse if (!rctx->seamless_cube_map.enabled) { 20842df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse tmp |= S_009508_DISABLE_CUBE_WRAP(1); 20852df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20862df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_config_reg(cs, R_009508_TA_CNTL_AUX, tmp); 20872df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20882df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 2089a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšákstatic void r600_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a) 2090a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák{ 2091a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák struct r600_sample_mask *s = (struct r600_sample_mask*)a; 2092a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák uint8_t mask = s->sample_mask; 2093a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 2094a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák r600_write_context_reg(rctx->cs, R_028C48_PA_SC_AA_MASK, 2095a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák mask | (mask << 8) | (mask << 16) | (mask << 24)); 2096a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák} 2097a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 2098e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_init_state_functions(struct r600_context *rctx) 2099fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 21005ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse unsigned id = 4; 21015ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21025ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* !!! 21035ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * To avoid GPU lockup registers must be emited in a specific order 21045ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * (no kidding ...). The order below is important and have been 21055ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * partialy infered from analyzing fglrx command stream. 21065ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * 21075ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * Don't reorder atom without carefully checking the effect (GPU lockup 21085ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * or piglit regression). 21095ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * !!! 21105ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse */ 21115ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 2112c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_init_atom(rctx, &rctx->framebuffer.atom, id++, r600_emit_framebuffer_state, 0); 2113c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 21145ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* shader const */ 21151bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX].atom, id++, r600_emit_vs_constant_buffers, 0); 2116263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY].atom, id++, r600_emit_gs_constant_buffers, 0); 21171bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT].atom, id++, r600_emit_ps_constant_buffers, 0); 21185ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21192df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* sampler must be emited before TA_CNTL_AUX otherwise DISABLE_CUBE_WRAP change 21205ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * does not take effect (TA_CNTL_AUX emited by r600_emit_seamless_cube_map) 21212df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse */ 2122f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].states.atom, id++, r600_emit_vs_sampler_states, 0); 2123263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].states.atom, id++, r600_emit_gs_sampler_states, 0); 2124f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].states.atom, id++, r600_emit_ps_sampler_states, 0); 21255ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* resource */ 2126f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views.atom, id++, r600_emit_vs_sampler_views, 0); 2127263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views.atom, id++, r600_emit_gs_sampler_views, 0); 2128f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views.atom, id++, r600_emit_ps_sampler_views, 0); 21295ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->vertex_buffer_state.atom, id++, r600_emit_vertex_buffers, 0); 21305ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21311f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák r600_init_atom(rctx, &rctx->vgt_state.atom, id++, r600_emit_vgt_state, 6); 21321f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák r600_init_atom(rctx, &rctx->vgt2_state.atom, id++, r600_emit_vgt2_state, 3); 21331f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák 21345ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->seamless_cube_map.atom, id++, r600_emit_seamless_cube_map, 3); 21355ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->sample_mask.atom, id++, r600_emit_sample_mask, 3); 2136a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák rctx->sample_mask.sample_mask = ~0; 2137a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 21385ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->alphatest_state.atom, id++, r600_emit_alphatest_state, 6); 2139de89fe1e5de581df280df41170f411692c6ddf4aMarek Olšák r600_init_atom(rctx, &rctx->blend_color.atom, id++, r600_emit_blend_color, 6); 21408faf3bcf0757451625e6443976db534e29e6d2aeMarek Olšák r600_init_atom(rctx, &rctx->cb_misc_state.atom, id++, r600_emit_cb_misc_state, 7); 2141c56dca909a0dc1410301c48618768adf58023fe7Marek Olšák r600_init_atom(rctx, &rctx->clip_misc_state.atom, id++, r600_emit_clip_misc_state, 6); 21422b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_init_atom(rctx, &rctx->clip_state.atom, id++, r600_emit_clip_state, 26); 21435ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->db_misc_state.atom, id++, r600_emit_db_misc_state, 4); 214463bf0f905ae9c8cc0dea9ebbde9dc59d83a3a94fMarek Olšák r600_init_atom(rctx, &rctx->stencil_ref.atom, id++, r600_emit_stencil_ref, 4); 2145605fd0c14abf14ed500b95dc957d762726243df8Marek Olšák r600_init_atom(rctx, &rctx->viewport.atom, id++, r600_emit_viewport_state, 8); 21465ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 2147fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_blend_state = r600_create_blend_state; 2148fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state; 2149fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_rasterizer_state = r600_create_rs_state; 2150fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_state = r600_create_sampler_state; 2151fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_view = r600_create_sampler_view; 2152fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_framebuffer_state = r600_set_framebuffer_state; 2153fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_polygon_stipple = r600_set_polygon_stipple; 2154aacd653834264b70a2537aff7914762b39f0683fMarek Olšák rctx->context.set_scissor_state = r600_pipe_set_scissor_state; 2155fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 2156fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 21574acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin/* Adjust GPR allocation on R6xx/R7xx */ 2158e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_adjust_gprs(struct r600_context *rctx) 215904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie{ 216004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie struct r600_pipe_state rstate; 216104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_ps_gprs = rctx->default_ps_gprs; 216204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_vs_gprs = rctx->default_vs_gprs; 216304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned tmp; 216404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie int diff; 216504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 2166fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák if (rctx->ps_shader->current->shader.bc.ngpr > rctx->default_ps_gprs) { 21674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin diff = rctx->ps_shader->current->shader.bc.ngpr - rctx->default_ps_gprs; 216804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs -= diff; 216904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs += diff; 217004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 217104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 21724acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin if (rctx->vs_shader->current->shader.bc.ngpr > rctx->default_vs_gprs) 217304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie { 21744acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin diff = rctx->vs_shader->current->shader.bc.ngpr - rctx->default_vs_gprs; 217504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs -= diff; 217604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs += diff; 217704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 217804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 217904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp = 0; 218004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs); 218104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs); 21825345e3ea86a3e942ccef083019a76b38b05f3f14Marek Olšák tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(rctx->r6xx_num_clause_temp_gprs); 218304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rstate.nregs = 0; 218462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(&rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, tmp); 218504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 2186e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, &rstate); 218704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie} 218804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 2189f126253040654d52db134063a69ebaf0c417d410Marek Olšákvoid r600_init_atom_start_cs(struct r600_context *rctx) 2190fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 2191fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int ps_prio; 2192fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int vs_prio; 2193fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int gs_prio; 2194fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int es_prio; 2195fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_gprs; 2196fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_gprs; 2197fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_gprs; 2198fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_gprs; 2199fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_temp_gprs; 2200fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_threads; 2201fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_threads; 2202fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_threads; 2203fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_threads; 2204fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_stack_entries; 2205fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_stack_entries; 2206fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_stack_entries; 2207fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_stack_entries; 2208fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse enum radeon_family family; 2209e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák struct r600_command_buffer *cb = &rctx->start_cs_cmd; 221078293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t tmp; 2211fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 22125ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_command_buffer(rctx, cb, 0, 256); 2213f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2214f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* R6xx requires this packet at the start of each command buffer */ 2215f126253040654d52db134063a69ebaf0c417d410Marek Olšák if (rctx->chip_class == R600) { 2216f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_START_3D_CMDBUF, 0, 0)); 2217f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); 2218f126253040654d52db134063a69ebaf0c417d410Marek Olšák } 2219f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* All asics require this one */ 2220f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0)); 2221f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 2222f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 2223f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2224b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet family = rctx->family; 2225fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse ps_prio = 0; 2226fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse vs_prio = 1; 2227fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse gs_prio = 2; 2228fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse es_prio = 3; 2229fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 2230fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_R600: 2231fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2232fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2233fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2234fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2235fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2236fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2237fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2238fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2239fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2240fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2241fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2242fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2243fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2244fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2245fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV630: 2246fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV635: 2247fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2248fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2249fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2250fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2251fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2252fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 2253fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 40; 2254fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2255fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2256fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2257fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2258fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2259fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2260fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2261fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 2262fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 2263fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 2264fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 2265fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 2266fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2267fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2268fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2269fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2270fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2271fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2272fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2273fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2274fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2275fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2276fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2277fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2278fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2279fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2280fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV670: 2281fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 144; 2282fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 40; 2283fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2284fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2285fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2286fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2287fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2288fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2289fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2290fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2291fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2292fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2293fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2294fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2295fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV770: 2296fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2297fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2298fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2299fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2300fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2301fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 2302fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 2303fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2304fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2305fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 256; 2306fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 256; 2307fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2308fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2309fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2310fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV730: 2311fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV740: 2312fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2313fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2314fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2315fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2316fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2317fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 2318fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 2319fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2320fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2321fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2322fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2323fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2324fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2325fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2326fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 2327fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2328fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2329fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2330fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2331fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2332fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 2333fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2334fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2335fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2336fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2337fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2338fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2339fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2340fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2341fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 2342fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 234304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_ps_gprs = num_ps_gprs; 234404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_vs_gprs = num_vs_gprs; 2345f126253040654d52db134063a69ebaf0c417d410Marek Olšák rctx->r6xx_num_clause_temp_gprs = num_temp_gprs; 2346fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2347fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_CONFIG */ 2348fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp = 0; 2349fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 2350fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 2351fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 2352fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 2353fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 2354fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 2355fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2356fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 2357fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VC_ENABLE(1); 2358fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2359fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 2360153105cfbfd8d6ff30de144605016f6e4f2a1b9eJerome Glisse tmp |= S_008C00_DX9_CONSTS(0); 2361fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ALU_INST_PREFER_VECTOR(1); 2362fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_PS_PRIO(ps_prio); 2363fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VS_PRIO(vs_prio); 2364fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_GS_PRIO(gs_prio); 2365fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ES_PRIO(es_prio); 2366f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008C00_SQ_CONFIG, tmp); 2367fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2368fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_GPR_RESOURCE_MGMT_2 */ 2369f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C08_NUM_GS_GPRS(num_gs_gprs); 2370e2529442e6cc208a4f62ff7dc00d5e2ba7c92624Mathias Fröhlich tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs); 2371f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg_seq(cb, R_008C08_SQ_GPR_RESOURCE_MGMT_2, 4); 2372f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); 2373fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2374fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_THREAD_RESOURCE_MGMT */ 2375f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C0C_NUM_PS_THREADS(num_ps_threads); 2376fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_VS_THREADS(num_vs_threads); 2377fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_GS_THREADS(num_gs_threads); 2378fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_ES_THREADS(num_es_threads); 2379f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C0C_SQ_THREAD_RESOURCE_MGMT */ 2380fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2381fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_1 */ 2382f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C10_NUM_PS_STACK_ENTRIES(num_ps_stack_entries); 2383fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C10_NUM_VS_STACK_ENTRIES(num_vs_stack_entries); 2384f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C10_SQ_STACK_RESOURCE_MGMT_1 */ 2385fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2386fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_2 */ 2387f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C14_NUM_GS_STACK_ENTRIES(num_gs_stack_entries); 2388fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C14_NUM_ES_STACK_ENTRIES(num_es_stack_entries); 2389f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C14_SQ_STACK_RESOURCE_MGMT_2 */ 2390f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2391f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009714_VC_ENHANCE, 0); 2392fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2393b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class >= R700) { 2394f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x00004000); 2395f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0); 2396f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x00420204); 2397f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 0); 2398fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 2399f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); 2400f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0x82000000); 2401f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x01020204); 2402f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 1); 240347dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák } 2404f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_0288A8_SQ_ESGS_RING_ITEMSIZE, 9); 2405f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288A8_SQ_ESGS_RING_ITEMSIZE */ 2406f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288AC_SQ_GSVS_RING_ITEMSIZE */ 2407f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B0_SQ_ESTMP_RING_ITEMSIZE */ 2408f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B4_SQ_GSTMP_RING_ITEMSIZE */ 2409f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B8_SQ_VSTMP_RING_ITEMSIZE */ 2410f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288BC_SQ_PSTMP_RING_ITEMSIZE */ 2411f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C0_SQ_FBUF_RING_ITEMSIZE */ 2412f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C4_SQ_REDUC_RING_ITEMSIZE */ 2413f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C8_SQ_GS_VERT_ITEMSIZE */ 2414f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2415841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse /* to avoid GPU doing any preloading of constant from random address */ 2416841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_context_reg_seq(cb, R_028140_ALU_CONST_BUFFER_SIZE_PS_0, 8); 2417841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); /* R_028140_ALU_CONST_BUFFER_SIZE_PS_0 */ 2418841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2419841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2420841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2421841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2422841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2423841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2424841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2425841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_context_reg_seq(cb, R_028180_ALU_CONST_BUFFER_SIZE_VS_0, 8); 2426841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); /* R_028180_ALU_CONST_BUFFER_SIZE_VS_0 */ 2427841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2428841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2429841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2430841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2431841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2432841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2433841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2434841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse 2435f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13); 2436f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */ 2437f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */ 2438f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */ 2439f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */ 2440f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */ 2441f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */ 2442f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */ 2443f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */ 2444f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */ 2445f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */ 2446f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */ 2447f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */ 2448f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE, 0); */ 2449f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2450f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028A84_VGT_PRIMITIVEID_EN, 0); 2451f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA0_VGT_INSTANCE_STEP_RATE_0, 0); 2452f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA4_VGT_INSTANCE_STEP_RATE_1, 0); 2453f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2454f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028AB0_VGT_STRMOUT_EN, 3); 2455f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB0_VGT_STRMOUT_EN */ 2456f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 1); /* R_028AB4_VGT_REUSE_OFF */ 2457f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */ 2458f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2459f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028B20_VGT_STRMOUT_BUFFER_EN, 0); 2460182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák 2461182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák r600_store_context_reg_seq(cb, R_028400_VGT_MAX_VTX_INDX, 2); 2462182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák r600_store_value(cb, ~0); /* R_028400_VGT_MAX_VTX_INDX */ 2463182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák r600_store_value(cb, 0); /* R_028404_VGT_MIN_VTX_INDX */ 2464182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák 2465182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák r600_store_ctl_const(cb, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0); 2466fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2467fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028028_DB_STENCIL_CLEAR, 2); 2468fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028028_DB_STENCIL_CLEAR */ 2469fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_02802C_DB_DEPTH_CLEAR */ 2470fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2471fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0286DC_SPI_FOG_CNTL, 3); 2472fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286DC_SPI_FOG_CNTL */ 2473fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286E0_SPI_FOG_FUNC_SCALE */ 2474fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286E4_SPI_FOG_FUNC_BIAS */ 2475fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2476fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028D2C_DB_SRESULTS_COMPARE_STATE1, 2); 2477fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028D2C_DB_SRESULTS_COMPARE_STATE1 */ 2478fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028D30_DB_PRELOAD_CONTROL */ 2479fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2480fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0); 2481fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028A48_PA_SC_MPASS_PS_CNTL, 0); 2482fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 24838698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák r600_store_context_reg_seq(cb, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 4); 2484fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C0C_PA_CL_GB_VERT_CLIP_ADJ */ 2485fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C10_PA_CL_GB_VERT_DISC_ADJ */ 2486fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C14_PA_CL_GB_HORZ_CLIP_ADJ */ 2487fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C18_PA_CL_GB_HORZ_DISC_ADJ */ 2488fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2489fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0282D0_PA_SC_VPORT_ZMIN_0, 2); 2490fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0282D0_PA_SC_VPORT_ZMIN_0 */ 2491fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_0282D4_PA_SC_VPORT_ZMAX_0 */ 2492fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2493fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028818_PA_CL_VTE_CNTL, 0x43F); 2494fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2495fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028200_PA_SC_WINDOW_OFFSET, 0); 2496aacd653834264b70a2537aff7914762b39f0683fMarek Olšák r600_store_context_reg(cb, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF); 2497fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2498fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák if (rctx->chip_class >= R700) { 2499fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA); 2500fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák } 2501fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2502fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028C30_CB_CLRCMP_CONTROL, 4); 2503fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x1000000); /* R_028C30_CB_CLRCMP_CONTROL */ 2504fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028C34_CB_CLRCMP_SRC */ 2505fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0xFF); /* R_028C38_CB_CLRCMP_DST */ 2506fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0xFFFFFFFF); /* R_028C3C_CB_CLRCMP_MSK */ 2507fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2508c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2); 2509c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */ 2510c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_value(cb, S_028034_BR_X(8192) | S_028034_BR_Y(8192)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */ 2511ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák 2512ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_context_reg_seq(cb, R_028240_PA_SC_GENERIC_SCISSOR_TL, 2); 2513ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_value(cb, 0); /* R_028240_PA_SC_GENERIC_SCISSOR_TL */ 2514ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_value(cb, S_028244_BR_X(8192) | S_028244_BR_Y(8192)); /* R_028244_PA_SC_GENERIC_SCISSOR_BR */ 2515ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák 2516fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0288CC_SQ_PGM_CF_OFFSET_PS, 2); 2517fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0288CC_SQ_PGM_CF_OFFSET_PS */ 2518fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0288D0_SQ_PGM_CF_OFFSET_VS */ 2519fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2520fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_0288A4_SQ_PGM_RESOURCES_FS, 0); 2521fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_0288DC_SQ_PGM_CF_OFFSET_FS, 0); 2522fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 25236e7756db14c362ede6fdc97454267a32b8eab1d4Marek Olšák if (rctx->chip_class == R700 && rctx->screen->has_streamout) 25246187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák r600_store_context_reg(cb, R_028354_SX_SURFACE_SYNC, S_028354_SURFACE_SYNC_MASK(0xf)); 252596ef4ddc3ddda4d1f637af86f4790d24f8f386c6Marek Olšák r600_store_context_reg(cb, R_028800_DB_DEPTH_CONTROL, 0); 2526b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse if (rctx->screen->has_streamout) { 2527b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse r600_store_context_reg(cb, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0); 2528b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse } 25296187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák 2530fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0, 0x1000FFF); 2531fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x1000FFF); 2532fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 2533084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2534f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeetvoid r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2535f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet{ 2536e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2537f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2538f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_shader *rshader = &shader->shader; 2539f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control; 2540f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet int pos_index = -1, face_index = -1; 254146ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher unsigned tmp, sid, ufi = 0; 25421fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie int need_linear = 0; 2543b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse unsigned z_export = 0, stencil_export = 0; 2544f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2545f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet rstate->nregs = 0; 2546f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2547f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->ninput; i++) { 2548f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 2549f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet pos_index = i; 2550f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 2551f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet face_index = i; 2552e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2553e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin sid = rshader->input[i].spi_sid; 2554e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2555e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp = S_028644_SEMANTIC(sid); 2556e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 25571a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || 25581a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 25591a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && 25601a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rctx->rasterizer && rctx->rasterizer->flatshade)) 25611fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie tmp |= S_028644_FLAT_SHADE(1); 2562e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2563e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 2564e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { 2565e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_PT_SPRITE_TEX(1); 2566e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin } 2567e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2568e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].centroid) 2569e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_CENTROID(1); 2570e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 25711fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) { 25721fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie need_linear = 1; 2573e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_LINEAR(1); 25741fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie } 2575e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2576e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, 257762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie tmp); 2578f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2579f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 25803d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); 2581f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2582f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 2583b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse z_export = 1; 2584f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2585b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse stencil_export = 1; 2586f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2587b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export); 2588b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse db_shader_control |= S_02880C_STENCIL_REF_EXPORT_ENABLE(stencil_export); 2589f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->uses_kill) 2590f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control |= S_02880C_KILL_ENABLE(1); 2591f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2592f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 0; 2593f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2594f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || 2595b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse rshader->output[i].name == TGSI_SEMANTIC_STENCIL) { 2596f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= 1; 2597f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2598f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2599b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse num_cout = rshader->nr_ps_color_exports; 2600f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= S_028854_EXPORT_COLORS(num_cout); 2601f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (!exports_ps) { 2602f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* always at least export 1 component per pixel */ 2603f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 2; 2604f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2605f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 26064fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák shader->nr_ps_color_outputs = num_cout; 2607d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie 2608f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 26091fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_PERSP_GRADIENT_ENA(1)| 26101fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_LINEAR_GRADIENT_ENA(need_linear); 2611f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z = 0; 2612f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (pos_index != -1) { 2613f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) | 2614f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 2615f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) | 2616f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_BARYC_SAMPLE_CNTL(1)); 2617f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z |= 1; 2618f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2619f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2620f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 = 0; 2621f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (face_index != -1) { 2622f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 2623f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 2624f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2625f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 262646ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher /* HW bug in original R600 */ 262746ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher if (rctx->family == CHIP_R600) 262846ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher ufi = 1; 262946ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher 263062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0); 263162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1); 263262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z); 263362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg_bo(rstate, 263462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028840_SQ_PGM_START_PS, 263562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie 0, shader->bo, RADEON_USAGE_READ); 2636f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2637f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028850_SQ_PGM_RESOURCES_PS, 2638e556983fc8f0ac9046c5a5e3e34e8ea036587ac7Mathias Fröhlich S_028850_NUM_GPRS(rshader->bc.ngpr) | 263946ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher S_028850_STACK_SIZE(rshader->bc.nstack) | 264062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028850_UNCACHED_FIRST_INST(ufi)); 2641f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2642f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028854_SQ_PGM_EXPORTS_PS, 264362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie exports_ps); 2644f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* only set some bits here, the other bits are set in the dsa state */ 2645b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse shader->db_shader_control = db_shader_control; 2646b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse shader->ps_depth_export = z_export | stencil_export; 2647f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2648e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin shader->sprite_coord_enable = rctx->sprite_coord_enable; 26491a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rctx->rasterizer) 26501a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin shader->flatshade = rctx->rasterizer->flatshade; 2651f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet} 2652f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2653c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeetvoid r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2654c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet{ 2655e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2656c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2657c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_shader *rshader = &shader->shader; 26585b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned spi_vs_out_id[10] = {}; 26595b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned i, tmp, nparams = 0; 2660c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2661c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet /* clear previous register */ 2662c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet rstate->nregs = 0; 2663c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 26645b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin for (i = 0; i < rshader->noutput; i++) { 26655b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (rshader->output[i].spi_sid) { 26665b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); 26675b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin spi_vs_out_id[nparams / 4] |= tmp; 26685b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin nparams++; 26695b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 2670c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 26715b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 2672c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet for (i = 0; i < 10; i++) { 2673c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2674c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028614_SPI_VS_OUT_ID_0 + i * 4, 267562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie spi_vs_out_id[i]); 2676c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 2677c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2678dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher /* Certain attributes (position, psize, etc.) don't count as params. 2679dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * VS is required to export at least one param and r600_shader_from_tgsi() 2680dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * takes care of adding a dummy export. 2681dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher */ 2682dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if (nparams < 1) 2683dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher nparams = 1; 2684dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher 2685c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 268662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_0286C4_SPI_VS_OUT_CONFIG, 268762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_0286C4_VS_EXPORT_COUNT(nparams - 1)); 2688c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 268962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028868_SQ_PGM_RESOURCES_VS, 269062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028868_NUM_GPRS(rshader->bc.ngpr) | 269162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028868_STACK_SIZE(rshader->bc.nstack)); 269262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg_bo(rstate, 2693c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028858_SQ_PGM_START_VS, 26944a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, shader->bo, RADEON_USAGE_READ); 2695c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 269697acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák shader->pa_cl_vs_out_cntl = 269797acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) | 269897acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) | 269997acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) | 270097acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size); 2701c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet} 2702c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 27037f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlievoid r600_fetch_shader(struct pipe_context *ctx, 27047f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlie struct r600_vertex_element *ve) 2705a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet{ 2706a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet struct r600_pipe_state *rstate; 2707e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2708a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet 2709a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate = &ve->rstate; 2710a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate->id = R600_PIPE_STATE_FETCH_SHADER; 2711a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate->nregs = 0; 271262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg_bo(rstate, R_028894_SQ_PGM_START_FS, 2713e69dde5233a2fc6ad4c5483d079e1ea3a2123a59Marek Olšák 0, 27144a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák ve->fetch_shader, RADEON_USAGE_READ); 2715a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet} 2716a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet 27178698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákvoid *r600_create_resolve_blend(struct r600_context *rctx) 27188698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 27198698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct pipe_blend_state blend; 27208698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_pipe_state *rstate; 272178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák unsigned i; 272278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 272378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(&blend, 0, sizeof(blend)); 272478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.independent_blend_enable = true; 272578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák for (i = 0; i < 2; i++) { 272678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].colormask = 0xf; 272778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].blend_enable = 1; 272878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_func = PIPE_BLEND_ADD; 272978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_func = PIPE_BLEND_ADD; 273078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ZERO; 273178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 273278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ZERO; 273378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 273478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 273578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX); 273678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák return rstate; 273778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 273878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 273978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšákvoid *r700_create_resolve_blend(struct r600_context *rctx) 274078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 274178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_blend_state blend; 274278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_pipe_state *rstate; 27438698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 27448698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák memset(&blend, 0, sizeof(blend)); 27458698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.independent_blend_enable = true; 27468698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.rt[0].colormask = 0xf; 27478698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX); 27488698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return rstate; 27498698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 27508698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 27518698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákvoid *r600_create_decompress_blend(struct r600_context *rctx) 27528698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 27538698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct pipe_blend_state blend; 27548698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_pipe_state *rstate; 27558698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 27568698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák memset(&blend, 0, sizeof(blend)); 27578698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.independent_blend_enable = true; 27588698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.rt[0].colormask = 0xf; 27598698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_EXPAND_SAMPLES); 27608698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return rstate; 27618698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 27628698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 2763e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid *r600_create_db_flush_dsa(struct r600_context *rctx) 2764084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie{ 2765084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie struct pipe_depth_stencil_alpha_state dsa; 2766084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie boolean quirk = false; 2767084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2768084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || 2769084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) 2770084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie quirk = true; 2771084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2772084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie memset(&dsa, 0, sizeof(dsa)); 2773084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2774084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (quirk) { 2775084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.enabled = 1; 2776084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.func = PIPE_FUNC_LEQUAL; 2777084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].enabled = 1; 2778084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 2779084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_KEEP; 2780084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_INCR; 2781084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].writemask = 0xff; 2782084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie } 2783084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2784df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák return rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 2785084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie} 2786b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse 2787b75f1d973c7b626dba567b792be5a3539855a705Jerome Glissevoid r600_update_dual_export_state(struct r600_context * rctx) 2788b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse{ 2789c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák bool dual_export = rctx->framebuffer.export_16bpc && 2790c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák !rctx->ps_shader->current->ps_depth_export; 2791c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 2792b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse unsigned db_shader_control = rctx->ps_shader->current->db_shader_control | 2793b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse S_02880C_DUAL_EXPORT_ENABLE(dual_export); 2794b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse 2795b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse if (db_shader_control != rctx->db_shader_control) { 2796b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse struct r600_pipe_state rstate; 2797b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse 2798b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse rctx->db_shader_control = db_shader_control; 2799b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse rstate.nregs = 0; 2800b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse r600_pipe_state_add_reg(&rstate, R_02880C_DB_SHADER_CONTROL, db_shader_control); 2801b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse r600_context_pipe_state_set(rctx, &rstate); 2802b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 2803b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse} 2804