r600_state.c revision f126253040654d52db134063a69ebaf0c417d410
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 */ 23fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 24fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse/* TODO: 25fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse * - fix mask for depth control & cull for query 26fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse */ 27fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include <stdio.h> 28fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include <errno.h> 298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "pipe/p_defines.h" 308fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "pipe/p_state.h" 318fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "pipe/p_context.h" 328fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "tgsi/tgsi_scan.h" 338fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "tgsi/tgsi_parse.h" 348fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "tgsi/tgsi_util.h" 358fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_double_list.h" 368fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_pack_color.h" 378fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_memory.h" 388fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_inlines.h" 398fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_framebuffer.h" 40588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák#include "util/u_transfer.h" 418fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "pipebuffer/pb_buffer.h" 42fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include "r600.h" 43fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include "r600d.h" 44fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include "r600_resource.h" 45fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#include "r600_shader.h" 46b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse#include "r600_pipe.h" 473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#include "r600_formats.h" 483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_function(int blend_func) 503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_func) { 523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_ADD: 533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_PLUS_SRC; 543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_SUBTRACT: 553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_SRC_MINUS_DST; 563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_REVERSE_SUBTRACT: 573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_DST_MINUS_SRC; 583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MIN: 593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MIN_DST_SRC; 603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLEND_MAX: 613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_COMB_MAX_DST_SRC; 623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Unknown blend function %d\n", blend_func); 643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_factor(int blend_fact) 713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (blend_fact) { 733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ONE: 743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE; 753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_COLOR: 763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_COLOR; 773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA: 783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA; 793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_ALPHA: 803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_ALPHA; 813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_DST_COLOR: 823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_DST_COLOR; 833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE: 843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC_ALPHA_SATURATE; 853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_COLOR: 863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_COLOR; 873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_CONST_ALPHA: 883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_CONST_ALPHA; 893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_ZERO: 903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ZERO; 913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_COLOR: 923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_COLOR; 933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC_ALPHA: 943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_SRC_ALPHA; 953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_ALPHA: 963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_ALPHA; 973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_DST_COLOR: 983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_DST_COLOR; 993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_COLOR: 1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_COLOR; 1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_CONST_ALPHA: 1023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_ONE_MINUS_CONST_ALPHA; 1033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_COLOR: 1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_COLOR; 1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_SRC1_ALPHA: 1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_SRC1_ALPHA; 1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_COLOR: 1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_COLOR; 1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: 1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028804_BLEND_INV_SRC1_ALPHA; 1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("Bad blend factor %d not supported!\n", blend_fact); 1133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet assert(0); 1143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet break; 1153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return 0; 1173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic unsigned r600_tex_dim(unsigned dim) 1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (dim) { 1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D: 1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D; 1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_1D_ARRAY: 1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_1D_ARRAY; 1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D: 1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_RECT: 1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_2D; 1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_2D_ARRAY: 1313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_2D_ARRAY; 1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_3D: 1333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_3D; 1343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_TEXTURE_CUBE: 1353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_038000_SQ_TEX_DIM_CUBEMAP; 1363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_dbformat(enum pipe_format format) 1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_16; 1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_X8_24; 146866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 1473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_028010_DEPTH_8_24; 14889954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 14989954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_32_FLOAT; 150866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 15189954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_028010_DEPTH_X24_8_32_FLOAT; 1523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 1533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 1543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 1553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 1563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorswap(enum pipe_format format) 1583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 1593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 1613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 1628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 1638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 1640d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 1653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 1663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 1673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_UNORM: 1688d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 1698d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 1708d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 1718d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 1723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 1733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 1743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 17577058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_UINT: 17677058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie case PIPE_FORMAT_R8_SINT: 1773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 1783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 1800d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 1813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 1823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 1843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 1853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 1863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 1883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 1893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 1903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 1923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 1933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 1973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 1998d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 2008d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 2013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 2023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 2048d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 2058d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 2063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 2098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 2108d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 2113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 2123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 2153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 2173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 2193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 2223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 2233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 2263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 2273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT_REV; 2283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 2293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 2303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 231b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R8G8B8A8_SSCALED: 232b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R8G8B8A8_USCALED: 2338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 2348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 2353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 2383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 2393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */ 2403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD_REV; 2413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 243866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 247866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 2569608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_ALT; 2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 2613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 2628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 2638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 2648d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_UINT: 2658d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32_SINT: 2663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 26789954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 2683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 2713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 2728d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 2738d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 2743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 2753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 276b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R16G16B16A16_USCALED: 277b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R16G16B16A16_SSCALED: 2788d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 2798d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 2803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 281866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 2823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 2843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 2853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 2863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 2872b47d2bce1f77cc450da500655a0ab5596c0585eDave Airlie case PIPE_FORMAT_R32G32B32A32_USCALED: 2882b47d2bce1f77cc450da500655a0ab5596c0585eDave Airlie case PIPE_FORMAT_R32G32B32A32_SSCALED: 2898d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 2908d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_SWAP_STD; 2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet R600_ERR("unsupported colorswap format %d\n", format); 2943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 2953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 2963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; 2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 2983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 2993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorformat(enum pipe_format format) 3003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 3013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch (format) { 3023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L4A4_UNORM: 3030d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_R4A4_UNORM: 3040d0285ba916d9e25871354441c09b0a8c7c9b844Christian König case PIPE_FORMAT_A4R4_UNORM: 3053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4; 3063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 3083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8_UNORM: 3098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_UINT: 3108d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_A8_SINT: 3113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_I8_UNORM: 3128d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_UINT: 3138d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_I8_SINT: 3143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_UNORM: 3158d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_UINT: 3168d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8_SINT: 3173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8_SRGB: 3183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_UNORM: 3193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8_SNORM: 3208d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_UINT: 3218d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8_SINT: 3223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8; 3233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 3253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G6R5_UNORM: 3263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_5_6_5; 3273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5A1_UNORM: 3293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B5G5R5X1_UNORM: 3303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_1_5_5_5; 3313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4A4_UNORM: 3333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B4G4R4X4_UNORM: 3343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_4_4_4_4; 3353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z16_UNORM: 3373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_UNORM: 3408d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_UINT: 3418d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_L8A8_SINT: 3423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_L8A8_SRGB: 3433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8_UNORM: 3448d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_UINT: 3458d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8_SINT: 3463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8; 3473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_UNORM: 3498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_UINT: 3508d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16_SINT: 3513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16; 3523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16_FLOAT: 3543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_FLOAT; 3553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 3573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_SRGB: 3583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8B8G8R8_UNORM: 3593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_A8R8G8B8_UNORM: 3603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_SRGB: 3613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8A8_UNORM: 3623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B8G8R8X8_UNORM: 3633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_SNORM: 3643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8A8_UNORM: 365b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R8G8B8A8_SSCALED: 366b205f53c7fe1a1b63465ad8b55047d7b5490d4b6Dave Airlie case PIPE_FORMAT_R8G8B8A8_USCALED: 3673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8X8_UNORM: 3683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8SG8SB8UX8U_NORM: 3693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8B8G8R8_UNORM: 3703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8R8G8B8_UNORM: 3713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R8G8B8_UNORM: 3728d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_SINT: 3738d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R8G8B8A8_UINT: 3743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_8_8_8; 3753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10A2_UNORM: 3773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10G10B10X2_SNORM: 3783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_B10G10R10A2_UNORM: 3799608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie case PIPE_FORMAT_B10G10R10A2_UINT: 3803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R10SG10SB10SA2U_NORM: 3813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_2_10_10_10; 3823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_Z24X8_UNORM: 384866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 3853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_8_24; 3863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 3873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_X8Z24_UNORM: 388866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_S8_UINT_Z24_UNORM: 3893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_24_8; 3903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 391866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 39289954723bfeef59d055d2332ff112f0204b48130Marek Olšák return V_0280A0_COLOR_X24_8_32_FLOAT; 39389954723bfeef59d055d2332ff112f0204b48130Marek Olšák 3945250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_UINT: 3955250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie case PIPE_FORMAT_R32_SINT: 3965250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie return V_0280A0_COLOR_32; 3975250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie 3983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32_FLOAT: 39989954723bfeef59d055d2332ff112f0204b48130Marek Olšák case PIPE_FORMAT_Z32_FLOAT: 4003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_FLOAT; 4013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_FLOAT: 4033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_FLOAT; 4043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_SSCALED: 4063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16_UNORM: 4078d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_UINT: 4088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16_SINT: 4093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16; 4103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R11G11B10_FLOAT: 4123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_10_11_11_FLOAT; 4133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 4153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16_USCALED: 4163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_USCALED: 4173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16_SSCALED: 4188d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_UINT: 4198d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R16G16B16A16_SINT: 4203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SSCALED: 4213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_UNORM: 4223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_SNORM: 4233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16; 4243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16_FLOAT: 4263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R16G16B16A16_FLOAT: 4273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_16_16_16_16_FLOAT; 4283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_FLOAT: 4303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_FLOAT; 4313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_USCALED: 4333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32_SSCALED: 4348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_SINT: 4358d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32_UINT: 4363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32; 4373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 96-bit buffers. */ 4393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32_FLOAT: 4403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_FLOAT; 4413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 4433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_FLOAT: 4443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32_FLOAT; 4453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_SNORM: 4463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_R32G32B32A32_UNORM: 4472b47d2bce1f77cc450da500655a0ab5596c0585eDave Airlie case PIPE_FORMAT_R32G32B32A32_SSCALED: 4482b47d2bce1f77cc450da500655a0ab5596c0585eDave Airlie case PIPE_FORMAT_R32G32B32A32_USCALED: 4498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_SINT: 4508d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie case PIPE_FORMAT_R32G32B32A32_UINT: 4513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return V_0280A0_COLOR_32_32_32_32; 4523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* YUV buffers. */ 4543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_UYVY: 4553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case PIPE_FORMAT_YUYV: 4563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 4573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ~0U; /* Unsupported. */ 4583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 4593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 4603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_colorformat_endian_swap(uint32_t colorformat) 4623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 4633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet if (R600_BIG_ENDIAN) { 4643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet switch(colorformat) { 4653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4: 4667e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 4673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 8-bit buffers. */ 4693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8: 4707e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_NONE; 4713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 16-bit buffers. */ 4733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_5_6_5: 4743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_1_5_5_5: 4753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_4_4_4_4: 4763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16: 4773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8: 4787e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 4793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 32-bit buffers. */ 4813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_8_8_8: 4823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_2_10_10_10: 4833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_8_24: 4843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_24_8: 4853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_FLOAT: 4863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_FLOAT: 4873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16: 4887e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 4893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 64-bit buffers. */ 4913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16: 4923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_16_16_16_16_FLOAT: 4937e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN16; 4943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 4953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_FLOAT: 4963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32: 49789954723bfeef59d055d2332ff112f0204b48130Marek Olšák case V_0280A0_COLOR_X24_8_32_FLOAT: 4987e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 4993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet /* 128-bit buffers. */ 5013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_FLOAT: 5023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32_FLOAT: 5033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet case V_0280A0_COLOR_32_32_32_32: 5047e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet return ENDIAN_8IN32; 5053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet default: 5063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; /* Unsupported. */ 5073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } else { 5093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return ENDIAN_NONE; 5103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet } 5113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) 5143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U; 5163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_colorbuffer_format_supported(enum pipe_format format) 5193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_colorformat(format) != ~0U && 5213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet r600_translate_colorswap(format) != ~0U; 5223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 5233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet 5243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_zs_format_supported(enum pipe_format format) 5253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{ 5263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet return r600_translate_dbformat(format) != ~0U; 5273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet} 528fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 52918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetboolean r600_is_format_supported(struct pipe_screen *screen, 53018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_format format, 53118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet enum pipe_texture_target target, 53218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned sample_count, 53318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned usage) 53418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet{ 53518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet unsigned retval = 0; 53618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 53718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (target >= PIPE_MAX_TEXTURE_TYPES) { 53818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet R600_ERR("r600: unsupported texture type %d\n", target); 53918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 54018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 54118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 54218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (!util_format_is_supported(format, usage)) 54318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 54418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 54518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet /* Multisample */ 54618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (sample_count > 1) 54718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return FALSE; 54818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 54918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_SAMPLER_VIEW) && 55018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_sampler_format_supported(screen, format)) { 55118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_SAMPLER_VIEW; 55218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 55318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 55418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & (PIPE_BIND_RENDER_TARGET | 55518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 55618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 55718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED)) && 55818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_colorbuffer_format_supported(format)) { 55918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= usage & 56018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet (PIPE_BIND_RENDER_TARGET | 56118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_DISPLAY_TARGET | 56218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SCANOUT | 56318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet PIPE_BIND_SHARED); 56418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 56518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 56618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_DEPTH_STENCIL) && 56718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_zs_format_supported(format)) { 56818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_DEPTH_STENCIL; 56918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 57018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 57118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if ((usage & PIPE_BIND_VERTEX_BUFFER) && 57218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet r600_is_vertex_format_supported(format)) { 57318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_VERTEX_BUFFER; 57418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet } 57518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 57618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_READ) 57718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_READ; 57818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet if (usage & PIPE_BIND_TRANSFER_WRITE) 57918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet retval |= PIPE_BIND_TRANSFER_WRITE; 58018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 58118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet return retval == usage; 58218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet} 58318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet 584e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_polygon_offset_update(struct r600_context *rctx) 5850b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse{ 5860b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse struct r600_pipe_state state; 5870b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 5880b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse state.id = R600_PIPE_STATE_POLYGON_OFFSET; 5890b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse state.nregs = 0; 5900b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse if (rctx->rasterizer && rctx->framebuffer.zsbuf) { 5910b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse float offset_units = rctx->rasterizer->offset_units; 5920b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse unsigned offset_db_fmt_cntl = 0, depth; 5930b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 5940b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse switch (rctx->framebuffer.zsbuf->texture->format) { 5950b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z24X8_UNORM: 596866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z24_UNORM_S8_UINT: 5970b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -24; 5980b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 2.0f; 5990b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6000b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z32_FLOAT: 601866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 6020b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -23; 6030b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 1.0f; 6040b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_DB_IS_FLOAT_FMT(1); 6050b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6060b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse case PIPE_FORMAT_Z16_UNORM: 6070b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse depth = -16; 6080b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_units *= 4.0f; 6090b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse break; 6100b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse default: 6110b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse return; 6120b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 613afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse /* FIXME some of those reg can be computed with cso */ 6140b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS(depth); 6150b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6160b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E00_PA_SU_POLY_OFFSET_FRONT_SCALE, 6174a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(rctx->rasterizer->offset_scale), NULL, 0); 6180b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6190b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E04_PA_SU_POLY_OFFSET_FRONT_OFFSET, 6204a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(offset_units), NULL, 0); 6210b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6220b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E08_PA_SU_POLY_OFFSET_BACK_SCALE, 6234a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(rctx->rasterizer->offset_scale), NULL, 0); 6240b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6250b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028E0C_PA_SU_POLY_OFFSET_BACK_OFFSET, 6264a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(offset_units), NULL, 0); 6270b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_pipe_state_add_reg(&state, 6280b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse R_028DF8_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6294a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák offset_db_fmt_cntl, NULL, 0); 630e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, &state); 6310b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 6320b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse} 6330b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 634fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_blend_state(struct pipe_context *ctx, 635fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_blend_state *state) 636fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 637e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 638fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend); 639fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate; 64078293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t color_control = 0, target_mask; 641fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 642fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (blend == NULL) { 643fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 644fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 645fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate = &blend->rstate; 646fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 647fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_BLEND; 648fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 649fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask = 0; 6503e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher 6513e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher /* R600 does not support per-MRT blends */ 6523e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (rctx->family > CHIP_R600) 6533e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher color_control |= S_028808_PER_MRT_BLEND(1); 654fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->logicop_enable) { 655fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (state->logicop_func << 16) | (state->logicop_func << 20); 656fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 657fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= (0xcc << 16); 658fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 659fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */ 660fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->independent_blend_enable) { 661fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 662fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[i].blend_enable) { 663fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 664fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 665fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[i].colormask << (4 * i)); 666fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 667fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 668fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 669fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->rt[0].blend_enable) { 670fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i); 671fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 672fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse target_mask |= (state->rt[0].colormask << (4 * i)); 673fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 674fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 675fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse blend->cb_target_mask = target_mask; 67684b4b2a8aacf6655d3f2a9f03dec3913a00aabdbMarek Olšák blend->cb_color_control = color_control; 677fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 678fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < 8; i++) { 6793f8455d07b129062885f58237516ae0d1aa339eaJulian Adams /* state->rt entries > 0 only written if independent blending */ 6803f8455d07b129062885f58237516ae0d1aa339eaJulian Adams const int j = state->independent_blend_enable ? i : 0; 6817ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 6823f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned eqRGB = state->rt[j].rgb_func; 6833f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned srcRGB = state->rt[j].rgb_src_factor; 6843f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned dstRGB = state->rt[j].rgb_dst_factor; 6853f8455d07b129062885f58237516ae0d1aa339eaJulian Adams 6863f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned eqA = state->rt[j].alpha_func; 6873f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned srcA = state->rt[j].alpha_src_factor; 6883f8455d07b129062885f58237516ae0d1aa339eaJulian Adams unsigned dstA = state->rt[j].alpha_dst_factor; 689fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse uint32_t bc = 0; 690fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 6913f8455d07b129062885f58237516ae0d1aa339eaJulian Adams if (!state->rt[j].blend_enable) 692fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse continue; 693fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 694fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB)); 695fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB)); 696fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB)); 697fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 698fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) { 699fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_SEPARATE_ALPHA_BLEND(1); 700fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_COMB_FCN(r600_translate_blend_function(eqA)); 701fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA)); 702fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse bc |= S_028804_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA)); 703fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 704fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 7053e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher /* R600 does not support per-MRT blends */ 7063e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (rctx->family > CHIP_R600) 7074a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, bc, NULL, 0); 7083e30148900f27e29d4ea0faa5b0513f8d944fab0Alex Deucher if (i == 0) 7094a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028804_CB_BLEND_CONTROL, bc, NULL, 0); 710fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 711fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 712fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 713fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 714fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_dsa_state(struct pipe_context *ctx, 715fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_depth_stencil_alpha_state *state) 716fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 717e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 718f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa); 7193d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák unsigned db_depth_control, alpha_test_control, alpha_ref; 720a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák unsigned db_render_override, db_render_control; 721f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet struct r600_pipe_state *rstate; 722fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 723f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet if (dsa == NULL) { 724fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 725fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 726fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 727a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[0] = state->stencil[0].valuemask; 728a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->valuemask[1] = state->stencil[1].valuemask; 729a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[0] = state->stencil[0].writemask; 730a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák dsa->writemask[1] = state->stencil[1].writemask; 731a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák 732f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet rstate = &dsa->rstate; 733f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet 734fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_DSA; 735fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) | 736fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_Z_WRITE_ENABLE(state->depth.writemask) | 737fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028800_ZFUNC(state->depth.func); 738fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 739fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* stencil */ 740fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[0].enabled) { 741fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCIL_ENABLE(1); 742d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); /* translates straight */ 743fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op)); 744fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op)); 745fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op)); 746fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 747fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->stencil[1].enabled) { 748fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_BACKFACE_ENABLE(1); 749d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); /* translates straight */ 750fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op)); 751fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op)); 752fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op)); 753fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 754fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 755fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 756fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* alpha */ 757fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = 0; 758fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = 0; 759fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->alpha.enabled) { 760fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func); 761fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1); 762fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse alpha_ref = fui(state->alpha.ref_value); 763fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 764f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet dsa->alpha_ref = alpha_ref; 765fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 766fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* misc */ 767fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_render_control = 0; 768fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse db_render_override = S_028D10_FORCE_HIZ_ENABLE(V_028D10_FORCE_DISABLE) | 769fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028D10_FORCE_HIS_ENABLE0(V_028D10_FORCE_DISABLE) | 770fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028D10_FORCE_HIS_ENABLE1(V_028D10_FORCE_DISABLE); 771fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* TODO db_render_override depends on query */ 7724a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028028_DB_STENCIL_CLEAR, 0x00000000, NULL, 0); 7734a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_02802C_DB_DEPTH_CLEAR, 0x3F800000, NULL, 0); 7744a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control, NULL, 0); 7754a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286E0_SPI_FOG_FUNC_SCALE, 0x00000000, NULL, 0); 7764a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286E4_SPI_FOG_FUNC_BIAS, 0x00000000, NULL, 0); 7774a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286DC_SPI_FOG_CNTL, 0x00000000, NULL, 0); 7784a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control, NULL, 0); 7794a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028D0C_DB_RENDER_CONTROL, db_render_control, NULL, 0); 7804a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028D10_DB_RENDER_OVERRIDE, db_render_override, NULL, 0); 7814a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028D2C_DB_SRESULTS_COMPARE_STATE1, 0x00000000, NULL, 0); 7824a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028D30_DB_PRELOAD_CONTROL, 0x00000000, NULL, 0); 7834a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028D44_DB_ALPHA_TO_MASK, 0x0000AA00, NULL, 0); 784fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 78585db52025189c88437f82369716ffe88429dc08bMarek Olšák dsa->db_render_override = db_render_override; 78685db52025189c88437f82369716ffe88429dc08bMarek Olšák dsa->db_render_control = db_render_control; 78785db52025189c88437f82369716ffe88429dc08bMarek Olšák 788fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 789fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 790fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 791fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_rs_state(struct pipe_context *ctx, 792543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák const struct pipe_rasterizer_state *state) 793fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 794e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 795fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer); 796fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate; 797fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned tmp; 798b534eb16a298ce02e723c53c1d021f35a4a873a2Jerome Glisse unsigned prov_vtx = 1, polygon_dual_mode; 799a8d1d7253ed281fd5c3a8a86658998eb5b9af847Dave Airlie unsigned clip_rule; 800391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie unsigned sc_mode_cntl; 801f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák float psize_min, psize_max; 802fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 803fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rs == NULL) { 804fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 805fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 806fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 807a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL || 808a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák state->fill_back != PIPE_POLYGON_MODE_FILL); 809a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák 810a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák if (state->flatshade_first) 811a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák prov_vtx = 0; 812a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák 813fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate = &rs->rstate; 814fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->flatshade = state->flatshade; 815fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rs->sprite_coord_enable = state->sprite_coord_enable; 816725a820b926575265e6790601a0defd9c30947dcVadim Girlin rs->two_side = state->light_twoside; 81791d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin rs->clip_plane_enable = state->clip_plane_enable; 8182000086fcd5174f121f61dd6df5948c67101e148Marek Olšák rs->pa_sc_line_stipple = state->line_stipple_enable ? 8192000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_LINE_PATTERN(state->line_stipple_pattern) | 8202000086fcd5174f121f61dd6df5948c67101e148Marek Olšák S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0; 821a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák rs->pa_cl_clip_cntl = 822a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_PS_UCP_MODE(3) | 823a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) | 824a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) | 825a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák S_028810_DX_LINEAR_ATTR_CLIP_ENA(1); 826fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 827a8d1d7253ed281fd5c3a8a86658998eb5b9af847Dave Airlie clip_rule = state->scissor ? 0xAAAA : 0xFFFF; 82858c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse /* offset */ 82958c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_units = state->offset_units; 83058c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse rs->offset_scale = state->offset_scale * 12.0f; 83158c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse 832fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_RASTERIZER; 8331a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin tmp = S_0286D4_FLAT_SHADE_ENA(1); 834fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->sprite_coord_enable) { 835fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_0286D4_PNT_SPRITE_ENA(1) | 836fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_X(2) | 837fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_Y(3) | 838fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_Z(0) | 839fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0286D4_PNT_SPRITE_OVRD_W(1); 840fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) { 841fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_0286D4_PNT_SPRITE_TOP_1(1); 842fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 843fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 8444a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp, NULL, 0); 845fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 8464a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028820_PA_CL_NANINF_CNTL, 0x00000000, NULL, 0); 847fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* point size 12.4 fixed point */ 848fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp = (unsigned)(state->point_size * 8.0); 8494a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp), NULL, 0); 850f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák 851e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák if (state->point_size_per_vertex) { 852e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = util_get_min_point_size(state); 853e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = 8192; 854e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } else { 855e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák /* Force the point size to be as if the vertex output was disabled. */ 856e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_min = state->point_size; 857e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák psize_max = state->point_size; 858e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák } 859f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák /* Divide by two, because 0.5 = 1 pixel. */ 860f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 861f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) | 862f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)), 8634a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 864c28f7645722ed3da1a04d3187f9cfa5d8e5e489dKeith Whitwell 865d6b6a0bc170bd61abbbe9cb6ba777c7192dbd018Keith Whitwell tmp = (unsigned)state->line_width * 8; 8664a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), NULL, 0); 867c28f7645722ed3da1a04d3187f9cfa5d8e5e489dKeith Whitwell 868391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie if (rctx->chip_class >= R700) 869391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie sc_mode_cntl = 0x514002; 870391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie else 871391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie sc_mode_cntl = 0x4102; 872391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie sc_mode_cntl |= S_028A4C_LINE_STIPPLE_ENABLE(state->line_stipple_enable); 873391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie 874391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL, sc_mode_cntl, 8754a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 8764a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MPASS_PS_CNTL, 0x00000000, NULL, 0); 8774a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, 0x00000400, NULL, 0); 8787ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 879c3974dc837b4a11a30603bb00fa1d346e721af59Keith Whitwell r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL, 880c3974dc837b4a11a30603bb00fa1d346e721af59Keith Whitwell S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules), 8814a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 8824a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 8834a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000, NULL, 0); 8844a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028C10_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000, NULL, 0); 8854a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028C14_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000, NULL, 0); 8864a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028C18_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000, NULL, 0); 8874a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028DFC_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp), NULL, 0); 8884a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule, NULL, 0); 889b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák r600_pipe_state_add_reg(rstate, R_028814_PA_SU_SC_MODE_CNTL, 890b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_PROVOKING_VTX_LAST(prov_vtx) | 891b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) | 892b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) | 893b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_FACE(!state->front_ccw) | 894b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) | 895b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) | 896b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) | 897b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLY_MODE(polygon_dual_mode) | 898b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) | 899b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back)), 900b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák NULL, 0); 901fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 902fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 903fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 904fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void *r600_create_sampler_state(struct pipe_context *ctx, 905fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_sampler_state *state) 906fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 907badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state); 908badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák struct r600_pipe_state *rstate; 909fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse union util_color uc; 910b9e8ea6a2717422ea71887beda093fe1dfbd1200Jerome Glisse unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0; 911fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 912badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák if (ss == NULL) { 913fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 914fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 915fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 916badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák ss->seamless_cube_map = state->seamless_cube_map; 917badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák rstate = &ss->rstate; 918fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_SAMPLER; 9199f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc); 92051d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie r600_pipe_state_add_reg_noblock(rstate, R_03C000_SQ_TEX_SAMPLER_WORD0_0, 92151d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) | 92251d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) | 92351d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) | 92451d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) | 92551d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) | 92651d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) | 92751d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) | 92851d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) | 9294a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), NULL, 0); 93051d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie r600_pipe_state_add_reg_noblock(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0, 93151d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 6)) | 93251d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 6)) | 9334a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák S_03C004_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 6)), NULL, 0); 9344a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg_noblock(rstate, R_03C008_SQ_TEX_SAMPLER_WORD2_0, S_03C008_TYPE(1), NULL, 0); 935fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (uc.ui) { 9364a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg_noblock(rstate, R_00A400_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]), NULL, 0); 9374a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg_noblock(rstate, R_00A404_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]), NULL, 0); 9384a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg_noblock(rstate, R_00A408_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]), NULL, 0); 9394a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg_noblock(rstate, R_00A40C_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]), NULL, 0); 940fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 941fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return rstate; 942fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 943fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 944fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *ctx, 945fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct pipe_resource *texture, 946fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_sampler_view *state) 947fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 948c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse struct r600_screen *rscreen = (struct r600_screen*)ctx->screen; 949565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view); 950cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie struct r600_pipe_resource_state *rstate; 951565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture; 952843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, endian; 953fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse uint32_t word4 = 0, yuv_format = 0, pitch = 0; 954fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned char swizzle[4], array_mode = 0, tile_type = 0; 955677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák unsigned width, height, depth, offset_level, last_level; 956fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 957565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák if (view == NULL) 958fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return NULL; 959565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák rstate = &view->state; 960fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 961fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* initialize base object */ 962565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base = *state; 963565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = NULL; 964fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse pipe_reference(NULL, &texture->reference); 965565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.texture = texture; 966565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.reference.count = 1; 967565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák view->base.context = ctx; 968fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 969fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[0] = state->swizzle_r; 970fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[1] = state->swizzle_g; 971fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[2] = state->swizzle_b; 972fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle[3] = state->swizzle_a; 973565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 974929be6eb95c33d5885a89b36dbc82db64c1344feDave Airlie format = r600_translate_texformat(ctx->screen, state->format, 975fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse swizzle, 976fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse &word4, &yuv_format); 977fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (format == ~0) { 978fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse format = 0; 979fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 980565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 981b13b7b86b2e1165b24a2df20cb67f9f3baa17b13Dave Airlie if (tmp->depth && !tmp->is_flushing_texture) { 9823e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie r600_texture_depth_flush(ctx, texture, TRUE); 983d171ae086bae37279251a1d6f32e16e333cfc154Henri Verbeet tmp = tmp->flushed_depth_texture; 984fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 985565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák 986843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 987231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 988677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák offset_level = state->u.tex.first_level; 989677a4406d20e0a2b6d92c34e9ff6716f31ba1382Marek Olšák last_level = state->u.tex.last_level - offset_level; 990c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (!rscreen->use_surface) { 991c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse width = u_minify(texture->width0, offset_level); 992c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse height = u_minify(texture->height0, offset_level); 993c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = u_minify(texture->depth0, offset_level); 994c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 995c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = align(tmp->pitch_in_blocks[offset_level] * 996c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse util_format_get_blockwidth(state->format), 8); 997c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = tmp->array_mode[offset_level]; 998c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse tile_type = tmp->tile_type; 999c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 1000c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 1001c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse height = 1; 1002c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = texture->array_size; 1003c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 1004c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = texture->array_size; 1005c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 100669d969e8fafd3357a140072f0f4bbf0f28db9769Dave Airlie 1007c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo[0] = &tmp->resource; 1008c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo[1] = &tmp->resource; 1009c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo_usage[0] = RADEON_USAGE_READ; 1010c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo_usage[1] = RADEON_USAGE_READ; 1011c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 1012c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[0] = (S_038000_DIM(r600_tex_dim(texture->target)) | 1013c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TILE_MODE(array_mode) | 1014c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TILE_TYPE(tile_type) | 1015c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_PITCH((pitch / 8) - 1) | 1016c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TEX_WIDTH(width - 1)); 1017c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[1] = (S_038004_TEX_HEIGHT(height - 1) | 1018c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038004_TEX_DEPTH(depth - 1) | 1019c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038004_DATA_FORMAT(format)); 1020c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[2] = tmp->offset[offset_level] >> 8; 1021c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[3] = tmp->offset[offset_level+1] >> 8; 1022c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[4] = (word4 | 1023c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) | 1024c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_REQUEST_SIZE(1) | 1025c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_ENDIAN_SWAP(endian) | 1026c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_BASE_LEVEL(0)); 1027c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[5] = (S_038014_LAST_LEVEL(last_level) | 1028c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038014_BASE_ARRAY(state->u.tex.first_layer) | 1029c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038014_LAST_ARRAY(state->u.tex.last_layer)); 1030c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[6] = (S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) | 1031c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038018_MAX_ANISO(4 /* max 16 samples */)); 1032c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1033c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse width = tmp->surface.level[offset_level].npix_x; 1034c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse height = tmp->surface.level[offset_level].npix_y; 1035c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = tmp->surface.level[offset_level].npix_z; 1036c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format); 1037c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse tile_type = tmp->tile_type; 1038c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 1039c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (texture->target == PIPE_TEXTURE_1D_ARRAY) { 1040c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse height = 1; 1041c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = texture->array_size; 1042c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) { 1043c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse depth = texture->array_size; 1044c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1045c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse switch (tmp->surface.level[offset_level].mode) { 1046c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR_ALIGNED: 1047c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_038000_ARRAY_LINEAR_ALIGNED; 1048c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1049c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_1D: 1050c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_038000_ARRAY_1D_TILED_THIN1; 1051c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1052c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_2D: 1053c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_038000_ARRAY_2D_TILED_THIN1; 1054c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1055c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR: 1056c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse default: 1057c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_038000_ARRAY_LINEAR_GENERAL; 1058c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1059c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1060fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1061c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo[0] = &tmp->resource; 1062c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo[1] = &tmp->resource; 1063c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo_usage[0] = RADEON_USAGE_READ; 1064c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->bo_usage[1] = RADEON_USAGE_READ; 1065c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 1066c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[0] = (S_038000_DIM(r600_tex_dim(texture->target)) | 1067c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TILE_MODE(array_mode) | 1068c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TILE_TYPE(tile_type) | 1069c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_PITCH((pitch / 8) - 1) | 1070c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038000_TEX_WIDTH(width - 1)); 1071c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[1] = (S_038004_TEX_HEIGHT(height - 1) | 1072c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038004_TEX_DEPTH(depth - 1) | 1073c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038004_DATA_FORMAT(format)); 1074c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[2] = tmp->surface.level[offset_level].offset >> 8; 1075c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (offset_level >= tmp->surface.last_level) { 1076c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[3] = tmp->surface.level[offset_level].offset >> 8; 1077c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1078c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[3] = tmp->surface.level[offset_level + 1].offset >> 8; 1079c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1080c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[4] = (word4 | 1081c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) | 1082c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_REQUEST_SIZE(1) | 1083c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_ENDIAN_SWAP(endian) | 1084c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038010_BASE_LEVEL(0)); 1085c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[5] = (S_038014_LAST_LEVEL(last_level) | 1086c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038014_BASE_ARRAY(state->u.tex.first_layer) | 1087c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038014_LAST_ARRAY(state->u.tex.last_layer)); 1088c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rstate->val[6] = (S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) | 1089c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_038018_MAX_ANISO(4 /* max 16 samples */)); 1090c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1091565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák return &view->base; 1092fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1093fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1094e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_set_sampler_views(struct r600_context *rctx, 1095c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct r600_textures_info *dst, 1096c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák unsigned count, 1097c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct pipe_sampler_view **views, 1098c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák void (*set_resource)(struct r600_context*, struct r600_pipe_resource_state*, unsigned)) 1099fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1100c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct r600_pipe_sampler_view **rviews = (struct r600_pipe_sampler_view **)views; 1101c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák unsigned i; 1102fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 11030813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák if (count) 11040813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák r600_inval_texture_cache(rctx); 11050813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák 1106a1b7333c07797faea29f50fd49b6c5e877beca0aDave Airlie for (i = 0; i < count; i++) { 1107c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (rviews[i]) { 1108c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (((struct r600_resource_texture *)rviews[i]->base.texture)->depth) 1109c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rctx->have_depth_texture = true; 1110c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1111c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák /* Changing from array to non-arrays textures and vice versa requires updating TEX_ARRAY_OVERRIDE. */ 1112c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if ((rviews[i]->base.texture->target == PIPE_TEXTURE_1D_ARRAY || 1113c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rviews[i]->base.texture->target == PIPE_TEXTURE_2D_ARRAY) != dst->is_array_sampler[i]) 1114c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák dst->samplers_dirty = true; 1115c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 1116e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák set_resource(rctx, &rviews[i]->state, i + R600_MAX_CONST_BUFFERS); 11172743851c1a73305dd83e42b99edc49906d9c0a51Dave Airlie } else { 1118e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák set_resource(rctx, NULL, i + R600_MAX_CONST_BUFFERS); 1119fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1120c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1121c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák pipe_sampler_view_reference( 1122c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák (struct pipe_sampler_view **)&dst->views[i], 1123c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák views[i]); 1124fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1125c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1126c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák for (i = count; i < dst->n_views; i++) { 1127c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (dst->views[i]) { 1128e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák set_resource(rctx, NULL, i + R600_MAX_CONST_BUFFERS); 1129c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views[i], NULL); 1130a1b7333c07797faea29f50fd49b6c5e877beca0aDave Airlie } 1131a1b7333c07797faea29f50fd49b6c5e877beca0aDave Airlie } 1132c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1133c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák dst->n_views = count; 1134c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák} 1135c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1136c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšákstatic void r600_set_vs_sampler_views(struct pipe_context *ctx, unsigned count, 1137c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct pipe_sampler_view **views) 1138c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák{ 1139e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1140c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_set_sampler_views(rctx, &rctx->vs_samplers, count, views, 1141c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_context_pipe_state_set_vs_resource); 1142c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák} 1143c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1144c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšákstatic void r600_set_ps_sampler_views(struct pipe_context *ctx, unsigned count, 1145c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct pipe_sampler_view **views) 1146c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák{ 1147e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1148c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_set_sampler_views(rctx, &rctx->ps_samplers, count, views, 1149c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_context_pipe_state_set_ps_resource); 1150fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1151fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1152e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_set_seamless_cubemap(struct r600_context *rctx, boolean enable) 1153badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák{ 1154badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1155badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák if (rstate == NULL) 1156badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák return; 1157badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1158badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák rstate->id = R600_PIPE_STATE_SEAMLESS_CUBEMAP; 1159badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák r600_pipe_state_add_reg(rstate, R_009508_TA_CNTL_AUX, 11600569f13d2b6239dbbc693781d806826924b0ed16Marek Olšák (enable ? 0 : S_009508_DISABLE_CUBE_WRAP(1)) | 11610569f13d2b6239dbbc693781d806826924b0ed16Marek Olšák S_009508_DISABLE_CUBE_ANISO(1) | 11620569f13d2b6239dbbc693781d806826924b0ed16Marek Olšák S_009508_SYNC_GRADIENT(1) | 11630569f13d2b6239dbbc693781d806826924b0ed16Marek Olšák S_009508_SYNC_WALKER(1) | 11640569f13d2b6239dbbc693781d806826924b0ed16Marek Olšák S_009508_SYNC_ALIGNER(1), 11654a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 1166badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1167badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák free(rctx->states[R600_PIPE_STATE_SEAMLESS_CUBEMAP]); 1168badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák rctx->states[R600_PIPE_STATE_SEAMLESS_CUBEMAP] = rstate; 1169e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 1170badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák} 1171badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1172e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_bind_samplers(struct r600_context *rctx, 1173c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct r600_textures_info *dst, 1174c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák unsigned count, void **states) 1175fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1176c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák memcpy(dst->samplers, states, sizeof(void*) * count); 1177c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák dst->n_samplers = count; 1178c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák dst->samplers_dirty = true; 1179c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák} 1180badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1181c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšákstatic void r600_bind_vs_samplers(struct pipe_context *ctx, unsigned count, void **states) 1182c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák{ 1183e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1184c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_bind_samplers(rctx, &rctx->vs_samplers, count, states); 1185fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1186fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1187c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšákstatic void r600_bind_ps_samplers(struct pipe_context *ctx, unsigned count, void **states) 1188fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1189e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1190c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_bind_samplers(rctx, &rctx->ps_samplers, count, states); 1191c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák} 1192fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1193e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_update_samplers(struct r600_context *rctx, 1194c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák struct r600_textures_info *tex, 1195c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák void (*set_sampler)(struct r600_context*, struct r600_pipe_state*, unsigned)) 1196c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák{ 1197c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák unsigned i; 1198c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1199c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (tex->samplers_dirty) { 1200c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák int seamless = -1; 1201c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák for (i = 0; i < tex->n_samplers; i++) { 1202c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (!tex->samplers[i]) 1203c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák continue; 1204c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1205c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák /* TEX_ARRAY_OVERRIDE must be set for array textures to disable 1206c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák * filtering between layers. 1207c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák * Don't update TEX_ARRAY_OVERRIDE if we don't have the sampler view. */ 1208c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (tex->views[i]) { 1209c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (tex->views[i]->base.texture->target == PIPE_TEXTURE_1D_ARRAY || 1210c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->views[i]->base.texture->target == PIPE_TEXTURE_2D_ARRAY) { 1211c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->samplers[i]->rstate.regs[0].value |= S_03C000_TEX_ARRAY_OVERRIDE(1); 1212c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->is_array_sampler[i] = true; 1213c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák } else { 1214c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->samplers[i]->rstate.regs[0].value &= C_03C000_TEX_ARRAY_OVERRIDE; 1215c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->is_array_sampler[i] = false; 1216c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák } 1217c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák } 1218badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1219e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák set_sampler(rctx, &tex->samplers[i]->rstate, i); 1220c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1221c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (tex->samplers[i]) 1222c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák seamless = tex->samplers[i]->seamless_cube_map; 1223c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák } 1224c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1225c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák if (seamless != -1) 1226c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_set_seamless_cubemap(rctx, seamless); 1227c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák 1228c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák tex->samplers_dirty = false; 1229fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1230c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák} 1231badf0335ef70223204fbae3e8fdef718cdb3ad19Marek Olšák 1232e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_update_sampler_states(struct r600_context *rctx) 1233c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák{ 1234c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_update_samplers(rctx, &rctx->vs_samplers, 1235c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_context_pipe_state_set_vs_sampler); 1236c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_update_samplers(rctx, &rctx->ps_samplers, 1237c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák r600_context_pipe_state_set_ps_sampler); 1238fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1239fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1240fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_clip_state(struct pipe_context *ctx, 1241fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_clip_state *state) 1242fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1243e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1244fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 124554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin struct pipe_resource * cbuf; 1246fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1247fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rstate == NULL) 1248fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1249fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1250fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->clip = *state; 1251fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_CLIP; 1252dc4c821f0817a3db716f965692fb701079f66340Marek Olšák for (int i = 0; i < 6; i++) { 12535646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1254c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor R_028E20_PA_CL_UCP0_X + i * 16, 12554a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(state->ucp[i][0]), NULL, 0); 12565646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1257c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor R_028E24_PA_CL_UCP0_Y + i * 16, 12584a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(state->ucp[i][1]) , NULL, 0); 12595646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1260c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor R_028E28_PA_CL_UCP0_Z + i * 16, 12614a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(state->ucp[i][2]), NULL, 0); 12625646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1263c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor R_028E2C_PA_CL_UCP0_W + i * 16, 12644a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák fui(state->ucp[i][3]), NULL, 0); 1265fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1266fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1267fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse free(rctx->states[R600_PIPE_STATE_CLIP]); 1268fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->states[R600_PIPE_STATE_CLIP] = rstate; 1269e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 127054e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 127154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin cbuf = pipe_user_buffer_create(ctx->screen, 127254e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin state->ucp, 127354e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin 4*4*8, /* 8*4 floats */ 127454e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin PIPE_BIND_CONSTANT_BUFFER); 127554e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin r600_set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 1, cbuf); 127654e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin pipe_resource_reference(&cbuf, NULL); 1277fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1278fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1279fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_polygon_stipple(struct pipe_context *ctx, 1280fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_poly_stipple *state) 1281fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1282fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1283fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1284fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 1285fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1286fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1287fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1288fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_scissor_state(struct pipe_context *ctx, 1289fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_scissor_state *state) 1290fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1291e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1292fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 129378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t tl, br; 1294fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1295fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rstate == NULL) 1296fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1297fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1298fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_SCISSOR; 1299fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny) | S_028240_WINDOW_OFFSET_DISABLE(1); 1300fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy); 13015646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1302fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028210_PA_SC_CLIPRECT_0_TL, tl, 13034a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13045646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1305fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028214_PA_SC_CLIPRECT_0_BR, br, 13064a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13075646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1308fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028218_PA_SC_CLIPRECT_1_TL, tl, 13094a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13105646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1311fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_02821C_PA_SC_CLIPRECT_1_BR, br, 13124a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13135646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1314fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028220_PA_SC_CLIPRECT_2_TL, tl, 13154a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13165646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1317fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028224_PA_SC_CLIPRECT_2_BR, br, 13184a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13195646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1320fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028228_PA_SC_CLIPRECT_3_TL, tl, 13214a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 13225646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1323fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_02822C_PA_SC_CLIPRECT_3_BR, br, 13244a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 1325fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1326fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse free(rctx->states[R600_PIPE_STATE_SCISSOR]); 1327fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->states[R600_PIPE_STATE_SCISSOR] = rstate; 1328e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 1329fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1330fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1331fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_viewport_state(struct pipe_context *ctx, 1332fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_viewport_state *state) 1333fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1334e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1335fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 1336fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1337fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rstate == NULL) 1338fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1339fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1340fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->viewport = *state; 1341fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_VIEWPORT; 13424a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000, NULL, 0); 13434a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000, NULL, 0); 13444a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]), NULL, 0); 13454a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]), NULL, 0); 13464a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]), NULL, 0); 13474a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]), NULL, 0); 13484a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]), NULL, 0); 13494a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]), NULL, 0); 13504a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_028818_PA_CL_VTE_CNTL, 0x0000043F, NULL, 0); 1351fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1352fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse free(rctx->states[R600_PIPE_STATE_VIEWPORT]); 1353fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->states[R600_PIPE_STATE_VIEWPORT] = rstate; 1354e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 1355fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1356fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1357e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_cb(struct r600_context *rctx, struct r600_pipe_state *rstate, 1358fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_framebuffer_state *state, int cb) 1359fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1360c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse struct r600_screen *rscreen = rctx->screen; 1361fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_resource_texture *rtex; 136291e513044de21f20c2c085a99e9d784c7a61173cDave Airlie struct r600_surface *surf; 13634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level = state->cbufs[cb]->u.tex.level; 1364fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned pitch, slice; 1365fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse unsigned color_info; 1366843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano unsigned format, swap, ntype, endian; 13674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned offset; 1368fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct util_format_description *desc; 13690d851f6e9c6046052ddce3860e625537832530a0Dave Airlie int i; 1370a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie unsigned blend_bypass = 0, blend_clamp = 1; 1371fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 137291e513044de21f20c2c085a99e9d784c7a61173cDave Airlie surf = (struct r600_surface *)state->cbufs[cb]; 1373fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; 13743e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 13752743851c1a73305dd83e42b99edc49906d9c0a51Dave Airlie if (rtex->depth) 13762743851c1a73305dd83e42b99edc49906d9c0a51Dave Airlie rctx->have_depth_fb = TRUE; 13772743851c1a73305dd83e42b99edc49906d9c0a51Dave Airlie 13783e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie if (rtex->depth && !rtex->is_flushing_texture) { 13793e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie rtex = rtex->flushed_depth_texture; 13803e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie } 13813e9bc43fbafdd497d475eaffe0deec81b446d122Dave Airlie 13824c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX quite sure for dx10+ hw don't need any offset hacks */ 1383c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (!rscreen->use_surface) { 1384c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse offset = r600_texture_get_offset(rtex, 1385c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse level, state->cbufs[cb]->u.tex.first_layer); 1386c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = rtex->pitch_in_blocks[level] / 8 - 1; 1387c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64; 1388c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (slice) { 1389c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = slice - 1; 1390c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1391c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = S_0280A0_ARRAY_MODE(rtex->array_mode[level]); 1392c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1393c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse offset = rtex->surface.level[level].offset; 1394c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1395c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse offset += rtex->surface.level[level].slice_size * 1396c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse state->cbufs[cb]->u.tex.first_layer; 1397c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1398c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1399c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1400c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (slice) { 1401c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = slice - 1; 1402c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1403c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = 0; 1404c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse switch (rtex->surface.level[level].mode) { 1405c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR_ALIGNED: 1406c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_ALIGNED); 1407c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1408c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_1D: 1409c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_1D_TILED_THIN1); 1410c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1411c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_2D: 1412c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_2D_TILED_THIN1); 1413c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1414c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR: 1415c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse default: 1416c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_GENERAL); 1417c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1418c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1419c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1420780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie desc = util_format_description(surf->base.format); 1421fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 14220d851f6e9c6046052ddce3860e625537832530a0Dave Airlie for (i = 0; i < 4; i++) { 14230d851f6e9c6046052ddce3860e625537832530a0Dave Airlie if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 14240d851f6e9c6046052ddce3860e625537832530a0Dave Airlie break; 14250d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 14260d851f6e9c6046052ddce3860e625537832530a0Dave Airlie } 14278d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie 142866866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 142966866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) 143066866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie ntype = V_0280A0_NUMBER_SRGB; 14318d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) { 14328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 14338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SNORM; 14348d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 14358d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_SINT; 14368d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) { 14378d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie if (desc->channel[i].normalized) 14388d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UNORM; 14398d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie else if (desc->channel[i].pure_integer) 14408d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie ntype = V_0280A0_NUMBER_UINT; 14418d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie } 14420d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 1443780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie format = r600_translate_colorformat(surf->base.format); 1444780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie swap = r600_translate_colorswap(surf->base.format); 14456101b6d442b06a347c001fe85848d636ab7df260Marek Olšák if(rtex->resource.b.b.b.usage == PIPE_USAGE_STAGING) { 1446843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = ENDIAN_NONE; 1447843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } else { 1448843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano endian = r600_colorformat_endian_swap(format); 1449843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano } 1450231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie 1451a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie /* set blend bypass according to docs if SINT/UINT or 1452a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 8/24 COLOR variants */ 1453a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie if (ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT || 1454a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_8_24 || format == V_0280A0_COLOR_24_8 || 1455a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie format == V_0280A0_COLOR_X24_8_32_FLOAT) { 1456a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_clamp = 0; 1457a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie blend_bypass = 1; 1458a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie } 1459a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie 1460c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse color_info |= S_0280A0_FORMAT(format) | 1461fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_0280A0_COMP_SWAP(swap) | 1462a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_BYPASS(blend_bypass) | 1463a33937d043f9c1795d2be635117a7cc9646ff0ceDave Airlie S_0280A0_BLEND_CLAMP(blend_clamp) | 1464843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_NUMBER_TYPE(ntype) | 1465843dfe3206c4f397c7911b748373dde5540392a4Cédric Cano S_0280A0_ENDIAN(endian); 14660d851f6e9c6046052ddce3860e625537832530a0Dave Airlie 14675939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM is an optimzation that can be enabled for better 14685939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * performance in certain cases 14695939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 1470b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class == R600) { 14715939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 14725939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 14735939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_CLAMP is enabled 14745939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - BLEND_FLOAT32 is disabled 14755939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 14765939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 14775939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 12 && 14785939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 14795939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && 14805939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_SINT) && 14815939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher G_0280A0_BLEND_CLAMP(color_info) && 14825939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher !G_0280A0_BLEND_FLOAT32(color_info)) 14835939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 14845939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } else { 14855939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher /* EXPORT_NORM can be enabled if: 14865939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 11-bit or smaller UNORM/SNORM/SRGB 14875939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher * - 16-bit or smaller FLOAT 14885939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher */ 14895939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS && 14905939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ((desc->channel[i].size < 12 && 14915939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT && 14925939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher ntype != V_0280A0_NUMBER_UINT && ntype != V_0280A0_NUMBER_SINT) || 14935939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher (desc->channel[i].size < 17 && 14945939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) 14955939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM); 14965939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher } 1497fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 14985646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1499fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028040_CB_COLOR0_BASE + cb * 4, 15004a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák offset >> 8, &rtex->resource, RADEON_USAGE_READWRITE); 15015646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1502fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_0280A0_CB_COLOR0_INFO + cb * 4, 15034a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák color_info, &rtex->resource, RADEON_USAGE_READWRITE); 15045646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1505fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028060_CB_COLOR0_SIZE + cb * 4, 1506fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028060_PITCH_TILE_MAX(pitch) | 1507fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028060_SLICE_TILE_MAX(slice), 15084a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 1509c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (!rscreen->use_surface) { 1510c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse r600_pipe_state_add_reg(rstate, 1511c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse R_028080_CB_COLOR0_VIEW + cb * 4, 1512c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 0x00000000, NULL, 0); 1513c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1514c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) { 1515c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse r600_pipe_state_add_reg(rstate, 1516c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse R_028080_CB_COLOR0_VIEW + cb * 4, 1517c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 0x00000000, NULL, 0); 1518c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1519c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse r600_pipe_state_add_reg(rstate, 1520c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse R_028080_CB_COLOR0_VIEW + cb * 4, 1521c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_028080_SLICE_START(state->cbufs[cb]->u.tex.first_layer) | 1522c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_028080_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer), 1523c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse NULL, 0); 1524c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1525c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 15265646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1527fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_0280E0_CB_COLOR0_FRAG + cb * 4, 15284a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, &rtex->resource, RADEON_USAGE_READWRITE); 15295646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1530fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_0280C0_CB_COLOR0_TILE + cb * 4, 15314a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, &rtex->resource, RADEON_USAGE_READWRITE); 15325646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1533fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028100_CB_COLOR0_MASK + cb * 4, 15344a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 1535fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1536fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1537e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_db(struct r600_context *rctx, struct r600_pipe_state *rstate, 1538fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_framebuffer_state *state) 1539fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1540c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse struct r600_screen *rscreen = rctx->screen; 1541fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_resource_texture *rtex; 154291e513044de21f20c2c085a99e9d784c7a61173cDave Airlie struct r600_surface *surf; 1543faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák unsigned level, pitch, slice, format, offset, array_mode; 1544fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1545fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->zsbuf == NULL) 1546fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1547fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 15484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger level = state->zsbuf->u.tex.level; 1549ea5aab85fd195074189832c2d6870dd78f0f8966Dave Airlie 155091e513044de21f20c2c085a99e9d784c7a61173cDave Airlie surf = (struct r600_surface *)state->zsbuf; 1551fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rtex = (struct r600_resource_texture*)state->zsbuf->texture; 155211bc8991e94e2fa6d461193a6aff47f8f94b7a47Dave Airlie 1553c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (!rscreen->use_surface) { 1554c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse /* XXX remove this once tiling is properly supported */ 1555c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = rtex->array_mode[level] ? rtex->array_mode[level] : 1556c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse V_0280A0_ARRAY_1D_TILED_THIN1; 1557c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 1558c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse /* XXX quite sure for dx10+ hw don't need any offset hacks */ 1559c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse offset = r600_texture_get_offset((struct r600_resource_texture *)state->zsbuf->texture, 1560c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse level, state->zsbuf->u.tex.first_layer); 1561c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = rtex->pitch_in_blocks[level] / 8 - 1; 1562c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64; 1563c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (slice) { 1564c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = slice - 1; 1565c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1566c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1567c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse offset = rtex->surface.level[level].offset; 1568c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse pitch = rtex->surface.level[level].nblk_x / 8 - 1; 1569c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64; 1570c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (slice) { 1571c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse slice = slice - 1; 1572c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1573c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse switch (rtex->surface.level[level].mode) { 1574c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_2D: 1575c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_0280A0_ARRAY_2D_TILED_THIN1; 1576c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1577c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_1D: 1578c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR_ALIGNED: 1579c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse case RADEON_SURF_MODE_LINEAR: 1580c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse default: 1581c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse array_mode = V_0280A0_ARRAY_1D_TILED_THIN1; 1582c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse break; 1583c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1584c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 1585faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák 1586fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse format = r600_translate_dbformat(state->zsbuf->texture->format); 1587fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 15885646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_02800C_DB_DEPTH_BASE, 15894a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák offset >> 8, &rtex->resource, RADEON_USAGE_READWRITE); 15905646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028000_DB_DEPTH_SIZE, 1591fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse S_028000_PITCH_TILE_MAX(pitch) | S_028000_SLICE_TILE_MAX(slice), 15924a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 1593c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse if (!rscreen->use_surface) { 1594c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse r600_pipe_state_add_reg(rstate, R_028004_DB_DEPTH_VIEW, 0x00000000, NULL, 0); 1595c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } else { 1596c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse r600_pipe_state_add_reg(rstate, R_028004_DB_DEPTH_VIEW, 1597c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_028004_SLICE_START(state->zsbuf->u.tex.first_layer) | 1598c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse S_028004_SLICE_MAX(state->zsbuf->u.tex.last_layer), 1599c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse NULL, 0); 1600c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse } 16015646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028010_DB_DEPTH_INFO, 1602faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák S_028010_ARRAY_MODE(array_mode) | S_028010_FORMAT(format), 16034a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák &rtex->resource, RADEON_USAGE_READWRITE); 16045646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028D34_DB_PREFETCH_LIMIT, 16054a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák (surf->aligned_height / 8) - 1, NULL, 0); 1606fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1607fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1608fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissestatic void r600_set_framebuffer_state(struct pipe_context *ctx, 1609fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse const struct pipe_framebuffer_state *state) 1610fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1611e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1612fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state); 161378293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t shader_mask, tl, br, shader_control; 1614fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1615fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (rstate == NULL) 1616fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse return; 1617fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 16180813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák r600_flush_framebuffer(rctx, false); 16196067a2a67f9a7aab2aee051469bea8af03747a95Fredrik Höglund 1620fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* unreference old buffer and reference new one */ 1621fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rstate->id = R600_PIPE_STATE_FRAMEBUFFER; 1622c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 1623c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie util_copy_framebuffer_state(&rctx->framebuffer, state); 16247ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse 1625fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* build states */ 16262743851c1a73305dd83e42b99edc49906d9c0a51Dave Airlie rctx->have_depth_fb = 0; 1627fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < state->nr_cbufs; i++) { 1628fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse r600_cb(rctx, rstate, state, i); 1629fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1630fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse if (state->zsbuf) { 1631fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse r600_db(rctx, rstate, state); 1632fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1633fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1634fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse shader_mask = 0; 1635fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse shader_control = 0; 1636fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse for (int i = 0; i < state->nr_cbufs; i++) { 1637fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse shader_mask |= 0xf << (i * 4); 1638fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse shader_control |= 1 << i; 1639fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1640fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tl = S_028240_TL_X(0) | S_028240_TL_Y(0) | S_028240_WINDOW_OFFSET_DISABLE(1); 1641fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse br = S_028244_BR_X(state->width) | S_028244_BR_Y(state->height); 1642fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 16435646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 16443322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028030_PA_SC_SCREEN_SCISSOR_TL, tl, 16454a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16463322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 16473322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028034_PA_SC_SCREEN_SCISSOR_BR, br, 16484a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16493322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 16503322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028204_PA_SC_WINDOW_SCISSOR_TL, tl, 16514a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16523322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 16533322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028208_PA_SC_WINDOW_SCISSOR_BR, br, 16544a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16553322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 1656fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028240_PA_SC_GENERIC_SCISSOR_TL, tl, 16574a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16585646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1659fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028244_PA_SC_GENERIC_SCISSOR_BR, br, 16604a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16615646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1662fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl, 16634a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16645646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, 1665fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse R_028254_PA_SC_VPORT_SCISSOR_0_BR, br, 16664a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16673322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 16683322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028200_PA_SC_WINDOW_OFFSET, 0x00000000, 16694a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 1670b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class >= R700) { 16713322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie r600_pipe_state_add_reg(rstate, 16723322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie R_028230_PA_SC_EDGERULE, 0xAAAAAAAA, 16734a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 16743322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie } 1675fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 16765646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_0287A0_CB_SHADER_CONTROL, 16774a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák shader_control, NULL, 0); 16785646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_02823C_CB_SHADER_MASK, 16794a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák shader_mask, NULL, 0); 16805646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG, 16814a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 16825646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 16834a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 16845646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C20_PA_SC_AA_SAMPLE_LOCS_8S_WD1_MCTX, 16854a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 16865646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C30_CB_CLRCMP_CONTROL, 16874a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x01000000, NULL, 0); 16885646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C34_CB_CLRCMP_SRC, 16894a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 16905646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C38_CB_CLRCMP_DST, 16914a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x000000FF, NULL, 0); 16925646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C3C_CB_CLRCMP_MSK, 16934a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0xFFFFFFFF, NULL, 0); 16945646964b1360883b6254e2ebacc198f43869d36fJerome Glisse r600_pipe_state_add_reg(rstate, R_028C48_PA_SC_AA_MASK, 16954a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0xFFFFFFFF, NULL, 0); 1696fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1697fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse free(rctx->states[R600_PIPE_STATE_FRAMEBUFFER]); 1698fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->states[R600_PIPE_STATE_FRAMEBUFFER] = rstate; 1699e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, rstate); 17000b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse 17010b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse if (state->zsbuf) { 17020b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse r600_polygon_offset_update(rctx); 17030b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse } 1704fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1705fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1706e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_init_state_functions(struct r600_context *rctx) 1707fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1708fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_blend_state = r600_create_blend_state; 1709fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state; 1710fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_fs_state = r600_create_shader_state; 1711fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_rasterizer_state = r600_create_rs_state; 1712fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_state = r600_create_sampler_state; 1713fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_sampler_view = r600_create_sampler_view; 1714fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_vertex_elements_state = r600_create_vertex_elements; 1715fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.create_vs_state = r600_create_shader_state; 1716fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.bind_blend_state = r600_bind_blend_state; 1717f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state; 1718c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rctx->context.bind_fragment_sampler_states = r600_bind_ps_samplers; 1719fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.bind_fs_state = r600_bind_ps_shader; 1720fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.bind_rasterizer_state = r600_bind_rs_state; 1721fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements; 1722c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rctx->context.bind_vertex_sampler_states = r600_bind_vs_samplers; 1723fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.bind_vs_state = r600_bind_vs_shader; 1724fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_blend_state = r600_delete_state; 1725fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_depth_stencil_alpha_state = r600_delete_state; 1726fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_fs_state = r600_delete_ps_shader; 1727fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_rasterizer_state = r600_delete_rs_state; 1728fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_sampler_state = r600_delete_state; 1729fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_vertex_elements_state = r600_delete_vertex_element; 1730fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.delete_vs_state = r600_delete_vs_shader; 1731fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_blend_color = r600_set_blend_color; 1732fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_clip_state = r600_set_clip_state; 1733fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_constant_buffer = r600_set_constant_buffer; 1734c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_views; 1735fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_framebuffer_state = r600_set_framebuffer_state; 1736fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_polygon_stipple = r600_set_polygon_stipple; 1737fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_sample_mask = r600_set_sample_mask; 1738fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_scissor_state = r600_set_scissor_state; 1739a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák rctx->context.set_stencil_ref = r600_set_pipe_stencil_ref; 1740fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_vertex_buffers = r600_set_vertex_buffers; 1741fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_index_buffer = r600_set_index_buffer; 1742c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_views; 1743fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.set_viewport_state = r600_set_viewport_state; 1744fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse rctx->context.sampler_view_destroy = r600_sampler_view_destroy; 1745588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák rctx->context.redefine_user_buffer = u_default_redefine_user_buffer; 1746d04ab396a54d29948363c3353efa5aaa888076a3Fredrik Höglund rctx->context.texture_barrier = r600_texture_barrier; 1747543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák rctx->context.create_stream_output_target = r600_create_so_target; 1748543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák rctx->context.stream_output_target_destroy = r600_so_target_destroy; 1749543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák rctx->context.set_stream_output_targets = r600_set_so_targets; 1750fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 1751fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1752e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_adjust_gprs(struct r600_context *rctx) 175304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie{ 175404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie struct r600_pipe_state rstate; 175504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_ps_gprs = rctx->default_ps_gprs; 175604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned num_vs_gprs = rctx->default_vs_gprs; 175704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie unsigned tmp; 175804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie int diff; 175904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 1760b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class >= EVERGREEN) 176104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie return; 176204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 1763e330d90e919cebd64f720ccfb5dca94c2ded4e4cMarek Olšák if (!rctx->ps_shader || !rctx->vs_shader) 176404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie return; 176504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 176604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie if (rctx->ps_shader->shader.bc.ngpr > rctx->default_ps_gprs) 176704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie { 176804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie diff = rctx->ps_shader->shader.bc.ngpr - rctx->default_ps_gprs; 176904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs -= diff; 177004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs += diff; 177104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 177204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 177304554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie if (rctx->vs_shader->shader.bc.ngpr > rctx->default_vs_gprs) 177404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie { 177504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie diff = rctx->vs_shader->shader.bc.ngpr - rctx->default_vs_gprs; 177604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_ps_gprs -= diff; 177704554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie num_vs_gprs += diff; 177804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie } 177904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 178004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp = 0; 178104554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs); 178204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs); 17835345e3ea86a3e942ccef083019a76b38b05f3f14Marek Olšák tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(rctx->r6xx_num_clause_temp_gprs); 178404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rstate.nregs = 0; 17854a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(&rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, tmp, NULL, 0); 178604554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 1787e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák r600_context_pipe_state_set(rctx, &rstate); 178804554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie} 178904554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie 1790f126253040654d52db134063a69ebaf0c417d410Marek Olšákvoid r600_init_atom_start_cs(struct r600_context *rctx) 1791fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse{ 1792fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int ps_prio; 1793fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int vs_prio; 1794fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int gs_prio; 1795fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int es_prio; 1796fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_gprs; 1797fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_gprs; 1798fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_gprs; 1799fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_gprs; 1800fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_temp_gprs; 1801fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_threads; 1802fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_threads; 1803fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_threads; 1804fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_threads; 1805fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_ps_stack_entries; 1806fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_vs_stack_entries; 1807fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_gs_stack_entries; 1808fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse int num_es_stack_entries; 1809fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse enum radeon_family family; 1810f126253040654d52db134063a69ebaf0c417d410Marek Olšák struct r600_command_buffer *cb = &rctx->atom_start_cs; 181178293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák uint32_t tmp; 1812fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1813f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_init_command_buffer(cb, 256, EMIT_EARLY); 1814f126253040654d52db134063a69ebaf0c417d410Marek Olšák 1815f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* R6xx requires this packet at the start of each command buffer */ 1816f126253040654d52db134063a69ebaf0c417d410Marek Olšák if (rctx->chip_class == R600) { 1817f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_START_3D_CMDBUF, 0, 0)); 1818f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); 1819f126253040654d52db134063a69ebaf0c417d410Marek Olšák } 1820f126253040654d52db134063a69ebaf0c417d410Marek Olšák /* All asics require this one */ 1821f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0)); 1822f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 1823f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0x80000000); 1824f126253040654d52db134063a69ebaf0c417d410Marek Olšák 1825b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet family = rctx->family; 1826fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse ps_prio = 0; 1827fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse vs_prio = 1; 1828fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse gs_prio = 2; 1829fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse es_prio = 3; 1830fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 1831fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_R600: 1832fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 1833fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 1834fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1835fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1836fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1837fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 1838fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 1839fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 1840fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 1841fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 1842fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 1843fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 1844fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 1845fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1846fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV630: 1847fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV635: 1848fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 1849fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 1850fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1851fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1852fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1853fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 1854fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 40; 1855fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 1856fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 1857fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 1858fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 1859fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 1860fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 1861fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1862fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 1863fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 1864fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 1865fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 1866fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 1867fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 1868fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 1869fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1870fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1871fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1872fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 1873fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 1874fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 1875fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 1876fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 1877fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 1878fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 1879fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 1880fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1881fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV670: 1882fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 144; 1883fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 40; 1884fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1885fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1886fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1887fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 136; 1888fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 1889fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 4; 1890fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 4; 1891fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 40; 1892fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 40; 1893fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 32; 1894fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 16; 1895fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1896fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV770: 1897fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 1898fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 1899fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1900fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1901fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1902fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 1903fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 1904fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 1905fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 1906fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 256; 1907fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 256; 1908fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 1909fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 1910fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1911fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV730: 1912fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV740: 1913fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 84; 1914fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 36; 1915fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1916fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1917fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1918fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 188; 1919fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 60; 1920fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 1921fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 1922fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 1923fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 1924fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 1925fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 1926fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1927fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 1928fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_gprs = 192; 1929fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_gprs = 56; 1930fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_temp_gprs = 4; 1931fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_gprs = 0; 1932fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_gprs = 0; 1933fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_threads = 144; 1934fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_threads = 48; 1935fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_threads = 0; 1936fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_threads = 0; 1937fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_ps_stack_entries = 128; 1938fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_vs_stack_entries = 128; 1939fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_gs_stack_entries = 0; 1940fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse num_es_stack_entries = 0; 1941fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1942fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1943fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 194404554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_ps_gprs = num_ps_gprs; 194504554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie rctx->default_vs_gprs = num_vs_gprs; 1946f126253040654d52db134063a69ebaf0c417d410Marek Olšák rctx->r6xx_num_clause_temp_gprs = num_temp_gprs; 1947fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1948fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_CONFIG */ 1949fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp = 0; 1950fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse switch (family) { 1951fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV610: 1952fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV620: 1953fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS780: 1954fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RS880: 1955fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse case CHIP_RV710: 1956fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1957fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse default: 1958fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VC_ENABLE(1); 1959fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse break; 1960fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } 1961153105cfbfd8d6ff30de144605016f6e4f2a1b9eJerome Glisse tmp |= S_008C00_DX9_CONSTS(0); 1962fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ALU_INST_PREFER_VECTOR(1); 1963fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_PS_PRIO(ps_prio); 1964fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_VS_PRIO(vs_prio); 1965fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_GS_PRIO(gs_prio); 1966fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C00_ES_PRIO(es_prio); 1967f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008C00_SQ_CONFIG, tmp); 1968fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1969fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_GPR_RESOURCE_MGMT_2 */ 1970f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C08_NUM_GS_GPRS(num_gs_gprs); 1971e2529442e6cc208a4f62ff7dc00d5e2ba7c92624Mathias Fröhlich tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs); 1972f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg_seq(cb, R_008C08_SQ_GPR_RESOURCE_MGMT_2, 4); 1973f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); 1974fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1975fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_THREAD_RESOURCE_MGMT */ 1976f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C0C_NUM_PS_THREADS(num_ps_threads); 1977fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_VS_THREADS(num_vs_threads); 1978fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_GS_THREADS(num_gs_threads); 1979fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C0C_NUM_ES_THREADS(num_es_threads); 1980f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C0C_SQ_THREAD_RESOURCE_MGMT */ 1981fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1982fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_1 */ 1983f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C10_NUM_PS_STACK_ENTRIES(num_ps_stack_entries); 1984fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C10_NUM_VS_STACK_ENTRIES(num_vs_stack_entries); 1985f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C10_SQ_STACK_RESOURCE_MGMT_1 */ 1986fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1987fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse /* SQ_STACK_RESOURCE_MGMT_2 */ 1988f126253040654d52db134063a69ebaf0c417d410Marek Olšák tmp = S_008C14_NUM_GS_STACK_ENTRIES(num_gs_stack_entries); 1989fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse tmp |= S_008C14_NUM_ES_STACK_ENTRIES(num_es_stack_entries); 1990f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, tmp); /* R_008C14_SQ_STACK_RESOURCE_MGMT_2 */ 1991f126253040654d52db134063a69ebaf0c417d410Marek Olšák 1992f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009714_VC_ENHANCE, 0); 1993fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1994f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028350_SX_MISC, 0); 1995fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse 1996b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet if (rctx->chip_class >= R700) { 1997f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x00004000); 1998f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0); 1999f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x00420204); 2000f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 0); 2001fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse } else { 2002f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); 2003f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009830_DB_DEBUG, 0x82000000); 2004f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x01020204); 2005f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 1); 200647dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák } 2007f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_0288A8_SQ_ESGS_RING_ITEMSIZE, 9); 2008f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288A8_SQ_ESGS_RING_ITEMSIZE */ 2009f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288AC_SQ_GSVS_RING_ITEMSIZE */ 2010f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B0_SQ_ESTMP_RING_ITEMSIZE */ 2011f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B4_SQ_GSTMP_RING_ITEMSIZE */ 2012f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288B8_SQ_VSTMP_RING_ITEMSIZE */ 2013f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288BC_SQ_PSTMP_RING_ITEMSIZE */ 2014f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C0_SQ_FBUF_RING_ITEMSIZE */ 2015f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C4_SQ_REDUC_RING_ITEMSIZE */ 2016f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_0288C8_SQ_GS_VERT_ITEMSIZE */ 2017f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2018f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13); 2019f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */ 2020f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */ 2021f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */ 2022f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */ 2023f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */ 2024f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */ 2025f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */ 2026f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */ 2027f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */ 2028f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */ 2029f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */ 2030f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */ 2031f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE, 0); */ 2032f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2033f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028A84_VGT_PRIMITIVEID_EN, 0); 2034f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA0_VGT_INSTANCE_STEP_RATE_0, 0); 2035f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028AA4_VGT_INSTANCE_STEP_RATE_1, 0); 2036f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2037f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg_seq(cb, R_028AB0_VGT_STRMOUT_EN, 3); 2038f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB0_VGT_STRMOUT_EN */ 2039f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 1); /* R_028AB4_VGT_REUSE_OFF */ 2040f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */ 2041f126253040654d52db134063a69ebaf0c417d410Marek Olšák 2042f126253040654d52db134063a69ebaf0c417d410Marek Olšák r600_store_context_reg(cb, R_028B20_VGT_STRMOUT_BUFFER_EN, 0); 2043fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse} 2044084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2045f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeetvoid r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2046f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet{ 2047e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2048f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2049f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet struct r600_shader *rshader = &shader->shader; 2050f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control; 2051f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet int pos_index = -1, face_index = -1; 205246ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher unsigned tmp, sid, ufi = 0; 20531fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie int need_linear = 0; 2054f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2055f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet rstate->nregs = 0; 2056f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2057f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->ninput; i++) { 2058f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) 2059f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet pos_index = i; 2060f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->input[i].name == TGSI_SEMANTIC_FACE) 2061f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet face_index = i; 2062e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2063e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin sid = rshader->input[i].spi_sid; 2064e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2065e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp = S_028644_SEMANTIC(sid); 2066e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 20671a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || 20681a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT || 20691a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin (rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR && 20701a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin rctx->rasterizer && rctx->rasterizer->flatshade)) 20711fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie tmp |= S_028644_FLAT_SHADE(1); 2072e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2073e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC && 2074e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) { 2075e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_PT_SPRITE_TEX(1); 2076e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin } 2077e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2078e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin if (rshader->input[i].centroid) 2079e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_CENTROID(1); 2080e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 20811fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) { 20821fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie need_linear = 1; 2083e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin tmp |= S_028644_SEL_LINEAR(1); 20841fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie } 2085e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2086e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, 20874a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák tmp, NULL, 0); 2088f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2089f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 20903d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z); 2091f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2092f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION) 2093f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1); 2094f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2095f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control |= S_02880C_STENCIL_REF_EXPORT_ENABLE(1); 2096f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2097f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->uses_kill) 2098f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control |= S_02880C_KILL_ENABLE(1); 2099f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2100f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 0; 2101f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet num_cout = 0; 2102f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet for (i = 0; i < rshader->noutput; i++) { 2103f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (rshader->output[i].name == TGSI_SEMANTIC_POSITION || 2104f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet rshader->output[i].name == TGSI_SEMANTIC_STENCIL) 2105f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= 1; 2106f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) { 2107f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet num_cout++; 2108f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2109f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2110f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps |= S_028854_EXPORT_COLORS(num_cout); 2111f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (!exports_ps) { 2112f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* always at least export 1 component per pixel */ 2113f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet exports_ps = 2; 2114f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2115f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2116f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) | 21171fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_PERSP_GRADIENT_ENA(1)| 21181fc001ea15f79166a32bc3a3fa2f6405a986e3f1Dave Airlie S_0286CC_LINEAR_GRADIENT_ENA(need_linear); 2119f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z = 0; 2120f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (pos_index != -1) { 2121f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) | 2122f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) | 2123f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) | 2124f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286CC_BARYC_SAMPLE_CNTL(1)); 2125f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_input_z |= 1; 2126f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2127f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2128f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 = 0; 2129f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet if (face_index != -1) { 2130f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) | 2131f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr); 2132f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet } 2133f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 213446ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher /* HW bug in original R600 */ 213546ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher if (rctx->family == CHIP_R600) 213646ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher ufi = 1; 213746ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher 21384a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0, NULL, 0); 21394a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1, NULL, 0); 21404a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z, NULL, 0); 2141f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2142f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028840_SQ_PGM_START_PS, 21434a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, shader->bo, RADEON_USAGE_READ); 2144f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2145f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028850_SQ_PGM_RESOURCES_PS, 2146e556983fc8f0ac9046c5a5e3e34e8ea036587ac7Mathias Fröhlich S_028850_NUM_GPRS(rshader->bc.ngpr) | 214746ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher S_028850_STACK_SIZE(rshader->bc.nstack) | 214846ce25722b364ae7fa20b61e60eff4be5ad051d3Alex Deucher S_028850_UNCACHED_FIRST_INST(ufi), 21494a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 2150f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2151f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_028854_SQ_PGM_EXPORTS_PS, 21524a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák exports_ps, NULL, 0); 2153f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2154f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_0288CC_SQ_PGM_CF_OFFSET_PS, 21554a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 2156f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet /* only set some bits here, the other bits are set in the dsa state */ 2157f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, R_02880C_DB_SHADER_CONTROL, 2158f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet db_shader_control, 21594a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 2160f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2161f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet r600_pipe_state_add_reg(rstate, 2162f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet R_03E200_SQ_LOOP_CONST_0, 0x01000FFF, 21634a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 2164e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin 2165e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin shader->sprite_coord_enable = rctx->sprite_coord_enable; 21661a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin if (rctx->rasterizer) 21671a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin shader->flatshade = rctx->rasterizer->flatshade; 2168f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet} 2169f262ba26f045699f0aa871b6be966714e9dd6740Henri Verbeet 2170c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeetvoid r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader) 2171c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet{ 2172e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2173c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_pipe_state *rstate = &shader->rstate; 2174c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet struct r600_shader *rshader = &shader->shader; 21755b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned spi_vs_out_id[10] = {}; 21765b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin unsigned i, tmp, nparams = 0; 2177c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2178c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet /* clear previous register */ 2179c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet rstate->nregs = 0; 2180c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 21815b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin for (i = 0; i < rshader->noutput; i++) { 21825b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin if (rshader->output[i].spi_sid) { 21835b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); 21845b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin spi_vs_out_id[nparams / 4] |= tmp; 21855b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin nparams++; 21865b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin } 2187c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 21885b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin 2189c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet for (i = 0; i < 10; i++) { 2190c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2191c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028614_SPI_VS_OUT_ID_0 + i * 4, 21924a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák spi_vs_out_id[i], NULL, 0); 2193c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet } 2194c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2195dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher /* Certain attributes (position, psize, etc.) don't count as params. 2196dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * VS is required to export at least one param and r600_shader_from_tgsi() 2197dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher * takes care of adding a dummy export. 2198dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher */ 2199dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher if (nparams < 1) 2200dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher nparams = 1; 2201dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher 2202c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2203c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_0286C4_SPI_VS_OUT_CONFIG, 2204dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher S_0286C4_VS_EXPORT_COUNT(nparams - 1), 22054a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 2206c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2207c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028868_SQ_PGM_RESOURCES_VS, 2208c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet S_028868_NUM_GPRS(rshader->bc.ngpr) | 2209c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet S_028868_STACK_SIZE(rshader->bc.nstack), 22104a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 2211c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2212c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_0288D0_SQ_PGM_CF_OFFSET_VS, 22134a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 2214c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2215c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_028858_SQ_PGM_START_VS, 22164a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0, shader->bo, RADEON_USAGE_READ); 2217c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 2218c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet r600_pipe_state_add_reg(rstate, 2219c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF, 22204a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák NULL, 0); 222191d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin 222297acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák shader->pa_cl_vs_out_cntl = 222397acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) | 222497acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) | 222597acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) | 222697acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size); 2227c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet} 2228c0ca43e507dce11bd4a78bc08a8e92997cd385bfHenri Verbeet 22297f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlievoid r600_fetch_shader(struct pipe_context *ctx, 22307f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlie struct r600_vertex_element *ve) 2231a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet{ 2232a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet struct r600_pipe_state *rstate; 2233e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 2234a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet 2235a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate = &ve->rstate; 2236a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate->id = R600_PIPE_STATE_FETCH_SHADER; 2237a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet rstate->nregs = 0; 2238a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet r600_pipe_state_add_reg(rstate, R_0288A4_SQ_PGM_RESOURCES_FS, 22394a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 2240a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet r600_pipe_state_add_reg(rstate, R_0288DC_SQ_PGM_CF_OFFSET_FS, 22414a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák 0x00000000, NULL, 0); 2242a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet r600_pipe_state_add_reg(rstate, R_028894_SQ_PGM_START_FS, 2243e69dde5233a2fc6ad4c5483d079e1ea3a2123a59Marek Olšák 0, 22444a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák ve->fetch_shader, RADEON_USAGE_READ); 2245a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet} 2246a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet 2247e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid *r600_create_db_flush_dsa(struct r600_context *rctx) 2248084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie{ 2249084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie struct pipe_depth_stencil_alpha_state dsa; 2250084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie struct r600_pipe_state *rstate; 225185db52025189c88437f82369716ffe88429dc08bMarek Olšák struct r600_pipe_dsa *dsa_state; 225285db52025189c88437f82369716ffe88429dc08bMarek Olšák unsigned db_render_control; 2253084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie boolean quirk = false; 2254084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2255084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || 2256084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) 2257084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie quirk = true; 2258084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2259084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie memset(&dsa, 0, sizeof(dsa)); 2260084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2261084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie if (quirk) { 2262084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.enabled = 1; 2263084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.depth.func = PIPE_FUNC_LEQUAL; 2264084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].enabled = 1; 2265084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].func = PIPE_FUNC_ALWAYS; 2266084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_KEEP; 2267084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_INCR; 2268084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie dsa.stencil[0].writemask = 0xff; 2269084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie } 2270084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie 2271084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie rstate = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa); 227285db52025189c88437f82369716ffe88429dc08bMarek Olšák dsa_state = (struct r600_pipe_dsa*)rstate; 227385db52025189c88437f82369716ffe88429dc08bMarek Olšák 227485db52025189c88437f82369716ffe88429dc08bMarek Olšák db_render_control = 227585db52025189c88437f82369716ffe88429dc08bMarek Olšák S_028D0C_DEPTH_COPY_ENABLE(1) | 227685db52025189c88437f82369716ffe88429dc08bMarek Olšák S_028D0C_STENCIL_COPY_ENABLE(1) | 227785db52025189c88437f82369716ffe88429dc08bMarek Olšák S_028D0C_COPY_CENTROID(1); 227885db52025189c88437f82369716ffe88429dc08bMarek Olšák 227985db52025189c88437f82369716ffe88429dc08bMarek Olšák r600_pipe_state_add_reg(rstate, R_028D0C_DB_RENDER_CONTROL, db_render_control, NULL, 0); 228085db52025189c88437f82369716ffe88429dc08bMarek Olšák 228185db52025189c88437f82369716ffe88429dc08bMarek Olšák dsa_state->db_render_control = db_render_control; 228285db52025189c88437f82369716ffe88429dc08bMarek Olšák 2283084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie return rstate; 2284084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie} 228573fb2b7c9074c8878e8ff617ad6d6a21b93b66f2Marek Olšák 2286e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_pipe_init_buffer_resource(struct r600_context *rctx, 2287cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie struct r600_pipe_resource_state *rstate) 228873fb2b7c9074c8878e8ff617ad6d6a21b93b66f2Marek Olšák{ 2289573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie rstate->id = R600_PIPE_STATE_RESOURCE; 2290cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie 2291cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->bo[0] = NULL; 2292cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[0] = 0; 2293cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[1] = 0; 2294cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[2] = 0; 2295cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[3] = 0; 2296cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[4] = 0; 2297cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[5] = 0; 2298cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[6] = 0xc0000000; 229973fb2b7c9074c8878e8ff617ad6d6a21b93b66f2Marek Olšák} 2300573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie 2301cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlievoid r600_pipe_mod_buffer_resource(struct r600_pipe_resource_state *rstate, 2302573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie struct r600_resource *rbuffer, 230347dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák unsigned offset, unsigned stride, 230447dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák enum radeon_bo_usage usage) 2305573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie{ 2306cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[0] = offset; 23076101b6d442b06a347c001fe85848d636ab7df260Marek Olšák rstate->bo[0] = rbuffer; 230847dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák rstate->bo_usage[0] = usage; 23096101b6d442b06a347c001fe85848d636ab7df260Marek Olšák rstate->val[1] = rbuffer->buf->size - offset - 1; 2310cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie rstate->val[2] = S_038008_ENDIAN_SWAP(r600_endian_swap(32)) | 2311cf0f02e501eb2eb8edcf2c4f6db826b0cdd31c9bDave Airlie S_038008_STRIDE(stride); 2312573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie} 2313