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