r600_state.c revision 33dda8f4fb4298d6c8e04d2b5fe569b56043b28d
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" 24555c8d500a4a09445a892316610a428d408318edMarek Olšák#include "r600_shader.h" 25330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "r600d.h" 26fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 27330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "pipe/p_shader_tokens.h" 288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_pack_color.h" 298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_memory.h" 308fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_framebuffer.h" 31d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie#include "util/u_dual_blend.h" 323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_function(int blend_func) 343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_func) { 363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_ADD: 373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_PLUS_SRC; 383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_SUBTRACT: 393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_SRC_MINUS_DST; 403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_REVERSE_SUBTRACT: 413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_MINUS_SRC; 423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MIN: 433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MIN_DST_SRC; 443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MAX: 453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MAX_DST_SRC; 463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Unknown blend function %d\n", blend_func); 483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_factor(int blend_fact) 553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_fact) { 573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ONE: 583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE; 593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_COLOR: 603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_COLOR; 613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA: 623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA; 633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_ALPHA: 643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_ALPHA; 653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_COLOR: 663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_COLOR; 673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA_SATURATE; 693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_COLOR: 703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_COLOR; 713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_ALPHA: 723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_ALPHA; 733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ZERO: 743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ZERO; 753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_COLOR: 763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_COLOR; 773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_ALPHA; 793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_ALPHA: 803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_ALPHA; 813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_COLOR: 823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_COLOR; 833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_COLOR: 843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_COLOR; 853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_ALPHA; 873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_COLOR: 883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_COLOR; 893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_ALPHA: 903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_ALPHA; 913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_COLOR; 933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_ALPHA; 953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1038698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic unsigned r600_tex_dim(unsigned dim, unsigned nr_samples) 1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (dim) { 1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D: 1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D; 1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D_ARRAY: 1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D_ARRAY; 1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D: 1123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_RECT: 1138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_MSAA : 1148698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák V_038000_SQ_TEX_DIM_2D; 1153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D_ARRAY: 1168698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA : 1178698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák V_038000_SQ_TEX_DIM_2D_ARRAY; 1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_3D: 1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_3D; 1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_CUBE: 1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_CUBEMAP; 1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_dbformat(enum pipe_format format) 1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_16; 1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 1313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_X8_24; 132866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_8_24; 13489954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 13589954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_32_FLOAT; 136866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 13789954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_X24_8_32_FLOAT; 1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorswap(enum pipe_format format) 1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 1473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 148914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A8_SNORM: 1498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 1508d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 151914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UNORM: 152914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SNORM: 153914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UINT: 154914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SINT: 155914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_FLOAT: 156914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_UINT: 157914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_SINT: 158914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_FLOAT: 1590d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 1613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 162914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I8_SNORM: 1638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 1648d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 165914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_UNORM: 166914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_SNORM: 1678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 1688d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 1693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 170914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UNORM: 171914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SNORM: 172914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UINT: 173914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SINT: 174914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_FLOAT: 175914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_UINT: 176914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_SINT: 177914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_FLOAT: 178914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UNORM: 179914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SNORM: 180914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UINT: 181914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SINT: 182914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_FLOAT: 183914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_UINT: 184914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_SINT: 185914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_FLOAT: 1863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 1873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 18877058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_UINT: 18977058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_SINT: 1903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 1930d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 1973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 1993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 2013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 2023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 2053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 2063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 2093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 212914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8A8_SNORM: 2138d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 2148d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 2153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 216914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 217914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 218914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UINT: 219914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SINT: 220914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 221914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_UINT: 222914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_SINT: 223914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 2243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 226914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 2278d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 2288d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 2293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 232914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16_SNORM: 2338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 2348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 2353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 2363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 2393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 2413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 2433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 2463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 2473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 2543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 2558d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 2568d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 2613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 2623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 265866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 2663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 269866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 2703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 2733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 2743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 2753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 2789608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 2793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 2823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 283914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 2843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 2858d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 2868d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 2878d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_UINT: 2888d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_SINT: 2893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 29089954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 2943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 2958d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 2968d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 2983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 2998d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 3008d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 3013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 302866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 3033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 3053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 3063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 3073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 3088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 3098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 3103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 3113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 3123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("unsupported colorswap format %d\n", format); 3133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 3143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 3153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 3163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 3173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorformat(enum pipe_format format) 3193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 3203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 3213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 3220d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 3230d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 3243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4; 3253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 3273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 328914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A8_SNORM: 3298d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 3308d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 3313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 332914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I8_SNORM: 3338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 3348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 3353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_UNORM: 336914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8_SNORM: 3378d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 3388d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 3393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 3403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 3413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 3428d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_UINT: 3438d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_SINT: 3443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8; 3453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 3473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 3483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_5_6_5; 3493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 3513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 3523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_1_5_5_5; 3533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 3553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 3563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4_4_4; 3573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 3593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 362914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L8A8_SNORM: 3638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 3648d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 3653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 3663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 367914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R8G8_SNORM: 3688d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 3698d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 3703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8; 3713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 373914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16_SNORM: 3748d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 3758d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 376914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UNORM: 377914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SNORM: 378914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_UINT: 379914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_SINT: 380914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UNORM: 381914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SNORM: 382914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_UINT: 383914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_SINT: 384914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UNORM: 385914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SNORM: 386914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_UINT: 387914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_SINT: 3883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 391914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A16_FLOAT: 392914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16_FLOAT: 393914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I16_FLOAT: 3943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_FLOAT; 3953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 3973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 3983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 3993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 4003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 4013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 4023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 4033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 4043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 4053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 4063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 4073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 4083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 4098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 4108d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 4113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8_8_8; 4123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 4143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 4153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 4169608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 4173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 4183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_2_10_10_10; 4193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 421866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 4223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_24; 4233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 425866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 4263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_24_8; 4273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 428866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 42989954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_0280A0_COLOR_X24_8_32_FLOAT; 43089954723bfeef59d055d2332ff112f0204b48130Marek Olšák 4315250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_UINT: 4325250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_SINT: 433914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_UINT: 434914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_SINT: 435914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_UINT: 436914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_SINT: 437914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_UINT: 438914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_SINT: 4395250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie return V_0280A0_COLOR_32; 4405250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie 4413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 442914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_A32_FLOAT: 443914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32_FLOAT: 444914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_I32_FLOAT: 44589954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 4463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_FLOAT; 4473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 449914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_FLOAT: 4503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_FLOAT; 4513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 453914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_R16G16_SNORM: 4548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 4558d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 456914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UNORM: 457914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SNORM: 458914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_UINT: 459914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L16A16_SINT: 4603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16; 4613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 4633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_10_11_11_FLOAT; 4643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 4668d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 4678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 4683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 4693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 4703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16; 4713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 4733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16_FLOAT; 4743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 476914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_FLOAT: 4773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_FLOAT; 4783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4798d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 4808d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 481914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_UINT: 482914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák case PIPE_FORMAT_L32A32_SINT: 4833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32; 4843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 4863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 4873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32_FLOAT; 4883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 4893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 4908d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 4918d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 4923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32; 4933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* YUV buffers. */ 4953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_UYVY: 4963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_YUYV: 4973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 4983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; /* Unsupported. */ 4993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_colorformat_endian_swap(uint32_t colorformat) 5033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet if (R600_BIG_ENDIAN) { 5053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch(colorformat) { 5063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4: 5077e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 5083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 5103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8: 5117e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 5123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 5143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_5_6_5: 5153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_1_5_5_5: 5163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4_4_4: 5173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16: 5183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8: 5197e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 5203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 5223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8_8_8: 5233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_2_10_10_10: 5243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_24: 5253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_24_8: 5263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_FLOAT: 5273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_FLOAT: 5283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16: 5297e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 5323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16: 5333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16_FLOAT: 5347e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 5353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_FLOAT: 5373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32: 53889954723bfeef59d055d2332ff112f0204b48130Marek Olšák case V_0280A0_COLOR_X24_8_32_FLOAT: 5397e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 5423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_FLOAT: 5433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32_FLOAT: 5443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32: 5457e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 5473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; /* Unsupported. */ 5483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } else { 5503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; 5513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 5553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U; 5573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_colorbuffer_format_supported(enum pipe_format format) 5603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_colorformat(format) != ~0U && 5623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet r600_translate_colorswap(format) != ~0U; 5633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_zs_format_supported(enum pipe_format format) 5663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_dbformat(format) != ~0U; 5683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 569fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 57018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetboolean r600_is_format_supported(struct pipe_screen *screen, 57118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_format format, 57218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_texture_target target, 57318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned sample_count, 57418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned usage) 57518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet{ 5768698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_screen *rscreen = (struct r600_screen*)screen; 57718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned retval = 0; 57818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 57918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (target >= PIPE_MAX_TEXTURE_TYPES) { 58018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet R600_ERR("r600: unsupported texture type %d\n", target); 58118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 58218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 58318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 58418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (!util_format_is_supported(format, usage)) 58518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 58618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 5878698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (sample_count > 1) { 588c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák if (rscreen->info.drm_minor < 22) 5898698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 590c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák 591c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák /* R11G11B10 is broken on R6xx. */ 592c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák if (rscreen->chip_class == R600 && 593c2e9dd0276464ed61d48d3d80b9be8228767dfe2Marek Olšák format == PIPE_FORMAT_R11G11B10_FLOAT) 5948698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 5958698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 596df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák /* MSAA integer colorbuffers hang. */ 597fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák if (util_format_is_pure_integer(format) && 598fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák !util_format_is_depth_or_stencil(format)) 599df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák return FALSE; 600df5e2c058f73b72909fa99a2a189f5877525e3bfMarek Olšák 6018698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák switch (sample_count) { 6028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 2: 6038698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 4: 6048698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák case 8: 6058698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák break; 6068698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák default: 6078698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return FALSE; 6088698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 6098698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 61018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 61118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_SAMPLER_VIEW) && 61218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_sampler_format_supported(screen, format)) { 61318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_SAMPLER_VIEW; 61418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 61518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 61618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & (PIPE_BIND_RENDER_TARGET | 61718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 61818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 61918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED)) && 62018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_colorbuffer_format_supported(format)) { 62118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= usage & 62218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet (PIPE_BIND_RENDER_TARGET | 62318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 62418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 62518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED); 62618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 62718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 62818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_DEPTH_STENCIL) && 62918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_zs_format_supported(format)) { 63018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_DEPTH_STENCIL; 63118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 63218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 63318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_VERTEX_BUFFER) && 63418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_vertex_format_supported(format)) { 63518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_VERTEX_BUFFER; 63618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 63718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 63818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_READ) 63918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_READ; 64018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_WRITE) 64118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_WRITE; 64218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 64318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return retval == usage; 64418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet} 64518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 646ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšákstatic void r600_emit_polygon_offset(struct r600_context *rctx, struct r600_atom *a) 6470b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse{ 648ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 649ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák struct r600_poly_offset_state *state = (struct r600_poly_offset_state*)a; 650ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák float offset_units = state->offset_units; 651ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák float offset_scale = state->offset_scale; 652ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák 653ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák switch (state->zs_format) { 654ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z24X8_UNORM: 655ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z24_UNORM_S8_UINT: 656ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák offset_units *= 2.0f; 657ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák break; 658ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z16_UNORM: 659ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák offset_units *= 4.0f; 660ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák break; 661ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák default:; 6620b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 663ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák 664ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_context_reg_seq(cs, R_028E00_PA_SU_POLY_OFFSET_FRONT_SCALE, 4); 665ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_value(cs, fui(offset_scale)); 666ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_value(cs, fui(offset_units)); 667ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_value(cs, fui(offset_scale)); 668ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_value(cs, fui(offset_units)); 6690b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse} 6700b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 671faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšákstatic uint32_t r600_get_blend_control(const struct pipe_blend_state *state, unsigned i) 672faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák{ 673faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák int j = state->independent_blend_enable ? i : 0; 674faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 675faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned eqRGB = state->rt[j].rgb_func; 676faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned srcRGB = state->rt[j].rgb_src_factor; 677faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned dstRGB = state->rt[j].rgb_dst_factor; 678faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 679faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned eqA = state->rt[j].alpha_func; 680faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned srcA = state->rt[j].alpha_src_factor; 681faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák unsigned dstA = state->rt[j].alpha_dst_factor; 682faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák uint32_t bc = 0; 683faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 684faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák if (!state->rt[j].blend_enable) 685faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return 0; 686faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 687faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB)); 688faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB)); 689faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB)); 690faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 691faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 692faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_SEPARATE_ALPHA_BLEND(1); 693faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_ALPHA_COMB_FCN(r600_translate_blend_function(eqA)); 694faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA)); 695faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák bc |= S_028804_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA)); 696faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák } 697faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return bc; 698faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák} 699faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 7008698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic void *r600_create_blend_state_mode(struct pipe_context *ctx, 7018698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák const struct pipe_blend_state *state, 7028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák int mode) 703fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 704e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 7058698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák uint32_t color_control = 0, target_mask = 0; 706faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák struct r600_blend_state *blend = CALLOC_STRUCT(r600_blend_state); 707fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 708faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák if (!blend) { 709fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 710fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 711fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 712faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_init_command_buffer(&blend->buffer, 20); 713faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_init_command_buffer(&blend->buffer_no_blend, 20); 714fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7153e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher /* R600 does not support per-MRT blends */ 7163e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (rctx->family > CHIP_R600) 7173e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher color_control |= S_028808_PER_MRT_BLEND(1); 7188698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 719fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->logicop_enable) { 720fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (state->logicop_func << 16) | (state->logicop_func << 20); 721fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 722fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (0xcc << 16); 723fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 724fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 725fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->independent_blend_enable) { 726fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 727fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[i].blend_enable) { 728fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 729fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 730fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[i].colormask << (4 * i)); 731fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 732fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 733fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 734fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[0].blend_enable) { 735fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 736fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 737fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[0].colormask << (4 * i)); 738fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 739fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 74043e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák 74143e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák if (target_mask) 7428698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_control |= S_028808_SPECIAL_OP(mode); 74343e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák else 74443e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák color_control |= S_028808_SPECIAL_OP(V_028808_DISABLE); 74543e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák 746d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie /* only MRT0 has dual src blend */ 747d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie blend->dual_src_blend = util_blend_state_is_dual(state, 0); 748faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák blend->cb_target_mask = target_mask; 749faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák blend->cb_color_control = color_control; 750faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák blend->cb_color_control_no_blend = color_control & C_028808_TARGET_BLEND_ENABLE; 751faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák blend->alpha_to_one = state->alpha_to_one; 752faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 753faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_store_context_reg(&blend->buffer, R_028D44_DB_ALPHA_TO_MASK, 754faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák S_028D44_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) | 755faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák S_028D44_ALPHA_TO_MASK_OFFSET0(2) | 756faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák S_028D44_ALPHA_TO_MASK_OFFSET1(2) | 757faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák S_028D44_ALPHA_TO_MASK_OFFSET2(2) | 758faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák S_028D44_ALPHA_TO_MASK_OFFSET3(2)); 759fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 760faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák /* Copy over the registers set so far into buffer_no_blend. */ 761faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák memcpy(blend->buffer_no_blend.buf, blend->buffer.buf, blend->buffer.num_dw * 4); 762faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák blend->buffer_no_blend.num_dw = blend->buffer.num_dw; 763faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák 764faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák /* Only add blend registers if blending is enabled. */ 765faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák if (!G_028808_TARGET_BLEND_ENABLE(color_control)) { 766faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return blend; 767fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 76826cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák 769faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák /* The first R600 does not support per-MRT blends */ 770faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_store_context_reg(&blend->buffer, R_028804_CB_BLEND_CONTROL, 771faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_get_blend_control(state, 0)); 7726517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák 773faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák if (rctx->family > CHIP_R600) { 774faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_store_context_reg_seq(&blend->buffer, R_028780_CB_BLEND0_CONTROL, 8); 775faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák for (int i = 0; i < 8; i++) { 776faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_store_value(&blend->buffer, r600_get_blend_control(state, i)); 777faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák } 778faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák } 779faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return blend; 780fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 781fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7828698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákstatic void *r600_create_blend_state(struct pipe_context *ctx, 7838698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák const struct pipe_blend_state *state) 7848698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 7858698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák return r600_create_blend_state_mode(ctx, state, V_028808_SPECIAL_NORMAL); 7868698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 7878698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 788fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_dsa_state(struct pipe_context *ctx, 789fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_depth_stencil_alpha_state *state) 790fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 7913d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák unsigned db_depth_control, alpha_test_control, alpha_ref; 792ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák struct r600_dsa_state *dsa = CALLOC_STRUCT(r600_dsa_state); 793fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 794f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet if (dsa == NULL) { 795fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 796fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 797fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 798ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák r600_init_command_buffer(&dsa->buffer, 3); 799ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák 800a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[0] = state->stencil[0].valuemask; 801a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[1] = state->stencil[1].valuemask; 802a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[0] = state->stencil[0].writemask; 803a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[1] = state->stencil[1].writemask; 804a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák 805fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 806fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 807fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_ZFUNC(state->depth.func); 808fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 809fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* stencil */ 810fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[0].enabled) { 811fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCIL_ENABLE(1); 812d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); /* translates straight */ 813fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op)); 814fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op)); 815fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op)); 816fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 817fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[1].enabled) { 818fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_BACKFACE_ENABLE(1); 819d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); /* translates straight */ 820fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op)); 821fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op)); 822fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op)); 823fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 824fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 825fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 826fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* alpha */ 827fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = 0; 828fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = 0; 829fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->alpha.enabled) { 830fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 831fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 832fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = fui(state->alpha.ref_value); 833fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 8344a26454e979251db25bab68685835fa32c099429Dave Airlie dsa->sx_alpha_test_control = alpha_test_control & 0xff; 835f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet dsa->alpha_ref = alpha_ref; 836fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 837ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák r600_store_context_reg(&dsa->buffer, R_028800_DB_DEPTH_CONTROL, db_depth_control); 838ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák return dsa; 839fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 840fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 841fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_rs_state(struct pipe_context *ctx, 842543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák const struct pipe_rasterizer_state *state) 843fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 844e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 845711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák unsigned tmp, sc_mode_cntl, spi_interp; 846f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák float psize_min, psize_max; 847711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák struct r600_rasterizer_state *rs = CALLOC_STRUCT(r600_rasterizer_state); 848fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 849fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rs == NULL) { 850fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 851fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 852fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 853711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_init_command_buffer(&rs->buffer, 30); 854a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák 855fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->flatshade = state->flatshade; 856fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->sprite_coord_enable = state->sprite_coord_enable; 857725a820b926575265e6790601a0defd9c30947dcVadim Girlin rs->two_side = state->light_twoside; 85891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin rs->clip_plane_enable = state->clip_plane_enable; 8592000086fcd5174f121f61dd6df5948c67101e148Marek Olšák rs->pa_sc_line_stipple = state->line_stipple_enable ? 8602000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 8612000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 862a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák rs->pa_cl_clip_cntl = 863a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_PS_UCP_MODE(3) | 864a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 865a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 866a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 86726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák rs->multisample_enable = state->multisample; 868fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 86958c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse /* offset */ 87058c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_units = state->offset_units; 87158c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_scale = state->offset_scale * 12.0f; 872ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák rs->offset_enable = state->offset_point || state->offset_line || state->offset_tri; 87358c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse 874c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák if (state->point_size_per_vertex) { 875e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = util_get_min_point_size(state); 876e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = 8192; 877e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } else { 878e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák /* Force the point size to be as if the vertex output was disabled. */ 879e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = state->point_size; 880e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = state->point_size; 881e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } 882c28f7645722ed3da1a04d3187f9cfa5d8e5e489dKeith Whitwell 883711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák sc_mode_cntl = S_028A4C_MSAA_ENABLE(state->multisample) | 884711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A4C_LINE_STIPPLE_ENABLE(state->line_stipple_enable) | 885711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1); 886aacd653834264b70a2537aff7914762b39f0683fMarek Olšák if (rctx->chip_class >= R700) { 887711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák sc_mode_cntl |= S_028A4C_FORCE_EOV_REZ_ENABLE(1) | 888711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A4C_R700_ZMM_LINE_OFFSET(1) | 889711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A4C_R700_VPORT_SCISSOR_ENABLE(state->scissor); 890aacd653834264b70a2537aff7914762b39f0683fMarek Olšák } else { 891711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák sc_mode_cntl |= S_028A4C_WALK_ALIGN8_PRIM_FITS_ST(1); 892aacd653834264b70a2537aff7914762b39f0683fMarek Olšák rs->scissor_enable = state->scissor; 893aacd653834264b70a2537aff7914762b39f0683fMarek Olšák } 894711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák 895711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák spi_interp = S_0286D4_FLAT_SHADE_ENA(1); 896711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák if (state->sprite_coord_enable) { 897711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák spi_interp |= S_0286D4_PNT_SPRITE_ENA(1) | 898711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_0286D4_PNT_SPRITE_OVRD_X(2) | 899711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_0286D4_PNT_SPRITE_OVRD_Y(3) | 900711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_0286D4_PNT_SPRITE_OVRD_Z(0) | 901711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_0286D4_PNT_SPRITE_OVRD_W(1); 902711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 903711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák spi_interp |= S_0286D4_PNT_SPRITE_TOP_1(1); 904711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák } 905711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák } 906711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák 907711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg_seq(&rs->buffer, R_028A00_PA_SU_POINT_SIZE, 3); 908711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák /* point size 12.4 fixed point (divide by two, because 0.5 = 1 pixel. */ 909711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák tmp = r600_pack_float_12p4(state->point_size/2); 910711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_value(&rs->buffer, /* R_028A00_PA_SU_POINT_SIZE */ 911711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp)); 912711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_value(&rs->buffer, /* R_028A04_PA_SU_POINT_MINMAX */ 913711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 914711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2))); 915711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_value(&rs->buffer, /* R_028A08_PA_SU_LINE_CNTL */ 916711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028A08_WIDTH(r600_pack_float_12p4(state->line_width/2))); 917711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák 918711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_0286D4_SPI_INTERP_CONTROL_0, spi_interp); 919711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_028A4C_PA_SC_MODE_CNTL, sc_mode_cntl); 920711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_028C08_PA_SU_VTX_CNTL, 921711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules) | 922711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028C08_QUANT_MODE(V_028C08_X_1_256TH)); 923711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_028DFC_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp)); 924711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_028814_PA_SU_SC_MODE_CNTL, 925711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_PROVOKING_VTX_LAST(!state->flatshade_first) | 926711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_CULL_FRONT(state->cull_face & PIPE_FACE_FRONT ? 1 : 0) | 927711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_CULL_BACK(state->cull_face & PIPE_FACE_BACK ? 1 : 0) | 928711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_FACE(!state->front_ccw) | 929711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 930711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 931711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 932711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLY_MODE(state->fill_front != PIPE_POLYGON_MODE_FILL || 933711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák state->fill_back != PIPE_POLYGON_MODE_FILL) | 934711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) | 935711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back))); 936711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_store_context_reg(&rs->buffer, R_028350_SX_MISC, S_028350_MULTIPASS(state->rasterizer_discard)); 937711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák return rs; 938fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 939fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 940fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_sampler_state(struct pipe_context *ctx, 941fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_sampler_state *state) 942fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 943badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state); 944b9e8ea6a2717422ea71887beda093fe1dfbd1200Jerome Glisse unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0; 945fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 946badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák if (ss == NULL) { 947fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 948fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 949fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 950badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák ss->seamless_cube_map = state->seamless_cube_map; 95133dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák ss->border_color_use = state->border_color.ui[0] || state->border_color.ui[1] || 95233dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák state->border_color.ui[2] || state->border_color.ui[3]; 95333dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák 9542df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */ 95533dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák ss->tex_sampler_words[0] = 95633dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) | 95733dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) | 95833dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) | 95933dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) | 96033dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) | 96133dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) | 96233dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) | 96333dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) | 96433dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C000_BORDER_COLOR_TYPE(ss->border_color_use ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0); 9652df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */ 96633dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák ss->tex_sampler_words[1] = 96733dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 6)) | 96833dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 6)) | 96933dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák S_03C004_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 6)); 9702df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* R_03C008_SQ_TEX_SAMPLER_WORD2_0 */ 9712df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse ss->tex_sampler_words[2] = S_03C008_TYPE(1); 97233dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák 97333dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák if (ss->border_color_use) { 97433dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák memcpy(&ss->border_color, &state->border_color, sizeof(state->border_color)); 975fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 9762df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse return ss; 977fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 978fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 9796db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšákstruct pipe_sampler_view * 9806db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšákr600_create_sampler_view_custom(struct pipe_context *ctx, 9816db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák struct pipe_resource *texture, 9826db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák const struct pipe_sampler_view *state, 9836db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák unsigned width_first_level, unsigned height_first_level) 984fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 985565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view); 986951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *tmp = (struct r600_texture*)texture; 987843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, endian; 988fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse uint32_t word4 = 0, yuv_format = 0, pitch = 0; 989fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned char swizzle[4], array_mode = 0, tile_type = 0; 990677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák unsigned width, height, depth, offset_level, last_level; 991fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 992565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák if (view == NULL) 993fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 994fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 995fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* initialize base object */ 996565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base = *state; 997565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = NULL; 998fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse pipe_reference(NULL, &texture->reference); 999565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = texture; 1000565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.reference.count = 1; 1001565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.context = ctx; 1002fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1003fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[0] = state->swizzle_r; 1004fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[1] = state->swizzle_g; 1005fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[2] = state->swizzle_b; 1006fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[3] = state->swizzle_a; 1007565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1008929be6eb95c33d5885a89b36dbc82db64c1344feDave Airlie format = r600_translate_texformat(ctx->screen, state->format, 1009fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle, 1010fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse &word4, &yuv_format); 1011a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1012fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (format == ~0) { 1013a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák FREE(view); 1014a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák return NULL; 1015fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1016565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1017d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák if (tmp->is_depth && !tmp->is_flushing_texture) { 1018611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák if (!r600_init_flushed_depth_texture(ctx, texture, NULL)) { 1019da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák FREE(view); 1020da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák return NULL; 1021da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák } 1022611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák tmp = tmp->flushed_depth_texture; 1023fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1024565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 1025843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 1026231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 1027677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák offset_level = state->u.tex.first_level; 1028677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák last_level = state->u.tex.last_level - offset_level; 10296db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák width = width_first_level; 10306db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák height = height_first_level; 1031581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = tmp->surface.level[offset_level].npix_z; 1032581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format); 1033581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák tile_type = tmp->tile_type; 1034581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák 1035581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 1036581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák height = 1; 1037581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = texture->array_size; 1038581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 1039581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák depth = texture->array_size; 1040581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1041581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (tmp->surface.level[offset_level].mode) { 1042581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1043581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_LINEAR_ALIGNED; 1044581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1045581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1046581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_1D_TILED_THIN1; 1047581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1048581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1049581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_2D_TILED_THIN1; 1050581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1051581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1052581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1053581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_038000_ARRAY_LINEAR_GENERAL; 1054581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1055581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 105669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 1057581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource = &tmp->resource; 10588698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[0] = (S_038000_DIM(r600_tex_dim(texture->target, texture->nr_samples)) | 1059581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TILE_MODE(array_mode) | 1060581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TILE_TYPE(tile_type) | 1061581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_PITCH((pitch / 8) - 1) | 1062581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038000_TEX_WIDTH(width - 1)); 1063581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[1] = (S_038004_TEX_HEIGHT(height - 1) | 1064581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038004_TEX_DEPTH(depth - 1) | 1065581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038004_DATA_FORMAT(format)); 1066581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[2] = tmp->surface.level[offset_level].offset >> 8; 1067581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (offset_level >= tmp->surface.last_level) { 1068581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[3] = tmp->surface.level[offset_level].offset >> 8; 1069c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1070581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[3] = tmp->surface.level[offset_level + 1].offset >> 8; 1071c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1072581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[4] = (word4 | 1073581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) | 1074581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_REQUEST_SIZE(1) | 1075581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_ENDIAN_SWAP(endian) | 1076581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038010_BASE_LEVEL(0)); 10778698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] = (S_038014_BASE_ARRAY(state->u.tex.first_layer) | 1078581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038014_LAST_ARRAY(state->u.tex.last_layer)); 10798698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (texture->nr_samples > 1) { 10808698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* LAST_LEVEL holds log2(nr_samples) for multisample textures */ 10818698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] |= S_038014_LAST_LEVEL(util_logbase2(texture->nr_samples)); 10828698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { 10838698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák view->tex_resource_words[5] |= S_038014_LAST_LEVEL(last_level); 10848698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1085581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák view->tex_resource_words[6] = (S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) | 1086581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák S_038018_MAX_ANISO(4 /* max 16 samples */)); 1087565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák return &view->base; 1088fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1089fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 10906db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšákstatic struct pipe_sampler_view * 10916db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšákr600_create_sampler_view(struct pipe_context *ctx, 10926db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák struct pipe_resource *tex, 10936db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák const struct pipe_sampler_view *state) 10946db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák{ 10956db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 10966db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák 10976db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák return r600_create_sampler_view_custom(ctx, tex, state, 10986db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák rtex->surface.level[state->u.tex.first_level].npix_x, 10996db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák rtex->surface.level[state->u.tex.first_level].npix_y); 11006db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák} 11016db53ca490b22ba3f16b3ab0beef7a5fc071a074Marek Olšák 11022b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšákstatic void r600_emit_clip_state(struct r600_context *rctx, struct r600_atom *atom) 1103fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 11042b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 11052b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák struct pipe_clip_state *state = &rctx->clip_state.state; 110654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 11072b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_write_context_reg_seq(cs, R_028E20_PA_CL_UCP0_X, 6*4); 11082b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_write_array(cs, 6*4, (unsigned*)state); 1109fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1110fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1111fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_polygon_stipple(struct pipe_context *ctx, 1112fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_poly_stipple *state) 1113fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1114fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1115fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 111618a189188ab5f209942ccc85cb8aac51f419b591Marek Olšákstatic void r600_emit_scissor_state(struct r600_context *rctx, struct r600_atom *atom) 1117fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 111818a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 111918a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák struct pipe_scissor_state *state = &rctx->scissor.scissor; 1120fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 112118a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák if (rctx->chip_class != R600 || rctx->scissor.enable) { 112218a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, 2); 112318a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_value(cs, S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny) | 112418a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák S_028240_WINDOW_OFFSET_DISABLE(1)); 112518a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_value(cs, S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy)); 112618a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák } else { 112718a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_context_reg_seq(cs, R_028250_PA_SC_VPORT_SCISSOR_0_TL, 2); 112818a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_value(cs, S_028240_TL_X(0) | S_028240_TL_Y(0) | 112918a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák S_028240_WINDOW_OFFSET_DISABLE(1)); 113018a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_write_value(cs, S_028244_BR_X(8192) | S_028244_BR_Y(8192)); 113118a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák } 1132fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1133fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 113418a189188ab5f209942ccc85cb8aac51f419b591Marek Olšákstatic void r600_set_scissor_state(struct pipe_context *ctx, 113518a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák const struct pipe_scissor_state *state) 1136aacd653834264b70a2537aff7914762b39f0683fMarek Olšák{ 1137aacd653834264b70a2537aff7914762b39f0683fMarek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1138aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 113918a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák rctx->scissor.scissor = *state; 1140aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 114118a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák if (rctx->chip_class == R600 && !rctx->scissor.enable) 1142fc887d687b0598e09de76be885652d96e20ae07eMarek Olšák return; 1143aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 114418a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák rctx->scissor.atom.dirty = true; 1145aacd653834264b70a2537aff7914762b39f0683fMarek Olšák} 1146aacd653834264b70a2537aff7914762b39f0683fMarek Olšák 114778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšákstatic struct r600_resource *r600_buffer_create_helper(struct r600_screen *rscreen, 114878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák unsigned size, unsigned alignment) 114978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 115078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_resource buffer; 115178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 115278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(&buffer, 0, sizeof buffer); 115378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.target = PIPE_BUFFER; 115478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.format = PIPE_FORMAT_R8_UNORM; 115578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.bind = PIPE_BIND_CUSTOM; 115678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.usage = PIPE_USAGE_STATIC; 115778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.flags = 0; 115878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.width0 = size; 115978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.height0 = 1; 116078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.depth0 = 1; 116178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák buffer.array_size = 1; 116278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 116378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák return (struct r600_resource*) 116478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_buffer_create(&rscreen->screen, &buffer, alignment); 116578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 116678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 1167cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšákstatic void r600_init_color_surface(struct r600_context *rctx, 116878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_surface *surf, 116978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák bool force_cmask_fmask) 1170fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 117178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_screen *rscreen = rctx->screen; 1172951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)surf->base.texture; 1173cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák unsigned level = surf->base.u.tex.level; 1174fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned pitch, slice; 1175fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned color_info; 1176843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, swap, ntype, endian; 11774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned offset; 1178fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct util_format_description *desc; 11790d851f6e9c6046052ddce3860e625537832530a0Dave Airlie int i; 1180cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák bool blend_bypass = 0, blend_clamp = 1; 11813e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 1182d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák if (rtex->is_depth && !rtex->is_flushing_texture) { 1183cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák r600_init_flushed_depth_texture(&rctx->context, surf->base.texture, NULL); 11843e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie rtex = rtex->flushed_depth_texture; 1185cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák assert(rtex); 11863e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie } 11873e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 1188581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset = rtex->surface.level[level].offset; 1189581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1190581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset += rtex->surface.level[level].slice_size * 1191cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->base.u.tex.first_layer; 1192581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1193581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1194581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1195581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (slice) { 1196581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = slice - 1; 1197581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1198581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = 0; 1199581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (rtex->surface.level[level].mode) { 1200581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1201581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_ALIGNED); 1202581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1203581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1204581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_1D_TILED_THIN1); 1205581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1206581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1207581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_2D_TILED_THIN1); 1208581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1209581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1210581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1211581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_GENERAL); 1212581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1213c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1214581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák 1215780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie desc = util_format_description(surf->base.format); 1216fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 12170d851f6e9c6046052ddce3860e625537832530a0Dave Airlie for (i = 0; i < 4; i++) { 12180d851f6e9c6046052ddce3860e625537832530a0Dave Airlie if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 12190d851f6e9c6046052ddce3860e625537832530a0Dave Airlie break; 12200d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 12210d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 12228d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie 122366866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 122466866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 122566866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_SRGB; 12268d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 12278d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 12288d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SNORM; 12298d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 12308d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SINT; 12318d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 12328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 12338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 12348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 12358d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UINT; 12368d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } 12370d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 1238780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie format = r600_translate_colorformat(surf->base.format); 1239a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1240a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák 1241780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie swap = r600_translate_colorswap(surf->base.format); 1242a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(swap != ~0); 1243a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák 1244a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) { 1245843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = ENDIAN_NONE; 1246843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } else { 1247843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 1248843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 1249231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 1250a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie /* set blend bypass according to docs if SINT/UINT or 1251a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 8/24 COLOR variants */ 1252a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie if (ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT || 1253a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_8_24 || format == V_0280A0_COLOR_24_8 || 1254a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_X24_8_32_FLOAT) { 1255a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_clamp = 0; 1256a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_bypass = 1; 1257a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie } 1258a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 1259cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->alphatest_bypass = ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT; 12604a26454e979251db25bab68685835fa32c099429Dave Airlie 1261c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info |= S_0280A0_FORMAT(format) | 1262fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0280A0_COMP_SWAP(swap) | 1263a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_BYPASS(blend_bypass) | 1264a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_CLAMP(blend_clamp) | 1265843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_NUMBER_TYPE(ntype) | 1266843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_ENDIAN(endian); 12670d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 12685939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM is an optimzation that can be enabled for better 12695939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * performance in certain cases 12705939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 1271b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class == R600) { 12725939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 12735939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 12745939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_CLAMP is enabled 12755939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_FLOAT32 is disabled 12765939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 12775939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 12785939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 12 && 12795939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 12805939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && 12815939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_SINT) && 12825939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher G_0280A0_BLEND_CLAMP(color_info) && 1283b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse !G_0280A0_BLEND_FLOAT32(color_info)) { 12845939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 1285cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->export_16bpc = true; 1286b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 12875939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } else { 12885939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 12895939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 12905939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 16-bit or smaller FLOAT 12915939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 12925939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 12935939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ((desc->channel[i].size < 12 && 12945939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 12955939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && ntype != V_0280A0_NUMBER_SINT) || 12965939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 17 && 1297b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) { 12985939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 1299cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->export_16bpc = true; 1300b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 13015939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } 1302fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 130378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* These might not always be initialized to zero. */ 1304cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_base = offset >> 8; 1305cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_size = S_028060_PITCH_TILE_MAX(pitch) | 1306cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák S_028060_SLICE_TILE_MAX(slice); 13078698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_fmask = surf->cb_color_base; 13088698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_cmask = surf->cb_color_base; 130978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_mask = 0; 131078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 131178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask, 131278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rtex->resource.b.b); 131378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask, 131478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rtex->resource.b.b); 13158698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 13168698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->cmask_size) { 13178698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_cmask = rtex->cmask_offset >> 8; 13188698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_mask |= S_028100_CMASK_BLOCK_MAX(rtex->cmask_slice_tile_max); 13198698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 13208698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->fmask_size) { 13218698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE); 13228698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_fmask = rtex->fmask_offset >> 8; 13238698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_mask |= S_028100_FMASK_TILE_MAX(slice); 13248698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { /* cmask only */ 13258698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_CLEAR_ENABLE); 13268698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 132778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } else if (force_cmask_fmask) { 132878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Allocate dummy FMASK and CMASK if they aren't allocated already. 132978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * 133078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * R6xx needs FMASK and CMASK for the destination buffer of color resolve, 133178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * otherwise it hangs. We don't have FMASK and CMASK pre-allocated, 133278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák * because it's not an MSAA buffer. 133378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák */ 133478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_cmask_info cmask; 133578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct r600_fmask_info fmask; 133678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 133778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_texture_get_cmask_info(rscreen, rtex, &cmask); 133878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_texture_get_fmask_info(rscreen, rtex, 8, &fmask); 133978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 134078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* CMASK. */ 134178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!rctx->dummy_cmask || 134278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask->buf->size < cmask.size || 134378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask->buf->alignment % cmask.alignment != 0) { 134478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_transfer *transfer; 134578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák void *ptr; 134678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 134778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&rctx->dummy_cmask, NULL); 134878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_cmask = r600_buffer_create_helper(rscreen, cmask.size, cmask.alignment); 134978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 135078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Set the contents to 0xCC. */ 135178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák ptr = pipe_buffer_map(&rctx->context, &rctx->dummy_cmask->b.b, PIPE_TRANSFER_WRITE, &transfer); 135278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(ptr, 0xCC, cmask.size); 135378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_buffer_unmap(&rctx->context, transfer); 135478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 135578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask, 135678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rctx->dummy_cmask->b.b); 135778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 135878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* FMASK. */ 135978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!rctx->dummy_fmask || 136078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask->buf->size < fmask.size || 136178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask->buf->alignment % fmask.alignment != 0) { 136278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&rctx->dummy_fmask, NULL); 136378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák rctx->dummy_fmask = r600_buffer_create_helper(rscreen, fmask.size, fmask.alignment); 136478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 136578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 136678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask, 136778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák &rctx->dummy_fmask->b.b); 136878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 136978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* Init the registers. */ 137078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE); 137178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_cmask = 0; 137278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_fmask = 0; 137378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->cb_color_mask = S_028100_CMASK_BLOCK_MAX(cmask.slice_tile_max) | 137478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák S_028100_FMASK_TILE_MAX(slice); 13758698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 137678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 13778698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák surf->cb_color_info = color_info; 13788698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1379581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1380cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_view = 0; 1381c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1382cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->cb_color_view = S_028080_SLICE_START(surf->base.u.tex.first_layer) | 1383cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák S_028080_SLICE_MAX(surf->base.u.tex.last_layer); 1384c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1385cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1386cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf->color_initialized = true; 1387fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1388fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1389cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšákstatic void r600_init_depth_surface(struct r600_context *rctx, 1390cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák struct r600_surface *surf) 1391fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1392951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)surf->base.texture; 1393faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák unsigned level, pitch, slice, format, offset, array_mode; 1394fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1395cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák level = surf->base.u.tex.level; 1396581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák offset = rtex->surface.level[level].offset; 1397581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1398581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1399581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák if (slice) { 1400581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák slice = slice - 1; 1401581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák } 1402581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák switch (rtex->surface.level[level].mode) { 1403581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_2D: 1404581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_0280A0_ARRAY_2D_TILED_THIN1; 1405581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1406581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_1D: 1407581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR_ALIGNED: 1408581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák case RADEON_SURF_MODE_LINEAR: 1409581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák default: 1410581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák array_mode = V_0280A0_ARRAY_1D_TILED_THIN1; 1411581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák break; 1412c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1413faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák 1414cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák format = r600_translate_dbformat(surf->base.format); 1415a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák assert(format != ~0); 1416fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1417cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_info = S_028010_ARRAY_MODE(array_mode) | S_028010_FORMAT(format); 1418cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_base = offset >> 8; 1419cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_view = S_028004_SLICE_START(surf->base.u.tex.first_layer) | 1420cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák S_028004_SLICE_MAX(surf->base.u.tex.last_layer); 1421cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_depth_size = S_028000_PITCH_TILE_MAX(pitch) | S_028000_SLICE_TILE_MAX(slice); 1422cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->db_prefetch_limit = (rtex->surface.level[level].nblk_y / 8) - 1; 1423cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1424ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák switch (surf->base.format) { 1425ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z24X8_UNORM: 1426ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1427ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák surf->pa_su_poly_offset_db_fmt_cntl = 1428ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS((char)-24); 1429ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák break; 1430ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z32_FLOAT: 1431ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 1432ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák surf->pa_su_poly_offset_db_fmt_cntl = 1433ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS((char)-23) | 1434ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák S_028DF8_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 1435ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák break; 1436ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák case PIPE_FORMAT_Z16_UNORM: 1437ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák surf->pa_su_poly_offset_db_fmt_cntl = 1438ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS((char)-16); 1439ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák break; 1440ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák default:; 1441ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák } 1442ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák 1443cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf->depth_initialized = true; 1444fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1445fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1446fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_framebuffer_state(struct pipe_context *ctx, 1447fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_framebuffer_state *state) 1448fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1449e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1450cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák struct r600_surface *surf; 14518698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct r600_texture *rtex; 1452c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned i; 1453fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1454c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.nr_cbufs) { 1455fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_CB_FLUSH; 1456933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák 1457933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák if (rctx->chip_class >= R700 && 1458933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák rctx->framebuffer.state.cbufs[0]->texture->nr_samples > 1) { 1459933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák rctx->flags |= R600_CONTEXT_FLUSH_AND_INV_CB_META; 1460933faae2b8669f459e7ab27d6bcbfb6f4136b6d5Marek Olšák } 1461fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 1462c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.zsbuf) { 1463fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_DB_FLUSH; 1464fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 1465fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák /* R6xx errata */ 1466fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák if (rctx->chip_class == R600) { 1467fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák rctx->flags |= R600_CONTEXT_FLUSH_AND_INV; 1468fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák } 14696067a2a67f9a7aab2aee051469bea8af03747a95Fredrik Höglund 1470c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Set the new state. */ 1471c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák util_copy_framebuffer_state(&rctx->framebuffer.state, state); 1472c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 1473c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.export_16bpc = state->nr_cbufs != 0; 1474c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.cb0_is_integer = state->nr_cbufs && 1475c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák util_format_is_pure_integer(state->cbufs[0]->format); 1476c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.compressed_cb_mask = 0; 1477c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.is_msaa_resolve = state->nr_cbufs == 2 && 1478c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák state->cbufs[0]->texture->nr_samples > 1 && 1479c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák state->cbufs[1]->texture->nr_samples <= 1; 14807ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1481c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (state->nr_cbufs) 1482c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = state->cbufs[0]->texture->nr_samples; 1483c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák else if (state->zsbuf) 1484c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = state->zsbuf->texture->nr_samples; 1485c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák else 1486c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.nr_samples = 0; 1487fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák 14888698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* Colorbuffers. */ 1489cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák for (i = 0; i < state->nr_cbufs; i++) { 1490c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* The resolve buffer must have CMASK and FMASK to prevent hardlocks on R6xx. */ 1491c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák bool force_cmask_fmask = rctx->chip_class == R600 && 1492c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.is_msaa_resolve && 1493c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák i == 1; 1494c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1495cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf = (struct r600_surface*)state->cbufs[i]; 1496c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rtex = (struct r600_texture*)surf->base.texture; 1497cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 149878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (!surf->color_initialized || force_cmask_fmask) { 149978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák r600_init_color_surface(rctx, surf, force_cmask_fmask); 150078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák if (force_cmask_fmask) { 150178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák /* re-initialize later without compression */ 150278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák surf->color_initialized = false; 150378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 1504cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1505cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1506cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (!surf->export_16bpc) { 1507c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.export_16bpc = false; 1508cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1509cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 15108698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (rtex->fmask_size && rtex->cmask_size) { 1511c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.compressed_cb_mask |= 1 << i; 15128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1513cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1514cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 1515cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák /* Update alpha-test state dependencies. 1516cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák * Alpha-test is done on the first colorbuffer only. */ 1517cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (state->nr_cbufs) { 1518cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák surf = (struct r600_surface*)state->cbufs[0]; 1519cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák if (rctx->alphatest_state.bypass != surf->alphatest_bypass) { 1520cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák rctx->alphatest_state.bypass = surf->alphatest_bypass; 1521eb65fefa4bd5e9a6f08ec599b95f9d63d11c15faMarek Olšák rctx->alphatest_state.atom.dirty = true; 1522cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1523cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák } 1524cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák 15258698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák /* ZS buffer. */ 1526fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->zsbuf) { 1527cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák surf = (struct r600_surface*)state->zsbuf; 1528cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1529cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák if (!surf->depth_initialized) { 1530cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák r600_init_depth_surface(rctx, surf); 1531cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák } 1532cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák 1533ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák if (state->zsbuf->format != rctx->poly_offset_state.zs_format) { 1534ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák rctx->poly_offset_state.zs_format = state->zsbuf->format; 1535ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák rctx->poly_offset_state.atom.dirty = true; 1536ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák } 1537fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1538fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1539c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) { 1540c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->cb_misc_state.nr_cbufs = state->nr_cbufs; 1541eb65fefa4bd5e9a6f08ec599b95f9d63d11c15faMarek Olšák rctx->cb_misc_state.atom.dirty = true; 1542c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1543fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1544c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) { 1545c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->alphatest_state.bypass = false; 1546eb65fefa4bd5e9a6f08ec599b95f9d63d11c15faMarek Olšák rctx->alphatest_state.atom.dirty = true; 1547c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1548fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1549c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák r600_update_db_shader_control(rctx); 1550c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák 1551c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Calculate the CS size. */ 1552c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw = 1553c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 10 /*COLOR_INFO*/ + 4 /*SCISSOR*/ + 3 /*SHADER_CONTROL*/ + 8 /*MSAA*/; 1554c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1555c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.nr_cbufs) { 1556c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 6 * (2 + rctx->framebuffer.state.nr_cbufs); 1557c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 6 * rctx->framebuffer.state.nr_cbufs; /* relocs */ 1558c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1559c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1560c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.state.zsbuf) { 1561ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák rctx->framebuffer.atom.num_dw += 16; 15629f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák } else if (rctx->screen->info.drm_minor >= 18) { 15639f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák rctx->framebuffer.atom.num_dw += 3; 1564c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1565c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family > CHIP_R600 && rctx->family < CHIP_RV770) { 1566c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák rctx->framebuffer.atom.num_dw += 2; 15678698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 15688698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1569eb65fefa4bd5e9a6f08ec599b95f9d63d11c15faMarek Olšák rctx->framebuffer.atom.dirty = true; 1570c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák} 1571c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1572c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák#define FILL_SREG(s0x, s0y, s1x, s1y, s2x, s2y, s3x, s3y) \ 1573c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s0x) & 0xf) | (((s0y) & 0xf) << 4) | \ 1574c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s1x) & 0xf) << 8) | (((s1y) & 0xf) << 12) | \ 1575c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s2x) & 0xf) << 16) | (((s2y) & 0xf) << 20) | \ 1576c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (((s3x) & 0xf) << 24) | (((s3y) & 0xf) << 28)) 1577c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1578c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšákstatic void r600_emit_msaa_state(struct r600_context *rctx, int nr_samples) 1579c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák{ 1580c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_2x[] = { 1581c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4), 1582c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4), 1583c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1584c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_2x = 4; 1585c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_4x[] = { 1586c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6), 1587c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6), 1588c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1589c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_4x = 6; 1590c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static uint32_t sample_locs_8x[] = { 1591c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2), 1592c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák FILL_SREG( 6, 0, 0, 0, -5, 3, 4, 4), 1593c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák }; 1594c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák static unsigned max_dist_8x = 8; 159582a1d241754a52934b41bd152d25741b0c9c6294Marek Olšák 1596c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1597c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned max_dist = 0; 1598c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1599c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family == CHIP_R600) { 1600c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák switch (nr_samples) { 1601c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák default: 1602c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák nr_samples = 0; 1603c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1604c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 2: 1605c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg(cs, R_008B40_PA_SC_AA_SAMPLE_LOCS_2S, sample_locs_2x[0]); 1606c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_2x; 1607c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1608c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 4: 1609c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg(cs, R_008B44_PA_SC_AA_SAMPLE_LOCS_4S, sample_locs_4x[0]); 1610c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_4x; 1611c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1612c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 8: 1613c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_config_reg_seq(cs, R_008B48_PA_SC_AA_SAMPLE_LOCS_8S_WD0, 2); 1614c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[0]); /* R_008B48_PA_SC_AA_SAMPLE_LOCS_8S_WD0 */ 1615c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[1]); /* R_008B4C_PA_SC_AA_SAMPLE_LOCS_8S_WD1 */ 1616c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_8x; 1617c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1618c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1619c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } else { 1620c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák switch (nr_samples) { 1621c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák default: 1622c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1623c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1624c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1625c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák nr_samples = 0; 1626c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1627c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 2: 1628c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1629c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_2x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1630c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_2x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1631c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_2x; 1632c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1633c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 4: 1634c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1635c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_4x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1636c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_4x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1637c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_4x; 1638c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1639c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák case 8: 1640c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 2); 1641c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[0]); /* R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX */ 1642c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sample_locs_8x[1]); /* R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX */ 1643c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák max_dist = max_dist_8x; 1644c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák break; 1645c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1646c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 16478698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 16488698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák if (nr_samples > 1) { 1649c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C00_PA_SC_LINE_CNTL, 2); 1650c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C00_LAST_PIXEL(1) | 1651c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028C00_EXPAND_LINE_WIDTH(1)); /* R_028C00_PA_SC_LINE_CNTL */ 1652c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C04_MSAA_NUM_SAMPLES(util_logbase2(nr_samples)) | 1653c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028C04_MAX_SAMPLE_DIST(max_dist)); /* R_028C04_PA_SC_AA_CONFIG */ 16548698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } else { 1655c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028C00_PA_SC_LINE_CNTL, 2); 1656c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028C00_LAST_PIXEL(1)); /* R_028C00_PA_SC_LINE_CNTL */ 1657c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); /* R_028C04_PA_SC_AA_CONFIG */ 165882a1d241754a52934b41bd152d25741b0c9c6294Marek Olšák } 1659c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák} 1660fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1661c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšákstatic void r600_emit_framebuffer_state(struct r600_context *rctx, struct r600_atom *atom) 1662c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák{ 1663c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1664c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct pipe_framebuffer_state *state = &rctx->framebuffer.state; 1665c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned nr_cbufs = state->nr_cbufs; 1666c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct r600_surface **cb = (struct r600_surface**)&state->cbufs[0]; 1667c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned i, sbu = 0; 16680b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 1669c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Colorbuffers. */ 1670c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280A0_CB_COLOR0_INFO, 8); 1671c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1672c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_info); 1673c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1674c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* set CB_COLOR1_INFO for possible dual-src blending */ 1675c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (i == 1) { 1676c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[0]->cb_color_info); 1677c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák i++; 1678c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1679c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (; i < 8; i++) { 1680c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, 0); 1681c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1682c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1683c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (nr_cbufs) { 1684c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* COLOR_BASE */ 1685c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028040_CB_COLOR0_BASE, nr_cbufs); 1686c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1687c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_base); 1688c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1689c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1690c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1691c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1692c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1693c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (struct r600_resource*)cb[i]->base.texture, 1694c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1695c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1696c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1697c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1698c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1699c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028060_CB_COLOR0_SIZE, nr_cbufs); 1700c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1701c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_size); 1702c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1703c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1704c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028080_CB_COLOR0_VIEW, nr_cbufs); 1705c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1706c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_view); 1707c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1708c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1709c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028100_CB_COLOR0_MASK, nr_cbufs); 1710c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1711c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_mask); 1712c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1713c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1714c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* FMASK. */ 1715c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280E0_CB_COLOR0_FRAG, nr_cbufs); 1716c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1717c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_fmask); 1718c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1719c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1720c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1721c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1722c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák cb[i]->cb_buffer_fmask, 1723c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1724c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1725c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1726c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1727c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1728c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* CMASK. */ 1729c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_0280C0_CB_COLOR0_TILE, nr_cbufs); 1730c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1731c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, cb[i]->cb_color_cmask); 1732c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1733c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* relocations */ 1734c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák for (i = 0; i < nr_cbufs; i++) { 1735c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1736c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák cb[i]->cb_buffer_cmask, 1737c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1738c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1739c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1740c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1741c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1742c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák sbu |= SURFACE_BASE_UPDATE_COLOR_NUM(nr_cbufs); 1743c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } 1744c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1745c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Zbuffer. */ 17460b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse if (state->zsbuf) { 1747c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák struct r600_surface *surf = (struct r600_surface*)state->zsbuf; 1748c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák unsigned reloc = r600_context_bo_reloc(rctx, 1749c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (struct r600_resource*)state->zsbuf->texture, 1750c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák RADEON_USAGE_READWRITE); 1751c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1752ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_write_context_reg(cs, R_028DF8_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 1753ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák surf->pa_su_poly_offset_db_fmt_cntl); 1754ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák 1755c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028000_DB_DEPTH_SIZE, 2); 1756c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_size); /* R_028000_DB_DEPTH_SIZE */ 1757c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_view); /* R_028004_DB_DEPTH_VIEW */ 1758c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_02800C_DB_DEPTH_BASE, 2); 1759c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_base); /* R_02800C_DB_DEPTH_BASE */ 1760c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, surf->db_depth_info); /* R_028010_DB_DEPTH_INFO */ 1761c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1762c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1763c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, reloc); 1764c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1765c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_028D34_DB_PREFETCH_LIMIT, surf->db_prefetch_limit); 1766c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1767c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák sbu |= SURFACE_BASE_UPDATE_DEPTH; 17689f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák } else if (rctx->screen->info.drm_minor >= 18) { 17699f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák /* DRM 2.6.18 allows the INVALID format to disable depth/stencil. 17709f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák * Older kernels are out of luck. */ 17719f5d6320f2ee1e8147866030212f9924c6b3bf60Marek Olšák r600_write_context_reg(cs, R_028010_DB_DEPTH_INFO, S_028010_FORMAT(V_028010_DEPTH_INVALID)); 17720b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 17730ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák 1774c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* SURFACE_BASE_UPDATE */ 1775c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->family > CHIP_R600 && rctx->family < CHIP_RV770 && sbu) { 1776c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, PKT3(PKT3_SURFACE_BASE_UPDATE, 0, 0)); 1777c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, sbu); 17780ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák } 17798698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 1780c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Framebuffer dimensions. */ 1781c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg_seq(cs, R_028204_PA_SC_WINDOW_SCISSOR_TL, 2); 1782c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028240_TL_X(0) | S_028240_TL_Y(0) | 1783c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028240_WINDOW_OFFSET_DISABLE(1)); /* R_028204_PA_SC_WINDOW_SCISSOR_TL */ 1784c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_value(cs, S_028244_BR_X(state->width) | 1785c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák S_028244_BR_Y(state->height)); /* R_028208_PA_SC_WINDOW_SCISSOR_BR */ 1786c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1787c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák if (rctx->framebuffer.is_msaa_resolve) { 1788c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_0287A0_CB_SHADER_CONTROL, 1); 1789c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák } else { 1790c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák /* Always enable the first colorbuffer in CB_SHADER_CONTROL. This 1791c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák * will assure that the alpha-test will work even if there is 1792c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák * no colorbuffer bound. */ 1793c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_write_context_reg(cs, R_0287A0_CB_SHADER_CONTROL, 1794c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák (1ull << MAX2(nr_cbufs, 1)) - 1); 17958698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák } 1796c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 1797c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_emit_msaa_state(rctx, rctx->framebuffer.nr_samples); 17980ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák} 17990ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák 18000ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšákstatic void r600_emit_cb_misc_state(struct r600_context *rctx, struct r600_atom *atom) 18010ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák{ 18020ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 18030ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák struct r600_cb_misc_state *a = (struct r600_cb_misc_state*)atom; 1804863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák 1805863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák if (G_028808_SPECIAL_OP(a->cb_color_control) == V_028808_SPECIAL_RESOLVE_BOX) { 1806863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2); 1807863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák if (rctx->chip_class == R600) { 1808863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xff); /* R_028238_CB_TARGET_MASK */ 1809863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xff); /* R_02823C_CB_SHADER_MASK */ 1810863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } else { 1811863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf); /* R_028238_CB_TARGET_MASK */ 1812863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf); /* R_02823C_CB_SHADER_MASK */ 1813863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } 1814863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL, a->cb_color_control); 1815863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } else { 1816863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned fb_colormask = (1ULL << ((unsigned)a->nr_cbufs * 4)) - 1; 1817863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned ps_colormask = (1ULL << ((unsigned)a->nr_ps_color_outputs * 4)) - 1; 1818863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák unsigned multiwrite = a->multiwrite && a->nr_cbufs > 1; 1819863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák 1820863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2); 1821863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, a->blend_colormask & fb_colormask); /* R_028238_CB_TARGET_MASK */ 1822863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák /* Always enable the first color output to make sure alpha-test works even without one. */ 1823863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_value(cs, 0xf | (multiwrite ? fb_colormask : ps_colormask)); /* R_02823C_CB_SHADER_MASK */ 1824863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL, 1825863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák a->cb_color_control | 1826863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák S_028808_MULTIWRITE_ENABLE(multiwrite)); 1827863e2c85b9c59d717ad786c709638d948ff0f38eMarek Olšák } 1828fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1829fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1830e2809849ecac69615ece294a55ee355afaac33d3Marek Olšákstatic void r600_emit_db_misc_state(struct r600_context *rctx, struct r600_atom *atom) 1831e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák{ 1832e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1833e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák struct r600_db_misc_state *a = (struct r600_db_misc_state*)atom; 1834e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák unsigned db_render_control = 0; 1835e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák unsigned db_render_override = 1836e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIZ_ENABLE(V_028D10_FORCE_DISABLE) | 1837e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIS_ENABLE0(V_028D10_FORCE_DISABLE) | 1838e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák S_028D10_FORCE_HIS_ENABLE1(V_028D10_FORCE_DISABLE); 1839e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 1840e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák if (a->occlusion_query_enabled) { 1841e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák if (rctx->chip_class >= R700) { 1842e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák db_render_control |= S_028D0C_R700_PERFECT_ZPASS_COUNTS(1); 1843e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1844e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák db_render_override |= S_028D10_NOOP_CULL_DISABLE(1); 1845e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1846df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák if (a->flush_depthstencil_through_cb) { 1847e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák assert(a->copy_depth || a->copy_stencil); 1848e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák 1849e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(a->copy_depth) | 1850e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák S_028D0C_STENCIL_COPY_ENABLE(a->copy_stencil) | 18518698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028D0C_COPY_CENTROID(1) | 18528698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák S_028D0C_COPY_SAMPLE(a->copy_sample); 1853e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák } 1854e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 1855e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_context_reg_seq(cs, R_028D0C_DB_RENDER_CONTROL, 2); 1856e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_value(cs, db_render_control); /* R_028D0C_DB_RENDER_CONTROL */ 1857e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák r600_write_value(cs, db_render_override); /* R_028D10_DB_RENDER_OVERRIDE */ 1858c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák r600_write_context_reg(cs, R_02880C_DB_SHADER_CONTROL, a->db_shader_control); 1859e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák} 1860e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák 186187a34131c427b40a561cfef1513b446a0eeabc39Marek Olšákstatic void r600_emit_config_state(struct r600_context *rctx, struct r600_atom *atom) 186287a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák{ 186387a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 186487a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák struct r600_config_state *a = (struct r600_config_state*)atom; 186587a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák 186687a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák r600_write_config_reg(cs, R_008C04_SQ_GPR_RESOURCE_MGMT_1, a->sq_gpr_resource_mgmt_1); 186787a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák} 186887a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák 1869c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšákstatic void r600_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom *atom) 1870c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák{ 1871c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák struct radeon_winsys_cs *cs = rctx->cs; 1872585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák uint32_t dirty_mask = rctx->vertex_buffer_state.dirty_mask; 1873c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1874585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák while (dirty_mask) { 1875585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák struct pipe_vertex_buffer *vb; 1876585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák struct r600_resource *rbuffer; 1877585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák unsigned offset; 1878585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák unsigned buffer_index = u_bit_scan(&dirty_mask); 1879c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1880585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák vb = &rctx->vertex_buffer_state.vb[buffer_index]; 1881585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák rbuffer = (struct r600_resource*)vb->buffer; 1882585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák assert(rbuffer); 1883c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1884585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák offset = vb->buffer_offset; 1885c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1886c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák /* fetch resources start at index 320 */ 1887c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 1888585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák r600_write_value(cs, (320 + buffer_index) * 7); 1889c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, offset); /* RESOURCEi_WORD0 */ 1890c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */ 1891c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, /* RESOURCEi_WORD2 */ 1892c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák S_038008_ENDIAN_SWAP(r600_endian_swap(32)) | 1893585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák S_038008_STRIDE(vb->stride)); 1894c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD3 */ 1895c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD4 */ 1896c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD5 */ 1897c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */ 1898c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 1899c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 1900c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ)); 1901c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák } 1902c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák} 1903c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák 190468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšákstatic void r600_emit_constant_buffers(struct r600_context *rctx, 190568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct r600_constbuf_state *state, 190668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned buffer_id_base, 190768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned reg_alu_constbuf_size, 190868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned reg_alu_const_cache) 190968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 191068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 191168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák uint32_t dirty_mask = state->dirty_mask; 191268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 191368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák while (dirty_mask) { 1914507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák struct pipe_constant_buffer *cb; 191568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák struct r600_resource *rbuffer; 191668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned offset; 191768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák unsigned buffer_index = ffs(dirty_mask) - 1; 191868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 191968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák cb = &state->cb[buffer_index]; 192068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák rbuffer = (struct r600_resource*)cb->buffer; 192168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák assert(rbuffer); 192268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 192368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák offset = cb->buffer_offset; 192468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 192568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_context_reg(cs, reg_alu_constbuf_size + buffer_index * 4, 192668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák ALIGN_DIVUP(cb->buffer_size >> 4, 16)); 192768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_context_reg(cs, reg_alu_const_cache + buffer_index * 4, offset >> 8); 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 r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 193368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, (buffer_id_base + buffer_index) * 7); 193468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, offset); /* RESOURCEi_WORD0 */ 193568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */ 193668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, /* RESOURCEi_WORD2 */ 193768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák S_038008_ENDIAN_SWAP(r600_endian_swap(32)) | 193868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák S_038008_STRIDE(16)); 193968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD3 */ 194068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD4 */ 194168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0); /* RESOURCEi_WORD5 */ 194268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */ 194368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 194468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 194568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ)); 194668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 194768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák dirty_mask &= ~(1 << buffer_index); 194868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák } 194968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák state->dirty_mask = 0; 195068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 195168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 19520b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void r600_emit_vs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 195368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 19541bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX], 160, 195568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028180_ALU_CONST_BUFFER_SIZE_VS_0, 195668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028980_ALU_CONST_CACHE_VS_0); 195768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 195868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 1959263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 1960263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 1961263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY], 336, 1962263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák R_0281C0_ALU_CONST_BUFFER_SIZE_GS_0, 1963263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák R_0289C0_ALU_CONST_CACHE_GS_0); 1964263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 1965263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 19660b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void r600_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom) 196768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{ 19681bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_emit_constant_buffers(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT], 0, 196968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028140_ALU_CONST_BUFFER_SIZE_PS_0, 197068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák R_028940_ALU_CONST_CACHE_PS_0); 197168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák} 197268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák 19735d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_sampler_views(struct r600_context *rctx, 19745d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct r600_samplerview_state *state, 19755d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned resource_id_base) 19765d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 19775d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 19785d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák uint32_t dirty_mask = state->dirty_mask; 19795d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19805d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák while (dirty_mask) { 19815d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct r600_pipe_sampler_view *rview; 19825d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned resource_index = u_bit_scan(&dirty_mask); 19835d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák unsigned reloc; 19845d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19855d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák rview = state->views[resource_index]; 19865d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák assert(rview); 19875d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19885d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); 19895d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, (resource_id_base + resource_index) * 7); 19905d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_array(cs, 7, rview->tex_resource_words); 19915d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 19925d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák /* XXX The kernel needs two relocations. This is stupid. */ 19935d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák reloc = r600_context_bo_reloc(rctx, rview->tex_resource, 19945d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák RADEON_USAGE_READ); 19955d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 19965d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, reloc); 19975d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 19985d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák r600_write_value(cs, reloc); 19995d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák } 20005d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák state->dirty_mask = 0; 20015d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 20025d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 2003263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák/* Resource IDs: 2004263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * PS: 0 .. +160 2005263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * VS: 160 .. +160 2006263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * FS: 320 .. +16 2007263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák * GS: 336 .. +160 2008263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák */ 2009263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 20105d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 20115d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 2012f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views, 160 + R600_MAX_CONST_BUFFERS); 20135d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 20145d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 2015263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 2016263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 2017263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views, 336 + R600_MAX_CONST_BUFFERS); 2018263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 2019263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 20205d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void r600_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom) 20215d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{ 2022f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_views(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views, R600_MAX_CONST_BUFFERS); 20235d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák} 20245d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák 20253bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_sampler_states(struct r600_context *rctx, 20262df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct r600_textures_info *texinfo, 20272df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned resource_id_base, 20282df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned border_color_reg) 20292df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 20302df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct radeon_winsys_cs *cs = rctx->cs; 20313fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák uint32_t dirty_mask = texinfo->states.dirty_mask; 20322df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20333fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák while (dirty_mask) { 20343fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák struct r600_pipe_sampler_state *rstate; 20353fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák struct r600_pipe_sampler_view *rview; 20363fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák unsigned i = u_bit_scan(&dirty_mask); 20372df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20383fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate = texinfo->states.states[i]; 20393fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák assert(rstate); 20403fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rview = texinfo->views.views[i]; 20412df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20422df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* TEX_ARRAY_OVERRIDE must be set for array textures to disable 20432df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse * filtering between layers. 20442df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse * Don't update TEX_ARRAY_OVERRIDE if we don't have the sampler view. 20452df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse */ 20463fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (rview) { 20473fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák enum pipe_texture_target target = rview->base.texture->target; 20483fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (target == PIPE_TEXTURE_1D_ARRAY || 20493fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák target == PIPE_TEXTURE_2D_ARRAY) { 20503fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate->tex_sampler_words[0] |= S_03C000_TEX_ARRAY_OVERRIDE(1); 20512df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse texinfo->is_array_sampler[i] = true; 20522df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } else { 20533fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák rstate->tex_sampler_words[0] &= C_03C000_TEX_ARRAY_OVERRIDE; 20542df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse texinfo->is_array_sampler[i] = false; 20552df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20562df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20572df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20582df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_value(cs, PKT3(PKT3_SET_SAMPLER, 3, 0)); 20592df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_value(cs, (resource_id_base + i) * 3); 20603fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák r600_write_array(cs, 3, rstate->tex_sampler_words); 20612df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20623fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák if (rstate->border_color_use) { 20632df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned offset; 20642df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20652df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse offset = border_color_reg; 20662df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse offset += i * 16; 20672df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_config_reg_seq(cs, offset, 4); 206833dda8f4fb4298d6c8e04d2b5fe569b56043b28dMarek Olšák r600_write_array(cs, 4, rstate->border_color.ui); 20692df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20702df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 20713fe78594b1221358f4ba96072d952e33a7e54a76Marek Olšák texinfo->states.dirty_mask = 0; 20722df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20732df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20743bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_vs_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 20752df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 2076f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_VERTEX], 18, R_00A600_TD_VS_SAMPLER0_BORDER_RED); 20772df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20782df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 2079263045afbc731fe669b43013a32c6dfa457e46adMarek Olšákstatic void r600_emit_gs_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 2080263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák{ 2081263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY], 36, R_00A800_TD_GS_SAMPLER0_BORDER_RED); 2082263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák} 2083263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák 20843bffd8a5eb30d993c7f56a12b9936e17fb4523deMarek Olšákstatic void r600_emit_ps_sampler_states(struct r600_context *rctx, struct r600_atom *atom) 20852df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 2086f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_emit_sampler_states(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT], 0, R_00A400_TD_PS_SAMPLER0_BORDER_RED); 20872df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 20882df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20892df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissestatic void r600_emit_seamless_cube_map(struct r600_context *rctx, struct r600_atom *atom) 20902df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{ 20912df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse struct radeon_winsys_cs *cs = rctx->cs; 20922df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse unsigned tmp; 20932df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 20942df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse tmp = S_009508_DISABLE_CUBE_ANISO(1) | 20952df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_GRADIENT(1) | 20962df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_WALKER(1) | 20972df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse S_009508_SYNC_ALIGNER(1); 20982df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse if (!rctx->seamless_cube_map.enabled) { 20992df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse tmp |= S_009508_DISABLE_CUBE_WRAP(1); 21002df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse } 21012df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse r600_write_config_reg(cs, R_009508_TA_CNTL_AUX, tmp); 21022df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse} 21032df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse 2104a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšákstatic void r600_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a) 2105a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák{ 2106a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák struct r600_sample_mask *s = (struct r600_sample_mask*)a; 2107a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák uint8_t mask = s->sample_mask; 2108a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 2109a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák r600_write_context_reg(rctx->cs, R_028C48_PA_SC_AA_MASK, 2110a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák mask | (mask << 8) | (mask << 16) | (mask << 24)); 2111a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák} 2112a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 2113a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšákstatic void r600_emit_vertex_fetch_shader(struct r600_context *rctx, struct r600_atom *a) 2114a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák{ 2115a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák struct radeon_winsys_cs *cs = rctx->cs; 2116a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák struct r600_cso_state *state = (struct r600_cso_state*)a; 2117a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák struct r600_resource *shader = (struct r600_resource*)state->cso; 2118a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák 2119a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák r600_write_context_reg(cs, R_028894_SQ_PGM_START_FS, 0); 2120a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák r600_write_value(cs, PKT3(PKT3_NOP, 0, 0)); 2121a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák r600_write_value(cs, r600_context_bo_reloc(rctx, shader, RADEON_USAGE_READ)); 2122a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák} 2123a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák 2124e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_init_state_functions(struct r600_context *rctx) 2125fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 21265ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse unsigned id = 4; 21275ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21285ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* !!! 21295ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * To avoid GPU lockup registers must be emited in a specific order 21305ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * (no kidding ...). The order below is important and have been 21315ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * partialy infered from analyzing fglrx command stream. 21325ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * 21335ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * Don't reorder atom without carefully checking the effect (GPU lockup 21345ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * or piglit regression). 21355ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * !!! 21365ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse */ 21375ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 2138c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák r600_init_atom(rctx, &rctx->framebuffer.atom, id++, r600_emit_framebuffer_state, 0); 2139c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 21405ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* shader const */ 21411bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_VERTEX].atom, id++, r600_emit_vs_constant_buffers, 0); 2142263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_GEOMETRY].atom, id++, r600_emit_gs_constant_buffers, 0); 21431bce17ee01fb2ad77e37a600c2cacda57d0067efMarek Olšák r600_init_atom(rctx, &rctx->constbuf_state[PIPE_SHADER_FRAGMENT].atom, id++, r600_emit_ps_constant_buffers, 0); 21445ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21452df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse /* sampler must be emited before TA_CNTL_AUX otherwise DISABLE_CUBE_WRAP change 21465ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse * does not take effect (TA_CNTL_AUX emited by r600_emit_seamless_cube_map) 21472df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse */ 2148f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].states.atom, id++, r600_emit_vs_sampler_states, 0); 2149263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].states.atom, id++, r600_emit_gs_sampler_states, 0); 2150f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].states.atom, id++, r600_emit_ps_sampler_states, 0); 21515ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse /* resource */ 2152f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_VERTEX].views.atom, id++, r600_emit_vs_sampler_views, 0); 2153263045afbc731fe669b43013a32c6dfa457e46adMarek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_GEOMETRY].views.atom, id++, r600_emit_gs_sampler_views, 0); 2154f2eac1423a92ba47981ba50a4af22e6596059cf4Marek Olšák r600_init_atom(rctx, &rctx->samplers[PIPE_SHADER_FRAGMENT].views.atom, id++, r600_emit_ps_sampler_views, 0); 21555ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->vertex_buffer_state.atom, id++, r600_emit_vertex_buffers, 0); 21565ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 21571f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák r600_init_atom(rctx, &rctx->vgt_state.atom, id++, r600_emit_vgt_state, 6); 21581f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák r600_init_atom(rctx, &rctx->vgt2_state.atom, id++, r600_emit_vgt2_state, 3); 21591f5a7567e84fa3e861939dbbfd8f559e24a42e31Marek Olšák 21605ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->seamless_cube_map.atom, id++, r600_emit_seamless_cube_map, 3); 21615ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->sample_mask.atom, id++, r600_emit_sample_mask, 3); 2162a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák rctx->sample_mask.sample_mask = ~0; 2163a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák 21645ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse r600_init_atom(rctx, &rctx->alphatest_state.atom, id++, r600_emit_alphatest_state, 6); 2165de89fe1e5de581df280df41170f411692c6ddf4aMarek Olšák r600_init_atom(rctx, &rctx->blend_color.atom, id++, r600_emit_blend_color, 6); 2166faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák r600_init_atom(rctx, &rctx->blend_state.atom, id++, r600_emit_cso_state, 0); 21678faf3bcf0757451625e6443976db534e29e6d2aeMarek Olšák r600_init_atom(rctx, &rctx->cb_misc_state.atom, id++, r600_emit_cb_misc_state, 7); 2168c56dca909a0dc1410301c48618768adf58023fe7Marek Olšák r600_init_atom(rctx, &rctx->clip_misc_state.atom, id++, r600_emit_clip_misc_state, 6); 21692b8d39bbfc111166105d7e06f6f6f908fea3d243Marek Olšák r600_init_atom(rctx, &rctx->clip_state.atom, id++, r600_emit_clip_state, 26); 2170c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák r600_init_atom(rctx, &rctx->db_misc_state.atom, id++, r600_emit_db_misc_state, 7); 2171ef723613e017ba33e9d9568ae59eb9faab80aba2Marek Olšák r600_init_atom(rctx, &rctx->dsa_state.atom, id++, r600_emit_cso_state, 0); 2172ab075de53baa9829780cc133e5ac06e5498a763cMarek Olšák r600_init_atom(rctx, &rctx->poly_offset_state.atom, id++, r600_emit_polygon_offset, 6); 2173711f3bae9d8bde9750448c23fde4a15efbcfacb5Marek Olšák r600_init_atom(rctx, &rctx->rasterizer_state.atom, id++, r600_emit_cso_state, 0); 217418a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák r600_init_atom(rctx, &rctx->scissor.atom, id++, r600_emit_scissor_state, 4); 217587a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák r600_init_atom(rctx, &rctx->config_state.atom, id++, r600_emit_config_state, 3); 217663bf0f905ae9c8cc0dea9ebbde9dc59d83a3a94fMarek Olšák r600_init_atom(rctx, &rctx->stencil_ref.atom, id++, r600_emit_stencil_ref, 4); 2177605fd0c14abf14ed500b95dc957d762726243df8Marek Olšák r600_init_atom(rctx, &rctx->viewport.atom, id++, r600_emit_viewport_state, 8); 2178a50edc8ed84c4c48c0dc8e1a079e8d5e8f1c3a0eMarek Olšák r600_init_atom(rctx, &rctx->vertex_fetch_shader.atom, id++, r600_emit_vertex_fetch_shader, 5); 21795ceb87286f2e1b5b8527ba18a844abf450903175Jerome Glisse 2180fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_blend_state = r600_create_blend_state; 2181fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state; 2182fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_rasterizer_state = r600_create_rs_state; 2183fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_state = r600_create_sampler_state; 2184fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_view = r600_create_sampler_view; 2185fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_framebuffer_state = r600_set_framebuffer_state; 2186fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_polygon_stipple = r600_set_polygon_stipple; 218718a189188ab5f209942ccc85cb8aac51f419b591Marek Olšák rctx->context.set_scissor_state = r600_set_scissor_state; 2188fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 2189fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 21904acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin/* Adjust GPR allocation on R6xx/R7xx */ 2191e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_adjust_gprs(struct r600_context *rctx) 219204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie{ 219304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_ps_gprs = rctx->default_ps_gprs; 219404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_vs_gprs = rctx->default_vs_gprs; 219504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned tmp; 219604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie int diff; 219704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 2198fd2e34d557c07fba5a6e344e915f73dcfb66d0b4Marek Olšák if (rctx->ps_shader->current->shader.bc.ngpr > rctx->default_ps_gprs) { 21994acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin diff = rctx->ps_shader->current->shader.bc.ngpr - rctx->default_ps_gprs; 220004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs -= diff; 220104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs += diff; 220204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 220304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 22044acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin if (rctx->vs_shader->current->shader.bc.ngpr > rctx->default_vs_gprs) 220504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie { 22064acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin diff = rctx->vs_shader->current->shader.bc.ngpr - rctx->default_vs_gprs; 220704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs -= diff; 220804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs += diff; 220904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 221004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 221104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp = 0; 221204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs); 221304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs); 22145345e3ea86a3e942ccef083019a76b38b05f3f14Marek Olšák tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(rctx->r6xx_num_clause_temp_gprs); 221504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 221687a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák if (tmp != rctx->config_state.sq_gpr_resource_mgmt_1) { 221787a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák rctx->config_state.sq_gpr_resource_mgmt_1 = tmp; 221887a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák rctx->config_state.atom.dirty = true; 221987a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák rctx->flags |= R600_CONTEXT_PS_PARTIAL_FLUSH; 222087a34131c427b40a561cfef1513b446a0eeabc39Marek Olšák } 222104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie} 222204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 2223f126253040654d52db134063a69ebaf0c417d410Marek Olšákvoid r600_init_atom_start_cs(struct r600_context *rctx) 2224fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 2225fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int ps_prio; 2226fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int vs_prio; 2227fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int gs_prio; 2228fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int es_prio; 2229fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_gprs; 2230fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_gprs; 2231fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_gprs; 2232fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_gprs; 2233fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_temp_gprs; 2234fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_threads; 2235fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_threads; 2236fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_threads; 2237fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_threads; 2238fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_stack_entries; 2239fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_stack_entries; 2240fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_stack_entries; 2241fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_stack_entries; 2242fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse enum radeon_family family; 2243e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák struct r600_command_buffer *cb = &rctx->start_cs_cmd; 224478293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t tmp; 2245fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2246d8ea64697bbdbc1c7987db00a55954e4cf094ad5Marek Olšák r600_init_command_buffer(cb, 256); 2247f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2248f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* R6xx requires this packet at the start of each command buffer */ 2249f126253040654d52db134063a69ebaf0c417d410Marek Olšák if (rctx->chip_class == R600) { 2250f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_START_3D_CMDBUF, 0, 0)); 2251f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); 2252f126253040654d52db134063a69ebaf0c417d410Marek Olšák } 2253f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* All asics require this one */ 2254f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0)); 2255f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 2256f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 2257f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2258ae25b932456eb368ea91d167614751172edacfeeMarek Olšák /* We're setting config registers here. */ 2259ae25b932456eb368ea91d167614751172edacfeeMarek Olšák r600_store_value(cb, PKT3(PKT3_EVENT_WRITE, 0, 0)); 2260ae25b932456eb368ea91d167614751172edacfeeMarek Olšák r600_store_value(cb, EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4)); 2261ae25b932456eb368ea91d167614751172edacfeeMarek Olšák 2262b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet family = rctx->family; 2263fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse ps_prio = 0; 2264fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse vs_prio = 1; 2265fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse gs_prio = 2; 2266fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse es_prio = 3; 2267fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 2268fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_R600: 2269fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2270fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2271fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2272fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2273fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2274fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2275fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2276fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2277fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2278fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2279fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2280fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2281fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2282fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2283fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV630: 2284fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV635: 2285fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2286fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2287fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2288fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2289fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2290fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 2291fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 40; 2292fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2293fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2294fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2295fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2296fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2297fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2298fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2299fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 2300fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 2301fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 2302fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 2303fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 2304fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2305fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2306fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2307fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2308fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2309fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2310fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2311fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2312fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2313fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2314fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2315fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2316fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2317fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2318fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV670: 2319fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 144; 2320fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 40; 2321fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2322fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2323fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2324fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 2325fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2326fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 2327fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 2328fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 2329fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 2330fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 2331fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 2332fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2333fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV770: 2334fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2335fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2336fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2337fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2338fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2339fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 2340fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 2341fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2342fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2343fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 256; 2344fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 256; 2345fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2346fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2347fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2348fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV730: 2349fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV740: 2350fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 2351fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 2352fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2353fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2354fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2355fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 2356fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 2357fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2358fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2359fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2360fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2361fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2362fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2363fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2364fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 2365fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 2366fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 2367fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 2368fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 2369fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 2370fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 2371fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 2372fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 2373fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 2374fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 2375fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 2376fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 2377fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 2378fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2379fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 2380fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 238104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_ps_gprs = num_ps_gprs; 238204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_vs_gprs = num_vs_gprs; 2383f126253040654d52db134063a69ebaf0c417d410Marek Olšák rctx->r6xx_num_clause_temp_gprs = num_temp_gprs; 2384fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2385fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_CONFIG */ 2386fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp = 0; 2387fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 2388fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 2389fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 2390fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 2391fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 2392fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 2393fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2394fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 2395fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VC_ENABLE(1); 2396fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 2397fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 2398153105cfbfd8d6ff30de144605016f6e4f2a1b9eJerome Glisse tmp |= S_008C00_DX9_CONSTS(0); 2399fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ALU_INST_PREFER_VECTOR(1); 2400fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_PS_PRIO(ps_prio); 2401fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VS_PRIO(vs_prio); 2402fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_GS_PRIO(gs_prio); 2403fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ES_PRIO(es_prio); 2404f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008C00_SQ_CONFIG, tmp); 2405fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2406fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_GPR_RESOURCE_MGMT_2 */ 2407f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C08_NUM_GS_GPRS(num_gs_gprs); 2408e2529442e6cc208a4f62ff7dc00d5e2ba7c92624Mathias Fröhlich tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs); 2409f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg_seq(cb, R_008C08_SQ_GPR_RESOURCE_MGMT_2, 4); 2410f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); 2411fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2412fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_THREAD_RESOURCE_MGMT */ 2413f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C0C_NUM_PS_THREADS(num_ps_threads); 2414fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_VS_THREADS(num_vs_threads); 2415fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_GS_THREADS(num_gs_threads); 2416fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_ES_THREADS(num_es_threads); 2417f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C0C_SQ_THREAD_RESOURCE_MGMT */ 2418fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2419fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_1 */ 2420f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C10_NUM_PS_STACK_ENTRIES(num_ps_stack_entries); 2421fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C10_NUM_VS_STACK_ENTRIES(num_vs_stack_entries); 2422f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C10_SQ_STACK_RESOURCE_MGMT_1 */ 2423fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2424fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_2 */ 2425f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C14_NUM_GS_STACK_ENTRIES(num_gs_stack_entries); 2426fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C14_NUM_ES_STACK_ENTRIES(num_es_stack_entries); 2427f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C14_SQ_STACK_RESOURCE_MGMT_2 */ 2428f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2429f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009714_VC_ENHANCE, 0); 2430fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 2431b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class >= R700) { 2432f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x00004000); 2433f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0); 2434f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x00420204); 2435f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 0); 2436fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 2437f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); 2438f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0x82000000); 2439f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x01020204); 2440f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 1); 244147dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák } 2442f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_0288A8_SQ_ESGS_RING_ITEMSIZE, 9); 2443f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288A8_SQ_ESGS_RING_ITEMSIZE */ 2444f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288AC_SQ_GSVS_RING_ITEMSIZE */ 2445f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B0_SQ_ESTMP_RING_ITEMSIZE */ 2446f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B4_SQ_GSTMP_RING_ITEMSIZE */ 2447f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B8_SQ_VSTMP_RING_ITEMSIZE */ 2448f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288BC_SQ_PSTMP_RING_ITEMSIZE */ 2449f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C0_SQ_FBUF_RING_ITEMSIZE */ 2450f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C4_SQ_REDUC_RING_ITEMSIZE */ 2451f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C8_SQ_GS_VERT_ITEMSIZE */ 2452f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2453841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse /* to avoid GPU doing any preloading of constant from random address */ 2454841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_context_reg_seq(cb, R_028140_ALU_CONST_BUFFER_SIZE_PS_0, 8); 2455841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); /* R_028140_ALU_CONST_BUFFER_SIZE_PS_0 */ 2456841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2457841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2458841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2459841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2460841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2461841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2462841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2463841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_context_reg_seq(cb, R_028180_ALU_CONST_BUFFER_SIZE_VS_0, 8); 2464841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); /* R_028180_ALU_CONST_BUFFER_SIZE_VS_0 */ 2465841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2466841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2467841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2468841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2469841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2470841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2471841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse r600_store_value(cb, 0); 2472841c1b5f5423d7994ff0f6773639934d75bd1fcaJerome Glisse 2473f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13); 2474f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */ 2475f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */ 2476f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */ 2477f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */ 2478f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */ 2479f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */ 2480f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */ 2481f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */ 2482f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */ 2483f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */ 2484f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */ 2485f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */ 2486f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE, 0); */ 2487f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2488f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028A84_VGT_PRIMITIVEID_EN, 0); 2489f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA0_VGT_INSTANCE_STEP_RATE_0, 0); 2490f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA4_VGT_INSTANCE_STEP_RATE_1, 0); 2491f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2492f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028AB0_VGT_STRMOUT_EN, 3); 2493f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB0_VGT_STRMOUT_EN */ 2494f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 1); /* R_028AB4_VGT_REUSE_OFF */ 2495f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */ 2496f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2497f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028B20_VGT_STRMOUT_BUFFER_EN, 0); 2498182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák 2499182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák r600_store_ctl_const(cb, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0); 2500fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2501fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028028_DB_STENCIL_CLEAR, 2); 2502fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028028_DB_STENCIL_CLEAR */ 2503fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_02802C_DB_DEPTH_CLEAR */ 2504fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2505fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0286DC_SPI_FOG_CNTL, 3); 2506fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286DC_SPI_FOG_CNTL */ 2507fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286E0_SPI_FOG_FUNC_SCALE */ 2508fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0286E4_SPI_FOG_FUNC_BIAS */ 2509fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2510fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028D2C_DB_SRESULTS_COMPARE_STATE1, 2); 2511fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028D2C_DB_SRESULTS_COMPARE_STATE1 */ 2512fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028D30_DB_PRELOAD_CONTROL */ 2513fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2514fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0); 2515fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028A48_PA_SC_MPASS_PS_CNTL, 0); 2516fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 25178698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák r600_store_context_reg_seq(cb, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 4); 2518fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C0C_PA_CL_GB_VERT_CLIP_ADJ */ 2519fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C10_PA_CL_GB_VERT_DISC_ADJ */ 2520fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C14_PA_CL_GB_HORZ_CLIP_ADJ */ 2521fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_028C18_PA_CL_GB_HORZ_DISC_ADJ */ 2522fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2523fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0282D0_PA_SC_VPORT_ZMIN_0, 2); 2524fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0282D0_PA_SC_VPORT_ZMIN_0 */ 2525fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x3F800000); /* R_0282D4_PA_SC_VPORT_ZMAX_0 */ 2526fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2527fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028818_PA_CL_VTE_CNTL, 0x43F); 2528fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2529fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028200_PA_SC_WINDOW_OFFSET, 0); 2530aacd653834264b70a2537aff7914762b39f0683fMarek Olšák r600_store_context_reg(cb, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF); 2531fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2532fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák if (rctx->chip_class >= R700) { 2533fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA); 2534fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák } 2535fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2536fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_028C30_CB_CLRCMP_CONTROL, 4); 2537fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0x1000000); /* R_028C30_CB_CLRCMP_CONTROL */ 2538fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_028C34_CB_CLRCMP_SRC */ 2539fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0xFF); /* R_028C38_CB_CLRCMP_DST */ 2540fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0xFFFFFFFF); /* R_028C3C_CB_CLRCMP_MSK */ 2541fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 2542c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2); 2543c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */ 2544c7eaf274a9b7e3e5f4b060be2320eb605464ba5cMarek Olšák r600_store_value(cb, S_028034_BR_X(8192) | S_028034_BR_Y(8192)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */ 2545ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák 2546ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_context_reg_seq(cb, R_028240_PA_SC_GENERIC_SCISSOR_TL, 2); 2547ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_value(cb, 0); /* R_028240_PA_SC_GENERIC_SCISSOR_TL */ 2548ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák r600_store_value(cb, S_028244_BR_X(8192) | S_028244_BR_Y(8192)); /* R_028244_PA_SC_GENERIC_SCISSOR_BR */ 2549ca78a47b056b5a4589933492db364f6e418abb0fMarek Olšák 2550fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg_seq(cb, R_0288CC_SQ_PGM_CF_OFFSET_PS, 2); 2551fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0288CC_SQ_PGM_CF_OFFSET_PS */ 2552fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_value(cb, 0); /* R_0288D0_SQ_PGM_CF_OFFSET_VS */ 2553fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 255430bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_context_reg_seq(cb, R_028380_SQ_VTX_SEMANTIC_0, 34); 255530bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); /* R_028380_SQ_VTX_SEMANTIC_0 */ 255630bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 255730bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 255830bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 255930bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256030bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256130bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256230bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256330bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256430bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256530bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256630bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256730bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256830bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 256930bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257030bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257130bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257230bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257330bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257430bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257530bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257630bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257730bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257830bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 257930bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258030bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258130bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258230bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258330bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258430bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258530bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); 258630bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); /* R_0283FC_SQ_VTX_SEMANTIC_31 */ 258730bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, ~0); /* R_028400_VGT_MAX_VTX_INDX */ 258830bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák r600_store_value(cb, 0); /* R_028404_VGT_MIN_VTX_INDX */ 258930bcc5538fe3d40799d6cdf38a288b71dd275d02Marek Olšák 2590fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_0288A4_SQ_PGM_RESOURCES_FS, 0); 2591fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_context_reg(cb, R_0288DC_SQ_PGM_CF_OFFSET_FS, 0); 2592fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák 25936e7756db14c362ede6fdc97454267a32b8eab1d4Marek Olšák if (rctx->chip_class == R700 && rctx->screen->has_streamout) 25946187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák r600_store_context_reg(cb, R_028354_SX_SURFACE_SYNC, S_028354_SURFACE_SYNC_MASK(0xf)); 259596ef4ddc3ddda4d1f637af86f4790d24f8f386c6Marek Olšák r600_store_context_reg(cb, R_028800_DB_DEPTH_CONTROL, 0); 2596b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse if (rctx->screen->has_streamout) { 2597b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse r600_store_context_reg(cb, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0); 2598b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse } 25996187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák 2600fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0, 0x1000FFF); 2601fbebd431ec4e2e461a0cbcd5f3a04a000b8f6bbfMarek Olšák r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x1000FFF); 2602fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 2603084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2604f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeetvoid r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2605f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet{ 2606e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2607f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2608f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_shader *rshader = &shader->shader; 2609f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control; 2610f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet int pos_index = -1, face_index = -1; 261146ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher unsigned tmp, sid, ufi = 0; 26121fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie int need_linear = 0; 2613b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse unsigned z_export = 0, stencil_export = 0; 26149a683d1bd82a2252df5a3841dc9108ba767a023aMarek Olšák unsigned sprite_coord_enable = rctx->rasterizer ? rctx->rasterizer->sprite_coord_enable : 0; 2615f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2616f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet rstate->nregs = 0; 2617f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2618f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->ninput; i++) { 2619f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 2620f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet pos_index = i; 2621f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 2622f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet face_index = i; 2623e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2624e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin sid = rshader->input[i].spi_sid; 2625e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2626e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp = S_028644_SEMANTIC(sid); 2627e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 26281a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || 26291a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 26301a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && 26311a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rctx->rasterizer && rctx->rasterizer->flatshade)) 26321fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie tmp |= S_028644_FLAT_SHADE(1); 2633e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2634e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 26359a683d1bd82a2252df5a3841dc9108ba767a023aMarek Olšák sprite_coord_enable & (1 << rshader->input[i].sid)) { 2636e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_PT_SPRITE_TEX(1); 2637e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin } 2638e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2639e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].centroid) 2640e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_CENTROID(1); 2641e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 26421fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) { 26431fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie need_linear = 1; 2644e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_LINEAR(1); 26451fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie } 2646e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2647e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, 264862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie tmp); 2649f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2650f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 26513d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); 2652f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2653f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 2654b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse z_export = 1; 2655f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2656b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse stencil_export = 1; 2657f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2658b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export); 2659b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse db_shader_control |= S_02880C_STENCIL_REF_EXPORT_ENABLE(stencil_export); 2660f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->uses_kill) 2661f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control |= S_02880C_KILL_ENABLE(1); 2662f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2663f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 0; 2664f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2665f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || 2666b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse rshader->output[i].name == TGSI_SEMANTIC_STENCIL) { 2667f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= 1; 2668f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2669f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2670b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse num_cout = rshader->nr_ps_color_exports; 2671f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= S_028854_EXPORT_COLORS(num_cout); 2672f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (!exports_ps) { 2673f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* always at least export 1 component per pixel */ 2674f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 2; 2675f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2676f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 26774fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák shader->nr_ps_color_outputs = num_cout; 2678d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie 2679f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 26801fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_PERSP_GRADIENT_ENA(1)| 26811fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_LINEAR_GRADIENT_ENA(need_linear); 2682f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z = 0; 2683f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (pos_index != -1) { 2684f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) | 2685f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 2686f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) | 2687f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_BARYC_SAMPLE_CNTL(1)); 2688f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z |= 1; 2689f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2690f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2691f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 = 0; 2692f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (face_index != -1) { 2693f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 2694f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 2695f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2696f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 269746ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher /* HW bug in original R600 */ 269846ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher if (rctx->family == CHIP_R600) 269946ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher ufi = 1; 270046ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher 270162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0); 270262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1); 270362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z); 270462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg_bo(rstate, 270562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028840_SQ_PGM_START_PS, 270662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie 0, shader->bo, RADEON_USAGE_READ); 2707f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2708f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028850_SQ_PGM_RESOURCES_PS, 2709e556983fc8f0ac9046c5a5e3e34e8ea036587ac7Mathias Fröhlich S_028850_NUM_GPRS(rshader->bc.ngpr) | 271046ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher S_028850_STACK_SIZE(rshader->bc.nstack) | 271162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028850_UNCACHED_FIRST_INST(ufi)); 2712f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2713f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028854_SQ_PGM_EXPORTS_PS, 271462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie exports_ps); 2715f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* only set some bits here, the other bits are set in the dsa state */ 2716b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse shader->db_shader_control = db_shader_control; 2717b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse shader->ps_depth_export = z_export | stencil_export; 2718f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 27199a683d1bd82a2252df5a3841dc9108ba767a023aMarek Olšák shader->sprite_coord_enable = sprite_coord_enable; 27201a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rctx->rasterizer) 27211a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin shader->flatshade = rctx->rasterizer->flatshade; 2722f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet} 2723f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2724c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeetvoid r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2725c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet{ 2726e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2727c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2728c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_shader *rshader = &shader->shader; 27295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned spi_vs_out_id[10] = {}; 27305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned i, tmp, nparams = 0; 2731c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2732c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet /* clear previous register */ 2733c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet rstate->nregs = 0; 2734c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 27355b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin for (i = 0; i < rshader->noutput; i++) { 27365b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (rshader->output[i].spi_sid) { 27375b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); 27385b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin spi_vs_out_id[nparams / 4] |= tmp; 27395b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin nparams++; 27405b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 2741c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 27425b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 2743c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet for (i = 0; i < 10; i++) { 2744c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2745c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028614_SPI_VS_OUT_ID_0 + i * 4, 274662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie spi_vs_out_id[i]); 2747c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 2748c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2749dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher /* Certain attributes (position, psize, etc.) don't count as params. 2750dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * VS is required to export at least one param and r600_shader_from_tgsi() 2751dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * takes care of adding a dummy export. 2752dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher */ 2753dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if (nparams < 1) 2754dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher nparams = 1; 2755dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher 2756c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 275762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_0286C4_SPI_VS_OUT_CONFIG, 275862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_0286C4_VS_EXPORT_COUNT(nparams - 1)); 2759c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 276062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie R_028868_SQ_PGM_RESOURCES_VS, 276162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028868_NUM_GPRS(rshader->bc.ngpr) | 276262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie S_028868_STACK_SIZE(rshader->bc.nstack)); 276362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie r600_pipe_state_add_reg_bo(rstate, 2764c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028858_SQ_PGM_START_VS, 27654a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, shader->bo, RADEON_USAGE_READ); 2766c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 276797acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák shader->pa_cl_vs_out_cntl = 276897acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) | 276997acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) | 277097acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) | 277197acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size); 2772c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet} 2773c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 27748698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákvoid *r600_create_resolve_blend(struct r600_context *rctx) 27758698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 27768698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct pipe_blend_state blend; 277778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák unsigned i; 277878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 277978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák memset(&blend, 0, sizeof(blend)); 278078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.independent_blend_enable = true; 278178354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák for (i = 0; i < 2; i++) { 278278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].colormask = 0xf; 278378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].blend_enable = 1; 278478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_func = PIPE_BLEND_ADD; 278578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_func = PIPE_BLEND_ADD; 278678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ZERO; 278778354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO; 278878354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ZERO; 278978354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák blend.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO; 279078354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák } 2791faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX); 279278354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák} 279378354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák 279478354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšákvoid *r700_create_resolve_blend(struct r600_context *rctx) 279578354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák{ 279678354011f99c4103345f8f32e10b0b4b884ebdafMarek Olšák struct pipe_blend_state blend; 27978698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 27988698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák memset(&blend, 0, sizeof(blend)); 27998698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.independent_blend_enable = true; 28008698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.rt[0].colormask = 0xf; 2801faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX); 28028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 28038698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 28048698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšákvoid *r600_create_decompress_blend(struct r600_context *rctx) 28058698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák{ 28068698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák struct pipe_blend_state blend; 28078698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 28088698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák memset(&blend, 0, sizeof(blend)); 28098698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.independent_blend_enable = true; 28108698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák blend.rt[0].colormask = 0xf; 2811faaba52aedf9807ced2ddfccc4133589a7bacd5fMarek Olšák return r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_EXPAND_SAMPLES); 28128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák} 28138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák 2814e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid *r600_create_db_flush_dsa(struct r600_context *rctx) 2815084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie{ 2816084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie struct pipe_depth_stencil_alpha_state dsa; 2817084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie boolean quirk = false; 2818084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2819084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || 2820084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) 2821084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie quirk = true; 2822084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2823084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie memset(&dsa, 0, sizeof(dsa)); 2824084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2825084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (quirk) { 2826084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.enabled = 1; 2827084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.func = PIPE_FUNC_LEQUAL; 2828084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].enabled = 1; 2829084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 2830084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_KEEP; 2831084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_INCR; 2832084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].writemask = 0xff; 2833084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie } 2834084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2835df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák return rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 2836084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie} 2837b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse 2838c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšákvoid r600_update_db_shader_control(struct r600_context * rctx) 2839b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse{ 2840c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák bool dual_export = rctx->framebuffer.export_16bpc && 2841c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák !rctx->ps_shader->current->ps_depth_export; 2842c8b06dccff9cb89e20378664f3cbc202876a180fMarek Olšák 2843b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse unsigned db_shader_control = rctx->ps_shader->current->db_shader_control | 2844b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse S_02880C_DUAL_EXPORT_ENABLE(dual_export); 2845b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse 2846c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák if (db_shader_control != rctx->db_misc_state.db_shader_control) { 2847c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák rctx->db_misc_state.db_shader_control = db_shader_control; 2848c5584e93b186bdec3d47c993db4c6461dcf6a75cMarek Olšák rctx->db_misc_state.atom.dirty = true; 2849b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse } 2850b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse} 2851