1b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse/*
2b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse *
4b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
5b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * copy of this software and associated documentation files (the "Software"),
6b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * to deal in the Software without restriction, including without limitation
7b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
8b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
9b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
10b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse *
11b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * The above copyright notice and this permission notice (including the next
12b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
13b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * Software.
14b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse *
15b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
22b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse */
23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "r600_formats.h"
24330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "evergreend.h"
25b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
26330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "pipe/p_shader_tokens.h"
278fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_pack_color.h"
288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_memory.h"
298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_framebuffer.h"
30d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie#include "util/u_dual_blend.h"
316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#include "evergreen_compute.h"
323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
33c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glissestatic uint32_t eg_num_banks(uint32_t nbanks)
34c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse{
35c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	switch (nbanks) {
36c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 2:
37c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse		return 0;
38c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 4:
39c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse		return 1;
40c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 8:
41c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	default:
42c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse		return 2;
43c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 16:
44c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse		return 3;
45c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
46c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
47c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
48c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
49c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glissestatic unsigned eg_tile_split(unsigned tile_split)
50c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse{
51c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	switch (tile_split) {
52c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 64:	tile_split = 0;	break;
53c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 128:	tile_split = 1;	break;
54c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 256:	tile_split = 2;	break;
55c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 512:	tile_split = 3;	break;
56c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	default:
57c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 1024:	tile_split = 4;	break;
58c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 2048:	tile_split = 5;	break;
59c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 4096:	tile_split = 6;	break;
60c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
61c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	return tile_split;
62c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
63c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
64c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glissestatic unsigned eg_macro_tile_aspect(unsigned macro_tile_aspect)
65c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse{
66c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	switch (macro_tile_aspect) {
67c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	default:
68c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 1:	macro_tile_aspect = 0;	break;
69c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 2:	macro_tile_aspect = 1;	break;
70c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 4:	macro_tile_aspect = 2;	break;
71c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 8:	macro_tile_aspect = 3;	break;
72c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
73c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	return macro_tile_aspect;
74c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
75c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
76c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glissestatic unsigned eg_bank_wh(unsigned bankwh)
77c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse{
78c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	switch (bankwh) {
79c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	default:
80c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 1:	bankwh = 0;	break;
81c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 2:	bankwh = 1;	break;
82c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 4:	bankwh = 2;	break;
83c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	case 8:	bankwh = 3;	break;
84c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
85c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	return bankwh;
86c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse}
87c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_function(int blend_func)
893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (blend_func) {
913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLEND_ADD:
923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_COMB_DST_PLUS_SRC;
933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLEND_SUBTRACT:
943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_COMB_SRC_MINUS_DST;
953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLEND_REVERSE_SUBTRACT:
963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_COMB_DST_MINUS_SRC;
973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLEND_MIN:
983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_COMB_MIN_DST_SRC;
993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLEND_MAX:
1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_COMB_MAX_DST_SRC;
1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
1023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		R600_ERR("Unknown blend function %d\n", blend_func);
1033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		assert(0);
1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		break;
1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return 0;
1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_blend_factor(int blend_fact)
1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (blend_fact) {
1123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_ONE:
1133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE;
1143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_SRC_COLOR:
1153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_SRC_COLOR;
1163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_SRC_ALPHA:
1173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_SRC_ALPHA;
1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_DST_ALPHA:
1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_DST_ALPHA;
1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_DST_COLOR:
1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_DST_COLOR;
1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_SRC_ALPHA_SATURATE;
1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_CONST_COLOR:
1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_CONST_COLOR;
1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_CONST_ALPHA:
1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_CONST_ALPHA;
1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_ZERO:
1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ZERO;
1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
1313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
1333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
1343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
1353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
1363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_DST_COLOR:
1373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_DST_COLOR;
1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_CONST_COLOR;
1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_ONE_MINUS_CONST_ALPHA;
1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_SRC1_COLOR:
1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_SRC1_COLOR;
1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_SRC1_ALPHA:
1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_SRC1_ALPHA;
1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
1473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_INV_SRC1_COLOR;
1483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
1493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028780_BLEND_INV_SRC1_ALPHA;
1503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
1513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
1523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		assert(0);
1533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		break;
1543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
1553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return 0;
1563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
1573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1584b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšákstatic unsigned r600_tex_dim(unsigned dim, unsigned nr_samples)
1593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (dim) {
1613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
1623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_1D:
1633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_030000_SQ_TEX_DIM_1D;
1643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_1D_ARRAY:
1653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_030000_SQ_TEX_DIM_1D_ARRAY;
1663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_2D:
1673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_RECT:
1684b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		return nr_samples > 1 ? V_030000_SQ_TEX_DIM_2D_MSAA :
1694b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák					V_030000_SQ_TEX_DIM_2D;
1703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_2D_ARRAY:
1714b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		return nr_samples > 1 ? V_030000_SQ_TEX_DIM_2D_ARRAY_MSAA :
1724b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák					V_030000_SQ_TEX_DIM_2D_ARRAY;
1733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_3D:
1743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_030000_SQ_TEX_DIM_3D;
1753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_TEXTURE_CUBE:
1763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_030000_SQ_TEX_DIM_CUBEMAP;
1773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
1783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
1793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_dbformat(enum pipe_format format)
1813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
1823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (format) {
1833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z16_UNORM:
1843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028040_Z_16;
1853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z24X8_UNORM:
186866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028040_Z_24;
188754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák	case PIPE_FORMAT_Z32_FLOAT:
189866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
190754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák		return V_028040_Z_32_FLOAT;
1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
1923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return ~0U;
1933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorswap(enum pipe_format format)
1973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (format) {
1993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 8-bit buffers. */
2003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L4A4_UNORM:
2010d0285ba916d9e25871354441c09b0a8c7c9b844Christian König	case PIPE_FORMAT_A4R4_UNORM:
2023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
2033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8_UNORM:
205914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A8_SNORM:
2060110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_A8_UINT:
2070110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_A8_SINT:
208914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_UNORM:
209914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_SNORM:
210914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_UINT:
211914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_SINT:
212914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_FLOAT:
213914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_UINT:
214914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_SINT:
215914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_FLOAT:
2160d0285ba916d9e25871354441c09b0a8c7c9b844Christian König	case PIPE_FORMAT_R4A4_UNORM:
2173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT_REV;
2183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_I8_UNORM:
219914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I8_SNORM:
2200110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_I8_UINT:
2210110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_I8_SINT:
222914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_UNORM:
223914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_SNORM:
224914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_UINT:
225914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_SINT:
226914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_FLOAT:
227914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_UINT:
228914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_SINT:
229914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_FLOAT:
230914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L8_UNORM:
231914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L8_SNORM:
2320110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8_UINT:
2330110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8_SINT:
2343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8_SRGB:
235914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_UNORM:
236914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_SNORM:
237914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_UINT:
238914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_SINT:
239914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_FLOAT:
240914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_UINT:
241914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_SINT:
242914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_FLOAT:
2433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8_UNORM:
2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8_SNORM:
24577058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie	case PIPE_FORMAT_R8_UINT:
24677058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie	case PIPE_FORMAT_R8_SINT:
2473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 16-bit buffers. */
2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G6R5_UNORM:
2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD_REV;
2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G5R5A1_UNORM:
2543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G5R5X1_UNORM:
2553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
2563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B4G4R4A4_UNORM:
2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B4G4R4X4_UNORM:
2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z16_UNORM:
2623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
2633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8A8_UNORM:
265914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L8A8_SNORM:
2660110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8A8_UINT:
2670110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8A8_SINT:
2683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8A8_SRGB:
269914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_UNORM:
270914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_SNORM:
271914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_UINT:
272914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_SINT:
273914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_FLOAT:
274914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_UINT:
275914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_SINT:
276914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_FLOAT:
2773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
2783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8_UNORM:
279914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R8G8_SNORM:
2800110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8_UINT:
2810110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8_SINT:
2823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
2833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16_UNORM:
285914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R16_SNORM:
2860110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16_UINT:
2870110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16_SINT:
2883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16_FLOAT:
2893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
2903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 32-bit buffers. */
2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8B8G8R8_SRGB:
2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD_REV;
2943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8A8_SRGB:
2953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
2963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8A8_UNORM:
2983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8X8_UNORM:
2993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
3003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8R8G8B8_UNORM:
3023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8R8G8B8_UNORM:
3033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT_REV;
3043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8A8_SNORM:
3053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8A8_UNORM:
3060110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8B8A8_SINT:
3070110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8B8A8_UINT:
3083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8X8_UNORM:
3093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8B8G8R8_UNORM:
3123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8B8G8R8_UNORM:
3133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
3143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD_REV;
3153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z24X8_UNORM:
317866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
3183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8Z24_UNORM:
321866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
3223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10G10B10A2_UNORM:
3253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10G10B10X2_SNORM:
3263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
3273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B10G10R10A2_UNORM:
3309608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie	case PIPE_FORMAT_B10G10R10A2_UINT:
3313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_ALT;
3323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R11G11B10_FLOAT:
3343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32_FLOAT:
3350110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32_UINT:
3360110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32_SINT:
337754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák	case PIPE_FORMAT_Z32_FLOAT:
3383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16_FLOAT:
3393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16_UNORM:
340914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R16G16_SNORM:
3410110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16_UINT:
3420110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16_SINT:
3433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 64-bit buffers. */
3463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32_FLOAT:
3470110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32_UINT:
3480110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32_SINT:
3493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_UNORM:
3503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_SNORM:
3510110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16B16A16_UINT:
3520110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16B16A16_SINT:
3533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_FLOAT:
354866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
3553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 128-bit buffers. */
3573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_FLOAT:
3583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_SNORM:
3593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_UNORM:
3600110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32B32A32_SINT:
3610110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32B32A32_UINT:
3623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_SWAP_STD;
3633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
3643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		R600_ERR("unsupported colorswap format %d\n", format);
3653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return ~0U;
3663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
3673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return ~0U;
3683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
3693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_translate_colorformat(enum pipe_format format)
3713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
3723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	switch (format) {
3733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 8-bit buffers. */
3743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8_UNORM:
375914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A8_SNORM:
3760110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_A8_UINT:
3770110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_A8_SINT:
3783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_I8_UNORM:
379914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I8_SNORM:
3800110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_I8_UINT:
3810110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_I8_SINT:
3823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8_UNORM:
383914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L8_SNORM:
3840110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8_UINT:
3850110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8_SINT:
3863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8_SRGB:
3873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8_UNORM:
3883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8_SNORM:
3890110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8_UINT:
3900110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8_SINT:
3913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_8;
3923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 16-bit buffers. */
3943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G6R5_UNORM:
3953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_5_6_5;
3963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
3973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G5R5A1_UNORM:
3983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B5G5R5X1_UNORM:
3993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_1_5_5_5;
4003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B4G4R4A4_UNORM:
4023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B4G4R4X4_UNORM:
4033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_4_4_4_4;
4043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z16_UNORM:
4063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16;
4073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8A8_UNORM:
409914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L8A8_SNORM:
4100110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8A8_UINT:
4110110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_L8A8_SINT:
4123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_L8A8_SRGB:
4133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8_UNORM:
414914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R8G8_SNORM:
4150110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8_UINT:
4160110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8_SINT:
4173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_8_8;
4183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16_UNORM:
420914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R16_SNORM:
4210110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16_UINT:
4220110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16_SINT:
423914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_UNORM:
424914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_SNORM:
425914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_UINT:
426914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_SINT:
427914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_UNORM:
428914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_SNORM:
429914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_UINT:
430914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_SINT:
431914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_UNORM:
432914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_SNORM:
433914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_UINT:
434914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_SINT:
4353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16;
4363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16_FLOAT:
438914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A16_FLOAT:
439914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16_FLOAT:
440914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I16_FLOAT:
4413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16_FLOAT;
4423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 32-bit buffers. */
4443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8B8G8R8_SRGB:
4453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8B8G8R8_UNORM:
4463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_A8R8G8B8_UNORM:
4473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8A8_SRGB:
4483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8A8_UNORM:
4493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B8G8R8X8_UNORM:
4503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8A8_SNORM:
4513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8A8_UNORM:
4523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8X8_UNORM:
4533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
4543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8B8G8R8_UNORM:
4553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8R8G8B8_UNORM:
4563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R8G8B8_UNORM:
4570110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8B8A8_SINT:
4580110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R8G8B8A8_UINT:
4593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_8_8_8_8;
4603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10G10B10A2_UNORM:
4623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10G10B10X2_SNORM:
4633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_B10G10R10A2_UNORM:
4649608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie	case PIPE_FORMAT_B10G10R10A2_UINT:
4653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
4663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_2_10_10_10;
4673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_Z24X8_UNORM:
469866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
4703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_8_24;
4713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_X8Z24_UNORM:
473866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
4743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_24_8;
4753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
476866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
477754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák		return V_028C70_COLOR_X24_8_32_FLOAT;
478754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák
4795250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie	case PIPE_FORMAT_R32_UINT:
4805250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie	case PIPE_FORMAT_R32_SINT:
481914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_UINT:
482914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_SINT:
483914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_UINT:
484914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_SINT:
485914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_UINT:
486914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_SINT:
4875250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie		return V_028C70_COLOR_32;
4885250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie
4893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32_FLOAT:
490914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_A32_FLOAT:
491914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32_FLOAT:
492914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_I32_FLOAT:
493754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák	case PIPE_FORMAT_Z32_FLOAT:
4943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_32_FLOAT;
4953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16_FLOAT:
497914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_FLOAT:
4983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16_16_FLOAT;
4993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16_UNORM:
501914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_R16G16_SNORM:
5020110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16_UINT:
5030110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16_SINT:
504914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_UNORM:
505914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_SNORM:
506914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_UINT:
507914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L16A16_SINT:
5083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16_16;
5093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R11G11B10_FLOAT:
5113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_10_11_11_FLOAT;
5123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 64-bit buffers. */
5140110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16B16A16_UINT:
5150110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R16G16B16A16_SINT:
5163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_UNORM:
5173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_SNORM:
5183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16_16_16_16;
5193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R16G16B16A16_FLOAT:
5213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_16_16_16_16_FLOAT;
5223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32_FLOAT:
524914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_FLOAT:
5253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_32_32_FLOAT;
5263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5270110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32_SINT:
5280110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32_UINT:
529914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_UINT:
530914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák	case PIPE_FORMAT_L32A32_SINT:
5313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_32_32;
5323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* 128-bit buffers. */
5343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_SNORM:
5353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_UNORM:
5360110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32B32A32_SINT:
5370110aa09e5898987ee86586e438ac571075eba3aDave Airlie	case PIPE_FORMAT_R32G32B32A32_UINT:
5383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_32_32_32_32;
5393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_R32G32B32A32_FLOAT:
5403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return V_028C70_COLOR_32_32_32_32_FLOAT;
5413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	/* YUV buffers. */
5433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_UYVY:
5443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	case PIPE_FORMAT_YUYV:
5453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	default:
5463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return ~0U; /* Unsupported. */
5473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
5483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
5493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
5513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
5523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	if (R600_BIG_ENDIAN) {
5533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		switch(colorformat) {
5543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 8-bit buffers. */
5563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_8:
5577e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_NONE;
5583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 16-bit buffers. */
5603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_5_6_5:
5613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_1_5_5_5:
5623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_4_4_4_4:
5633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_16:
5643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_8_8:
5657e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_8IN16;
5663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 32-bit buffers. */
5683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_8_8_8_8:
5693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_2_10_10_10:
5703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_8_24:
5713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_24_8:
5723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_FLOAT:
5733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_16_16_FLOAT:
5743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_16_16:
5757e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_8IN32;
5763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 64-bit buffers. */
5783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_16_16_16_16:
5793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_16_16_16_16_FLOAT:
5807e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_8IN16;
5813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_32_FLOAT:
5833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_32:
584754ea4ea76f1d5ac6150090cffe2542bdf178d87Marek Olšák		case V_028C70_COLOR_X24_8_32_FLOAT:
5857e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_8IN32;
5863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 96-bit buffers. */
5883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_32_32_FLOAT:
5893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		/* 128-bit buffers. */
5903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_32_32_32_FLOAT:
5913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		case V_028C70_COLOR_32_32_32_32:
5927e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet			return ENDIAN_8IN32;
5933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		default:
5943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet			return ENDIAN_NONE; /* Unsupported. */
5953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		}
5963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	} else {
5973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		return ENDIAN_NONE;
5983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	}
5993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
6003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
6013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
6023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
6033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U;
6043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
6053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
6063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_colorbuffer_format_supported(enum pipe_format format)
6073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
6083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return r600_translate_colorformat(format) != ~0U &&
6093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet		r600_translate_colorswap(format) != ~0U;
6103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
6113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
6123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetstatic bool r600_is_zs_format_supported(enum pipe_format format)
6133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet{
6143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet	return r600_translate_dbformat(format) != ~0U;
6153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet}
616b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
61718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeetboolean evergreen_is_format_supported(struct pipe_screen *screen,
61818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet				      enum pipe_format format,
61918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet				      enum pipe_texture_target target,
62018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet				      unsigned sample_count,
62118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet				      unsigned usage)
62218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet{
6231932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák	struct r600_screen *rscreen = (struct r600_screen*)screen;
62418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	unsigned retval = 0;
62518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
62618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if (target >= PIPE_MAX_TEXTURE_TYPES) {
62718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		R600_ERR("r600: unsupported texture type %d\n", target);
62818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		return FALSE;
62918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	}
63018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
63118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if (!util_format_is_supported(format, usage))
63218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		return FALSE;
63318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
6341932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák	if (sample_count > 1) {
6351932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		if (rscreen->info.drm_minor < 19)
6361932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák			return FALSE;
6371932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák
6381932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		switch (sample_count) {
6391932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		case 2:
6401932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		case 4:
6411932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		case 8:
6421932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák			break;
6431932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		default:
6441932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák			return FALSE;
6451932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák		}
6461932bc8aaeb59287a7f769b0cb9a55f49dd6d553Marek Olšák	}
64718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
64818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
64918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	    r600_is_sampler_format_supported(screen, format)) {
65018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= PIPE_BIND_SAMPLER_VIEW;
65118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	}
65218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
65318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if ((usage & (PIPE_BIND_RENDER_TARGET |
65418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		      PIPE_BIND_DISPLAY_TARGET |
65518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		      PIPE_BIND_SCANOUT |
65618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		      PIPE_BIND_SHARED)) &&
65718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	    r600_is_colorbuffer_format_supported(format)) {
65818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= usage &
65918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet			  (PIPE_BIND_RENDER_TARGET |
66018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet			   PIPE_BIND_DISPLAY_TARGET |
66118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet			   PIPE_BIND_SCANOUT |
66218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet			   PIPE_BIND_SHARED);
66318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	}
66418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
66518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
66618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	    r600_is_zs_format_supported(format)) {
66718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= PIPE_BIND_DEPTH_STENCIL;
66818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	}
66918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
67018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
67118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	    r600_is_vertex_format_supported(format)) {
67218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= PIPE_BIND_VERTEX_BUFFER;
67318cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	}
67418cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
67518cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if (usage & PIPE_BIND_TRANSFER_READ)
67618cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= PIPE_BIND_TRANSFER_READ;
67718cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	if (usage & PIPE_BIND_TRANSFER_WRITE)
67818cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet		retval |= PIPE_BIND_TRANSFER_WRITE;
67918cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
68018cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet	return retval == usage;
68118cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet}
68218cdb9c8abfb5d9f009fcb36ab788f48792207e4Henri Verbeet
6830f86915c5322b096b7154b6c84e21288074b775dMarek Olšákstatic void *evergreen_create_blend_state_mode(struct pipe_context *ctx,
6840f86915c5322b096b7154b6c84e21288074b775dMarek Olšák					       const struct pipe_blend_state *state, int mode)
685b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
686e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
687b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend);
688b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate;
68943e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák	uint32_t color_control = 0, target_mask;
690370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX there is more then 8 framebuffer */
691ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse	unsigned blend_cntl[8];
692b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
693b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (blend == NULL) {
694b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return NULL;
695b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
6967779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
697b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate = &blend->rstate;
698b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
699b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_BLEND;
700b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
701b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	target_mask = 0;
702b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->logicop_enable) {
703b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		color_control |= (state->logicop_func << 16) | (state->logicop_func << 20);
704b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	} else {
705b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		color_control |= (0xcc << 16);
706b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
707b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
708b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->independent_blend_enable) {
709b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		for (int i = 0; i < 8; i++) {
710b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			target_mask |= (state->rt[i].colormask << (4 * i));
711b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		}
712b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	} else {
713b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		for (int i = 0; i < 8; i++) {
714b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			target_mask |= (state->rt[0].colormask << (4 * i));
715b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		}
716b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
717b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	blend->cb_target_mask = target_mask;
71843e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák
71943e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák	if (target_mask)
7200f86915c5322b096b7154b6c84e21288074b775dMarek Olšák		color_control |= S_028808_MODE(mode);
72143e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák	else
72243e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák		color_control |= S_028808_MODE(V_028808_CB_DISABLE);
72343e3f19c766863a655bb9f7c04f7820cbda0c8f5Marek Olšák
7245646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate, R_028808_CB_COLOR_CONTROL,
72562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				color_control);
726d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie	/* only have dual source on MRT0 */
727d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie	blend->dual_src_blend = util_blend_state_is_dual(state, 0);
728ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse	for (int i = 0; i < 8; i++) {
7293f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		/* state->rt entries > 0 only written if independent blending */
7303f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		const int j = state->independent_blend_enable ? i : 0;
7313f8455d07b129062885f58237516ae0d1aa339eaJulian Adams
7323f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned eqRGB = state->rt[j].rgb_func;
7333f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned srcRGB = state->rt[j].rgb_src_factor;
7343f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned dstRGB = state->rt[j].rgb_dst_factor;
7353f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned eqA = state->rt[j].alpha_func;
7363f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned srcA = state->rt[j].alpha_src_factor;
7373f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		unsigned dstA = state->rt[j].alpha_dst_factor;
738ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse
739ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		blend_cntl[i] = 0;
7403f8455d07b129062885f58237516ae0d1aa339eaJulian Adams		if (!state->rt[j].blend_enable)
741ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse			continue;
742ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse
743ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		blend_cntl[i] |= S_028780_BLEND_CONTROL_ENABLE(1);
744ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		blend_cntl[i] |= S_028780_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB));
745ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		blend_cntl[i] |= S_028780_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB));
746ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		blend_cntl[i] |= S_028780_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB));
747ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse
748ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
749ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse			blend_cntl[i] |= S_028780_SEPARATE_ALPHA_BLEND(1);
750ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse			blend_cntl[i] |= S_028780_ALPHA_COMB_FCN(r600_translate_blend_function(eqA));
751ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse			blend_cntl[i] |= S_028780_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA));
752ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse			blend_cntl[i] |= S_028780_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA));
753ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse		}
754ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse	}
755ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse	for (int i = 0; i < 8; i++) {
75662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl[i]);
757ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse	}
758ba7e6ccc95a4e39cd15ca03573b2f6d6f8c9f539Jerome Glisse
7596517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák	r600_pipe_state_add_reg(rstate, R_028B70_DB_ALPHA_TO_MASK,
7606517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák				S_028B70_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) |
7616517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák				S_028B70_ALPHA_TO_MASK_OFFSET0(2) |
7626517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák				S_028B70_ALPHA_TO_MASK_OFFSET1(2) |
7636517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák				S_028B70_ALPHA_TO_MASK_OFFSET2(2) |
7646517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák				S_028B70_ALPHA_TO_MASK_OFFSET3(2));
7656517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák
76626cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák	blend->alpha_to_one = state->alpha_to_one;
767b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	return rstate;
768b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
769b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
7700f86915c5322b096b7154b6c84e21288074b775dMarek Olšákstatic void *evergreen_create_blend_state(struct pipe_context *ctx,
7710f86915c5322b096b7154b6c84e21288074b775dMarek Olšák					const struct pipe_blend_state *state)
7720f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{
7730f86915c5322b096b7154b6c84e21288074b775dMarek Olšák
7740f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	return evergreen_create_blend_state_mode(ctx, state, V_028808_CB_NORMAL);
7750f86915c5322b096b7154b6c84e21288074b775dMarek Olšák}
7760f86915c5322b096b7154b6c84e21288074b775dMarek Olšák
777b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void *evergreen_create_dsa_state(struct pipe_context *ctx,
778b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				   const struct pipe_depth_stencil_alpha_state *state)
779b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
780e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
781f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa);
7823d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák	unsigned db_depth_control, alpha_test_control, alpha_ref;
783f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	struct r600_pipe_state *rstate;
784b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
785f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	if (dsa == NULL) {
786b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return NULL;
787b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
788b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
789a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	dsa->valuemask[0] = state->stencil[0].valuemask;
790a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	dsa->valuemask[1] = state->stencil[1].valuemask;
791a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	dsa->writemask[0] = state->stencil[0].writemask;
792a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	dsa->writemask[1] = state->stencil[1].writemask;
793a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
794f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	rstate = &dsa->rstate;
795f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet
796b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_DSA;
797b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
798b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
799b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		S_028800_ZFUNC(state->depth.func);
800b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
801b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* stencil */
802b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->stencil[0].enabled) {
803b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		db_depth_control |= S_028800_STENCIL_ENABLE(1);
804d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák		db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); /* translates straight */
805b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op));
806b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op));
807b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op));
808b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
809b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		if (state->stencil[1].enabled) {
810b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			db_depth_control |= S_028800_BACKFACE_ENABLE(1);
811d214275aceed3afd1174cd2a1b823d4b7357de2aMarek Olšák			db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); /* translates straight */
812b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op));
813b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op));
814b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op));
815b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		}
816b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
817b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
818b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* alpha */
819b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	alpha_test_control = 0;
820b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	alpha_ref = 0;
821b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->alpha.enabled) {
822b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
823b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
824b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		alpha_ref = fui(state->alpha.ref_value);
825b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
8264a26454e979251db25bab68685835fa32c099429Dave Airlie	dsa->sx_alpha_test_control = alpha_test_control & 0xff;
827f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	dsa->alpha_ref = alpha_ref;
828b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
829b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* misc */
83062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control);
831b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	return rstate;
832b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
833b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
834b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void *evergreen_create_rs_state(struct pipe_context *ctx,
835b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					const struct pipe_rasterizer_state *state)
836b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
837e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
838b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer);
839b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate;
840b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	unsigned tmp;
841b534eb16a298ce02e723c53c1d021f35a4a873a2Jerome Glisse	unsigned prov_vtx = 1, polygon_dual_mode;
842f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák	float psize_min, psize_max;
843b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
844b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (rs == NULL) {
845b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return NULL;
846b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
847b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
848a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
849a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák				state->fill_back != PIPE_POLYGON_MODE_FILL);
850a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák
851a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák	if (state->flatshade_first)
852a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák		prov_vtx = 0;
853a652cc40b9641d0b51e0a8533924a50073a50aaeMarek Olšák
854b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate = &rs->rstate;
855b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rs->flatshade = state->flatshade;
856b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rs->sprite_coord_enable = state->sprite_coord_enable;
857725a820b926575265e6790601a0defd9c30947dcVadim Girlin	rs->two_side = state->light_twoside;
85891d47296967ebfaf685f3870998ea0a1450ecf55Vadim Girlin	rs->clip_plane_enable = state->clip_plane_enable;
8592000086fcd5174f121f61dd6df5948c67101e148Marek Olšák	rs->pa_sc_line_stipple = state->line_stipple_enable ?
8602000086fcd5174f121f61dd6df5948c67101e148Marek Olšák				S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
8612000086fcd5174f121f61dd6df5948c67101e148Marek Olšák				S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
862a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák	rs->pa_cl_clip_cntl =
863a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák		S_028810_PS_UCP_MODE(3) |
864a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák		S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
865a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák		S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
866a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák		S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
86726cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák	rs->multisample_enable = state->multisample;
868b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
86958c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse	/* offset */
87058c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse	rs->offset_units = state->offset_units;
87158c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse	rs->offset_scale = state->offset_scale * 12.0f;
87258c243905b0cfcbf1b0299a0f7f0ea90755e36ccJerome Glisse
873b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_RASTERIZER;
8741a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin	tmp = S_0286D4_FLAT_SHADE_ENA(1);
875b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->sprite_coord_enable) {
876b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
877b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			S_0286D4_PNT_SPRITE_OVRD_X(2) |
878b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			S_0286D4_PNT_SPRITE_OVRD_Y(3) |
879b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			S_0286D4_PNT_SPRITE_OVRD_Z(0) |
880b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			S_0286D4_PNT_SPRITE_OVRD_W(1);
881b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
882b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
883b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		}
884b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
88562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp);
886b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
887b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* point size 12.4 fixed point */
888b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp = (unsigned)(state->point_size * 8.0);
88962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp));
890f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák
891e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák	if (state->point_size_per_vertex) {
892e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák		psize_min = util_get_min_point_size(state);
893e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák		psize_max = 8192;
894e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák	} else {
895e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák		/* Force the point size to be as if the vertex output was disabled. */
896e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák		psize_min = state->point_size;
897e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák		psize_max = state->point_size;
898e3032a052321ea1fdfbca090618149ae1ed33911Marek Olšák	}
899f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák	/* Divide by two, because 0.5 = 1 pixel. */
900f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák	r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX,
901f183cc9ce3ad1d043bdf8b38fd519e8f437714fcMarek Olšák				S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
90262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)));
903d6b6a0bc170bd61abbbe9cb6ba777c7192dbd018Keith Whitwell
904d6b6a0bc170bd61abbbe9cb6ba777c7192dbd018Keith Whitwell	tmp = (unsigned)state->line_width * 8;
90562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp));
906391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie	r600_pipe_state_add_reg(rstate, R_028A48_PA_SC_MODE_CNTL_0,
9074b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák				S_028A48_MSAA_ENABLE(state->multisample) |
9082881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák				S_028A48_VPORT_SCISSOR_ENABLE(state->scissor) |
90962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable));
910391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie
911b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet	if (rctx->chip_class == CAYMAN) {
9127779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r600_pipe_state_add_reg(rstate, CM_R_028BE4_PA_SU_VTX_CNTL,
913a940c74bc3bb129b074601cc7967c331e2b97322Marek Olšák					S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules) |
914a940c74bc3bb129b074601cc7967c331e2b97322Marek Olšák					S_028C08_QUANT_MODE(V_028C08_X_1_256TH));
9157779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	} else {
9167779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL,
917c586fce4fb537e904e35cb5197b6b7fe02217acbVadim Girlin					S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules) |
918f94b6d706ff4340277b9c68d2bc51602792c5739Alex Deucher					S_028C08_QUANT_MODE(V_028C08_X_1_256TH));
9197779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
92062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp));
921b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák	r600_pipe_state_add_reg(rstate, R_028814_PA_SU_SC_MODE_CNTL,
922b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_PROVOKING_VTX_LAST(prov_vtx) |
92380e4d18f84748f903cea07b9bba2d519cfa4163aMarek Olšák				S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
92480e4d18f84748f903cea07b9bba2d519cfa4163aMarek Olšák				S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) |
925b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_FACE(!state->front_ccw) |
926b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
927b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
928b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
929b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_POLY_MODE(polygon_dual_mode) |
930b0b81218132b6952de987dca21b9750d8d51b7f0Marek Olšák				S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) |
93162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back)));
93262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, S_028350_MULTIPASS(state->rasterizer_discard));
933b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	return rstate;
934b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
935b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
936b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void *evergreen_create_sampler_state(struct pipe_context *ctx,
937b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					const struct pipe_sampler_state *state)
938b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
9392df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state);
940b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	union util_color uc;
941b9e8ea6a2717422ea71887beda093fe1dfbd1200Jerome Glisse	unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
942b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
9432df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	if (ss == NULL) {
944b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return NULL;
945b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
946b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
9472df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	/* directly into sampler avoid r6xx code to emit useless reg */
9482df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	ss->seamless_cube_map = false;
9499f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie	util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
9502df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	ss->border_color_use = false;
9512df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	/* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */
9522df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	ss->tex_sampler_words[0] = S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) |
9532df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) |
9542df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) |
9552df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) |
9562df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
9572df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
9582df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
9592df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
9602df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0);
9612df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	/* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */
9622df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	ss->tex_sampler_words[1] = S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
9632df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8));
9642df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	/* R_03C008_SQ_TEX_SAMPLER_WORD2_0 */
9652df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	ss->tex_sampler_words[2] = S_03C008_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
9662df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				(state->seamless_cube_map ? 0 : S_03C008_DISABLE_CUBE_WRAP(1)) |
9672df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				S_03C008_TYPE(1);
968b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (uc.ui) {
9692df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		ss->border_color_use = true;
9702df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		/* R_00A400_TD_PS_SAMPLER0_BORDER_RED */
9712df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		ss->border_color[0] = fui(state->border_color.f[0]);
9722df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		/* R_00A404_TD_PS_SAMPLER0_BORDER_GREEN */
9732df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		ss->border_color[1] = fui(state->border_color.f[1]);
9742df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		/* R_00A408_TD_PS_SAMPLER0_BORDER_BLUE */
9752df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		ss->border_color[2] = fui(state->border_color.f[2]);
9762df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		/* R_00A40C_TD_PS_SAMPLER0_BORDER_ALPHA */
9772df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		ss->border_color[3] = fui(state->border_color.f[3]);
9782df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
9792df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	return ss;
980b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
981b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
982b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_context *ctx,
983b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse							struct pipe_resource *texture,
984b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse							const struct pipe_sampler_view *state)
985b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
986c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	struct r600_screen *rscreen = (struct r600_screen*)ctx->screen;
987565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view);
988951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák	struct r600_texture *tmp = (struct r600_texture*)texture;
98908d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher	unsigned format, endian;
990b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	uint32_t word4 = 0, yuv_format = 0, pitch = 0;
99142b5f6819881e4885ff73a17635eb7d2d341563dDave Airlie	unsigned char swizzle[4], array_mode = 0, tile_type = 0;
992c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	unsigned height, depth, width;
993c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	unsigned macro_aspect, tile_split, bankh, bankw, nbanks;
994b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
995565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	if (view == NULL)
996b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return NULL;
997b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
998b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* initialize base object */
999565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	view->base = *state;
1000565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	view->base.texture = NULL;
1001b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	pipe_reference(NULL, &texture->reference);
1002565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	view->base.texture = texture;
1003565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	view->base.reference.count = 1;
1004565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	view->base.context = ctx;
1005b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1006b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	swizzle[0] = state->swizzle_r;
1007b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	swizzle[1] = state->swizzle_g;
1008b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	swizzle[2] = state->swizzle_b;
1009b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	swizzle[3] = state->swizzle_a;
1010565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák
1011929be6eb95c33d5885a89b36dbc82db64c1344feDave Airlie	format = r600_translate_texformat(ctx->screen, state->format,
1012b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					  swizzle,
1013b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					  &word4, &yuv_format);
1014a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák	assert(format != ~0);
1015b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (format == ~0) {
1016a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák		FREE(view);
1017a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák		return NULL;
1018b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
1019565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák
1020d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák	if (tmp->is_depth && !tmp->is_flushing_texture) {
1021611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák		if (!r600_init_flushed_depth_texture(ctx, texture, NULL)) {
1022da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák			FREE(view);
1023da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák			return NULL;
1024da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák		}
1025611dd529425281d73f1f0ad2000362d4a5525a25Marek Olšák		tmp = tmp->flushed_depth_texture;
1026b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
1027231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie
102808d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher	endian = r600_colorformat_endian_swap(format);
102908d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher
1030581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	width = tmp->surface.level[0].npix_x;
1031581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	height = tmp->surface.level[0].npix_y;
1032581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	depth = tmp->surface.level[0].npix_z;
1033581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	pitch = tmp->surface.level[0].nblk_x * util_format_get_blockwidth(state->format);
1034581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_type = tmp->tile_type;
1035581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák
1036581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	switch (tmp->surface.level[0].mode) {
1037581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1038581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_LINEAR_ALIGNED;
1039581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1040581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_2D:
1041581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_2D_TILED_THIN1;
1042581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1043581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_1D:
1044581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_1D_TILED_THIN1;
1045581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1046581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR:
1047581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	default:
1048581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_LINEAR_GENERAL;
1049581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1050c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
1051581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = tmp->surface.tile_split;
1052581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = tmp->surface.mtilea;
1053581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = tmp->surface.bankw;
1054581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = tmp->surface.bankh;
1055581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = eg_tile_split(tile_split);
1056581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = eg_macro_tile_aspect(macro_aspect);
1057581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = eg_bank_wh(bankw);
1058581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = eg_bank_wh(bankh);
1059581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák
10605e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	/* 128 bit formats require tile type = 1 */
10615e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	if (rscreen->chip_class == CAYMAN) {
10625e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher		if (util_format_get_blocksize(state->format) >= 16)
10635e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher			tile_type = 1;
10645e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	}
1065c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	nbanks = eg_num_banks(rscreen->tiling_info.num_banks);
1066b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
106723b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák	if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
106823b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák	        height = 1;
106923b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák		depth = texture->array_size;
107023b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák	} else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
107123b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák		depth = texture->array_size;
107223b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák	}
107323b4ad46268e4b3eb8399cadc448d8747492bd41Marek Olšák
10745d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	view->tex_resource = &tmp->resource;
10754b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	view->tex_resource_words[0] = (S_030000_DIM(r600_tex_dim(texture->target, texture->nr_samples)) |
10765d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				       S_030000_PITCH((pitch / 8) - 1) |
10775d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				       S_030000_TEX_WIDTH(width - 1));
1078acca690c259824636ef1ff684a10bd1caca4751fAlex Deucher	if (rscreen->chip_class == CAYMAN)
10795d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		view->tex_resource_words[0] |= CM_S_030000_NON_DISP_TILING_ORDER(tile_type);
1080acca690c259824636ef1ff684a10bd1caca4751fAlex Deucher	else
10815d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		view->tex_resource_words[0] |= S_030000_NON_DISP_TILING_ORDER(tile_type);
10825d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	view->tex_resource_words[1] = (S_030004_TEX_HEIGHT(height - 1) |
10835d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				       S_030004_TEX_DEPTH(depth - 1) |
10845d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				       S_030004_ARRAY_MODE(array_mode));
1085773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák	view->tex_resource_words[2] = (tmp->surface.level[0].offset + r600_resource_va(ctx->screen, texture)) >> 8;
10864b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	if (state->u.tex.last_level && texture->nr_samples <= 1) {
1087773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák		view->tex_resource_words[3] = (tmp->surface.level[1].offset + r600_resource_va(ctx->screen, texture)) >> 8;
1088c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	} else {
1089773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák		view->tex_resource_words[3] = (tmp->surface.level[0].offset + r600_resource_va(ctx->screen, texture)) >> 8;
1090c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
10915d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	view->tex_resource_words[4] = (word4 |
10925d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				       S_030010_SRF_MODE_ALL(V_030010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) |
10934b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák				       S_030010_ENDIAN_SWAP(endian));
10944b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	view->tex_resource_words[5] = S_030014_BASE_ARRAY(state->u.tex.first_layer) |
10954b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák				      S_030014_LAST_ARRAY(state->u.tex.last_layer);
10964b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	if (texture->nr_samples > 1) {
109764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		unsigned log_samples = util_logbase2(texture->nr_samples);
109864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		if (rscreen->chip_class == CAYMAN) {
109964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			view->tex_resource_words[4] |= S_030010_LOG2_NUM_FRAGMENTS(log_samples);
110064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		}
11014b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		/* LAST_LEVEL holds log2(nr_samples) for multisample textures */
110264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		view->tex_resource_words[5] |= S_030014_LAST_LEVEL(log_samples);
11034b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	} else {
11044b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		view->tex_resource_words[4] |= S_030010_BASE_LEVEL(state->u.tex.first_level);
11054b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		view->tex_resource_words[5] |= S_030014_LAST_LEVEL(state->u.tex.last_level);
11064b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	}
1107c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	/* aniso max 16 samples */
11085d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	view->tex_resource_words[6] = (S_030018_MAX_ANISO(4)) |
11095d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      (S_030018_TILE_SPLIT(tile_split));
11105d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	view->tex_resource_words[7] = S_03001C_DATA_FORMAT(format) |
11115d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      S_03001C_TYPE(V_03001C_SQ_TEX_VTX_VALID_TEXTURE) |
11125d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      S_03001C_BANK_WIDTH(bankw) |
11135d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      S_03001C_BANK_HEIGHT(bankh) |
11145d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      S_03001C_MACRO_TILE_ASPECT(macro_aspect) |
11155d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				      S_03001C_NUM_BANKS(nbanks);
1116565f39bdb2943bdb94ac3bdf67793c942ff45016Marek Olšák	return &view->base;
1117b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1118b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1119ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšákstatic void evergreen_set_vs_sampler_views(struct pipe_context *ctx, unsigned count,
1120ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák					   struct pipe_sampler_view **views)
1121b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1122d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	r600_set_sampler_views(ctx, PIPE_SHADER_VERTEX, 0, count, views);
1123b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1124b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1125ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšákstatic void evergreen_set_ps_sampler_views(struct pipe_context *ctx, unsigned count,
1126ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák					   struct pipe_sampler_view **views)
1127b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1128d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	r600_set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, count, views);
1129b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1130b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1131b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void evergreen_set_clip_state(struct pipe_context *ctx,
1132b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				const struct pipe_clip_state *state)
1133b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1134e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1135b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1136507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	struct pipe_constant_buffer cb;
1137b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1138b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (rstate == NULL)
1139b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return;
1140b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1141b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->clip = *state;
1142b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_CLIP;
1143dc4c821f0817a3db716f965692fb701079f66340Marek Olšák	for (int i = 0; i < 6; i++) {
11445646964b1360883b6254e2ebacc198f43869d36fJerome Glisse		r600_pipe_state_add_reg(rstate,
1145c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor					R_0285BC_PA_CL_UCP0_X + i * 16,
114662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					fui(state->ucp[i][0]));
11475646964b1360883b6254e2ebacc198f43869d36fJerome Glisse		r600_pipe_state_add_reg(rstate,
1148c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor					R_0285C0_PA_CL_UCP0_Y + i * 16,
114962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					fui(state->ucp[i][1]) );
11505646964b1360883b6254e2ebacc198f43869d36fJerome Glisse		r600_pipe_state_add_reg(rstate,
1151c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor					R_0285C4_PA_CL_UCP0_Z + i * 16,
115262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					fui(state->ucp[i][2]));
11535646964b1360883b6254e2ebacc198f43869d36fJerome Glisse		r600_pipe_state_add_reg(rstate,
1154c63a86e1e5665fb5cd94de42d6c59171398e12eeOwen W. Taylor					R_0285C8_PA_CL_UCP0_W + i * 16,
115562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					fui(state->ucp[i][3]));
1156b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
1157b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1158b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	free(rctx->states[R600_PIPE_STATE_CLIP]);
1159b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->states[R600_PIPE_STATE_CLIP] = rstate;
1160e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
116154e8dcaad65cbe3603730414fd8d76ac53f89a86Vadim Girlin
11620b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák	cb.buffer = NULL;
11630b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák	cb.user_buffer = state->ucp;
1164507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	cb.buffer_offset = 0;
1165507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	cb.buffer_size = 4*4*8;
1166507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	r600_set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 1, &cb);
1167507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	pipe_resource_reference(&cb.buffer, NULL);
1168b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1169b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1170b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void evergreen_set_polygon_stipple(struct pipe_context *ctx,
1171b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					 const struct pipe_poly_stipple *state)
1172b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1173b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1174b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
11752881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšákstatic void evergreen_get_scissor_rect(struct r600_context *rctx,
11762881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák				       unsigned tl_x, unsigned tl_y, unsigned br_x, unsigned br_y,
11772881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák				       uint32_t *tl, uint32_t *br)
11782881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák{
11792881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	/* EG hw workaround */
11802881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	if (br_x == 0)
11812881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák		tl_x = 1;
11822881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	if (br_y == 0)
11832881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák		tl_y = 1;
11842881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák
11852881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	/* cayman hw workaround */
11862881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	if (rctx->chip_class == CAYMAN) {
11872881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák		if (br_x == 1 && br_y == 1)
11882881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák			br_x = 2;
11892881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	}
11902881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák
11912881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	*tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y);
11922881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	*br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
11932881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák}
11942881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák
1195b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void evergreen_set_scissor_state(struct pipe_context *ctx,
1196b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					const struct pipe_scissor_state *state)
1197b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1198e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1199b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
120078293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák	uint32_t tl, br;
1201b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1202b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (rstate == NULL)
1203b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return;
1204b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
12052881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	evergreen_get_scissor_rect(rctx, state->minx, state->miny, state->maxx, state->maxy, &tl, &br);
12062881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák
1207b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_SCISSOR;
120862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl);
120962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br);
1210b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1211b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	free(rctx->states[R600_PIPE_STATE_SCISSOR]);
1212b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->states[R600_PIPE_STATE_SCISSOR] = rstate;
1213e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
1214b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1215b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1216b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void evergreen_set_viewport_state(struct pipe_context *ctx,
1217b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					const struct pipe_viewport_state *state)
1218b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1219e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1220b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1221b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1222b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (rstate == NULL)
1223b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return;
1224b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1225b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->viewport = *state;
1226b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_VIEWPORT;
122762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]));
122862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]));
122962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]));
123062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]));
123162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]));
123262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]));
1233b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1234b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	free(rctx->states[R600_PIPE_STATE_VIEWPORT]);
1235b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->states[R600_PIPE_STATE_VIEWPORT] = rstate;
1236e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
1237b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1238b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1239cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšákvoid evergreen_init_color_surface(struct r600_context *rctx,
1240cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák				  struct r600_surface *surf)
1241b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1242c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	struct r600_screen *rscreen = rctx->screen;
1243951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák	struct r600_texture *rtex = (struct r600_texture*)surf->base.texture;
1244cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	struct pipe_resource *pipe_tex = surf->base.texture;
1245cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	unsigned level = surf->base.u.tex.level;
1246b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	unsigned pitch, slice;
1247960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard	unsigned color_info, color_attrib, color_dim = 0;
124808d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher	unsigned format, swap, ntype, endian;
1249a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	uint64_t offset, base_offset;
1250a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	unsigned tile_type, macro_aspect, tile_split, bankh, bankw, fmask_bankh, nbanks;
1251b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	const struct util_format_description *desc;
12520d851f6e9c6046052ddce3860e625537832530a0Dave Airlie	int i;
1253cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	bool blend_clamp = 0, blend_bypass = 0;
12548c643446f982892aeec4298977fbbe1ab92206fbDave Airlie
1255d334d591a71c41d6a1eb4f2ea6cdabedc425e42fMarek Olšák	if (rtex->is_depth && !rtex->is_flushing_texture) {
1256cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_init_flushed_depth_texture(&rctx->context, pipe_tex, NULL);
12578c643446f982892aeec4298977fbbe1ab92206fbDave Airlie		rtex = rtex->flushed_depth_texture;
1258da98bb6fc105e1a2f688a1713ca9e50f0ac8fbedMarek Olšák		assert(rtex);
12598c643446f982892aeec4298977fbbe1ab92206fbDave Airlie	}
12608c643446f982892aeec4298977fbbe1ab92206fbDave Airlie
1261581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	offset = rtex->surface.level[level].offset;
1262581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1263581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		offset += rtex->surface.level[level].slice_size *
1264cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			  surf->base.u.tex.first_layer;
1265581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	}
1266581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	pitch = (rtex->surface.level[level].nblk_x) / 8 - 1;
1267581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1268581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	if (slice) {
1269581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		slice = slice - 1;
1270c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
1271581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	color_info = 0;
1272581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	switch (rtex->surface.level[level].mode) {
1273581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1274581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED);
1275581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		tile_type = 1;
1276581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1277581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_1D:
1278581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_1D_TILED_THIN1);
1279581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		tile_type = rtex->tile_type;
1280581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1281581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_2D:
1282581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_2D_TILED_THIN1);
1283581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		tile_type = rtex->tile_type;
1284581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1285581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR:
1286581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	default:
1287581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		color_info = S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_GENERAL);
1288581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		tile_type = 1;
1289581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1290581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	}
1291581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = rtex->surface.tile_split;
1292581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = rtex->surface.mtilea;
1293581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = rtex->surface.bankw;
1294581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = rtex->surface.bankh;
1295a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	fmask_bankh = rtex->fmask_bank_height;
1296581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = eg_tile_split(tile_split);
1297581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = eg_macro_tile_aspect(macro_aspect);
1298581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = eg_bank_wh(bankw);
1299581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = eg_bank_wh(bankh);
1300a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	fmask_bankh = eg_bank_wh(fmask_bankh);
1301581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák
13025e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	/* 128 bit formats require tile type = 1 */
13035e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	if (rscreen->chip_class == CAYMAN) {
13045e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher		if (util_format_get_blocksize(surf->base.format) >= 16)
13055e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher			tile_type = 1;
13065e1495b2d9311fa2b320766a1d299053904bd9c3Alex Deucher	}
1307c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	nbanks = eg_num_banks(rscreen->tiling_info.num_banks);
1308780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie	desc = util_format_description(surf->base.format);
130966866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie	for (i = 0; i < 4; i++) {
131066866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie		if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
131166866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie			break;
131266866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie		}
131366866d642fe8f8fba141d50a81b08793c3bd63e8Dave Airlie	}
131495fd5e5aba2e21ab20cb971506a81c0049b5a694Dave Airlie
1315c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	color_attrib = S_028C74_TILE_SPLIT(tile_split)|
1316c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse			S_028C74_NUM_BANKS(nbanks) |
1317c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse			S_028C74_BANK_WIDTH(bankw) |
1318c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse			S_028C74_BANK_HEIGHT(bankh) |
1319c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse			S_028C74_MACRO_TILE_ASPECT(macro_aspect) |
1320a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			S_028C74_NON_DISP_TILING_ORDER(tile_type) |
1321a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		        S_028C74_FMASK_BANK_HEIGHT(fmask_bankh);
1322c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse
132364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	if (rctx->chip_class == CAYMAN && rtex->resource.b.b.nr_samples > 1) {
132464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		unsigned log_samples = util_logbase2(rtex->resource.b.b.nr_samples);
132564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		color_attrib |= S_028C74_NUM_SAMPLES(log_samples) |
132664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák				S_028C74_NUM_FRAGMENTS(log_samples);
132764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	}
132864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
132995fd5e5aba2e21ab20cb971506a81c0049b5a694Dave Airlie	ntype = V_028C70_NUMBER_UNORM;
1330b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
1331b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		ntype = V_028C70_NUMBER_SRGB;
1332de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
1333de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		if (desc->channel[i].normalized)
1334de3218664a03ee116ca58db571f90a6914299a81Dave Airlie			ntype = V_028C70_NUMBER_SNORM;
13350110aa09e5898987ee86586e438ac571075eba3aDave Airlie		else if (desc->channel[i].pure_integer)
1336de3218664a03ee116ca58db571f90a6914299a81Dave Airlie			ntype = V_028C70_NUMBER_SINT;
1337de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	} else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1338de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		if (desc->channel[i].normalized)
1339de3218664a03ee116ca58db571f90a6914299a81Dave Airlie			ntype = V_028C70_NUMBER_UNORM;
13400110aa09e5898987ee86586e438ac571075eba3aDave Airlie		else if (desc->channel[i].pure_integer)
1341de3218664a03ee116ca58db571f90a6914299a81Dave Airlie			ntype = V_028C70_NUMBER_UINT;
134295fd5e5aba2e21ab20cb971506a81c0049b5a694Dave Airlie	}
1343b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1344780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie	format = r600_translate_colorformat(surf->base.format);
1345a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák	assert(format != ~0);
1346a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák
1347780c183b8fdf2d301e1eea7f0b83cd96fb6cbf84Dave Airlie	swap = r600_translate_colorswap(surf->base.format);
1348a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák	assert(swap != ~0);
1349a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák
1350a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
135108d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher		endian = ENDIAN_NONE;
135208d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher	} else {
135308d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher		endian = r600_colorformat_endian_swap(format);
135408d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher	}
1355231bf886dae9c7df0ae3e16acee904024a08824fDave Airlie
1356de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	/* blend clamp should be set for all NORM/SRGB types */
1357de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	if (ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM ||
1358de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	    ntype == V_028C70_NUMBER_SRGB)
1359de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		blend_clamp = 1;
1360de3218664a03ee116ca58db571f90a6914299a81Dave Airlie
1361de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	/* set blend bypass according to docs if SINT/UINT or
1362de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	   8/24 COLOR variants */
1363de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT ||
1364de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	    format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 ||
1365de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	    format == V_028C70_COLOR_X24_8_32_FLOAT) {
1366de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		blend_clamp = 0;
1367de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		blend_bypass = 1;
1368de3218664a03ee116ca58db571f90a6914299a81Dave Airlie	}
1369de3218664a03ee116ca58db571f90a6914299a81Dave Airlie
1370cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->alphatest_bypass = ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT;
13714a26454e979251db25bab68685835fa32c099429Dave Airlie
1372c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	color_info |= S_028C70_FORMAT(format) |
1373b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		S_028C70_COMP_SWAP(swap) |
1374de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		S_028C70_BLEND_CLAMP(blend_clamp) |
1375de3218664a03ee116ca58db571f90a6914299a81Dave Airlie		S_028C70_BLEND_BYPASS(blend_bypass) |
137608d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher		S_028C70_NUMBER_TYPE(ntype) |
137708d1c91e6c185a186e49189b7ed48629f35a4659Alex Deucher		S_028C70_ENDIAN(endian);
13780d851f6e9c6046052ddce3860e625537832530a0Dave Airlie
1379960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard	if (rtex->is_rat) {
1380960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard		color_info |= S_028C70_RAT(1);
1381960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard		color_dim = S_028C78_WIDTH_MAX(pipe_tex->width0)
1382960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard				| S_028C78_HEIGHT_MAX(pipe_tex->height0);
1383960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard	}
1384960906d16b3a9027d8871f9af9bcc50aae42b8bcTom Stellard
13855939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	/* EXPORT_NORM is an optimzation that can be enabled for better
13865939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	 * performance in certain cases.
13875939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	 * EXPORT_NORM can be enabled if:
13885939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	 * - 11-bit or smaller UNORM/SNORM/SRGB
13895939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	 * - 16-bit or smaller FLOAT
13905939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	 */
13910d851f6e9c6046052ddce3860e625537832530a0Dave Airlie	if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
13925939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	    ((desc->channel[i].size < 12 &&
13935939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	      desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
13945939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	      ntype != V_028C70_NUMBER_UINT && ntype != V_028C70_NUMBER_SINT) ||
13955939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	     (desc->channel[i].size < 17 &&
13965939bc03bc15b9b1131463ffad04a7b2d987074dAlex Deucher	      desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) {
139731d27259b6d682f69866ace89ffaac5294e8bf62Alex Deucher		color_info |= S_028C70_SOURCE_FORMAT(V_028C70_EXPORT_4C_16BPC);
1398cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		surf->export_16bpc = true;
139931a25dac98ea20ba853128f98987c6358d8e0598Dave Airlie	}
140042b5f6819881e4885ff73a17635eb7d2d341563dDave Airlie
1401a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	if (rtex->fmask_size && rtex->cmask_size) {
1402a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		color_info |= S_028C70_COMPRESSION(1) | S_028C70_FAST_CLEAR(1);
1403a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	}
1404a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
1405a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	base_offset = r600_resource_va(rctx->context.screen, pipe_tex);
1406bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse
1407370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák	/* XXX handle enabling of CB beyond BASE8 which has different offset */
1408a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	surf->cb_color_base = (base_offset + offset) >> 8;
1409cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->cb_color_dim = color_dim;
1410cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->cb_color_info = color_info;
1411cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->cb_color_pitch = S_028C64_PITCH_TILE_MAX(pitch);
1412cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->cb_color_slice = S_028C68_SLICE_TILE_MAX(slice);
1413581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1414cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		surf->cb_color_view = 0;
1415c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	} else {
1416cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		surf->cb_color_view = S_028C6C_SLICE_START(surf->base.u.tex.first_layer) |
1417cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák				      S_028C6C_SLICE_MAX(surf->base.u.tex.last_layer);
1418c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
1419cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->cb_color_attrib = color_attrib;
1420a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	if (rtex->fmask_size && rtex->cmask_size) {
1421a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		surf->cb_color_fmask = (base_offset + rtex->fmask_offset) >> 8;
1422a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		surf->cb_color_cmask = (base_offset + rtex->cmask_offset) >> 8;
1423a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	} else {
1424a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		surf->cb_color_fmask = surf->cb_color_base;
1425a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		surf->cb_color_cmask = surf->cb_color_base;
1426a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	}
1427a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	surf->cb_color_fmask_slice = S_028C88_TILE_MAX(slice);
1428a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	surf->cb_color_cmask_slice = S_028C80_TILE_MAX(rtex->cmask_slice_tile_max);
1429cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
1430cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	surf->color_initialized = true;
1431b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1432b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1433cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšákstatic void evergreen_init_depth_surface(struct r600_context *rctx,
1434cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					 struct r600_surface *surf)
1435b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1436c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	struct r600_screen *rscreen = rctx->screen;
1437cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	struct pipe_screen *screen = &rscreen->screen;
1438951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák	struct r600_texture *rtex = (struct r600_texture*)surf->base.texture;
1439bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse	uint64_t offset;
1440581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	unsigned level, pitch, slice, format, array_mode;
1441cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	unsigned macro_aspect, tile_split, bankh, bankw, nbanks;
1442b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1443faa16dc456f1f910eef24eaa23889be806b513b7Marek Olšák	level = surf->base.u.tex.level;
14446657a7af61ae7c328fecc6ee00246d7c6c93c936Marek Olšák	format = r600_translate_dbformat(surf->base.format);
1445a460df9299dfeb7915689befc15155e18e41ddb8Marek Olšák	assert(format != ~0);
1446b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1447cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	offset = r600_resource_va(screen, surf->base.texture);
1448581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	offset += rtex->surface.level[level].offset;
1449581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	pitch = (rtex->surface.level[level].nblk_x / 8) - 1;
1450581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1451581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	if (slice) {
1452581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		slice = slice - 1;
1453581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	}
1454581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	switch (rtex->surface.level[level].mode) {
1455581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_2D:
1456581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_2D_TILED_THIN1;
1457581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1458581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_1D:
1459581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1460581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	case RADEON_SURF_MODE_LINEAR:
1461581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	default:
1462581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		array_mode = V_028C70_ARRAY_1D_TILED_THIN1;
1463581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		break;
1464c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	}
1465581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = rtex->surface.tile_split;
1466581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = rtex->surface.mtilea;
1467581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = rtex->surface.bankw;
1468581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = rtex->surface.bankh;
1469581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	tile_split = eg_tile_split(tile_split);
1470581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	macro_aspect = eg_macro_tile_aspect(macro_aspect);
1471581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankw = eg_bank_wh(bankw);
1472581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	bankh = eg_bank_wh(bankh);
1473c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse	nbanks = eg_num_banks(rscreen->tiling_info.num_banks);
1474bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse	offset >>= 8;
1475bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse
1476cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->db_depth_info = S_028040_ARRAY_MODE(array_mode) |
1477cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_FORMAT(format) |
1478cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_TILE_SPLIT(tile_split)|
1479cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_NUM_BANKS(nbanks) |
1480cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_BANK_WIDTH(bankw) |
1481cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_BANK_HEIGHT(bankh) |
1482cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028040_MACRO_TILE_ASPECT(macro_aspect);
148364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	if (rscreen->chip_class == CAYMAN && rtex->resource.b.b.nr_samples > 1) {
148464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		surf->db_depth_info |= S_028040_NUM_SAMPLES(util_logbase2(rtex->resource.b.b.nr_samples));
148564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	}
1486cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->db_depth_base = offset;
1487cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->db_depth_view = S_028008_SLICE_START(surf->base.u.tex.first_layer) |
1488cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			      S_028008_SLICE_MAX(surf->base.u.tex.last_layer);
1489cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->db_depth_size = S_028058_PITCH_TILE_MAX(pitch);
1490cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->db_depth_slice = S_02805C_SLICE_TILE_MAX(slice);
14919528fc2107d4cae39bc932c1943ffc57ebc92499Dave Airlie
1492581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
1493581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		uint64_t stencil_offset = rtex->surface.stencil_offset;
14947851d398def2df3f6836a500d67123eed50f3943Marek Olšák		unsigned i, stile_split = rtex->surface.stencil_tile_split;
14959528fc2107d4cae39bc932c1943ffc57ebc92499Dave Airlie
1496581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		stile_split = eg_tile_split(stile_split);
1497cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		stencil_offset += r600_resource_va(screen, surf->base.texture);
1498581f7e3101980a4e1068bb75c2eca60bb2071229Marek Olšák		stencil_offset += rtex->surface.level[level].offset / 4;
1499bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse		stencil_offset >>= 8;
1500bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse
15017851d398def2df3f6836a500d67123eed50f3943Marek Olšák		/* We're guessing the stencil offset from the depth offset.
15027851d398def2df3f6836a500d67123eed50f3943Marek Olšák		 * Make sure each mipmap level has a unique offset. */
15037851d398def2df3f6836a500d67123eed50f3943Marek Olšák		for (i = 1; i <= level; i++) {
15047851d398def2df3f6836a500d67123eed50f3943Marek Olšák			/* If two levels have the same address, add 256
15057851d398def2df3f6836a500d67123eed50f3943Marek Olšák			 * to the offset of the smaller level. */
15067851d398def2df3f6836a500d67123eed50f3943Marek Olšák			if ((rtex->surface.level[i-1].offset / 4) >> 8 ==
15077851d398def2df3f6836a500d67123eed50f3943Marek Olšák			    (rtex->surface.level[i].offset / 4) >> 8) {
15087851d398def2df3f6836a500d67123eed50f3943Marek Olšák				stencil_offset++;
15097851d398def2df3f6836a500d67123eed50f3943Marek Olšák			}
15107851d398def2df3f6836a500d67123eed50f3943Marek Olšák		}
15117851d398def2df3f6836a500d67123eed50f3943Marek Olšák
1512cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		surf->db_stencil_base = stencil_offset;
1513cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		surf->db_stencil_info = 1 | S_028044_TILE_SPLIT(stile_split);
151468c54abb2cfd12a031829e78d721b2480d0c8cc4Marek Olšák	} else {
1515cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		surf->db_stencil_base = offset;
1516cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		surf->db_stencil_info = 1;
15179528fc2107d4cae39bc932c1943ffc57ebc92499Dave Airlie	}
15189528fc2107d4cae39bc932c1943ffc57ebc92499Dave Airlie
1519cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	surf->depth_initialized = true;
1520b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1521b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
15224b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák#define FILL_SREG(s0x, s0y, s1x, s1y, s2x, s2y, s3x, s3y)  \
15234b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	(((s0x) & 0xf) | (((s0y) & 0xf) << 4) |		   \
15244b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	(((s1x) & 0xf) << 8) | (((s1y) & 0xf) << 12) |	   \
15254b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	(((s2x) & 0xf) << 16) | (((s2y) & 0xf) << 20) |	   \
15264b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	 (((s3x) & 0xf) << 24) | (((s3y) & 0xf) << 28))
15274b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
15284b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšákstatic uint32_t evergreen_set_ms_pos(struct pipe_context *ctx, struct r600_pipe_state *rstate, int nsample)
15294b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák{
15304b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* 2xMSAA
15314b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	 * There are two locations (-4, 4), (4, -4). */
15324b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static uint32_t sample_locs_2x[] = {
15334b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
15344b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
15354b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
15364b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
15374b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	};
15384b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static unsigned max_dist_2x = 4;
15394b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* 4xMSAA
15404b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	 * There are 4 locations: (-2, -2), (2, 2), (-6, 6), (6, -6). */
15414b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static uint32_t sample_locs_4x[] = {
15424b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
15434b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
15444b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
15454b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
15464b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	};
15474b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static unsigned max_dist_4x = 6;
15484b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* 8xMSAA */
154964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static uint32_t sample_locs_8x[] = {
15503ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
15513ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
15523ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
15533ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
15543ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
15553ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
15563ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
15573ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
15584b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	};
155964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static unsigned max_dist_8x = 8;
156064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
156164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	unsigned i;
156264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
156364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	switch (nsample) {
156464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	case 2:
156564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		for (i = 0; i < Elements(sample_locs_2x); i++) {
156664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_0 + i*4,
156764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						sample_locs_2x[i]);
156864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		}
156964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		return max_dist_2x;
157064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	case 4:
157164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		for (i = 0; i < Elements(sample_locs_4x); i++) {
157264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_0 + i*4,
157364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						sample_locs_4x[i]);
157464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		}
157564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		return max_dist_4x;
157664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	case 8:
157764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		for (i = 0; i < Elements(sample_locs_8x); i++) {
157864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_0 + i*4,
157964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						sample_locs_8x[i]);
158064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		}
158164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		return max_dist_8x;
158264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	default:
158364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		R600_ERR("Invalid nr_samples %i\n", nsample);
158464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		return 0;
158564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	}
158664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák}
158764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
158864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšákstatic uint32_t cayman_set_ms_pos(struct pipe_context *ctx, struct r600_pipe_state *rstate, int nsample)
158964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák{
159064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	/* 2xMSAA
159164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	 * There are two locations (-4, 4), (4, -4). */
159264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static uint32_t sample_locs_2x[] = {
159364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
159464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
159564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
159664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
159764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	};
159864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static unsigned max_dist_2x = 4;
159964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	/* 4xMSAA
160064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	 * There are 4 locations: (-2, -2), (2, 2), (-6, 6), (6, -6). */
160164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static uint32_t sample_locs_4x[] = {
160264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
160364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
160464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
160564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
160664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	};
160764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static unsigned max_dist_4x = 6;
160864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	/* 8xMSAA */
160964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static uint32_t sample_locs_8x[] = {
16103ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
16113ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
16123ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
16133ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
16143ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
16153ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
16163ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
16173ac54ac2c85d3ed035a9f1cbcc7de7010c609cfbMarek Olšák		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
16184b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	};
16194b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static unsigned max_dist_8x = 8;
16204b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* 16xMSAA */
162164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	static uint32_t sample_locs_16x[] = {
16224b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
16234b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
16244b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
16254b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-7, -3, 7, 3, 1, -5, -5, 5),
16264b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
16274b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
16284b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
16294b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-3, -7, 3, 7, 5, -1, -1, 1),
16304b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
16314b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
16324b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
16334b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-8, -6, 4, 2, 2, -8, -2, 6),
16344b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
16354b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
16364b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
16374b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		FILL_SREG(-4, -2, 0, 4, 6, -4, -6, 0),
16384b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	};
16394b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	static unsigned max_dist_16x = 8;
16404b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
164164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	uint32_t max_dist, num_regs, *sample_locs;
16424b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
16434b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	switch (nsample) {
16444b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	case 2:
16454b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		sample_locs = sample_locs_2x;
16464b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		num_regs = Elements(sample_locs_2x);
16474b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		max_dist = max_dist_2x;
16484b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		break;
16494b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	case 4:
16504b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		sample_locs = sample_locs_4x;
16514b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		num_regs = Elements(sample_locs_4x);
16524b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		max_dist = max_dist_4x;
16534b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		break;
16544b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	case 8:
165564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		sample_locs = sample_locs_8x;
165664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		num_regs = Elements(sample_locs_8x);
16574b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		max_dist = max_dist_8x;
16584b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		break;
16594b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	case 16:
166064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		sample_locs = sample_locs_16x;
166164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		num_regs = Elements(sample_locs_16x);
166264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		max_dist = max_dist_16x;
166364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		break;
16644b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	default:
16654b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		R600_ERR("Invalid nr_samples %i\n", nsample);
16664b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		return 0;
16674b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	}
16684b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
166964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	r600_pipe_state_add_reg(rstate, CM_R_028BF8_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0, sample_locs[0]);
167064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	r600_pipe_state_add_reg(rstate, CM_R_028C08_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0, sample_locs[1]);
167164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	r600_pipe_state_add_reg(rstate, CM_R_028C18_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0, sample_locs[2]);
167264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	r600_pipe_state_add_reg(rstate, CM_R_028C28_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0, sample_locs[3]);
167364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	if (num_regs <= 8) {
167464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028BFC_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1, sample_locs[4]);
167564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C0C_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1, sample_locs[5]);
167664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C1C_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1, sample_locs[6]);
167764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C2C_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1, sample_locs[7]);
167864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	}
167964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	if (num_regs <= 16) {
168064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C00_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2, sample_locs[8]);
168164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C10_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2, sample_locs[9]);
168264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C20_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2, sample_locs[10]);
168364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C30_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2, sample_locs[11]);
168464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C04_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3, sample_locs[12]);
168564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C14_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3, sample_locs[13]);
168664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C24_PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3, sample_locs[14]);
168764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_pipe_state_add_reg(rstate, CM_R_028C34_PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3, sample_locs[15]);
16884b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	}
16894b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	return max_dist;
16904b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák}
16914b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
1692b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissestatic void evergreen_set_framebuffer_state(struct pipe_context *ctx,
1693cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					    const struct pipe_framebuffer_state *state)
1694b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
1695e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1696b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1697cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	struct r600_surface *surf;
1698cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák	struct r600_resource *res;
1699a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	struct r600_texture *rtex;
170064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	uint32_t tl, br, i, nr_samples, log_samples;
1701b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1702b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (rstate == NULL)
1703b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		return;
1704b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
17050813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	r600_flush_framebuffer(rctx, false);
17066067a2a67f9a7aab2aee051469bea8af03747a95Fredrik Höglund
1707b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* unreference old buffer and reference new one */
1708b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->id = R600_PIPE_STATE_FRAMEBUFFER;
1709c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie
1710c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie	util_copy_framebuffer_state(&rctx->framebuffer, state);
1711c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie
17124b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* Colorbuffers. */
1713470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	rctx->export_16bpc = true;
1714feec48114b261f43c8dc94c06cfccea3b6ef1689Alex Deucher	rctx->nr_cbufs = state->nr_cbufs;
171526cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák	rctx->cb0_is_integer = state->nr_cbufs &&
171626cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák			       util_format_is_pure_integer(state->cbufs[0]->format);
1717a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	rctx->compressed_cb_mask = 0;
1718cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
1719470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	for (i = 0; i < state->nr_cbufs; i++) {
1720cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		surf = (struct r600_surface*)state->cbufs[i];
1721cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		res = (struct r600_resource*)surf->base.texture;
1722a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		rtex = (struct r600_texture*)res;
1723cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
172478222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, state->cbufs[i]->texture);
172578222e63630280b96488de0d51d1b2578e26f814Jerome Glisse
1726cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		if (!surf->color_initialized) {
1727cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			evergreen_init_color_surface(rctx, surf);
1728cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		}
1729cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
1730cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		if (!surf->export_16bpc) {
1731cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			rctx->export_16bpc = false;
1732cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		}
1733cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
1734cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028C60_CB_COLOR0_BASE + i * 0x3C,
1735cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					   surf->cb_color_base, res, RADEON_USAGE_READWRITE);
1736cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C78_CB_COLOR0_DIM + i * 0x3C,
1737cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					surf->cb_color_dim);
1738cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028C70_CB_COLOR0_INFO + i * 0x3C,
1739cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					   surf->cb_color_info, res, RADEON_USAGE_READWRITE);
1740cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C64_CB_COLOR0_PITCH + i * 0x3C,
1741cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					surf->cb_color_pitch);
1742cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C68_CB_COLOR0_SLICE + i * 0x3C,
1743cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					surf->cb_color_slice);
1744cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C6C_CB_COLOR0_VIEW + i * 0x3C,
1745cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					surf->cb_color_view);
1746cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028C74_CB_COLOR0_ATTRIB + i * 0x3C,
1747cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					   surf->cb_color_attrib, res, RADEON_USAGE_READWRITE);
1748a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028C7C_CB_COLOR0_CMASK + i * 0x3c,
1749a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák					   surf->cb_color_cmask, res, RADEON_USAGE_READWRITE);
1750a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C80_CB_COLOR0_CMASK_SLICE + i * 0x3c,
1751a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák					surf->cb_color_cmask_slice);
1752a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		r600_pipe_state_add_reg_bo(rstate,  R_028C84_CB_COLOR0_FMASK + i * 0x3c,
1753a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák					   surf->cb_color_fmask, res, RADEON_USAGE_READWRITE);
1754a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		r600_pipe_state_add_reg(rstate, R_028C88_CB_COLOR0_FMASK_SLICE + i * 0x3c,
1755a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák					surf->cb_color_fmask_slice);
1756a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
175764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		/* Cayman can fetch from a compressed MSAA colorbuffer,
175864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		 * so it's pointless to track them. */
175964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		if (rctx->chip_class != CAYMAN && rtex->fmask_size && rtex->cmask_size) {
1760a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			rctx->compressed_cb_mask |= 1 << i;
1761a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		}
1762b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
1763cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	/* set CB_COLOR1_INFO for possible dual-src blending */
1764951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák	if (i == 1 && !((struct r600_texture*)res)->is_rat) {
1765cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028C70_CB_COLOR0_INFO + 1 * 0x3C,
1766cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák					   surf->cb_color_info, res, RADEON_USAGE_READWRITE);
17679d699cd845f3544fa6e149fa4ffb1d131d32b482Marek Olšák		i++;
1768cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	}
1769470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	for (; i < 8 ; i++) {
1770470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		r600_pipe_state_add_reg(rstate, R_028C70_CB_COLOR0_INFO + i * 0x3C, 0);
1771470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	}
1772470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
1773cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	/* Update alpha-test state dependencies.
1774cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	 * Alpha-test is done on the first colorbuffer only. */
1775cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	if (state->nr_cbufs) {
1776cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		surf = (struct r600_surface*)state->cbufs[0];
1777cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		if (rctx->alphatest_state.bypass != surf->alphatest_bypass) {
1778cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			rctx->alphatest_state.bypass = surf->alphatest_bypass;
1779cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1780cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		}
1781cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		if (rctx->alphatest_state.cb0_export_16bpc != surf->export_16bpc) {
1782cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			rctx->alphatest_state.cb0_export_16bpc = surf->export_16bpc;
1783cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák			r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1784cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		}
1785cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	}
1786cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
17874b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* ZS buffer. */
1788b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (state->zsbuf) {
1789cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		surf = (struct r600_surface*)state->zsbuf;
1790cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		res = (struct r600_resource*)surf->base.texture;
1791cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák
179278222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, state->zsbuf->texture);
179378222e63630280b96488de0d51d1b2578e26f814Jerome Glisse
1794cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		if (!surf->depth_initialized) {
1795cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák			evergreen_init_depth_surface(rctx, surf);
1796cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		}
1797cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák
1798cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028048_DB_Z_READ_BASE, surf->db_depth_base,
1799cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1800cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028050_DB_Z_WRITE_BASE, surf->db_depth_base,
1801cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1802cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg(rstate, R_028008_DB_DEPTH_VIEW, surf->db_depth_view);
1803cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák
1804cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_02804C_DB_STENCIL_READ_BASE, surf->db_stencil_base,
1805cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1806cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028054_DB_STENCIL_WRITE_BASE, surf->db_stencil_base,
1807cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1808cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028044_DB_STENCIL_INFO, surf->db_stencil_info,
1809cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1810cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák
1811cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg_bo(rstate, R_028040_DB_Z_INFO, surf->db_depth_info,
1812cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák					   res, RADEON_USAGE_READWRITE);
1813cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE, surf->db_depth_size);
1814cdc681c3ad746fe8adab4ea71358bcc54e024ff9Marek Olšák		r600_pipe_state_add_reg(rstate, R_02805C_DB_DEPTH_SLICE, surf->db_depth_slice);
1815b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
1816b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
18174b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* Framebuffer dimensions. */
18182881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	evergreen_get_scissor_rect(rctx, 0, 0, state->width, state->height, &tl, &br);
1819b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
18205646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
182162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				R_028204_PA_SC_WINDOW_SCISSOR_TL, tl);
18223322416de44f27974edaba2aee8b2d2d21de6a8fDave Airlie	r600_pipe_state_add_reg(rstate,
182362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				R_028208_PA_SC_WINDOW_SCISSOR_BR, br);
18247779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
18254b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	/* Multisampling */
18264b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	if (state->nr_cbufs)
18274b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		nr_samples = state->cbufs[0]->texture->nr_samples;
18284b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	else if (state->zsbuf)
18294b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		nr_samples = state->zsbuf->texture->nr_samples;
18304b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	else
18314b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		nr_samples = 0;
18324b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
18334b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	if (nr_samples > 1) {
183464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		unsigned line_cntl = S_028C00_LAST_PIXEL(1) |
183564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák				     S_028C00_EXPAND_LINE_WIDTH(1);
183664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		log_samples = util_logbase2(nr_samples);
18374b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
18384b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		if (rctx->chip_class == CAYMAN) {
183964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			unsigned max_dist = cayman_set_ms_pos(ctx, rstate, nr_samples);
184064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
18414b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028BDC_PA_SC_LINE_CNTL, line_cntl);
184264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028BE0_PA_SC_AA_CONFIG,
184364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028BE0_MSAA_NUM_SAMPLES(log_samples) |
184464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028BE0_MAX_SAMPLE_DIST(max_dist) |
184564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028BE0_MSAA_EXPOSED_SAMPLES(log_samples));
184664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028804_DB_EQAA,
184764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_MAX_ANCHOR_SAMPLES(log_samples) |
184864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_PS_ITER_SAMPLES(log_samples) |
184964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_MASK_EXPORT_NUM_SAMPLES(log_samples) |
185064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_ALPHA_TO_MASK_NUM_SAMPLES(log_samples) |
185164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_HIGH_QUALITY_INTERSECTIONS(1) |
185264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_STATIC_ANCHOR_ASSOCIATIONS(1));
18534b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		} else {
185464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			unsigned max_dist = evergreen_set_ms_pos(ctx, rstate, nr_samples);
185564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
18564b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, line_cntl);
185764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG,
185864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028C04_MSAA_NUM_SAMPLES(log_samples) |
185964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028C04_MAX_SAMPLE_DIST(max_dist));
18604b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		}
18614b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	} else {
186264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		log_samples = 0;
186364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
18644b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		if (rctx->chip_class == CAYMAN) {
18654b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028BDC_PA_SC_LINE_CNTL, S_028C00_LAST_PIXEL(1));
18664b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028BE0_PA_SC_AA_CONFIG, 0);
186764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			r600_pipe_state_add_reg(rstate, CM_R_028804_DB_EQAA,
186864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_HIGH_QUALITY_INTERSECTIONS(1) |
186964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák						S_028804_STATIC_ANCHOR_ASSOCIATIONS(1));
187064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
18714b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		} else {
18724b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, S_028C00_LAST_PIXEL(1));
18734b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák			r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG, 0);
18744b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák		}
18754b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	}
18764b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák
1877b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	free(rctx->states[R600_PIPE_STATE_FRAMEBUFFER]);
1878b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->states[R600_PIPE_STATE_FRAMEBUFFER] = rstate;
1879e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
18800b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
18810b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	if (state->zsbuf) {
18820b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		evergreen_polygon_offset_update(rctx);
18830b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	}
18840ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák
18850ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) {
18860ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák		rctx->cb_misc_state.nr_cbufs = state->nr_cbufs;
18870ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák		r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
18880ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	}
1889cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák
1890cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) {
1891cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		rctx->alphatest_state.bypass = false;
1892cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák		r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1893cb922b63eba1d75706354614bc5de4d39dbe9ad3Marek Olšák	}
189464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák
189564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	if (rctx->chip_class == CAYMAN && rctx->db_misc_state.log_samples != log_samples) {
189664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		rctx->db_misc_state.log_samples = log_samples;
189764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
189864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák	}
18990ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák}
19000ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák
19010ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšákstatic void evergreen_emit_cb_misc_state(struct r600_context *rctx, struct r600_atom *atom)
19020ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák{
19030ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
19040ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	struct r600_cb_misc_state *a = (struct r600_cb_misc_state*)atom;
19050ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	unsigned fb_colormask = (1ULL << ((unsigned)a->nr_cbufs * 4)) - 1;
19064fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	unsigned ps_colormask = (1ULL << ((unsigned)a->nr_ps_color_outputs * 4)) - 1;
19070ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák
19084fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2);
19094fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	r600_write_value(cs, a->blend_colormask & fb_colormask); /* R_028238_CB_TARGET_MASK */
19101b699a483233d29699865e317f1009a58ebd5416Marek Olšák	/* Always enable the first colorbuffer in CB_SHADER_MASK. This
19111b699a483233d29699865e317f1009a58ebd5416Marek Olšák	 * will assure that the alpha-test will work even if there is
19121b699a483233d29699865e317f1009a58ebd5416Marek Olšák	 * no colorbuffer bound. */
19131b699a483233d29699865e317f1009a58ebd5416Marek Olšák	r600_write_value(cs, 0xf | (a->dual_src_blend ? ps_colormask : 0) | fb_colormask); /* R_02823C_CB_SHADER_MASK */
1914b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
1915b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
1916e2809849ecac69615ece294a55ee355afaac33d3Marek Olšákstatic void evergreen_emit_db_misc_state(struct r600_context *rctx, struct r600_atom *atom)
1917e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák{
1918e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
1919e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	struct r600_db_misc_state *a = (struct r600_db_misc_state*)atom;
1920e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	unsigned db_render_control = 0;
1921e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	unsigned db_count_control = 0;
1922e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	unsigned db_render_override =
1923e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
1924e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
1925e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
1926e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák
1927e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	if (a->occlusion_query_enabled) {
1928e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		db_count_control |= S_028004_PERFECT_ZPASS_COUNTS(1);
192964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		if (rctx->chip_class == CAYMAN) {
193064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			db_count_control |= S_028004_SAMPLE_RATE(a->log_samples);
193164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák		}
1932e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		db_render_override |= S_02800C_NOOP_CULL_DISABLE(1);
1933e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	}
1934e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák
1935e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	if (a->flush_depthstencil_through_cb) {
1936e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák		assert(a->copy_depth || a->copy_stencil);
1937e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák
1938e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák		db_render_control |= S_028000_DEPTH_COPY_ENABLE(a->copy_depth) |
1939e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák				     S_028000_STENCIL_COPY_ENABLE(a->copy_stencil) |
194094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák				     S_028000_COPY_CENTROID(1) |
194194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák				     S_028000_COPY_SAMPLE(a->copy_sample);
1942e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	}
1943e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák
1944e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	r600_write_context_reg_seq(cs, R_028000_DB_RENDER_CONTROL, 2);
1945e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	r600_write_value(cs, db_render_control); /* R_028000_DB_RENDER_CONTROL */
1946e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	r600_write_value(cs, db_count_control); /* R_028004_DB_COUNT_CONTROL */
1947e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák	r600_write_context_reg(cs, R_02800C_DB_RENDER_OVERRIDE, db_render_override);
1948e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák}
1949e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák
1950c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellardstatic void evergreen_emit_vertex_buffers(struct r600_context *rctx,
1951c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard					  struct r600_vertexbuf_state *state,
1952c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard					  unsigned resource_offset,
1953c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard					  unsigned pkt_flags)
1954c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák{
1955c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
1956c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	uint32_t dirty_mask = state->dirty_mask;
1957c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
1958c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	while (dirty_mask) {
1959c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		struct pipe_vertex_buffer *vb;
1960c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		struct r600_resource *rbuffer;
1961c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		uint64_t va;
1962585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		unsigned buffer_index = u_bit_scan(&dirty_mask);
1963c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
1964585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		vb = &state->vb[buffer_index];
1965c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		rbuffer = (struct r600_resource*)vb->buffer;
1966585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		assert(rbuffer);
1967c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
1968a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák		va = r600_resource_va(&rctx->screen->screen, &rbuffer->b.b);
1969c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		va += vb->buffer_offset;
1970c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
1971c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		/* fetch resources start at index 992 */
19729b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags);
1973c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		r600_write_value(cs, (resource_offset + buffer_index) * 8);
1974c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, va); /* RESOURCEi_WORD0 */
1975c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard		r600_write_value(cs, rbuffer->buf->size - vb->buffer_offset - 1); /* RESOURCEi_WORD1 */
1976c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, /* RESOURCEi_WORD2 */
1977c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_030008_ENDIAN_SWAP(r600_endian_swap(32)) |
1978c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard				 S_030008_STRIDE(vb->stride) |
1979c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_030008_BASE_ADDRESS_HI(va >> 32UL));
1980c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, /* RESOURCEi_WORD3 */
1981c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
1982c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
1983c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
1984c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák				 S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W));
1985c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD4 */
1986c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD5 */
1987c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD6 */
1988c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD7 */
1989c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
19909b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0) | pkt_flags);
1991c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
1992c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák	}
1993c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	state->dirty_mask = 0;
1994c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák}
1995c76462b45f1e3a0aa2ee7971191e30e8a5f52015Marek Olšák
19969b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellardstatic void evergreen_fs_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom * atom)
19979b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard{
1998585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	evergreen_emit_vertex_buffers(rctx, &rctx->vertex_buffer_state, 992, 0);
19999b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard}
20009b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
20019b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellardstatic void evergreen_cs_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom * atom)
20029b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard{
2003585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	evergreen_emit_vertex_buffers(rctx, &rctx->cs_vertex_buffer_state, 816,
2004585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				      RADEON_CP_PACKET3_COMPUTE_MODE);
20059b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard}
20069b76ee70b2ceebb52cc5edc574df9593cbac03b3Tom Stellard
20070b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void evergreen_emit_constant_buffers(struct r600_context *rctx,
20080b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					    struct r600_constbuf_state *state,
20090b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					    unsigned buffer_id_base,
20100b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					    unsigned reg_alu_constbuf_size,
20110b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					    unsigned reg_alu_const_cache)
201268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{
201368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
201468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	uint32_t dirty_mask = state->dirty_mask;
201568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
201668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	while (dirty_mask) {
2017507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák		struct pipe_constant_buffer *cb;
201868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		struct r600_resource *rbuffer;
201968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		uint64_t va;
202068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		unsigned buffer_index = ffs(dirty_mask) - 1;
202168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
202268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		cb = &state->cb[buffer_index];
202368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		rbuffer = (struct r600_resource*)cb->buffer;
202468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		assert(rbuffer);
202568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
2026a52b3338c6e51421e3836ae210cd98d9c1ec337bMarek Olšák		va = r600_resource_va(&rctx->screen->screen, &rbuffer->b.b);
202768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		va += cb->buffer_offset;
202868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
202968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_context_reg(cs, reg_alu_constbuf_size + buffer_index * 4,
203068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				       ALIGN_DIVUP(cb->buffer_size >> 4, 16));
203168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_context_reg(cs, reg_alu_const_cache + buffer_index * 4, va >> 8);
203268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
203368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
203468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
203568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
203668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 8, 0));
203768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, (buffer_id_base + buffer_index) * 8);
203868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, va); /* RESOURCEi_WORD0 */
203968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, rbuffer->buf->size - cb->buffer_offset - 1); /* RESOURCEi_WORD1 */
204068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, /* RESOURCEi_WORD2 */
204168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_030008_ENDIAN_SWAP(r600_endian_swap(32)) |
204268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_030008_STRIDE(16) |
204368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_030008_BASE_ADDRESS_HI(va >> 32UL));
204468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, /* RESOURCEi_WORD3 */
204568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
204668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
204768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
204868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				 S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W));
204968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD4 */
205068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD5 */
205168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, 0); /* RESOURCEi_WORD6 */
205268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD7 */
205368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
205468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
205568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
205668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
205768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		dirty_mask &= ~(1 << buffer_index);
205868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	}
205968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	state->dirty_mask = 0;
206068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák}
206168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
20620b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void evergreen_emit_vs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
206368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{
20640b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák	evergreen_emit_constant_buffers(rctx, &rctx->vs_constbuf_state, 176,
20650b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					R_028180_ALU_CONST_BUFFER_SIZE_VS_0,
20660b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák					R_028980_ALU_CONST_CACHE_VS_0);
206768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák}
206868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
20690b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšákstatic void evergreen_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
207068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{
20710b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák	evergreen_emit_constant_buffers(rctx, &rctx->ps_constbuf_state, 0,
207268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				       R_028140_ALU_CONST_BUFFER_SIZE_PS_0,
207368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák				       R_028940_ALU_CONST_CACHE_PS_0);
207468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák}
207568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
20765d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void evergreen_emit_sampler_views(struct r600_context *rctx,
20775d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák					 struct r600_samplerview_state *state,
20785d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák					 unsigned resource_id_base)
20795d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{
20805d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
20815d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	uint32_t dirty_mask = state->dirty_mask;
20825d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
20835d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	while (dirty_mask) {
20845d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		struct r600_pipe_sampler_view *rview;
20855d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		unsigned resource_index = u_bit_scan(&dirty_mask);
20865d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		unsigned reloc;
20875d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
20885d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		rview = state->views[resource_index];
20895d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		assert(rview);
20905d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
20915d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 8, 0));
20925d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, (resource_id_base + resource_index) * 8);
20935d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_array(cs, 8, rview->tex_resource_words);
20945d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
20955d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		/* XXX The kernel needs two relocations. This is stupid. */
20965d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		reloc = r600_context_bo_reloc(rctx, rview->tex_resource,
20975d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák					      RADEON_USAGE_READ);
20985d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
20995d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, reloc);
21005d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
21015d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_write_value(cs, reloc);
21025d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	}
21035d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	state->dirty_mask = 0;
21045d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák}
21055d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
21065d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void evergreen_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
21075d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{
21085d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	evergreen_emit_sampler_views(rctx, &rctx->vs_samplers.views, 176 + R600_MAX_CONST_BUFFERS);
21095d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák}
21105d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
21115d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákstatic void evergreen_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
21125d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{
21135d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	evergreen_emit_sampler_views(rctx, &rctx->ps_samplers.views, R600_MAX_CONST_BUFFERS);
21145d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák}
21155d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
21162df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissestatic void evergreen_emit_sampler(struct r600_context *rctx,
21172df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				struct r600_textures_info *texinfo,
21182df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				unsigned resource_id_base,
21192df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				unsigned border_index_reg)
21202df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
21212df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	struct radeon_winsys_cs *cs = rctx->cs;
21222df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	unsigned i;
21232df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
21242df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	for (i = 0; i < texinfo->n_samplers; i++) {
21252df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
21262df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		if (texinfo->samplers[i] == NULL) {
21272df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			continue;
21282df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		}
21292df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_write_value(cs, PKT3(PKT3_SET_SAMPLER, 3, 0));
21302df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_write_value(cs, (resource_id_base + i) * 3);
21312df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_write_array(cs, 3, texinfo->samplers[i]->tex_sampler_words);
21322df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
21332df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		if (texinfo->samplers[i]->border_color_use) {
21342df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			r600_write_config_reg_seq(cs, border_index_reg, 5);
21352df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			r600_write_value(cs, i);
21362df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			r600_write_array(cs, 4, texinfo->samplers[i]->border_color);
21372df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		}
21382df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
21392df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
21402df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
21412df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissestatic void evergreen_emit_vs_sampler(struct r600_context *rctx, struct r600_atom *atom)
21422df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
21432df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	evergreen_emit_sampler(rctx, &rctx->vs_samplers, 18, R_00A414_TD_VS_SAMPLER0_BORDER_INDEX);
21442df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
21452df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
21462df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissestatic void evergreen_emit_ps_sampler(struct r600_context *rctx, struct r600_atom *atom)
21472df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
21482df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	evergreen_emit_sampler(rctx, &rctx->ps_samplers, 0, R_00A400_TD_PS_SAMPLER0_BORDER_INDEX);
21492df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
21502df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
2151a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšákstatic void evergreen_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a)
2152a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák{
2153a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	struct r600_sample_mask *s = (struct r600_sample_mask*)a;
2154a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	uint8_t mask = s->sample_mask;
2155a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
2156a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_write_context_reg(rctx->cs, R_028C3C_PA_SC_AA_MASK,
2157a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák			       mask | (mask << 8) | (mask << 16) | (mask << 24));
2158a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák}
2159a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
2160a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšákstatic void cayman_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a)
2161a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák{
2162a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	struct r600_sample_mask *s = (struct r600_sample_mask*)a;
2163a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
2164a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	uint16_t mask = s->sample_mask;
2165a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
2166a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_write_context_reg_seq(cs, CM_R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, 2);
2167a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_write_value(cs, mask | (mask << 16)); /* X0Y0_X1Y0 */
2168a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_write_value(cs, mask | (mask << 16)); /* X0Y1_X1Y1 */
2169a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák}
2170a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
2171e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid evergreen_init_state_functions(struct r600_context *rctx)
2172b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
21730ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	r600_init_atom(&rctx->cb_misc_state.atom, evergreen_emit_cb_misc_state, 0, 0);
21740ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
2175e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	r600_init_atom(&rctx->db_misc_state.atom, evergreen_emit_db_misc_state, 7, 0);
2176e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
2177c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	r600_init_atom(&rctx->vertex_buffer_state.atom, evergreen_fs_emit_vertex_buffers, 0, 0);
2178c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	r600_init_atom(&rctx->cs_vertex_buffer_state.atom, evergreen_cs_emit_vertex_buffers, 0, 0);
21790b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák	r600_init_atom(&rctx->vs_constbuf_state.atom, evergreen_emit_vs_constant_buffers, 0, 0);
21800b4c5dbb8c5ee69a341c1f66f70c54e3fe2db970Marek Olšák	r600_init_atom(&rctx->ps_constbuf_state.atom, evergreen_emit_ps_constant_buffers, 0, 0);
21815d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	r600_init_atom(&rctx->vs_samplers.views.atom, evergreen_emit_vs_sampler_views, 0, 0);
21825d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	r600_init_atom(&rctx->ps_samplers.views.atom, evergreen_emit_ps_sampler_views, 0, 0);
2183d3b013049126fb44d65a0a67001b04acbe778613Tom Stellard	r600_init_atom(&rctx->cs_shader_state.atom, evergreen_emit_cs_shader, 0, 0);
21842df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	r600_init_atom(&rctx->vs_samplers.atom_sampler, evergreen_emit_vs_sampler, 0, 0);
21852df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	r600_init_atom(&rctx->ps_samplers.atom_sampler, evergreen_emit_ps_sampler, 0, 0);
2186e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák
2187a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	if (rctx->chip_class == EVERGREEN)
2188a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák		r600_init_atom(&rctx->sample_mask.atom, evergreen_emit_sample_mask, 3, 0);
2189a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	else
2190a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák		r600_init_atom(&rctx->sample_mask.atom, cayman_emit_sample_mask, 4, 0);
2191a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	rctx->sample_mask.sample_mask = ~0;
2192a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_atom_dirty(rctx, &rctx->sample_mask.atom);
2193a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
2194b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.create_blend_state = evergreen_create_blend_state;
2195b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.create_depth_stencil_alpha_state = evergreen_create_dsa_state;
21964acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	rctx->context.create_fs_state = r600_create_shader_state_ps;
2197b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.create_rasterizer_state = evergreen_create_rs_state;
2198b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.create_sampler_state = evergreen_create_sampler_state;
2199b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.create_sampler_view = evergreen_create_sampler_view;
2200f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	rctx->context.create_vertex_elements_state = r600_create_vertex_elements;
22014acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	rctx->context.create_vs_state = r600_create_shader_state_vs;
22029612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.bind_blend_state = r600_bind_blend_state;
2203f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state;
22042df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	rctx->context.bind_fragment_sampler_states = r600_bind_ps_samplers;
2205a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->context.bind_fs_state = r600_bind_ps_shader;
22069612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.bind_rasterizer_state = r600_bind_rs_state;
2207a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements;
22082df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	rctx->context.bind_vertex_sampler_states = r600_bind_vs_samplers;
2209a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->context.bind_vs_state = r600_bind_vs_shader;
22109612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.delete_blend_state = r600_delete_state;
22119612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.delete_depth_stencil_alpha_state = r600_delete_state;
2212a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->context.delete_fs_state = r600_delete_ps_shader;
22139612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.delete_rasterizer_state = r600_delete_rs_state;
22142df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	rctx->context.delete_sampler_state = r600_delete_sampler;
22159612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.delete_vertex_elements_state = r600_delete_vertex_element;
2216a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->context.delete_vs_state = r600_delete_vs_shader;
2217014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	rctx->context.set_blend_color = r600_set_blend_color;
2218b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.set_clip_state = evergreen_set_clip_state;
221915730a8207374936e354d945730070cb29c9547cMarek Olšák	rctx->context.set_constant_buffer = r600_set_constant_buffer;
2220ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	rctx->context.set_fragment_sampler_views = evergreen_set_ps_sampler_views;
2221b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.set_framebuffer_state = evergreen_set_framebuffer_state;
2222b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.set_polygon_stipple = evergreen_set_polygon_stipple;
2223a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	rctx->context.set_sample_mask = r600_set_sample_mask;
2224b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.set_scissor_state = evergreen_set_scissor_state;
2225a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	rctx->context.set_stencil_ref = r600_set_pipe_stencil_ref;
2226f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	rctx->context.set_vertex_buffers = r600_set_vertex_buffers;
2227f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	rctx->context.set_index_buffer = r600_set_index_buffer;
2228ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	rctx->context.set_vertex_sampler_views = evergreen_set_vs_sampler_views;
2229b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rctx->context.set_viewport_state = evergreen_set_viewport_state;
22309612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
22310813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	rctx->context.texture_barrier = r600_texture_barrier;
2232543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	rctx->context.create_stream_output_target = r600_create_so_target;
2233543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	rctx->context.stream_output_target_destroy = r600_so_target_destroy;
2234543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	rctx->context.set_stream_output_targets = r600_set_so_targets;
22356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak	evergreen_init_compute_state_functions(rctx);
2236b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
2237b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2238f126253040654d52db134063a69ebaf0c417d410Marek Olšákstatic void cayman_init_atom_start_cs(struct r600_context *rctx)
22397779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie{
2240e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	struct r600_command_buffer *cb = &rctx->start_cs_cmd;
22417779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2242f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_init_command_buffer(cb, 256, EMIT_EARLY);
2243f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2244f126253040654d52db134063a69ebaf0c417d410Marek Olšák	/* This must be first. */
2245f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
2246f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0x80000000);
2247f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0x80000000);
22487779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
2249f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg_seq(cb, R_008C00_SQ_CONFIG, 2);
2250f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, S_008C00_EXPORT_SRC_C(1)); /* R_008C00_SQ_CONFIG */
2251fe3a3434412482ff1b0a113e1008fd7dd7b42359Alex Deucher	/* always set the temp clauses */
2252f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, S_008C04_NUM_CLAUSE_TEMP_GPRS(4)); /* R_008C04_SQ_GPR_RESOURCE_MGMT_1 */
2253f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2254f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg_seq(cb, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 2);
2255f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1 */
2256f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2 */
2257f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2258f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8));
2259f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2260f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg(cb, R_028A4C_PA_SC_MODE_CNTL_1, 0);
2261f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2262f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13);
2263f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */
2264f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */
2265f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */
2266f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */
2267f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */
2268f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */
2269f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */
2270f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */
2271f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */
2272f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */
2273f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */
2274f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */
2275f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE */
2276f126253040654d52db134063a69ebaf0c417d410Marek Olšák
227780e4d18f84748f903cea07b9bba2d519cfa4163aMarek Olšák	r600_store_context_reg_seq(cb, R_028B94_VGT_STRMOUT_CONFIG, 2);
227880e4d18f84748f903cea07b9bba2d519cfa4163aMarek Olšák	r600_store_value(cb, 0); /* R_028B94_VGT_STRMOUT_CONFIG */
227980e4d18f84748f903cea07b9bba2d519cfa4163aMarek Olšák	r600_store_value(cb, 0); /* R_028B98_VGT_STRMOUT_BUFFER_CONFIG */
2280f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2281f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_028AB4_VGT_REUSE_OFF, 2);
2282f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028AB4_VGT_REUSE_OFF */
2283f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */
2284f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2285f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg(cb, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1);
2286f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2287f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg(cb, CM_R_028AA8_IA_MULTI_VGT_PARAM, S_028AA8_SWITCH_ON_EOP(1) | S_028AA8_PARTIAL_VS_WAVE_ON(1) | S_028AA8_PRIMGROUP_SIZE(63));
2288f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2289f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, CM_R_028BD4_PA_SC_CENTROID_PRIORITY_0, 2);
2290f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0x76543210); /* CM_R_028BD4_PA_SC_CENTROID_PRIORITY_0 */
2291f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0xfedcba98); /* CM_R_028BD8_PA_SC_CENTROID_PRIORITY_1 */
2292f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2293f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, CM_R_0288E8_SQ_LDS_ALLOC, 2);
2294f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* CM_R_0288E8_SQ_LDS_ALLOC */
2295f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_0288EC_SQ_LDS_ALLOC_PS */
2296f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2297182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_context_reg_seq(cb, R_028380_SQ_VTX_SEMANTIC_0, 34);
2298f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028380_SQ_VTX_SEMANTIC_0 */
2299f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2300f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2301f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2302f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2303f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2304f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2305f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2306f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2307f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2308f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2309f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2310f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2311f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2312f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2313f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2314f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2315f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2316f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2317f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2318f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2319f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2320f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2321f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2322f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2323f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2324f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2325f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2326f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2327f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2328f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2329f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_0283FC_SQ_VTX_SEMANTIC_31 */
2330182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_value(cb, ~0); /* R_028400_VGT_MAX_VTX_INDX */
2331182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_value(cb, 0); /* R_028404_VGT_MIN_VTX_INDX */
2332182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák
2333182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_ctl_const(cb, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0);
23345d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23355d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, R_028028_DB_STENCIL_CLEAR, 2);
23365d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028028_DB_STENCIL_CLEAR */
23375d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_02802C_DB_DEPTH_CLEAR */
23385d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23395d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_0286DC_SPI_FOG_CNTL, 0);
23405d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23415d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 3);
23425d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC0_DB_SRESULTS_COMPARE_STATE0 */
23435d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC4_DB_SRESULTS_COMPARE_STATE1 */
23445d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC8_DB_PRELOAD_CONTROL */
23455d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23465d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028200_PA_SC_WINDOW_OFFSET, 0);
23472881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	r600_store_context_reg(cb, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF);
23485d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23495d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, R_0282D0_PA_SC_VPORT_ZMIN_0, 2);
23505d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_0282D0_PA_SC_VPORT_ZMIN_0 */
23515d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_0282D4_PA_SC_VPORT_ZMAX_0 */
23525d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23535d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
23545d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028818_PA_CL_VTE_CNTL, 0x0000043F);
23555d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0);
23565d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23575d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, CM_R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 4);
23585d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* CM_R_028BE8_PA_CL_GB_VERT_CLIP_ADJ */
23595d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* CM_R_028BEC_PA_CL_GB_VERT_DISC_ADJ */
23605d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* CM_R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ */
23615d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* CM_R_028BF4_PA_CL_GB_HORZ_DISC_ADJ */
23625d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
2363cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_context_reg_seq(cb, R_028240_PA_SC_GENERIC_SCISSOR_TL, 2);
2364cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, 0); /* R_028240_PA_SC_GENERIC_SCISSOR_TL */
2365cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, S_028244_BR_X(16384) | S_028244_BR_Y(16384)); /* R_028244_PA_SC_GENERIC_SCISSOR_BR */
2366cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák
2367cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2);
2368cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */
2369cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, S_028034_BR_X(16384) | S_028034_BR_Y(16384)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */
2370cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák
2371a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	r600_store_context_reg(cb, R_028848_SQ_PGM_RESOURCES_2_PS, S_028848_SINGLE_ROUND(V_SQ_ROUND_NEAREST_EVEN));
2372a1a0974401c467cb86ef818f22df67c21774a38cVadim Girlin	r600_store_context_reg(cb, R_028864_SQ_PGM_RESOURCES_2_VS, S_028864_SINGLE_ROUND(V_SQ_ROUND_NEAREST_EVEN));
23735d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_0288A8_SQ_PGM_RESOURCES_FS, 0);
23745d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
23756187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák	r600_store_context_reg(cb, R_028354_SX_SURFACE_SYNC, S_028354_SURFACE_SYNC_MASK(0xf));
237696ef4ddc3ddda4d1f637af86f4790d24f8f386c6Marek Olšák	r600_store_context_reg(cb, R_028800_DB_DEPTH_CONTROL, 0);
2377b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse	if (rctx->screen->has_streamout) {
2378b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse		r600_store_context_reg(cb, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0);
2379b7b5a77ec0fa715f09cef32083f818e745772f91Jerome Glisse	}
23806187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák
23815d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0, 0x01000FFF);
23825d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF);
23837779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie}
23847779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie
238559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibaldvoid evergreen_init_common_regs(struct r600_command_buffer *cb,
238659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	enum chip_class ctx_chip_class,
238759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	enum radeon_family ctx_family,
238859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	int ctx_drm_minor)
2389b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
2390b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int ps_prio;
2391b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int vs_prio;
2392b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int gs_prio;
2393b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int es_prio;
239459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
239559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	int hs_prio;
239659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	int cs_prio;
239759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	int ls_prio;
239859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
2399b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ps_gprs;
2400b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_vs_gprs;
2401b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_gs_gprs;
2402b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_es_gprs;
2403b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_hs_gprs;
2404b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ls_gprs;
2405b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_temp_gprs;
240659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
240759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	unsigned tmp;
240859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
240959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	ps_prio = 0;
241059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	vs_prio = 1;
241159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	gs_prio = 2;
241259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	es_prio = 3;
241359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	hs_prio = 0;
241459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	ls_prio = 0;
241559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	cs_prio = 0;
241659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
241759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	switch (ctx_family) {
241859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_CEDAR:
241959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	default:
242059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
242159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
242259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
242359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
242459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
242559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
242659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
242759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
242859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_REDWOOD:
242959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
243059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
243159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
243259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
243359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
243459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
243559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
243659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
243759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_JUNIPER:
243859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
243959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
244059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
244159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
244259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
244359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
244459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
244559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
244659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_CYPRESS:
244759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_HEMLOCK:
244859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
244959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
245059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
245159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
245259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
245359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
245459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
245559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
245659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_PALM:
245759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
245859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
245959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
246059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
246159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
246259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
246359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
246459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
246559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_SUMO:
246659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
246759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
246859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
246959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
247059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
247159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
247259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
247359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
247459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_SUMO2:
247559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
247659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
247759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
247859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
247959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
248059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
248159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
248259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
248359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_BARTS:
248459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
248559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
248659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
248759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
248859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
248959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
249059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
249159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
249259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_TURKS:
249359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
249459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
249559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
249659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
249759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
249859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
249959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
250059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
250159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_CAICOS:
250259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ps_gprs = 93;
250359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_vs_gprs = 46;
250459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_temp_gprs = 4;
250559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_gs_gprs = 31;
250659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_es_gprs = 31;
250759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_hs_gprs = 23;
250859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		num_ls_gprs = 23;
250959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
251059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	}
251159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
251259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp = 0;
251359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	switch (ctx_family) {
251459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_CEDAR:
251559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_PALM:
251659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_SUMO:
251759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_SUMO2:
251859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	case CHIP_CAICOS:
251959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
252059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	default:
252159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp |= S_008C00_VC_ENABLE(1);
252259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		break;
252359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	}
252459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_EXPORT_SRC_C(1);
252559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_CS_PRIO(cs_prio);
252659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_LS_PRIO(ls_prio);
252759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_HS_PRIO(hs_prio);
252859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_PS_PRIO(ps_prio);
252959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_VS_PRIO(vs_prio);
253059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_GS_PRIO(gs_prio);
253159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	tmp |= S_008C00_ES_PRIO(es_prio);
253259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
253359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	/* enable dynamic GPR resource management */
253459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	if (ctx_drm_minor >= 7) {
253559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_config_reg_seq(cb, R_008C00_SQ_CONFIG, 2);
253659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, tmp); /* R_008C00_SQ_CONFIG */
253759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		/* always set temp clauses */
253859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs)); /* R_008C04_SQ_GPR_RESOURCE_MGMT_1 */
253959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_config_reg_seq(cb, R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1, 2);
254059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, 0); /* R_008C10_SQ_GLOBAL_GPR_RESOURCE_MGMT_1 */
254159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, 0); /* R_008C14_SQ_GLOBAL_GPR_RESOURCE_MGMT_2 */
254259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, (1 << 8));
254359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_context_reg(cb, R_028838_SQ_DYN_GPR_RESOURCE_LIMIT_1,
254459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_PS_GPRS(0x1e) |
254559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_VS_GPRS(0x1e) |
254659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_GS_GPRS(0x1e) |
254759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_ES_GPRS(0x1e) |
254859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_HS_GPRS(0x1e) |
254959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald					S_028838_LS_GPRS(0x1e)); /* workaround for hw issues with dyn gpr - must set all limits to 240 instead of 0, 0x1e == 240 / 8*/
255059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	} else {
255159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_config_reg_seq(cb, R_008C00_SQ_CONFIG, 4);
255259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, tmp); /* R_008C00_SQ_CONFIG */
255359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
255459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp = S_008C04_NUM_PS_GPRS(num_ps_gprs);
255559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs);
255659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(num_temp_gprs);
255759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, tmp); /* R_008C04_SQ_GPR_RESOURCE_MGMT_1 */
255859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
255959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp = S_008C08_NUM_GS_GPRS(num_gs_gprs);
256059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs);
256159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, tmp); /* R_008C08_SQ_GPR_RESOURCE_MGMT_2 */
256259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
256359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp = S_008C0C_NUM_HS_GPRS(num_hs_gprs);
256459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		tmp |= S_008C0C_NUM_HS_GPRS(num_ls_gprs);
256559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald		r600_store_value(cb, tmp); /* R_008C0C_SQ_GPR_RESOURCE_MGMT_3 */
256659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	}
256759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
256859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_config_reg(cb, R_008E2C_SQ_LDS_RESOURCE_MGMT,
256959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald			      S_008E2C_NUM_PS_LDS(0x1000) | S_008E2C_NUM_LS_LDS(0x1000));
257059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
257159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg(cb, R_028A4C_PA_SC_MODE_CNTL_1, 0);
257259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
257359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg_seq(cb, R_028B94_VGT_STRMOUT_CONFIG, 2);
257459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_028B94_VGT_STRMOUT_CONFIG */
257559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_028B98_VGT_STRMOUT_BUFFER_CONFIG */
257659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
257759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg(cb, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
257859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
257959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg_seq(cb, R_0282D0_PA_SC_VPORT_ZMIN_0, 2);
258059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_0282D0_PA_SC_VPORT_ZMIN_0 */
258159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0x3F800000); /* R_0282D4_PA_SC_VPORT_ZMAX_0 */
258259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
258359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg_seq(cb, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 3);
258459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_028AC0_DB_SRESULTS_COMPARE_STATE0 */
258559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_028AC4_DB_SRESULTS_COMPARE_STATE1 */
258659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_value(cb, 0); /* R_028AC8_DB_PRELOAD_CONTROL */
258759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
258859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg(cb, R_028848_SQ_PGM_RESOURCES_2_PS, S_028848_SINGLE_ROUND(V_SQ_ROUND_NEAREST_EVEN));
258959361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg(cb, R_028864_SQ_PGM_RESOURCES_2_VS, S_028864_SINGLE_ROUND(V_SQ_ROUND_NEAREST_EVEN));
259059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
259159361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	r600_store_context_reg(cb, R_028354_SX_SURFACE_SYNC, S_028354_SURFACE_SYNC_MASK(0xf));
259259361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
259359361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	return;
259459361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald}
259559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
259659361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibaldvoid evergreen_init_atom_start_cs(struct r600_context *rctx)
259759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald{
259859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	struct r600_command_buffer *cb = &rctx->start_cs_cmd;
2599b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ps_threads;
2600b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_vs_threads;
2601b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_gs_threads;
2602b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_es_threads;
2603b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_hs_threads;
2604b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ls_threads;
260559361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
2606b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ps_stack_entries;
2607b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_vs_stack_entries;
2608b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_gs_stack_entries;
2609b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_es_stack_entries;
2610b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_hs_stack_entries;
2611b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	int num_ls_stack_entries;
2612b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	enum radeon_family family;
2613b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	unsigned tmp;
2614b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2615b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet	if (rctx->chip_class == CAYMAN) {
2616f126253040654d52db134063a69ebaf0c417d410Marek Olšák		cayman_init_atom_start_cs(rctx);
26177779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie		return;
26187779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie	}
2619f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2620f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_init_command_buffer(cb, 256, EMIT_EARLY);
2621f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2622f126253040654d52db134063a69ebaf0c417d410Marek Olšák	/* This must be first. */
2623f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
2624f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0x80000000);
2625f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0x80000000);
2626f126253040654d52db134063a69ebaf0c417d410Marek Olšák
262759361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	evergreen_init_common_regs(cb, rctx->chip_class
262859361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald			, rctx->family, rctx->screen->info.drm_minor);
2629b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
263059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald	family = rctx->family;
2631b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	switch (family) {
2632b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	case CHIP_CEDAR:
2633b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	default:
2634b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_threads = 96;
2635b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_threads = 16;
2636b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_threads = 16;
2637b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_threads = 16;
2638b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_threads = 16;
2639b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_threads = 16;
2640b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_stack_entries = 42;
2641b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_stack_entries = 42;
2642b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_stack_entries = 42;
2643b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_stack_entries = 42;
2644b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_stack_entries = 42;
2645b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_stack_entries = 42;
2646b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		break;
2647b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	case CHIP_REDWOOD:
2648b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_threads = 128;
2649b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_threads = 20;
2650b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_threads = 20;
2651b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_threads = 20;
2652b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_threads = 20;
2653b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_threads = 20;
2654b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_stack_entries = 42;
2655b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_stack_entries = 42;
2656b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_stack_entries = 42;
2657b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_stack_entries = 42;
2658b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_stack_entries = 42;
2659b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_stack_entries = 42;
2660b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		break;
2661b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	case CHIP_JUNIPER:
2662b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_threads = 128;
2663b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_threads = 20;
2664b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_threads = 20;
2665b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_threads = 20;
2666b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_threads = 20;
2667b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_threads = 20;
2668b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_stack_entries = 85;
2669b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_stack_entries = 85;
2670b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_stack_entries = 85;
2671b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_stack_entries = 85;
2672b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_stack_entries = 85;
2673b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_stack_entries = 85;
2674b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		break;
2675b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	case CHIP_CYPRESS:
2676b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	case CHIP_HEMLOCK:
2677b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_threads = 128;
2678b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_threads = 20;
2679b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_threads = 20;
2680b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_threads = 20;
2681b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_threads = 20;
2682b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_threads = 20;
2683b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ps_stack_entries = 85;
2684b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_vs_stack_entries = 85;
2685b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_gs_stack_entries = 85;
2686b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_es_stack_entries = 85;
2687b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_hs_stack_entries = 85;
2688b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		num_ls_stack_entries = 85;
2689b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		break;
26900e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher	case CHIP_PALM:
26910e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_ps_threads = 96;
26920e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_vs_threads = 16;
26930e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_gs_threads = 16;
26940e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_es_threads = 16;
26950e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_hs_threads = 16;
26960e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_ls_threads = 16;
26970e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_ps_stack_entries = 42;
26980e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_vs_stack_entries = 42;
26990e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_gs_stack_entries = 42;
27000e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_es_stack_entries = 42;
27010e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_hs_stack_entries = 42;
27020e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		num_ls_stack_entries = 42;
27030e4c5f63b9023b292b88b2f0d5d0f6154e8ad263Alex Deucher		break;
2704414cd5df50435f475d92b02c229453d037369c0fAlex Deucher	case CHIP_SUMO:
2705414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ps_threads = 96;
2706414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_vs_threads = 25;
2707414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_gs_threads = 25;
2708414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_es_threads = 25;
2709414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_hs_threads = 25;
2710414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ls_threads = 25;
2711414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ps_stack_entries = 42;
2712414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_vs_stack_entries = 42;
2713414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_gs_stack_entries = 42;
2714414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_es_stack_entries = 42;
2715414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_hs_stack_entries = 42;
2716414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ls_stack_entries = 42;
2717414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		break;
2718414cd5df50435f475d92b02c229453d037369c0fAlex Deucher	case CHIP_SUMO2:
2719414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ps_threads = 96;
2720414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_vs_threads = 25;
2721414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_gs_threads = 25;
2722414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_es_threads = 25;
2723414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_hs_threads = 25;
2724414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ls_threads = 25;
2725414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ps_stack_entries = 85;
2726414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_vs_stack_entries = 85;
2727414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_gs_stack_entries = 85;
2728414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_es_stack_entries = 85;
2729414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_hs_stack_entries = 85;
2730414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		num_ls_stack_entries = 85;
2731414cd5df50435f475d92b02c229453d037369c0fAlex Deucher		break;
2732f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher	case CHIP_BARTS:
2733f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_threads = 128;
2734f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_threads = 20;
2735f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_threads = 20;
2736f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_threads = 20;
2737f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_threads = 20;
2738f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_threads = 20;
2739f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_stack_entries = 85;
2740f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_stack_entries = 85;
2741f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_stack_entries = 85;
2742f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_stack_entries = 85;
2743f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_stack_entries = 85;
2744f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_stack_entries = 85;
2745f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		break;
2746f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher	case CHIP_TURKS:
2747f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_threads = 128;
2748f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_threads = 20;
2749f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_threads = 20;
2750f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_threads = 20;
2751f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_threads = 20;
2752f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_threads = 20;
2753f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_stack_entries = 42;
2754f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_stack_entries = 42;
2755f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_stack_entries = 42;
2756f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_stack_entries = 42;
2757f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_stack_entries = 42;
2758f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_stack_entries = 42;
2759f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		break;
2760f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher	case CHIP_CAICOS:
2761f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_threads = 128;
2762f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_threads = 10;
2763f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_threads = 10;
2764f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_threads = 10;
2765f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_threads = 10;
2766f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_threads = 10;
2767f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ps_stack_entries = 42;
2768f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_vs_stack_entries = 42;
2769f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_gs_stack_entries = 42;
2770f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_es_stack_entries = 42;
2771f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_hs_stack_entries = 42;
2772f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		num_ls_stack_entries = 42;
2773f54366bcf61a414885abb9f7f47e897598a80859Alex Deucher		break;
2774b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
2775b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2776f126253040654d52db134063a69ebaf0c417d410Marek Olšák	tmp = S_008C18_NUM_PS_THREADS(num_ps_threads);
2777b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C18_NUM_VS_THREADS(num_vs_threads);
2778b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C18_NUM_GS_THREADS(num_gs_threads);
2779b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C18_NUM_ES_THREADS(num_es_threads);
278059361d76a5b0b6b77d6e6bc976e02df2e8df9ec3archibald
2781f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg_seq(cb, R_008C18_SQ_THREAD_RESOURCE_MGMT_1, 5);
2782f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, tmp); /* R_008C18_SQ_THREAD_RESOURCE_MGMT_1 */
2783b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2784f126253040654d52db134063a69ebaf0c417d410Marek Olšák	tmp = S_008C1C_NUM_HS_THREADS(num_hs_threads);
2785b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C1C_NUM_LS_THREADS(num_ls_threads);
2786f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, tmp); /* R_008C1C_SQ_THREAD_RESOURCE_MGMT_2 */
2787b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2788f126253040654d52db134063a69ebaf0c417d410Marek Olšák	tmp = S_008C20_NUM_PS_STACK_ENTRIES(num_ps_stack_entries);
2789b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C20_NUM_VS_STACK_ENTRIES(num_vs_stack_entries);
2790f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, tmp); /* R_008C20_SQ_STACK_RESOURCE_MGMT_1 */
2791b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2792f126253040654d52db134063a69ebaf0c417d410Marek Olšák	tmp = S_008C24_NUM_GS_STACK_ENTRIES(num_gs_stack_entries);
2793b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C24_NUM_ES_STACK_ENTRIES(num_es_stack_entries);
2794f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, tmp); /* R_008C24_SQ_STACK_RESOURCE_MGMT_2 */
2795b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2796f126253040654d52db134063a69ebaf0c417d410Marek Olšák	tmp = S_008C28_NUM_HS_STACK_ENTRIES(num_hs_stack_entries);
2797b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	tmp |= S_008C28_NUM_LS_STACK_ENTRIES(num_ls_stack_entries);
2798f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, tmp); /* R_008C28_SQ_STACK_RESOURCE_MGMT_3 */
2799f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2800f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg(cb, R_009100_SPI_CONFIG_CNTL, 0);
2801f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg(cb, R_00913C_SPI_CONFIG_CNTL_1, S_00913C_VTX_DONE_DELAY(4));
2802f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2803f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_028900_SQ_ESGS_RING_ITEMSIZE, 6);
2804f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028900_SQ_ESGS_RING_ITEMSIZE */
2805f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028904_SQ_GSVS_RING_ITEMSIZE */
2806f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028908_SQ_ESTMP_RING_ITEMSIZE */
2807f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_02890C_SQ_GSTMP_RING_ITEMSIZE */
2808f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028910_SQ_VSTMP_RING_ITEMSIZE */
2809f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028914_SQ_PSTMP_RING_ITEMSIZE */
2810f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2811f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_02891C_SQ_GS_VERT_ITEMSIZE, 4);
2812f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_02891C_SQ_GS_VERT_ITEMSIZE */
2813f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028920_SQ_GS_VERT_ITEMSIZE_1 */
2814f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028924_SQ_GS_VERT_ITEMSIZE_2 */
2815f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028928_SQ_GS_VERT_ITEMSIZE_3 */
2816f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2817f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13);
2818f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */
2819f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */
2820f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */
2821f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */
2822f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */
2823f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */
2824f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */
2825f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */
2826f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */
2827f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */
2828f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */
2829f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */
2830f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE */
2831f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2832f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_context_reg_seq(cb, R_028AB4_VGT_REUSE_OFF, 2);
2833f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028AB4_VGT_REUSE_OFF */
2834f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */
2835f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2836f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_config_reg(cb, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1);
2837f126253040654d52db134063a69ebaf0c417d410Marek Olšák
2838182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_context_reg_seq(cb, R_028380_SQ_VTX_SEMANTIC_0, 34);
2839f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0); /* R_028380_SQ_VTX_SEMANTIC_0 */
2840f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2841f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2842f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2843f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2844f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2845f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2846f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2847f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2848f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2849f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2850f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2851f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2852f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2853f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2854f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2855f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2856f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2857f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2858f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2859f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2860f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2861f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2862f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2863f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2864f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2865f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2866f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2867f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2868f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2869f126253040654d52db134063a69ebaf0c417d410Marek Olšák	r600_store_value(cb, 0);
2870182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_value(cb, 0); /* R_0283FC_SQ_VTX_SEMANTIC_31 */
2871182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_value(cb, ~0); /* R_028400_VGT_MAX_VTX_INDX */
2872182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_value(cb, 0); /* R_028404_VGT_MIN_VTX_INDX */
2873182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák
2874182fd4c54476ced92b61412b0cac5be32e257b53Marek Olšák	r600_store_ctl_const(cb, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0);
28755d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
28765d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, R_028028_DB_STENCIL_CLEAR, 2);
28775d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028028_DB_STENCIL_CLEAR */
28785d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_02802C_DB_DEPTH_CLEAR */
28795d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
28805d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028200_PA_SC_WINDOW_OFFSET, 0);
28812881d456a5dd267bf2291532c9d95b1d48e93c08Marek Olšák	r600_store_context_reg(cb, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF);
28825d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
28835d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_0286DC_SPI_FOG_CNTL, 0);
28845d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028818_PA_CL_VTE_CNTL, 0x0000043F);
28855d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0);
28865d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
28875d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg_seq(cb, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 3);
28885d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC0_DB_SRESULTS_COMPARE_STATE0 */
28895d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC4_DB_SRESULTS_COMPARE_STATE1 */
28905d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0); /* R_028AC8_DB_PRELOAD_CONTROL */
28915d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
28924b78df9c81f1ca8af2b750616de8ff440e99c3c1Marek Olšák	r600_store_context_reg_seq(cb, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 4);
28935d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_028C0C_PA_CL_GB_VERT_CLIP_ADJ */
28945d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_028C10_PA_CL_GB_VERT_DISC_ADJ */
28955d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_028C14_PA_CL_GB_HORZ_CLIP_ADJ */
28965d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_value(cb, 0x3F800000); /* R_028C18_PA_CL_GB_HORZ_DISC_ADJ */
28975d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
2898cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_context_reg_seq(cb, R_028240_PA_SC_GENERIC_SCISSOR_TL, 2);
2899cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, 0); /* R_028240_PA_SC_GENERIC_SCISSOR_TL */
2900cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, S_028244_BR_X(16384) | S_028244_BR_Y(16384)); /* R_028244_PA_SC_GENERIC_SCISSOR_BR */
2901cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák
2902cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2);
2903cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */
2904cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák	r600_store_value(cb, S_028034_BR_X(16384) | S_028034_BR_Y(16384)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */
2905cd5d02bf51af370233f35604a69d07e70db11eafMarek Olšák
29065d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	r600_store_context_reg(cb, R_0288A8_SQ_PGM_RESOURCES_FS, 0);
29075d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák
290896ef4ddc3ddda4d1f637af86f4790d24f8f386c6Marek Olšák	r600_store_context_reg(cb, R_028800_DB_DEPTH_CONTROL, 0);
2909cb149bf9e12aebd38bd0a6d009673e8400659110Jerome Glisse	if (rctx->screen->has_streamout) {
2910cb149bf9e12aebd38bd0a6d009673e8400659110Jerome Glisse		r600_store_context_reg(cb, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0);
2911cb149bf9e12aebd38bd0a6d009673e8400659110Jerome Glisse	}
29126187503f95c56aa3fdbb645170095c409dad12ffMarek Olšák
29135d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0, 0x01000FFF);
29145d2de9232d3bee91a6df49d1558fa00995a235c5Marek Olšák	eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0 + (32 * 4), 0x01000FFF);
2915b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
2916b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2917e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid evergreen_polygon_offset_update(struct r600_context *rctx)
29180b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse{
29190b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	struct r600_pipe_state state;
29200b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
29210b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	state.id = R600_PIPE_STATE_POLYGON_OFFSET;
29220b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	state.nregs = 0;
29230b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	if (rctx->rasterizer && rctx->framebuffer.zsbuf) {
29240b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		float offset_units = rctx->rasterizer->offset_units;
29250b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		unsigned offset_db_fmt_cntl = 0, depth;
29260b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
29276657a7af61ae7c328fecc6ee00246d7c6c93c936Marek Olšák		switch (rctx->framebuffer.zsbuf->format) {
29280b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		case PIPE_FORMAT_Z24X8_UNORM:
2929866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie		case PIPE_FORMAT_Z24_UNORM_S8_UINT:
29300b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			depth = -24;
29310b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			offset_units *= 2.0f;
29320b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			break;
29330b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		case PIPE_FORMAT_Z32_FLOAT:
2934866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie		case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
29350b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			depth = -23;
29360b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			offset_units *= 1.0f;
29370b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
29380b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			break;
29390b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		case PIPE_FORMAT_Z16_UNORM:
29400b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			depth = -16;
29410b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			offset_units *= 4.0f;
29420b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			break;
29430b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		default:
29440b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse			return;
29450b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		}
2946370c8b5ee7666f4f515d63603afe8282b1b3c682Marek Olšák		/* XXX some of those reg can be computed with cso */
29470b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
29480b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_pipe_state_add_reg(&state,
29490b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse				R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
295062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				fui(rctx->rasterizer->offset_scale));
29510b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_pipe_state_add_reg(&state,
29520b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse				R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET,
295362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				fui(offset_units));
29540b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_pipe_state_add_reg(&state,
29550b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse				R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE,
295662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				fui(rctx->rasterizer->offset_scale));
29570b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_pipe_state_add_reg(&state,
29580b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse				R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET,
295962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				fui(offset_units));
29600b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_pipe_state_add_reg(&state,
29610b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse				R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL,
296262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				offset_db_fmt_cntl);
2963e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		r600_context_pipe_state_set(rctx, &state);
29640b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	}
29650b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse}
29660b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
2967b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissevoid evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2968b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
2969e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
2970b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = &shader->rstate;
2971b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_shader *rshader = &shader->shader;
29722342e89979a66bb8438e1a2d5f8b6fedbf3ec340Henri Verbeet	unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control;
2973fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int pos_index = -1, face_index = -1;
2974fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	int ninterp = 0;
2975fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE;
2976e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin	unsigned spi_baryc_cntl, sid, tmp, idx = 0;
2977470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	unsigned z_export = 0, stencil_export = 0;
2978b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
2979b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->nregs = 0;
2980b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
29813d061caaed13b646ff40754f8ebe73f3d4983c5bMarek Olšák	db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
2982b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
2983fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		/* evergreen NUM_INTERP only contains values interpolated into the LDS,
2984fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		   POSITION goes via GPRs from the SC so isn't counted */
2985b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
2986fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			pos_index = i;
2987fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		else if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
2988fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			face_index = i;
2989fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		else {
29902dfabdd0a479a29d23aa6b10a0b6bfeb48e956b2Dave Airlie			ninterp++;
2991fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
2992fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				have_linear = TRUE;
2993fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (rshader->input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
2994fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				have_perspective = TRUE;
2995fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			if (rshader->input[i].centroid)
2996fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				have_centroid = TRUE;
2997fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		}
2998e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
2999e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin		sid = rshader->input[i].spi_sid;
3000e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3001e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin		if (sid) {
3002e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3003e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			tmp = S_028644_SEMANTIC(sid);
3004e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3005cb1578336421692454517f9a69dddd37de8fbf7eVadim Girlin			if (rshader->input[i].name == TGSI_SEMANTIC_POSITION ||
30061a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin				rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
30071a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin				(rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
30081a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin					rctx->rasterizer && rctx->rasterizer->flatshade)) {
3009e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin				tmp |= S_028644_FLAT_SHADE(1);
3010e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			}
3011e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3012e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
3013cb1578336421692454517f9a69dddd37de8fbf7eVadim Girlin					(rctx->sprite_coord_enable & (1 << rshader->input[i].sid))) {
3014e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin				tmp |= S_028644_PT_SPRITE_TEX(1);
3015e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			}
3016e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3017e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + idx * 4,
301862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					tmp);
3019e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3020e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin			idx++;
3021e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin		}
3022b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
3023e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3024b534eb16a298ce02e723c53c1d021f35a4a873a2Jerome Glisse	for (i = 0; i < rshader->noutput; i++) {
3025bd89da79a1acc8b896a7f5afc71435befe2ff7e4Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
3026470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin			z_export = 1;
302792e729bba5aab9958f5ba1339c27f6bfe743ef2eDave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
3028470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin			stencil_export = 1;
3029b534eb16a298ce02e723c53c1d021f35a4a873a2Jerome Glisse	}
30302342e89979a66bb8438e1a2d5f8b6fedbf3ec340Henri Verbeet	if (rshader->uses_kill)
30312342e89979a66bb8438e1a2d5f8b6fedbf3ec340Henri Verbeet		db_shader_control |= S_02880C_KILL_ENABLE(1);
3032b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
3033470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export);
3034470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(stencil_export);
3035470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3036b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	exports_ps = 0;
3037b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	for (i = 0; i < rshader->noutput; i++) {
3038fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION ||
3039fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		    rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
3040b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			exports_ps |= 1;
3041b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
30420c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
30430c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin	num_cout = rshader->nr_ps_color_exports;
30440c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin
3045b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	exports_ps |= S_02884C_EXPORT_COLORS(num_cout);
3046b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	if (!exports_ps) {
3047b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		/* always at least export 1 component per pixel */
3048b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		exports_ps = 2;
3049b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
30504fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	shader->nr_ps_color_outputs = num_cout;
3051fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (ninterp == 0) {
3052fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		ninterp = 1;
3053fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		have_perspective = TRUE;
3054fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
3055fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
30562dfabdd0a479a29d23aa6b10a0b6bfeb48e956b2Dave Airlie	if (!have_perspective && !have_linear)
30572dfabdd0a479a29d23aa6b10a0b6bfeb48e956b2Dave Airlie		have_perspective = TRUE;
30582dfabdd0a479a29d23aa6b10a0b6bfeb48e956b2Dave Airlie
3059fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	spi_ps_in_control_0 = S_0286CC_NUM_INTERP(ninterp) |
3060fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		              S_0286CC_PERSP_GRADIENT_ENA(have_perspective) |
3061fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		              S_0286CC_LINEAR_GRADIENT_ENA(have_linear);
3062b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	spi_input_z = 0;
3063fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (pos_index != -1) {
3064fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		spi_ps_in_control_0 |=  S_0286CC_POSITION_ENA(1) |
3065fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) |
3066fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr);
3067b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse		spi_input_z |= 1;
3068b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
3069fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
3070fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	spi_ps_in_control_1 = 0;
3071fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (face_index != -1) {
3072fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) |
3073fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie			S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr);
3074fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	}
3075fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
3076fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	spi_baryc_cntl = 0;
3077fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (have_perspective)
3078fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		spi_baryc_cntl |= S_0286E0_PERSP_CENTER_ENA(1) |
3079fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				  S_0286E0_PERSP_CENTROID_ENA(have_centroid);
3080fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	if (have_linear)
3081fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie		spi_baryc_cntl |= S_0286E0_LINEAR_CENTER_ENA(1) |
30827ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse				  S_0286E0_LINEAR_CENTROID_ENA(have_centroid);
30837ffd4e976fd11b8c083c2927effd25a2f79ac841Jerome Glisse
30845646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0,
308562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				spi_ps_in_control_0);
30865646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1,
308762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				spi_ps_in_control_1);
3088fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie	r600_pipe_state_add_reg(rstate, R_0286E4_SPI_PS_IN_CONTROL_2,
308962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				0);
309062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z);
30915646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
3092fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie				R_0286E0_SPI_BARYC_CNTL,
309362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				spi_baryc_cntl);
3094fc6caef4cb67fb13642c5ebccee53019d1764df6Dave Airlie
309562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg_bo(rstate,
3096b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				R_028840_SQ_PGM_START_PS,
3097bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse				r600_resource_va(ctx->screen, (void *)shader->bo) >> 8,
30984a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák				shader->bo, RADEON_USAGE_READ);
30995646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
3100b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				R_028844_SQ_PGM_RESOURCES_PS,
3101b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				S_028844_NUM_GPRS(rshader->bc.ngpr) |
3102b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				S_028844_PRIME_CACHE_ON_DRAW(1) |
310362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028844_STACK_SIZE(rshader->bc.nstack));
31045646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
3105b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse				R_02884C_SQ_PGM_EXPORTS_PS,
310662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				exports_ps);
3107470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3108470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	shader->db_shader_control = db_shader_control;
3109470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	shader->ps_depth_export = z_export | stencil_export;
3110e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3111e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin	shader->sprite_coord_enable = rctx->sprite_coord_enable;
31121a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin	if (rctx->rasterizer)
31131a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin		shader->flatshade = rctx->rasterizer->flatshade;
3114b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
3115b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
3116b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glissevoid evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader)
3117b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse{
3118e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
3119b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_pipe_state *rstate = &shader->rstate;
3120b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	struct r600_shader *rshader = &shader->shader;
31215b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	unsigned spi_vs_out_id[10] = {};
31225b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	unsigned i, tmp, nparams = 0;
3123b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
3124b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	/* clear previous register */
3125b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	rstate->nregs = 0;
3126b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
31275b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin	for (i = 0; i < rshader->noutput; i++) {
31285b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		if (rshader->output[i].spi_sid) {
31295b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8);
31305b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			spi_vs_out_id[nparams / 4] |= tmp;
31315b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin			nparams++;
31325b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin		}
3133b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
31345b27b63de64167a84a03d820550e56c4b7bbc69dVadim Girlin
3135b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	for (i = 0; i < 10; i++) {
31365646964b1360883b6254e2ebacc198f43869d36fJerome Glisse		r600_pipe_state_add_reg(rstate,
3137b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse					R_02861C_SPI_VS_OUT_ID_0 + i * 4,
313862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie					spi_vs_out_id[i]);
3139b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse	}
3140b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse
3141dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher	/* Certain attributes (position, psize, etc.) don't count as params.
3142dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher	 * VS is required to export at least one param and r600_shader_from_tgsi()
3143dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher	 * takes care of adding a dummy export.
3144dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher	 */
3145dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher	if (nparams < 1)
3146dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher		nparams = 1;
3147dc1c0ca22a1c7fcaef90b787290144d8e3d77c33Alex Deucher
31485646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
3149b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			R_0286C4_SPI_VS_OUT_CONFIG,
315062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie			S_0286C4_VS_EXPORT_COUNT(nparams - 1));
31515646964b1360883b6254e2ebacc198f43869d36fJerome Glisse	r600_pipe_state_add_reg(rstate,
3152b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			R_028860_SQ_PGM_RESOURCES_VS,
3153b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			S_028860_NUM_GPRS(rshader->bc.ngpr) |
315462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie			S_028860_STACK_SIZE(rshader->bc.nstack));
315562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg_bo(rstate,
3156b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse			R_02885C_SQ_PGM_START_VS,
3157bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse			r600_resource_va(ctx->screen, (void *)shader->bo) >> 8,
31584a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák			shader->bo, RADEON_USAGE_READ);
3159fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse
316097acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák	shader->pa_cl_vs_out_cntl =
316197acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák		S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) |
316297acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák		S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) |
316397acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák		S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) |
316497acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák		S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size);
3165b360c050b60a578ce6c75cbc872dd54999b3f6c5Jerome Glisse}
3166084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie
31677f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlievoid evergreen_fetch_shader(struct pipe_context *ctx,
31687f6672f6a737bc1c47e36c9567bd6d908855ce4dDave Airlie			    struct r600_vertex_element *ve)
3169a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet{
3170e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
3171a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet	struct r600_pipe_state *rstate = &ve->rstate;
3172a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet	rstate->id = R600_PIPE_STATE_FETCH_SHADER;
3173a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet	rstate->nregs = 0;
317462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg_bo(rstate, R_0288A4_SQ_PGM_START_FS,
3175bb1f0cf3508630a9a93512c79badf8c493c46743Jerome Glisse				r600_resource_va(ctx->screen, (void *)ve->fetch_shader) >> 8,
31764a058aebb2ce340d0e03434a8820fdf5853b971eMarek Olšák				ve->fetch_shader, RADEON_USAGE_READ);
3177a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet}
3178a2ef38368b638caba26418a68c157d52b6bcf797Henri Verbeet
31790f86915c5322b096b7154b6c84e21288074b775dMarek Olšákvoid *evergreen_create_resolve_blend(struct r600_context *rctx)
31800f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{
31810f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	struct pipe_blend_state blend;
31820f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	struct r600_pipe_state *rstate;
31830f86915c5322b096b7154b6c84e21288074b775dMarek Olšák
31840f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	memset(&blend, 0, sizeof(blend));
31851cfec6e2c8f15b2448e0297f4ca975ed7ab0c505Marek Olšák	blend.independent_blend_enable = true;
31860f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	blend.rt[0].colormask = 0xf;
31870f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	rstate = evergreen_create_blend_state_mode(&rctx->context, &blend, V_028808_CB_RESOLVE);
31880f86915c5322b096b7154b6c84e21288074b775dMarek Olšák	return rstate;
31890f86915c5322b096b7154b6c84e21288074b775dMarek Olšák}
31900f86915c5322b096b7154b6c84e21288074b775dMarek Olšák
3191a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid *evergreen_create_decompress_blend(struct r600_context *rctx)
3192a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{
3193a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	struct pipe_blend_state blend;
3194a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	struct r600_pipe_state *rstate;
3195a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
3196a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	memset(&blend, 0, sizeof(blend));
3197a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	blend.independent_blend_enable = true;
3198a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	blend.rt[0].colormask = 0xf;
3199a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	rstate = evergreen_create_blend_state_mode(&rctx->context, &blend, V_028808_CB_DECOMPRESS);
3200a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	return rstate;
3201a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák}
3202a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
3203e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid *evergreen_create_db_flush_dsa(struct r600_context *rctx)
3204084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie{
3205e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	struct pipe_depth_stencil_alpha_state dsa = {{0}};
3206084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie
3207e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse	return rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
3208084c29baedf2702200b310d6e63a5d0f95aaac37Dave Airlie}
3209470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3210470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlinvoid evergreen_update_dual_export_state(struct r600_context * rctx)
3211470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin{
3212470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	unsigned dual_export = rctx->export_16bpc && rctx->nr_cbufs &&
3213470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin			!rctx->ps_shader->current->ps_depth_export;
3214470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3215470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	unsigned db_source_format = dual_export ? V_02880C_EXPORT_DB_TWO :
3216470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin			V_02880C_EXPORT_DB_FULL;
3217470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3218470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	unsigned db_shader_control = rctx->ps_shader->current->db_shader_control |
3219470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin			S_02880C_DUAL_EXPORT_ENABLE(dual_export) |
32206517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák			S_02880C_DB_SOURCE_FORMAT(db_source_format) |
32216517225078a6a56c9fb3c1ea9f310992e6400b77Marek Olšák			S_02880C_ALPHA_TO_MASK_DISABLE(rctx->cb0_is_integer);
3222470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3223470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	if (db_shader_control != rctx->db_shader_control) {
3224470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		struct r600_pipe_state rstate;
3225470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3226470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		rctx->db_shader_control = db_shader_control;
3227470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin
3228470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		rstate.nregs = 0;
3229470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		r600_pipe_state_add_reg(&rstate, R_02880C_DB_SHADER_CONTROL, db_shader_control);
3230470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		r600_context_pipe_state_set(rctx, &rstate);
3231470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin	}
3232470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin}
3233