1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE.
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600_formats.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r600d.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_framebuffer.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_dual_blend.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_translate_blend_function(int blend_func)
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (blend_func) {
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_ADD:
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_COMB_DST_PLUS_SRC;
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_SUBTRACT:
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_COMB_SRC_MINUS_DST;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_REVERSE_SUBTRACT:
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_COMB_DST_MINUS_SRC;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_MIN:
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_COMB_MIN_DST_SRC;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_MAX:
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_COMB_MAX_DST_SRC;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Unknown blend function %d\n", blend_func);
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_translate_blend_factor(int blend_fact)
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (blend_fact) {
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_ONE:
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_COLOR:
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_SRC_COLOR;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_ALPHA:
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_SRC_ALPHA;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_DST_ALPHA:
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_DST_ALPHA;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_DST_COLOR:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_DST_COLOR;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_SRC_ALPHA_SATURATE;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_CONST_COLOR:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_CONST_COLOR;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_CONST_ALPHA:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_CONST_ALPHA;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_ZERO:
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ZERO;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_SRC_COLOR;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_SRC_ALPHA;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_DST_ALPHA;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_DST_COLOR:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_DST_COLOR;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_CONST_COLOR;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_ONE_MINUS_CONST_ALPHA;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC1_COLOR:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_SRC1_COLOR;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC1_ALPHA:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_SRC1_ALPHA;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_INV_SRC1_COLOR;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028804_BLEND_INV_SRC1_ALPHA;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned r600_tex_dim(unsigned dim, unsigned nr_samples)
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (dim) {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_1D:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_038000_SQ_TEX_DIM_1D;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_1D_ARRAY:
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_038000_SQ_TEX_DIM_1D_ARRAY;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_2D:
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_RECT:
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_MSAA :
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					V_038000_SQ_TEX_DIM_2D;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_2D_ARRAY:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return nr_samples > 1 ? V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA :
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					V_038000_SQ_TEX_DIM_2D_ARRAY;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_3D:
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_038000_SQ_TEX_DIM_3D;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_CUBE:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_038000_SQ_TEX_DIM_CUBEMAP;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_translate_dbformat(enum pipe_format format)
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028010_DEPTH_16;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028010_DEPTH_X8_24;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028010_DEPTH_8_24;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028010_DEPTH_32_FLOAT;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028010_DEPTH_X24_8_32_FLOAT;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_translate_colorswap(enum pipe_format format)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 8-bit buffers. */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UNORM:
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SNORM:
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UINT:
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SINT:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_UNORM:
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_SNORM:
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_UINT:
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_SINT:
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_FLOAT:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_UINT:
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_SINT:
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_FLOAT:
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R4A4_UNORM:
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT_REV;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UNORM:
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SNORM:
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UINT:
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SINT:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UNORM:
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SNORM:
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UINT:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SINT:
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SRGB:
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_UNORM:
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_SNORM:
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_UINT:
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_SINT:
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_FLOAT:
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_UINT:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_SINT:
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_FLOAT:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_UNORM:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_SNORM:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_UINT:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_SINT:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_FLOAT:
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_UINT:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_SINT:
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_FLOAT:
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UNORM:
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SNORM:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UINT:
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SINT:
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L4A4_UNORM:
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A4R4_UNORM:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 16-bit buffers. */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G6R5_UNORM:
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD_REV;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5A1_UNORM:
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5X1_UNORM:
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4A4_UNORM:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4X4_UNORM:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UNORM:
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SNORM:
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UINT:
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SINT:
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SRGB:
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_UNORM:
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_SNORM:
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_UINT:
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_SINT:
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_FLOAT:
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_UINT:
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_SINT:
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_FLOAT:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UNORM:
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SNORM:
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UINT:
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SINT:
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UNORM:
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SNORM:
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UINT:
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SINT:
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_FLOAT:
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 32-bit buffers. */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_SRGB:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD_REV;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_SRGB:
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_UNORM:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8X8_UNORM:
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8R8G8B8_UNORM:
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8R8G8B8_UNORM:
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT_REV;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SNORM:
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UNORM:
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8X8_UNORM:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SINT:
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UINT:
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_UNORM:
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8B8G8R8_UNORM:
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD_REV;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8Z24_UNORM:
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10A2_UNORM:
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10X2_SNORM:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UNORM:
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UINT:
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_ALT;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R11G11B10_FLOAT:
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UNORM:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SNORM:
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_FLOAT:
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UINT:
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SINT:
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_UINT:
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_SINT:
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_FLOAT:
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 64-bit buffers. */
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_FLOAT:
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_UINT:
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_SINT:
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UNORM:
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SNORM:
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UINT:
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SINT:
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_FLOAT:
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 128-bit buffers. */
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_FLOAT:
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SNORM:
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UNORM:
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SINT:
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UINT:
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_SWAP_STD;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("unsupported colorswap format %d\n", format);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ~0U;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_translate_colorformat(enum pipe_format format)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L4A4_UNORM:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R4A4_UNORM:
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A4R4_UNORM:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_4_4;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 8-bit buffers. */
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UNORM:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SNORM:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UINT:
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SINT:
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UNORM:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SNORM:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UINT:
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SINT:
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UNORM:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SNORM:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UINT:
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SINT:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SRGB:
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UNORM:
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SNORM:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UINT:
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SINT:
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_8;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 16-bit buffers. */
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G6R5_UNORM:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_5_6_5;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5A1_UNORM:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5X1_UNORM:
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_1_5_5_5;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4A4_UNORM:
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4X4_UNORM:
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_4_4_4_4;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UNORM:
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SNORM:
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UINT:
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SINT:
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SRGB:
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UNORM:
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SNORM:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UINT:
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SINT:
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_8_8;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UNORM:
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SNORM:
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UINT:
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SINT:
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_UNORM:
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_SNORM:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_UINT:
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_SINT:
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_UNORM:
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_SNORM:
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_UINT:
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_SINT:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_UNORM:
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_SNORM:
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_UINT:
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_SINT:
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_FLOAT:
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A16_FLOAT:
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16_FLOAT:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I16_FLOAT:
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16_FLOAT;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 32-bit buffers. */
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_SRGB:
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_UNORM:
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8R8G8B8_UNORM:
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_SRGB:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_UNORM:
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8X8_UNORM:
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SNORM:
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UNORM:
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8X8_UNORM:
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8B8G8R8_UNORM:
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8R8G8B8_UNORM:
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SINT:
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UINT:
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_8_8_8_8;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10A2_UNORM:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10X2_SNORM:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UNORM:
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UINT:
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_2_10_10_10;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_8_24;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8Z24_UNORM:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_24_8;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_X24_8_32_FLOAT;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_UINT:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_SINT:
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_UINT:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_SINT:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_UINT:
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_SINT:
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_UINT:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_SINT:
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_FLOAT:
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A32_FLOAT:
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32_FLOAT:
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I32_FLOAT:
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32_FLOAT;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_FLOAT:
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_FLOAT:
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16_16_FLOAT;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UNORM:
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SNORM:
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UINT:
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SINT:
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_UNORM:
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_SNORM:
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_UINT:
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L16A16_SINT:
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16_16;
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R11G11B10_FLOAT:
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_10_11_11_FLOAT;
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 64-bit buffers. */
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UINT:
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SINT:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UNORM:
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SNORM:
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16_16_16_16;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_FLOAT:
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_16_16_16_16_FLOAT;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_FLOAT:
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_FLOAT:
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32_32_FLOAT;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_SINT:
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_UINT:
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_UINT:
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L32A32_SINT:
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32_32;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 128-bit buffers. */
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_FLOAT:
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32_32_32_32_FLOAT;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SNORM:
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UNORM:
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SINT:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UINT:
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_0280A0_COLOR_32_32_32_32;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* YUV buffers. */
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_UYVY:
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_YUYV:
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U; /* Unsupported. */
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (R600_BIG_ENDIAN) {
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(colorformat) {
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_4_4:
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_NONE;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 8-bit buffers. */
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_8:
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_NONE;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 16-bit buffers. */
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_5_6_5:
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_1_5_5_5:
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_4_4_4_4:
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_16:
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_8_8:
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_8IN16;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 32-bit buffers. */
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_8_8_8_8:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_2_10_10_10:
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_8_24:
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_24_8:
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_FLOAT:
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_16_16_FLOAT:
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_16_16:
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_8IN32;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 64-bit buffers. */
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_16_16_16_16:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_16_16_16_16_FLOAT:
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_8IN16;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_32_FLOAT:
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_32:
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_X24_8_32_FLOAT:
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_8IN32;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 128-bit buffers. */
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_32_32_FLOAT:
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_32_32_32_FLOAT:
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_0280A0_COLOR_32_32_32_32:
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_8IN32;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return ENDIAN_NONE; /* Unsupported. */
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ENDIAN_NONE;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0U;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool r600_is_colorbuffer_format_supported(enum pipe_format format)
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r600_translate_colorformat(format) != ~0U &&
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       r600_translate_colorswap(format) != ~0U;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool r600_is_zs_format_supported(enum pipe_format format)
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r600_translate_dbformat(format) != ~0U;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean r600_is_format_supported(struct pipe_screen *screen,
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 enum pipe_format format,
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 enum pipe_texture_target target,
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 unsigned sample_count,
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 unsigned usage)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_screen *rscreen = (struct r600_screen*)screen;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned retval = 0;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (target >= PIPE_MAX_TEXTURE_TYPES) {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("r600: unsupported texture type %d\n", target);
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return FALSE;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!util_format_is_supported(format, usage))
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return FALSE;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sample_count > 1) {
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rscreen->info.drm_minor < 22)
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return FALSE;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R11G11B10 is broken on R6xx. */
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rscreen->chip_class == R600 &&
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    format == PIPE_FORMAT_R11G11B10_FLOAT)
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return FALSE;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* MSAA integer colorbuffers hang. */
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (util_format_is_pure_integer(format))
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return FALSE;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (sample_count) {
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 8:
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return FALSE;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r600_is_sampler_format_supported(screen, format)) {
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_SAMPLER_VIEW;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & (PIPE_BIND_RENDER_TARGET |
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_DISPLAY_TARGET |
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_SCANOUT |
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_SHARED)) &&
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r600_is_colorbuffer_format_supported(format)) {
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= usage &
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (PIPE_BIND_RENDER_TARGET |
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_DISPLAY_TARGET |
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_SCANOUT |
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_SHARED);
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r600_is_zs_format_supported(format)) {
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_DEPTH_STENCIL;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r600_is_vertex_format_supported(format)) {
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_VERTEX_BUFFER;
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (usage & PIPE_BIND_TRANSFER_READ)
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_TRANSFER_READ;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (usage & PIPE_BIND_TRANSFER_WRITE)
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_TRANSFER_WRITE;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return retval == usage;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_polygon_offset_update(struct r600_context *rctx)
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state state;
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state.id = R600_PIPE_STATE_POLYGON_OFFSET;
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state.nregs = 0;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->rasterizer && rctx->framebuffer.zsbuf) {
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		float offset_units = rctx->rasterizer->offset_units;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned offset_db_fmt_cntl = 0, depth;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (rctx->framebuffer.zsbuf->format) {
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z24X8_UNORM:
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z24_UNORM_S8_UINT:
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			depth = -24;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_units *= 2.0f;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z32_FLOAT:
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			depth = -23;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_units *= 1.0f;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z16_UNORM:
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			depth = -16;
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset_units *= 4.0f;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return;
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* XXX some of those reg can be computed with cso */
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset_db_fmt_cntl |= S_028DF8_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&state,
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028E00_PA_SU_POLY_OFFSET_FRONT_SCALE,
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fui(rctx->rasterizer->offset_scale));
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&state,
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028E04_PA_SU_POLY_OFFSET_FRONT_OFFSET,
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fui(offset_units));
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&state,
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028E08_PA_SU_POLY_OFFSET_BACK_SCALE,
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fui(rctx->rasterizer->offset_scale));
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&state,
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028E0C_PA_SU_POLY_OFFSET_BACK_OFFSET,
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fui(offset_units));
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&state,
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028DF8_PA_SU_POLY_OFFSET_DB_FMT_CNTL,
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				offset_db_fmt_cntl);
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_context_pipe_state_set(rctx, &state);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *r600_create_blend_state_mode(struct pipe_context *ctx,
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  const struct pipe_blend_state *state,
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  int mode)
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend);
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t color_control = 0, target_mask = 0;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (blend == NULL) {
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = &blend->rstate;
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_BLEND;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R600 does not support per-MRT blends */
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->family > CHIP_R600)
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= S_028808_PER_MRT_BLEND(1);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->logicop_enable) {
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= (state->logicop_func << 16) | (state->logicop_func << 20);
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= (0xcc << 16);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->independent_blend_enable) {
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (int i = 0; i < 8; i++) {
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (state->rt[i].blend_enable) {
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i);
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			target_mask |= (state->rt[i].colormask << (4 * i));
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (int i = 0; i < 8; i++) {
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (state->rt[0].blend_enable) {
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				color_control |= S_028808_TARGET_BLEND_ENABLE(1 << i);
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			target_mask |= (state->rt[0].colormask << (4 * i));
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (target_mask)
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= S_028808_SPECIAL_OP(mode);
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= S_028808_SPECIAL_OP(V_028808_DISABLE);
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend->cb_target_mask = target_mask;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend->cb_color_control = color_control;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* only MRT0 has dual src blend */
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend->dual_src_blend = util_blend_state_is_dual(state, 0);
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < 8; i++) {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* state->rt entries > 0 only written if independent blending */
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const int j = state->independent_blend_enable ? i : 0;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned eqRGB = state->rt[j].rgb_func;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned srcRGB = state->rt[j].rgb_src_factor;
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dstRGB = state->rt[j].rgb_dst_factor;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned eqA = state->rt[j].alpha_func;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned srcA = state->rt[j].alpha_src_factor;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dstA = state->rt[j].alpha_dst_factor;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t bc = 0;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!state->rt[j].blend_enable)
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc |= S_028804_COLOR_COMB_FCN(r600_translate_blend_function(eqRGB));
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc |= S_028804_COLOR_SRCBLEND(r600_translate_blend_factor(srcRGB));
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bc |= S_028804_COLOR_DESTBLEND(r600_translate_blend_factor(dstRGB));
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc |= S_028804_SEPARATE_ALPHA_BLEND(1);
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc |= S_028804_ALPHA_COMB_FCN(r600_translate_blend_function(eqA));
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc |= S_028804_ALPHA_SRCBLEND(r600_translate_blend_factor(srcA));
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bc |= S_028804_ALPHA_DESTBLEND(r600_translate_blend_factor(dstA));
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R600 does not support per-MRT blends */
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->family > CHIP_R600)
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028780_CB_BLEND0_CONTROL + i * 4, bc);
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (i == 0)
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028804_CB_BLEND_CONTROL, bc);
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028D44_DB_ALPHA_TO_MASK,
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028D44_ALPHA_TO_MASK_ENABLE(state->alpha_to_coverage) |
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028D44_ALPHA_TO_MASK_OFFSET0(2) |
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028D44_ALPHA_TO_MASK_OFFSET1(2) |
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028D44_ALPHA_TO_MASK_OFFSET2(2) |
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028D44_ALPHA_TO_MASK_OFFSET3(2));
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend->alpha_to_one = state->alpha_to_one;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *r600_create_blend_state(struct pipe_context *ctx,
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const struct pipe_blend_state *state)
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return r600_create_blend_state_mode(ctx, state, V_028808_SPECIAL_NORMAL);
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *r600_create_dsa_state(struct pipe_context *ctx,
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   const struct pipe_depth_stencil_alpha_state *state)
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_dsa *dsa = CALLOC_STRUCT(r600_pipe_dsa);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_depth_control, alpha_test_control, alpha_ref;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dsa == NULL) {
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->valuemask[0] = state->stencil[0].valuemask;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->valuemask[1] = state->stencil[1].valuemask;
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->writemask[0] = state->stencil[0].writemask;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->writemask[1] = state->stencil[1].writemask;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = &dsa->rstate;
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_DSA;
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028800_ZFUNC(state->depth.func);
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* stencil */
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->stencil[0].enabled) {
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCIL_ENABLE(1);
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func); /* translates straight */
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCILFAIL(r600_translate_stencil_op(state->stencil[0].fail_op));
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCILZPASS(r600_translate_stencil_op(state->stencil[0].zpass_op));
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCILZFAIL(r600_translate_stencil_op(state->stencil[0].zfail_op));
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (state->stencil[1].enabled) {
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_BACKFACE_ENABLE(1);
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func); /* translates straight */
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_STENCILFAIL_BF(r600_translate_stencil_op(state->stencil[1].fail_op));
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_STENCILZPASS_BF(r600_translate_stencil_op(state->stencil[1].zpass_op));
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_STENCILZFAIL_BF(r600_translate_stencil_op(state->stencil[1].zfail_op));
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* alpha */
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alpha_test_control = 0;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alpha_ref = 0;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->alpha.enabled) {
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alpha_ref = fui(state->alpha.ref_value);
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->sx_alpha_test_control = alpha_test_control & 0xff;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->alpha_ref = alpha_ref;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028800_DB_DEPTH_CONTROL, db_depth_control);
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *r600_create_rs_state(struct pipe_context *ctx,
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const struct pipe_rasterizer_state *state)
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_rasterizer *rs = CALLOC_STRUCT(r600_pipe_rasterizer);
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned tmp;
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned prov_vtx = 1, polygon_dual_mode;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned sc_mode_cntl;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	float psize_min, psize_max;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rs == NULL) {
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				state->fill_back != PIPE_POLYGON_MODE_FILL);
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->flatshade_first)
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		prov_vtx = 0;
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = &rs->rstate;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->flatshade = state->flatshade;
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->sprite_coord_enable = state->sprite_coord_enable;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->two_side = state->light_twoside;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->clip_plane_enable = state->clip_plane_enable;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_sc_line_stipple = state->line_stipple_enable ?
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_cl_clip_cntl =
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_PS_UCP_MODE(3) |
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->multisample_enable = state->multisample;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* offset */
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->offset_units = state->offset_units;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->offset_scale = state->offset_scale * 12.0f;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_RASTERIZER;
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_0286D4_FLAT_SHADE_ENA(1);
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->sprite_coord_enable) {
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_X(2) |
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_Y(3) |
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_Z(0) |
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_W(1);
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_0286D4_SPI_INTERP_CONTROL_0, tmp);
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* point size 12.4 fixed point */
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = r600_pack_float_12p4(state->point_size/2);
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp));
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->point_size_per_vertex) {
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_min = util_get_min_point_size(state);
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_max = 8192;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Force the point size to be as if the vertex output was disabled. */
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_min = state->point_size;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_max = state->point_size;
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Divide by two, because 0.5 = 1 pixel. */
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX,
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)));
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = r600_pack_float_12p4(state->line_width/2);
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp));
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class >= R700) {
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sc_mode_cntl =
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_MSAA_ENABLE(state->multisample) |
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) |
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_FORCE_EOV_REZ_ENABLE(1) |
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_R700_ZMM_LINE_OFFSET(1) |
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_R700_VPORT_SCISSOR_ENABLE(state->scissor);
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sc_mode_cntl =
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_MSAA_ENABLE(state->multisample) |
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_WALK_ALIGN8_PRIM_FITS_ST(1) |
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1);
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rs->scissor_enable = state->scissor;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sc_mode_cntl |= S_028A4C_LINE_STIPPLE_ENABLE(state->line_stipple_enable);
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028A4C_PA_SC_MODE_CNTL, sc_mode_cntl);
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028C08_PA_SU_VTX_CNTL,
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028C08_PIX_CENTER_HALF(state->gl_rasterization_rules) |
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028C08_QUANT_MODE(V_028C08_X_1_256TH));
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028DFC_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp));
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028814_PA_SU_SC_MODE_CNTL,
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_PROVOKING_VTX_LAST(prov_vtx) |
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_CULL_FRONT(state->cull_face & PIPE_FACE_FRONT ? 1 : 0) |
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_CULL_BACK(state->cull_face & PIPE_FACE_BACK ? 1 : 0) |
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_FACE(!state->front_ccw) |
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLY_MODE(polygon_dual_mode) |
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) |
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back)));
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028350_SX_MISC, S_028350_MULTIPASS(state->rasterizer_discard));
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *r600_create_sampler_state(struct pipe_context *ctx,
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const struct pipe_sampler_state *state)
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_sampler_state *ss = CALLOC_STRUCT(r600_pipe_sampler_state);
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union util_color uc;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ss == NULL) {
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ss->seamless_cube_map = state->seamless_cube_map;
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ss->border_color_use = false;
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R_03C000_SQ_TEX_SAMPLER_WORD0_0 */
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ss->tex_sampler_words[0] = S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) |
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) |
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) |
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) |
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0);
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R_03C004_SQ_TEX_SAMPLER_WORD1_0 */
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ss->tex_sampler_words[1] = S_03C004_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 6)) |
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C004_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 6)) |
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_03C004_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 6));
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R_03C008_SQ_TEX_SAMPLER_WORD2_0 */
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ss->tex_sampler_words[2] = S_03C008_TYPE(1);
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (uc.ui) {
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ss->border_color_use = true;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R_00A400_TD_PS_SAMPLER0_BORDER_RED */
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ss->border_color[0] = fui(state->border_color.f[0]);
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R_00A404_TD_PS_SAMPLER0_BORDER_GREEN */
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ss->border_color[1] = fui(state->border_color.f[1]);
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R_00A408_TD_PS_SAMPLER0_BORDER_BLUE */
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ss->border_color[2] = fui(state->border_color.f[2]);
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* R_00A40C_TD_PS_SAMPLER0_BORDER_ALPHA */
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ss->border_color[3] = fui(state->border_color.f[3]);
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ss;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *ctx,
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							struct pipe_resource *texture,
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							const struct pipe_sampler_view *state)
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_sampler_view *view = CALLOC_STRUCT(r600_pipe_sampler_view);
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_texture *tmp = (struct r600_texture*)texture;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned format, endian;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t word4 = 0, yuv_format = 0, pitch = 0;
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned char swizzle[4], array_mode = 0, tile_type = 0;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned width, height, depth, offset_level, last_level;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (view == NULL)
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* initialize base object */
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base = *state;
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.texture = NULL;
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_reference(NULL, &texture->reference);
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.texture = texture;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.reference.count = 1;
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.context = ctx;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swizzle[0] = state->swizzle_r;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swizzle[1] = state->swizzle_g;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swizzle[2] = state->swizzle_b;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swizzle[3] = state->swizzle_a;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = r600_translate_texformat(ctx->screen, state->format,
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  swizzle,
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  &word4, &yuv_format);
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(format != ~0);
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (format == ~0) {
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FREE(view);
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (tmp->is_depth && !tmp->is_flushing_texture) {
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!r600_init_flushed_depth_texture(ctx, texture, NULL)) {
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			FREE(view);
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return NULL;
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp = tmp->flushed_depth_texture;
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	endian = r600_colorformat_endian_swap(format);
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset_level = state->u.tex.first_level;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	last_level = state->u.tex.last_level - offset_level;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	width = tmp->surface.level[offset_level].npix_x;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	height = tmp->surface.level[offset_level].npix_y;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	depth = tmp->surface.level[offset_level].npix_z;
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format);
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tile_type = tmp->tile_type;
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		height = 1;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = texture->array_size;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = texture->array_size;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (tmp->surface.level[offset_level].mode) {
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_038000_ARRAY_LINEAR_ALIGNED;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_1D:
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_038000_ARRAY_1D_TILED_THIN1;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_2D:
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_038000_ARRAY_2D_TILED_THIN1;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR:
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_038000_ARRAY_LINEAR_GENERAL;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource = &tmp->resource;
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[0] = (S_038000_DIM(r600_tex_dim(texture->target, texture->nr_samples)) |
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038000_TILE_MODE(array_mode) |
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038000_TILE_TYPE(tile_type) |
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038000_PITCH((pitch / 8) - 1) |
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038000_TEX_WIDTH(width - 1));
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[1] = (S_038004_TEX_HEIGHT(height - 1) |
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038004_TEX_DEPTH(depth - 1) |
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038004_DATA_FORMAT(format));
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[2] = tmp->surface.level[offset_level].offset >> 8;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (offset_level >= tmp->surface.last_level) {
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		view->tex_resource_words[3] = tmp->surface.level[offset_level].offset >> 8;
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		view->tex_resource_words[3] = tmp->surface.level[offset_level + 1].offset >> 8;
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[4] = (word4 |
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) |
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038010_REQUEST_SIZE(1) |
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038010_ENDIAN_SWAP(endian) |
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038010_BASE_LEVEL(0));
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[5] = (S_038014_BASE_ARRAY(state->u.tex.first_layer) |
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038014_LAST_ARRAY(state->u.tex.last_layer));
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (texture->nr_samples > 1) {
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* LAST_LEVEL holds log2(nr_samples) for multisample textures */
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		view->tex_resource_words[5] |= S_038014_LAST_LEVEL(util_logbase2(texture->nr_samples));
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		view->tex_resource_words[5] |= S_038014_LAST_LEVEL(last_level);
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->tex_resource_words[6] = (S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) |
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_038018_MAX_ANISO(4 /* max 16 samples */));
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return &view->base;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_vs_sampler_views(struct pipe_context *ctx, unsigned count,
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      struct pipe_sampler_view **views)
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_set_sampler_views(ctx, PIPE_SHADER_VERTEX, 0, count, views);
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_ps_sampler_views(struct pipe_context *ctx, unsigned count,
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      struct pipe_sampler_view **views)
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_set_sampler_views(ctx, PIPE_SHADER_FRAGMENT, 0, count, views);
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_clip_state(struct pipe_context *ctx,
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const struct pipe_clip_state *state)
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_constant_buffer cb;
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rstate == NULL)
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->clip = *state;
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_CLIP;
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < 6; i++) {
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate,
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					R_028E20_PA_CL_UCP0_X + i * 16,
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fui(state->ucp[i][0]));
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate,
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					R_028E24_PA_CL_UCP0_Y + i * 16,
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fui(state->ucp[i][1]) );
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate,
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					R_028E28_PA_CL_UCP0_Z + i * 16,
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fui(state->ucp[i][2]));
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate,
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					R_028E2C_PA_CL_UCP0_W + i * 16,
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fui(state->ucp[i][3]));
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(rctx->states[R600_PIPE_STATE_CLIP]);
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->states[R600_PIPE_STATE_CLIP] = rstate;
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_context_pipe_state_set(rctx, rstate);
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cb.buffer = NULL;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cb.user_buffer = state->ucp;
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cb.buffer_offset = 0;
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	cb.buffer_size = 4*4*8;
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_set_constant_buffer(ctx, PIPE_SHADER_VERTEX, 1, &cb);
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference(&cb.buffer, NULL);
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_polygon_stipple(struct pipe_context *ctx,
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 const struct pipe_poly_stipple *state)
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_set_scissor_state(struct r600_context *rctx,
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    const struct pipe_scissor_state *state)
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t tl, br;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rstate == NULL)
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_SCISSOR;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny) | S_028240_WINDOW_OFFSET_DISABLE(1);
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy);
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl);
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028254_PA_SC_VPORT_SCISSOR_0_BR, br);
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(rctx->states[R600_PIPE_STATE_SCISSOR]);
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->states[R600_PIPE_STATE_SCISSOR] = rstate;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_context_pipe_state_set(rctx, rstate);
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_pipe_set_scissor_state(struct pipe_context *ctx,
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const struct pipe_scissor_state *state)
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class == R600) {
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->scissor_state = *state;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!rctx->scissor_enable)
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return;
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_set_scissor_state(rctx, state);
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_viewport_state(struct pipe_context *ctx,
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const struct pipe_viewport_state *state)
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rstate == NULL)
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->viewport = *state;
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_VIEWPORT;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]));
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]));
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]));
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]));
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]));
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]));
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(rctx->states[R600_PIPE_STATE_VIEWPORT]);
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->states[R600_PIPE_STATE_VIEWPORT] = rstate;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_context_pipe_state_set(rctx, rstate);
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct r600_resource *r600_buffer_create_helper(struct r600_screen *rscreen,
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						       unsigned size, unsigned alignment)
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_resource buffer;
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&buffer, 0, sizeof buffer);
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.target = PIPE_BUFFER;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.format = PIPE_FORMAT_R8_UNORM;
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.bind = PIPE_BIND_CUSTOM;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.usage = PIPE_USAGE_STATIC;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.flags = 0;
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.width0 = size;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.height0 = 1;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.depth0 = 1;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	buffer.array_size = 1;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return (struct r600_resource*)
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_buffer_create(&rscreen->screen, &buffer, alignment);
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_init_color_surface(struct r600_context *rctx,
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct r600_surface *surf,
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    bool force_cmask_fmask)
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_screen *rscreen = rctx->screen;
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_texture *rtex = (struct r600_texture*)surf->base.texture;
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned level = surf->base.u.tex.level;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned pitch, slice;
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned color_info;
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned format, swap, ntype, endian;
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned offset;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const struct util_format_description *desc;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bool blend_bypass = 0, blend_clamp = 1;
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->is_depth && !rtex->is_flushing_texture) {
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_init_flushed_depth_texture(&rctx->context, surf->base.texture, NULL);
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rtex = rtex->flushed_depth_texture;
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(rtex);
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset = rtex->surface.level[level].offset;
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset += rtex->surface.level[level].slice_size *
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  surf->base.u.tex.first_layer;
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = rtex->surface.level[level].nblk_x / 8 - 1;
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (slice) {
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slice = slice - 1;
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	color_info = 0;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (rtex->surface.level[level].mode) {
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_ALIGNED);
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_1D:
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_1D_TILED_THIN1);
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_2D:
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_2D_TILED_THIN1);
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR:
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_info = S_0280A0_ARRAY_MODE(V_038000_ARRAY_LINEAR_GENERAL);
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	desc = util_format_description(surf->base.format);
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ntype = V_0280A0_NUMBER_UNORM;
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ntype = V_0280A0_NUMBER_SRGB;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->channel[i].normalized)
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ntype = V_0280A0_NUMBER_SNORM;
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (desc->channel[i].pure_integer)
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ntype = V_0280A0_NUMBER_SINT;
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->channel[i].normalized)
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ntype = V_0280A0_NUMBER_UNORM;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (desc->channel[i].pure_integer)
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ntype = V_0280A0_NUMBER_UINT;
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = r600_translate_colorformat(surf->base.format);
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(format != ~0);
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swap = r600_translate_colorswap(surf->base.format);
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(swap != ~0);
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		endian = ENDIAN_NONE;
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		endian = r600_colorformat_endian_swap(format);
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* set blend bypass according to docs if SINT/UINT or
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   8/24 COLOR variants */
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT ||
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    format == V_0280A0_COLOR_8_24 || format == V_0280A0_COLOR_24_8 ||
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    format == V_0280A0_COLOR_X24_8_32_FLOAT) {
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_clamp = 0;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_bypass = 1;
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->alphatest_bypass = ntype == V_0280A0_NUMBER_UINT || ntype == V_0280A0_NUMBER_SINT;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	color_info |= S_0280A0_FORMAT(format) |
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_0280A0_COMP_SWAP(swap) |
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_0280A0_BLEND_BYPASS(blend_bypass) |
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_0280A0_BLEND_CLAMP(blend_clamp) |
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_0280A0_NUMBER_TYPE(ntype) |
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_0280A0_ENDIAN(endian);
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* EXPORT_NORM is an optimzation that can be enabled for better
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * performance in certain cases
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class == R600) {
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* EXPORT_NORM can be enabled if:
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * - 11-bit or smaller UNORM/SNORM/SRGB
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * - BLEND_CLAMP is enabled
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * - BLEND_FLOAT32 is disabled
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    (desc->channel[i].size < 12 &&
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     ntype != V_0280A0_NUMBER_UINT &&
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     ntype != V_0280A0_NUMBER_SINT) &&
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    G_0280A0_BLEND_CLAMP(color_info) &&
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    !G_0280A0_BLEND_FLOAT32(color_info)) {
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM);
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			surf->export_16bpc = true;
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* EXPORT_NORM can be enabled if:
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * - 11-bit or smaller UNORM/SNORM/SRGB
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * - 16-bit or smaller FLOAT
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    ((desc->channel[i].size < 12 &&
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      ntype != V_0280A0_NUMBER_UINT && ntype != V_0280A0_NUMBER_SINT) ||
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    (desc->channel[i].size < 17 &&
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT))) {
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM);
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			surf->export_16bpc = true;
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* These might not always be initialized to zero. */
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_base = offset >> 8;
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_size = S_028060_PITCH_TILE_MAX(pitch) |
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      S_028060_SLICE_TILE_MAX(slice);
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_fmask = surf->cb_color_base;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_cmask = surf->cb_color_base;
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_mask = 0;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask,
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				&rtex->resource.b.b);
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask,
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				&rtex->resource.b.b);
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->cmask_size) {
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_cmask = rtex->cmask_offset >> 8;
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_mask |= S_028100_CMASK_BLOCK_MAX(rtex->cmask_slice_tile_max);
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rtex->fmask_size) {
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE);
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			surf->cb_color_fmask = rtex->fmask_offset >> 8;
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			surf->cb_color_mask |= S_028100_FMASK_TILE_MAX(slice);
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else { /* cmask only */
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_info |= S_0280A0_TILE_MODE(V_0280A0_CLEAR_ENABLE);
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (force_cmask_fmask) {
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Allocate dummy FMASK and CMASK if they aren't allocated already.
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 *
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * R6xx needs FMASK and CMASK for the destination buffer of color resolve,
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * otherwise it hangs. We don't have FMASK and CMASK pre-allocated,
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * because it's not an MSAA buffer.
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_cmask_info cmask;
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_fmask_info fmask;
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_texture_get_cmask_info(rscreen, rtex, &cmask);
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_texture_get_fmask_info(rscreen, rtex, 8, &fmask);
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* CMASK. */
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!rctx->dummy_cmask ||
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    rctx->dummy_cmask->buf->size < cmask.size ||
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    rctx->dummy_cmask->buf->alignment % cmask.alignment != 0) {
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct pipe_transfer *transfer;
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			void *ptr;
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pipe_resource_reference((struct pipe_resource**)&rctx->dummy_cmask, NULL);
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rctx->dummy_cmask = r600_buffer_create_helper(rscreen, cmask.size, cmask.alignment);
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/* Set the contents to 0xCC. */
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ptr = pipe_buffer_map(&rctx->context, &rctx->dummy_cmask->b.b, PIPE_TRANSFER_WRITE, &transfer);
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(ptr, 0xCC, cmask.size);
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pipe_buffer_unmap(&rctx->context, transfer);
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_cmask,
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&rctx->dummy_cmask->b.b);
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* FMASK. */
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!rctx->dummy_fmask ||
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    rctx->dummy_fmask->buf->size < fmask.size ||
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    rctx->dummy_fmask->buf->alignment % fmask.alignment != 0) {
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pipe_resource_reference((struct pipe_resource**)&rctx->dummy_fmask, NULL);
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rctx->dummy_fmask = r600_buffer_create_helper(rscreen, fmask.size, fmask.alignment);
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_resource_reference((struct pipe_resource**)&surf->cb_buffer_fmask,
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					&rctx->dummy_fmask->b.b);
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Init the registers. */
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_info |= S_0280A0_TILE_MODE(V_0280A0_FRAG_ENABLE);
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_cmask = 0;
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_fmask = 0;
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_mask = S_028100_CMASK_BLOCK_MAX(cmask.slice_tile_max) |
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      S_028100_FMASK_TILE_MAX(slice);
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->cb_color_info = color_info;
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_view = 0;
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf->cb_color_view = S_028080_SLICE_START(surf->base.u.tex.first_layer) |
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      S_028080_SLICE_MAX(surf->base.u.tex.last_layer);
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->color_initialized = true;
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_init_depth_surface(struct r600_context *rctx,
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct r600_surface *surf)
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_texture *rtex = (struct r600_texture*)surf->base.texture;
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned level, pitch, slice, format, offset, array_mode;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	level = surf->base.u.tex.level;
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset = rtex->surface.level[level].offset;
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = rtex->surface.level[level].nblk_x / 8 - 1;
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (slice) {
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slice = slice - 1;
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (rtex->surface.level[level].mode) {
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_2D:
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_0280A0_ARRAY_2D_TILED_THIN1;
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_1D:
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR:
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		array_mode = V_0280A0_ARRAY_1D_TILED_THIN1;
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = r600_translate_dbformat(surf->base.format);
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(format != ~0);
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->db_depth_info = S_028010_ARRAY_MODE(array_mode) | S_028010_FORMAT(format);
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->db_depth_base = offset >> 8;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->db_depth_view = S_028004_SLICE_START(surf->base.u.tex.first_layer) |
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      S_028004_SLICE_MAX(surf->base.u.tex.last_layer);
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->db_depth_size = S_028000_PITCH_TILE_MAX(pitch) | S_028000_SLICE_TILE_MAX(slice);
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->db_prefetch_limit = (rtex->surface.level[level].nblk_y / 8) - 1;
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf->depth_initialized = true;
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FILL_SREG(s0x, s0y, s1x, s1y, s2x, s2y, s3x, s3y)  \
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(((s0x) & 0xf) | (((s0y) & 0xf) << 4) |		   \
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(((s1x) & 0xf) << 8) | (((s1y) & 0xf) << 12) |	   \
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(((s2x) & 0xf) << 16) | (((s2y) & 0xf) << 20) |	   \
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (((s3x) & 0xf) << 24) | (((s3y) & 0xf) << 28))
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t r600_set_ms_pos(struct pipe_context *ctx, struct r600_pipe_state *rstate, int nsample)
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static uint32_t sample_locs_2x[] = {
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG(-4, 4, 4, -4, -4, 4, 4, -4),
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	};
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static unsigned max_dist_2x = 4;
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static uint32_t sample_locs_4x[] = {
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG(-2, -2, 2, 2, -6, 6, 6, -6),
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	};
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static unsigned max_dist_4x = 6;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static uint32_t sample_locs_8x[] = {
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG(-2, -5, 3, -4, -1, 5, -6, -2),
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		FILL_SREG( 6,  0, 0,  0, -5, 3,  4,  4),
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	};
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static unsigned max_dist_8x = 8;
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->family == CHIP_R600) {
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (nsample) {
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 0:
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 0;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_008B40_PA_SC_AA_SAMPLE_LOCS_2S, sample_locs_2x[0]);
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_2x;
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_008B44_PA_SC_AA_SAMPLE_LOCS_4S, sample_locs_4x[0]);
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_4x;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 8:
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_008B48_PA_SC_AA_SAMPLE_LOCS_8S_WD0, sample_locs_8x[0]);
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_008B4C_PA_SC_AA_SAMPLE_LOCS_8S_WD1, sample_locs_8x[1]);
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_8x;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (nsample) {
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 0:
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, 0);
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX, 0);
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 0;
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, sample_locs_2x[0]);
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX, sample_locs_2x[1]);
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_2x;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, sample_locs_4x[0]);
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX, sample_locs_4x[1]);
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_4x;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 8:
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C1C_PA_SC_AA_SAMPLE_LOCS_MCTX, sample_locs_8x[0]);
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_pipe_state_add_reg(rstate, R_028C20_PA_SC_AA_SAMPLE_LOCS_8D_WD1_MCTX, sample_locs_8x[1]);
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return max_dist_8x;
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	R600_ERR("Invalid nr_samples %i\n", nsample);
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_set_framebuffer_state(struct pipe_context *ctx,
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					const struct pipe_framebuffer_state *state)
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_surface *surf;
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_resource *res;
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_texture *rtex;
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t tl, br, i, nr_samples, max_dist;
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bool is_resolve = state->nr_cbufs == 2 &&
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  state->cbufs[0]->texture->nr_samples > 1 &&
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		          state->cbufs[1]->texture->nr_samples <= 1;
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* The resolve buffer must have CMASK and FMASK to prevent hardlocks on R6xx. */
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bool cb1_force_cmask_fmask = rctx->chip_class == R600 && is_resolve;
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rstate == NULL)
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_flush_framebuffer(rctx, false);
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* unreference old buffer and reference new one */
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_FRAMEBUFFER;
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_copy_framebuffer_state(&rctx->framebuffer, state);
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Colorbuffers. */
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->export_16bpc = true;
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->nr_cbufs = state->nr_cbufs;
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->cb0_is_integer = state->nr_cbufs &&
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       util_format_is_pure_integer(state->cbufs[0]->format);
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->compressed_cb_mask = 0;
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < state->nr_cbufs; i++) {
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bool force_cmask_fmask = cb1_force_cmask_fmask && i == 1;
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf = (struct r600_surface*)state->cbufs[i];
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		res = (struct r600_resource*)surf->base.texture;
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rtex = (struct r600_texture*)res;
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_context_add_resource_size(ctx, state->cbufs[i]->texture);
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!surf->color_initialized || force_cmask_fmask) {
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_init_color_surface(rctx, surf, force_cmask_fmask);
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (force_cmask_fmask) {
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* re-initialize later without compression */
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				surf->color_initialized = false;
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!surf->export_16bpc) {
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rctx->export_16bpc = false;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_028040_CB_COLOR0_BASE + i * 4,
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   surf->cb_color_base, res, RADEON_USAGE_READWRITE);
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_0280A0_CB_COLOR0_INFO + i * 4,
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   surf->cb_color_info, res, RADEON_USAGE_READWRITE);
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028060_CB_COLOR0_SIZE + i * 4,
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					surf->cb_color_size);
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028080_CB_COLOR0_VIEW + i * 4,
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					surf->cb_color_view);
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_0280E0_CB_COLOR0_FRAG + i * 4,
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   surf->cb_color_fmask, surf->cb_buffer_fmask,
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   RADEON_USAGE_READWRITE);
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_0280C0_CB_COLOR0_TILE + i * 4,
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   surf->cb_color_cmask, surf->cb_buffer_cmask,
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   RADEON_USAGE_READWRITE);
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028100_CB_COLOR0_MASK + i * 4,
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					surf->cb_color_mask);
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rtex->fmask_size && rtex->cmask_size) {
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rctx->compressed_cb_mask |= 1 << i;
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* set CB_COLOR1_INFO for possible dual-src blending */
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (i == 1) {
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_0280A0_CB_COLOR0_INFO + 1 * 4,
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   surf->cb_color_info, res, RADEON_USAGE_READWRITE);
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		i++;
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (; i < 8 ; i++) {
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_0280A0_CB_COLOR0_INFO + i * 4, 0);
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Update alpha-test state dependencies.
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Alpha-test is done on the first colorbuffer only. */
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->nr_cbufs) {
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf = (struct r600_surface*)state->cbufs[0];
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->alphatest_state.bypass != surf->alphatest_bypass) {
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rctx->alphatest_state.bypass = surf->alphatest_bypass;
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* ZS buffer. */
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->zsbuf) {
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		surf = (struct r600_surface*)state->zsbuf;
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		res = (struct r600_resource*)surf->base.texture;
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_context_add_resource_size(ctx, state->zsbuf->texture);
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!surf->depth_initialized) {
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_init_depth_surface(rctx, surf);
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_02800C_DB_DEPTH_BASE, surf->db_depth_base,
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   res, RADEON_USAGE_READWRITE);
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028000_DB_DEPTH_SIZE, surf->db_depth_size);
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028004_DB_DEPTH_VIEW, surf->db_depth_view);
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg_bo(rstate, R_028010_DB_DEPTH_INFO, surf->db_depth_info,
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   res, RADEON_USAGE_READWRITE);
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028D34_DB_PREFETCH_LIMIT, surf->db_prefetch_limit);
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Framebuffer dimensions. */
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl = S_028240_TL_X(0) | S_028240_TL_Y(0) | S_028240_WINDOW_OFFSET_DISABLE(1);
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br = S_028244_BR_X(state->width) | S_028244_BR_Y(state->height);
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028204_PA_SC_WINDOW_SCISSOR_TL, tl);
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028208_PA_SC_WINDOW_SCISSOR_BR, br);
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* If we're doing MSAA resolve... */
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (is_resolve) {
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_0287A0_CB_SHADER_CONTROL, 1);
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Always enable the first colorbuffer in CB_SHADER_CONTROL. This
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * will assure that the alpha-test will work even if there is
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * no colorbuffer bound. */
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_0287A0_CB_SHADER_CONTROL,
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					(1ull << MAX2(state->nr_cbufs, 1)) - 1);
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Multisampling */
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->nr_cbufs)
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		nr_samples = state->cbufs[0]->texture->nr_samples;
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else if (state->zsbuf)
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		nr_samples = state->zsbuf->texture->nr_samples;
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		nr_samples = 0;
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	max_dist = r600_set_ms_pos(ctx, rstate, nr_samples);
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (nr_samples > 1) {
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned log_samples = util_logbase2(nr_samples);
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL,
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_028C00_LAST_PIXEL(1) |
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_028C00_EXPAND_LINE_WIDTH(1));
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG,
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_028C04_MSAA_NUM_SAMPLES(log_samples) |
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_028C04_MAX_SAMPLE_DIST(max_dist));
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028C00_PA_SC_LINE_CNTL, S_028C00_LAST_PIXEL(1));
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028C04_PA_SC_AA_CONFIG, 0);
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(rctx->states[R600_PIPE_STATE_FRAMEBUFFER]);
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->states[R600_PIPE_STATE_FRAMEBUFFER] = rstate;
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_context_pipe_state_set(rctx, rstate);
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->zsbuf) {
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_polygon_offset_update(rctx);
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->cb_misc_state.nr_cbufs != state->nr_cbufs) {
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->cb_misc_state.nr_cbufs = state->nr_cbufs;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->nr_cbufs == 0 && rctx->alphatest_state.bypass) {
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->alphatest_state.bypass = false;
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_cb_misc_state(struct r600_context *rctx, struct r600_atom *atom)
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_cb_misc_state *a = (struct r600_cb_misc_state*)atom;
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (G_028808_SPECIAL_OP(a->cb_color_control) == V_028808_SPECIAL_RESOLVE_BOX) {
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2);
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->chip_class == R600) {
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_value(cs, 0xff); /* R_028238_CB_TARGET_MASK */
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_value(cs, 0xff); /* R_02823C_CB_SHADER_MASK */
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_value(cs, 0xf); /* R_028238_CB_TARGET_MASK */
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_value(cs, 0xf); /* R_02823C_CB_SHADER_MASK */
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL, a->cb_color_control);
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned fb_colormask = (1ULL << ((unsigned)a->nr_cbufs * 4)) - 1;
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned ps_colormask = (1ULL << ((unsigned)a->nr_ps_color_outputs * 4)) - 1;
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned multiwrite = a->multiwrite && a->nr_cbufs > 1;
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg_seq(cs, R_028238_CB_TARGET_MASK, 2);
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, a->blend_colormask & fb_colormask); /* R_028238_CB_TARGET_MASK */
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Always enable the first color output to make sure alpha-test works even without one. */
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0xf | (multiwrite ? fb_colormask : ps_colormask)); /* R_02823C_CB_SHADER_MASK */
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg(cs, R_028808_CB_COLOR_CONTROL,
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       a->cb_color_control |
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       S_028808_MULTIWRITE_ENABLE(multiwrite));
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_db_misc_state(struct r600_context *rctx, struct r600_atom *atom)
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_db_misc_state *a = (struct r600_db_misc_state*)atom;
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_render_control = 0;
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_render_override =
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028D10_FORCE_HIZ_ENABLE(V_028D10_FORCE_DISABLE) |
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028D10_FORCE_HIS_ENABLE0(V_028D10_FORCE_DISABLE) |
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028D10_FORCE_HIS_ENABLE1(V_028D10_FORCE_DISABLE);
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (a->occlusion_query_enabled) {
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->chip_class >= R700) {
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_render_control |= S_028D0C_R700_PERFECT_ZPASS_COUNTS(1);
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_render_override |= S_028D10_NOOP_CULL_DISABLE(1);
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (a->flush_depthstencil_through_cb) {
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(a->copy_depth || a->copy_stencil);
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_render_control |= S_028D0C_DEPTH_COPY_ENABLE(a->copy_depth) |
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     S_028D0C_STENCIL_COPY_ENABLE(a->copy_stencil) |
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     S_028D0C_COPY_CENTROID(1) |
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     S_028D0C_COPY_SAMPLE(a->copy_sample);
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_write_context_reg_seq(cs, R_028D0C_DB_RENDER_CONTROL, 2);
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_write_value(cs, db_render_control); /* R_028D0C_DB_RENDER_CONTROL */
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_write_value(cs, db_render_override); /* R_028D10_DB_RENDER_OVERRIDE */
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_vertex_buffers(struct r600_context *rctx, struct r600_atom *atom)
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t dirty_mask = rctx->vertex_buffer_state.dirty_mask;
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (dirty_mask) {
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_vertex_buffer *vb;
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_resource *rbuffer;
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned offset;
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned buffer_index = u_bit_scan(&dirty_mask);
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		vb = &rctx->vertex_buffer_state.vb[buffer_index];
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rbuffer = (struct r600_resource*)vb->buffer;
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(rbuffer);
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset = vb->buffer_offset;
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* fetch resources start at index 320 */
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, (320 + buffer_index) * 7);
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, offset); /* RESOURCEi_WORD0 */
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, /* RESOURCEi_WORD2 */
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 S_038008_ENDIAN_SWAP(r600_endian_swap(32)) |
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 S_038008_STRIDE(vb->stride));
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD3 */
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD4 */
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD5 */
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_constant_buffers(struct r600_context *rctx,
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       struct r600_constbuf_state *state,
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       unsigned buffer_id_base,
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       unsigned reg_alu_constbuf_size,
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       unsigned reg_alu_const_cache)
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t dirty_mask = state->dirty_mask;
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (dirty_mask) {
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_constant_buffer *cb;
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_resource *rbuffer;
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned offset;
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned buffer_index = ffs(dirty_mask) - 1;
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cb = &state->cb[buffer_index];
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rbuffer = (struct r600_resource*)cb->buffer;
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(rbuffer);
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset = cb->buffer_offset;
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg(cs, reg_alu_constbuf_size + buffer_index * 4,
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       ALIGN_DIVUP(cb->buffer_size >> 4, 16));
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_context_reg(cs, reg_alu_const_cache + buffer_index * 4, offset >> 8);
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, (buffer_id_base + buffer_index) * 7);
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, offset); /* RESOURCEi_WORD0 */
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, rbuffer->buf->size - offset - 1); /* RESOURCEi_WORD1 */
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, /* RESOURCEi_WORD2 */
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 S_038008_ENDIAN_SWAP(r600_endian_swap(32)) |
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 S_038008_STRIDE(16));
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD3 */
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD4 */
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0); /* RESOURCEi_WORD5 */
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, 0xc0000000); /* RESOURCEi_WORD6 */
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, r600_context_bo_reloc(rctx, rbuffer, RADEON_USAGE_READ));
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dirty_mask &= ~(1 << buffer_index);
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state->dirty_mask = 0;
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_vs_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_constant_buffers(rctx, &rctx->vs_constbuf_state, 160,
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   R_028180_ALU_CONST_BUFFER_SIZE_VS_0,
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   R_028980_ALU_CONST_CACHE_VS_0);
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_ps_constant_buffers(struct r600_context *rctx, struct r600_atom *atom)
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_constant_buffers(rctx, &rctx->ps_constbuf_state, 0,
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   R_028140_ALU_CONST_BUFFER_SIZE_PS_0,
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   R_028940_ALU_CONST_CACHE_PS_0);
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_sampler_views(struct r600_context *rctx,
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct r600_samplerview_state *state,
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    unsigned resource_id_base)
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t dirty_mask = state->dirty_mask;
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (dirty_mask) {
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_pipe_sampler_view *rview;
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned resource_index = u_bit_scan(&dirty_mask);
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned reloc;
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rview = state->views[resource_index];
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(rview);
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_SET_RESOURCE, 7, 0));
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, (resource_id_base + resource_index) * 7);
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_array(cs, 7, rview->tex_resource_words);
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* XXX The kernel needs two relocations. This is stupid. */
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		reloc = r600_context_bo_reloc(rctx, rview->tex_resource,
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					      RADEON_USAGE_READ);
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, reloc);
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_NOP, 0, 0));
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, reloc);
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state->dirty_mask = 0;
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_vs_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_sampler_views(rctx, &rctx->vs_samplers.views, 160 + R600_MAX_CONST_BUFFERS);
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_ps_sampler_views(struct r600_context *rctx, struct r600_atom *atom)
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_sampler_views(rctx, &rctx->ps_samplers.views, R600_MAX_CONST_BUFFERS);
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_sampler(struct r600_context *rctx,
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct r600_textures_info *texinfo,
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned resource_id_base,
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned border_color_reg)
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < texinfo->n_samplers; i++) {
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (texinfo->samplers[i] == NULL) {
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TEX_ARRAY_OVERRIDE must be set for array textures to disable
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * filtering between layers.
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * Don't update TEX_ARRAY_OVERRIDE if we don't have the sampler view.
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (texinfo->views.views[i]) {
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (texinfo->views.views[i]->base.texture->target == PIPE_TEXTURE_1D_ARRAY ||
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    texinfo->views.views[i]->base.texture->target == PIPE_TEXTURE_2D_ARRAY) {
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				texinfo->samplers[i]->tex_sampler_words[0] |= S_03C000_TEX_ARRAY_OVERRIDE(1);
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				texinfo->is_array_sampler[i] = true;
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			} else {
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				texinfo->samplers[i]->tex_sampler_words[0] &= C_03C000_TEX_ARRAY_OVERRIDE;
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				texinfo->is_array_sampler[i] = false;
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, PKT3(PKT3_SET_SAMPLER, 3, 0));
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_value(cs, (resource_id_base + i) * 3);
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_write_array(cs, 3, texinfo->samplers[i]->tex_sampler_words);
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (texinfo->samplers[i]->border_color_use) {
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned offset;
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset = border_color_reg;
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			offset += i * 16;
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_config_reg_seq(cs, offset, 4);
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			r600_write_array(cs, 4, texinfo->samplers[i]->border_color);
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_vs_sampler(struct r600_context *rctx, struct r600_atom *atom)
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_sampler(rctx, &rctx->vs_samplers, 18, R_00A600_TD_VS_SAMPLER0_BORDER_RED);
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_ps_sampler(struct r600_context *rctx, struct r600_atom *atom)
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_emit_sampler(rctx, &rctx->ps_samplers, 0, R_00A400_TD_PS_SAMPLER0_BORDER_RED);
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_seamless_cube_map(struct r600_context *rctx, struct r600_atom *atom)
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_winsys_cs *cs = rctx->cs;
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned tmp;
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_009508_DISABLE_CUBE_ANISO(1) |
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_009508_SYNC_GRADIENT(1) |
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_009508_SYNC_WALKER(1) |
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_009508_SYNC_ALIGNER(1);
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!rctx->seamless_cube_map.enabled) {
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp |= S_009508_DISABLE_CUBE_WRAP(1);
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_write_config_reg(cs, R_009508_TA_CNTL_AUX, tmp);
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r600_emit_sample_mask(struct r600_context *rctx, struct r600_atom *a)
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_sample_mask *s = (struct r600_sample_mask*)a;
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint8_t mask = s->sample_mask;
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_write_context_reg(rctx->cs, R_028C48_PA_SC_AA_MASK,
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       mask | (mask << 8) | (mask << 16) | (mask << 24));
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_init_state_functions(struct r600_context *rctx)
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->seamless_cube_map.atom, r600_emit_seamless_cube_map, 3, 0);
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_atom_dirty(rctx, &rctx->seamless_cube_map.atom);
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->cb_misc_state.atom, r600_emit_cb_misc_state, 0, 0);
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->db_misc_state.atom, r600_emit_db_misc_state, 4, 0);
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_atom_dirty(rctx, &rctx->db_misc_state.atom);
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->vertex_buffer_state.atom, r600_emit_vertex_buffers, 0, 0);
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->vs_constbuf_state.atom, r600_emit_vs_constant_buffers, 0, 0);
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->ps_constbuf_state.atom, r600_emit_ps_constant_buffers, 0, 0);
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->vs_samplers.views.atom, r600_emit_vs_sampler_views, 0, 0);
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->ps_samplers.views.atom, r600_emit_ps_sampler_views, 0, 0);
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* sampler must be emited before TA_CNTL_AUX otherwise DISABLE_CUBE_WRAP change
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * does not take effect
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->vs_samplers.atom_sampler, r600_emit_vs_sampler, 0, EMIT_EARLY);
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->ps_samplers.atom_sampler, r600_emit_ps_sampler, 0, EMIT_EARLY);
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_atom(&rctx->sample_mask.atom, r600_emit_sample_mask, 3, 0);
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->sample_mask.sample_mask = ~0;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_atom_dirty(rctx, &rctx->sample_mask.atom);
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_blend_state = r600_create_blend_state;
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state;
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_fs_state = r600_create_shader_state_ps;
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_rasterizer_state = r600_create_rs_state;
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_sampler_state = r600_create_sampler_state;
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_sampler_view = r600_create_sampler_view;
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_vertex_elements_state = r600_create_vertex_elements;
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_vs_state = r600_create_shader_state_vs;
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_blend_state = r600_bind_blend_state;
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state;
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_fragment_sampler_states = r600_bind_ps_samplers;
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_fs_state = r600_bind_ps_shader;
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_rasterizer_state = r600_bind_rs_state;
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements;
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vertex_sampler_states = r600_bind_vs_samplers;
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vs_state = r600_bind_vs_shader;
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_blend_state = r600_delete_state;
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_depth_stencil_alpha_state = r600_delete_state;
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_fs_state = r600_delete_ps_shader;
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_rasterizer_state = r600_delete_rs_state;
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_sampler_state = r600_delete_sampler;
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_vertex_elements_state = r600_delete_vertex_element;
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_vs_state = r600_delete_vs_shader;
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_blend_color = r600_set_blend_color;
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_clip_state = r600_set_clip_state;
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_constant_buffer = r600_set_constant_buffer;
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_views;
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_framebuffer_state = r600_set_framebuffer_state;
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_polygon_stipple = r600_set_polygon_stipple;
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_sample_mask = r600_set_sample_mask;
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_scissor_state = r600_pipe_set_scissor_state;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_stencil_ref = r600_set_pipe_stencil_ref;
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_vertex_buffers = r600_set_vertex_buffers;
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_index_buffer = r600_set_index_buffer;
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_views;
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_viewport_state = r600_set_viewport_state;
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.texture_barrier = r600_texture_barrier;
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_stream_output_target = r600_create_so_target;
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.stream_output_target_destroy = r600_so_target_destroy;
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_stream_output_targets = r600_set_so_targets;
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Adjust GPR allocation on R6xx/R7xx */
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_adjust_gprs(struct r600_context *rctx)
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state rstate;
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned num_ps_gprs = rctx->default_ps_gprs;
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned num_vs_gprs = rctx->default_vs_gprs;
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned tmp;
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int diff;
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX: Following call moved from r600_bind_[ps|vs]_shader,
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * it seems eg+ doesn't need it, r6xx/7xx probably need it only for
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * adjusting the GPR allocation?
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Do we need this if we aren't really changing config below? */
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_inval_shader_cache(rctx);
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->ps_shader->current->shader.bc.ngpr > rctx->default_ps_gprs)
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		diff = rctx->ps_shader->current->shader.bc.ngpr - rctx->default_ps_gprs;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs -= diff;
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs += diff;
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->vs_shader->current->shader.bc.ngpr > rctx->default_vs_gprs)
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		diff = rctx->vs_shader->current->shader.bc.ngpr - rctx->default_vs_gprs;
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs -= diff;
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs += diff;
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = 0;
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C04_NUM_PS_GPRS(num_ps_gprs);
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C04_NUM_VS_GPRS(num_vs_gprs);
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C04_NUM_CLAUSE_TEMP_GPRS(rctx->r6xx_num_clause_temp_gprs);
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate.nregs = 0;
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(&rstate, R_008C04_SQ_GPR_RESOURCE_MGMT_1, tmp);
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_context_pipe_state_set(rctx, &rstate);
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_init_atom_start_cs(struct r600_context *rctx)
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int ps_prio;
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int vs_prio;
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int gs_prio;
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int es_prio;
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_ps_gprs;
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_vs_gprs;
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_gs_gprs;
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_es_gprs;
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_temp_gprs;
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_ps_threads;
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_vs_threads;
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_gs_threads;
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_es_threads;
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_ps_stack_entries;
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_vs_stack_entries;
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_gs_stack_entries;
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_es_stack_entries;
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	enum radeon_family family;
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_command_buffer *cb = &rctx->start_cs_cmd;
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t tmp;
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_init_command_buffer(cb, 256, EMIT_EARLY);
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R6xx requires this packet at the start of each command buffer */
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class == R600) {
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_value(cb, PKT3(PKT3_START_3D_CMDBUF, 0, 0));
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_value(cb, 0);
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* All asics require this one */
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, PKT3(PKT3_CONTEXT_CONTROL, 1, 0));
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x80000000);
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x80000000);
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	family = rctx->family;
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ps_prio = 0;
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	vs_prio = 1;
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	gs_prio = 2;
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	es_prio = 3;
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (family) {
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_R600:
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 192;
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 56;
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 136;
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 48;
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 4;
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 4;
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 128;
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 128;
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 0;
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 0;
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV630:
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV635:
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 84;
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 36;
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 144;
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 40;
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 4;
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 4;
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 40;
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 40;
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 32;
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 16;
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV610:
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV620:
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RS780:
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RS880:
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 84;
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 36;
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 136;
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 48;
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 4;
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 4;
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 40;
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 40;
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 32;
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 16;
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV670:
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 144;
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 40;
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 136;
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 48;
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 4;
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 4;
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 40;
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 40;
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 32;
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 16;
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV770:
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 192;
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 56;
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 188;
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 60;
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 0;
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 0;
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 256;
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 256;
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 0;
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 0;
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV730:
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV740:
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 84;
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 36;
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 188;
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 60;
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 0;
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 0;
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 128;
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 128;
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 0;
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 0;
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV710:
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_gprs = 192;
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_gprs = 56;
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_temp_gprs = 4;
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_gprs = 0;
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_gprs = 0;
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_threads = 144;
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_threads = 48;
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_threads = 0;
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_threads = 0;
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_ps_stack_entries = 128;
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_vs_stack_entries = 128;
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_gs_stack_entries = 0;
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_es_stack_entries = 0;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->default_ps_gprs = num_ps_gprs;
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->default_vs_gprs = num_vs_gprs;
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->r6xx_num_clause_temp_gprs = num_temp_gprs;
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* SQ_CONFIG */
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = 0;
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (family) {
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV610:
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV620:
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RS780:
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RS880:
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case CHIP_RV710:
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp |= S_008C00_VC_ENABLE(1);
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_DX9_CONSTS(0);
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_ALU_INST_PREFER_VECTOR(1);
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_PS_PRIO(ps_prio);
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_VS_PRIO(vs_prio);
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_GS_PRIO(gs_prio);
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C00_ES_PRIO(es_prio);
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_config_reg(cb, R_008C00_SQ_CONFIG, tmp);
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* SQ_GPR_RESOURCE_MGMT_2 */
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_008C08_NUM_GS_GPRS(num_gs_gprs);
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C08_NUM_ES_GPRS(num_es_gprs);
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_config_reg_seq(cb, R_008C08_SQ_GPR_RESOURCE_MGMT_2, 4);
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, tmp);
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* SQ_THREAD_RESOURCE_MGMT */
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_008C0C_NUM_PS_THREADS(num_ps_threads);
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C0C_NUM_VS_THREADS(num_vs_threads);
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C0C_NUM_GS_THREADS(num_gs_threads);
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C0C_NUM_ES_THREADS(num_es_threads);
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, tmp); /* R_008C0C_SQ_THREAD_RESOURCE_MGMT */
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* SQ_STACK_RESOURCE_MGMT_1 */
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_008C10_NUM_PS_STACK_ENTRIES(num_ps_stack_entries);
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C10_NUM_VS_STACK_ENTRIES(num_vs_stack_entries);
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, tmp); /* R_008C10_SQ_STACK_RESOURCE_MGMT_1 */
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* SQ_STACK_RESOURCE_MGMT_2 */
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_008C14_NUM_GS_STACK_ENTRIES(num_gs_stack_entries);
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp |= S_008C14_NUM_ES_STACK_ENTRIES(num_es_stack_entries);
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, tmp); /* R_008C14_SQ_STACK_RESOURCE_MGMT_2 */
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_config_reg(cb, R_009714_VC_ENHANCE, 0);
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class >= R700) {
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0x00004000);
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_009830_DB_DEBUG, 0);
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x00420204);
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 0);
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_008D8C_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_009830_DB_DEBUG, 0x82000000);
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_config_reg(cb, R_009838_DB_WATERMARKS, 0x01020204);
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_context_reg(cb, R_0286C8_SPI_THREAD_GROUPING, 1);
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_0288A8_SQ_ESGS_RING_ITEMSIZE, 9);
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288A8_SQ_ESGS_RING_ITEMSIZE */
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288AC_SQ_GSVS_RING_ITEMSIZE */
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288B0_SQ_ESTMP_RING_ITEMSIZE */
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288B4_SQ_GSTMP_RING_ITEMSIZE */
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288B8_SQ_VSTMP_RING_ITEMSIZE */
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288BC_SQ_PSTMP_RING_ITEMSIZE */
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288C0_SQ_FBUF_RING_ITEMSIZE */
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288C4_SQ_REDUC_RING_ITEMSIZE */
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288C8_SQ_GS_VERT_ITEMSIZE */
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028A10_VGT_OUTPUT_PATH_CNTL, 13);
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A10_VGT_OUTPUT_PATH_CNTL */
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A14_VGT_HOS_CNTL */
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A18_VGT_HOS_MAX_TESS_LEVEL */
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A1C_VGT_HOS_MIN_TESS_LEVEL */
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A20_VGT_HOS_REUSE_DEPTH */
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A24_VGT_GROUP_PRIM_TYPE */
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A28_VGT_GROUP_FIRST_DECR */
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A2C_VGT_GROUP_DECR */
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A30_VGT_GROUP_VECT_0_CNTL */
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A34_VGT_GROUP_VECT_1_CNTL */
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A38_VGT_GROUP_VECT_0_FMT_CNTL */
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL */
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028A40_VGT_GS_MODE, 0); */
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028A84_VGT_PRIMITIVEID_EN, 0);
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028AA0_VGT_INSTANCE_STEP_RATE_0, 0);
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028AA4_VGT_INSTANCE_STEP_RATE_1, 0);
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028AB0_VGT_STRMOUT_EN, 3);
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028AB0_VGT_STRMOUT_EN */
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 1); /* R_028AB4_VGT_REUSE_OFF */
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028AB8_VGT_VTX_CNT_EN */
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028B20_VGT_STRMOUT_BUFFER_EN, 0);
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028400_VGT_MAX_VTX_INDX, 2);
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, ~0); /* R_028400_VGT_MAX_VTX_INDX */
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028404_VGT_MIN_VTX_INDX */
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_ctl_const(cb, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0);
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028028_DB_STENCIL_CLEAR, 2);
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028028_DB_STENCIL_CLEAR */
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_02802C_DB_DEPTH_CLEAR */
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_0286DC_SPI_FOG_CNTL, 3);
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0286DC_SPI_FOG_CNTL */
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0286E0_SPI_FOG_FUNC_SCALE */
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0286E4_SPI_FOG_FUNC_BIAS */
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028D2C_DB_SRESULTS_COMPARE_STATE1, 2);
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028D2C_DB_SRESULTS_COMPARE_STATE1 */
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028D30_DB_PRELOAD_CONTROL */
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028820_PA_CL_NANINF_CNTL, 0);
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028A48_PA_SC_MPASS_PS_CNTL, 0);
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028C0C_PA_CL_GB_VERT_CLIP_ADJ, 4);
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_028C0C_PA_CL_GB_VERT_CLIP_ADJ */
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_028C10_PA_CL_GB_VERT_DISC_ADJ */
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_028C14_PA_CL_GB_HORZ_CLIP_ADJ */
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_028C18_PA_CL_GB_HORZ_DISC_ADJ */
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_0282D0_PA_SC_VPORT_ZMIN_0, 2);
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0282D0_PA_SC_VPORT_ZMIN_0 */
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x3F800000); /* R_0282D4_PA_SC_VPORT_ZMAX_0 */
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028818_PA_CL_VTE_CNTL, 0x43F);
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028200_PA_SC_WINDOW_OFFSET, 0);
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF);
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class >= R700) {
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_context_reg(cb, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028C30_CB_CLRCMP_CONTROL, 4);
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0x1000000);  /* R_028C30_CB_CLRCMP_CONTROL */
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0);          /* R_028C34_CB_CLRCMP_SRC */
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0xFF);       /* R_028C38_CB_CLRCMP_DST */
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0xFFFFFFFF); /* R_028C3C_CB_CLRCMP_MSK */
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028030_PA_SC_SCREEN_SCISSOR_TL, 2);
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028030_PA_SC_SCREEN_SCISSOR_TL */
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, S_028034_BR_X(8192) | S_028034_BR_Y(8192)); /* R_028034_PA_SC_SCREEN_SCISSOR_BR */
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_028240_PA_SC_GENERIC_SCISSOR_TL, 2);
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_028240_PA_SC_GENERIC_SCISSOR_TL */
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, S_028244_BR_X(8192) | S_028244_BR_Y(8192)); /* R_028244_PA_SC_GENERIC_SCISSOR_BR */
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg_seq(cb, R_0288CC_SQ_PGM_CF_OFFSET_PS, 2);
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288CC_SQ_PGM_CF_OFFSET_PS */
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_value(cb, 0); /* R_0288D0_SQ_PGM_CF_OFFSET_VS */
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_0288A4_SQ_PGM_RESOURCES_FS, 0);
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_0288DC_SQ_PGM_CF_OFFSET_FS, 0);
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class == R700 && rctx->screen->has_streamout)
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_context_reg(cb, R_028354_SX_SURFACE_SYNC, S_028354_SURFACE_SYNC_MASK(0xf));
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_context_reg(cb, R_028800_DB_DEPTH_CONTROL, 0);
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->screen->has_streamout) {
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_store_context_reg(cb, R_028B28_VGT_STRMOUT_DRAW_OPAQUE_OFFSET, 0);
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0, 0x1000FFF);
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_store_loop_const(cb, R_03E200_SQ_LOOP_CONST_0 + (32 * 4), 0x1000FFF);
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = &shader->rstate;
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader *rshader = &shader->shader;
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i, exports_ps, num_cout, spi_ps_in_control_0, spi_input_z, spi_ps_in_control_1, db_shader_control;
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int pos_index = -1, face_index = -1;
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned tmp, sid, ufi = 0;
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int need_linear = 0;
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned z_export = 0, stencil_export = 0;
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->nregs = 0;
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < rshader->ninput; i++) {
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pos_index = i;
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			face_index = i;
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sid = rshader->input[i].spi_sid;
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp = S_028644_SEMANTIC(sid);
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].name == TGSI_SEMANTIC_POSITION ||
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			rshader->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(rshader->input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				rctx->rasterizer && rctx->rasterizer->flatshade))
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_028644_FLAT_SHADE(1);
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].name == TGSI_SEMANTIC_GENERIC &&
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				rctx->sprite_coord_enable & (1 << rshader->input[i].sid)) {
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_028644_PT_SPRITE_TEX(1);
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].centroid)
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_028644_SEL_CENTROID(1);
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR) {
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			need_linear = 1;
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_028644_SEL_LINEAR(1);
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4,
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tmp);
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < rshader->noutput; i++) {
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			z_export = 1;
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->output[i].name == TGSI_SEMANTIC_STENCIL)
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			stencil_export = 1;
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_shader_control |= S_02880C_Z_EXPORT_ENABLE(z_export);
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_shader_control |= S_02880C_STENCIL_REF_EXPORT_ENABLE(stencil_export);
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rshader->uses_kill)
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_shader_control |= S_02880C_KILL_ENABLE(1);
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	exports_ps = 0;
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < rshader->noutput; i++) {
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION ||
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    rshader->output[i].name == TGSI_SEMANTIC_STENCIL) {
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			exports_ps |= 1;
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	num_cout = rshader->nr_ps_color_exports;
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	exports_ps |= S_028854_EXPORT_COLORS(num_cout);
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!exports_ps) {
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* always at least export 1 component per pixel */
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		exports_ps = 2;
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->nr_ps_color_outputs = num_cout;
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	spi_ps_in_control_0 = S_0286CC_NUM_INTERP(rshader->ninput) |
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_0286CC_PERSP_GRADIENT_ENA(1)|
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_0286CC_LINEAR_GRADIENT_ENA(need_linear);
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	spi_input_z = 0;
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pos_index != -1) {
2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		spi_ps_in_control_0 |= (S_0286CC_POSITION_ENA(1) |
2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_0286CC_POSITION_CENTROID(rshader->input[pos_index].centroid) |
2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_0286CC_POSITION_ADDR(rshader->input[pos_index].gpr) |
2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					S_0286CC_BARYC_SAMPLE_CNTL(1));
2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		spi_input_z |= 1;
2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	spi_ps_in_control_1 = 0;
2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (face_index != -1) {
2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		spi_ps_in_control_1 |= S_0286D0_FRONT_FACE_ENA(1) |
2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D0_FRONT_FACE_ADDR(rshader->input[face_index].gpr);
2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* HW bug in original R600 */
2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->family == CHIP_R600)
2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ufi = 1;
2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_0286CC_SPI_PS_IN_CONTROL_0, spi_ps_in_control_0);
2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_0286D0_SPI_PS_IN_CONTROL_1, spi_ps_in_control_1);
2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate, R_0286D8_SPI_INPUT_Z, spi_input_z);
2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg_bo(rstate,
2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   R_028840_SQ_PGM_START_PS,
2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0, shader->bo, RADEON_USAGE_READ);
2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028850_SQ_PGM_RESOURCES_PS,
2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028850_NUM_GPRS(rshader->bc.ngpr) |
2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028850_STACK_SIZE(rshader->bc.nstack) |
2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028850_UNCACHED_FIRST_INST(ufi));
2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028854_SQ_PGM_EXPORTS_PS,
2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				exports_ps);
2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* only set some bits here, the other bits are set in the dsa state */
2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->db_shader_control = db_shader_control;
2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->ps_depth_export = z_export | stencil_export;
2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->sprite_coord_enable = rctx->sprite_coord_enable;
2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->rasterizer)
2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->flatshade = rctx->rasterizer->flatshade;
2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader)
2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate = &shader->rstate;
2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_shader *rshader = &shader->shader;
2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned spi_vs_out_id[10] = {};
2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i, tmp, nparams = 0;
2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* clear previous register */
2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->nregs = 0;
2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < rshader->noutput; i++) {
2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rshader->output[i].spi_sid) {
2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8);
2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			spi_vs_out_id[nparams / 4] |= tmp;
2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			nparams++;
2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 10; i++) {
2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(rstate,
2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					R_028614_SPI_VS_OUT_ID_0 + i * 4,
2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					spi_vs_out_id[i]);
2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Certain attributes (position, psize, etc.) don't count as params.
2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * VS is required to export at least one param and r600_shader_from_tgsi()
2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * takes care of adding a dummy export.
2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (nparams < 1)
2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		nparams = 1;
2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_0286C4_SPI_VS_OUT_CONFIG,
2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_0286C4_VS_EXPORT_COUNT(nparams - 1));
2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg(rstate,
2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				R_028868_SQ_PGM_RESOURCES_VS,
2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028868_NUM_GPRS(rshader->bc.ngpr) |
2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028868_STACK_SIZE(rshader->bc.nstack));
2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg_bo(rstate,
2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R_028858_SQ_PGM_START_VS,
2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			0, shader->bo, RADEON_USAGE_READ);
2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->pa_cl_vs_out_cntl =
2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_VS_OUT_CCDIST0_VEC_ENA((rshader->clip_dist_write & 0x0F) != 0) |
2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_VS_OUT_CCDIST1_VEC_ENA((rshader->clip_dist_write & 0xF0) != 0) |
2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_VS_OUT_MISC_VEC_ENA(rshader->vs_out_misc_write) |
2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_USE_VTX_POINT_SIZE(rshader->vs_out_point_size);
2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_fetch_shader(struct pipe_context *ctx,
2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       struct r600_vertex_element *ve)
2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = &ve->rstate;
2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->id = R600_PIPE_STATE_FETCH_SHADER;
2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->nregs = 0;
2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r600_pipe_state_add_reg_bo(rstate, R_028894_SQ_PGM_START_FS,
2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				0,
2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ve->fetch_shader, RADEON_USAGE_READ);
2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *r600_create_resolve_blend(struct r600_context *rctx)
2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_blend_state blend;
2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned i;
2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&blend, 0, sizeof(blend));
2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend.independent_blend_enable = true;
2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 2; i++) {
2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].colormask = 0xf;
2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].blend_enable = 1;
2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].rgb_func = PIPE_BLEND_ADD;
2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].alpha_func = PIPE_BLEND_ADD;
2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].rgb_src_factor = PIPE_BLENDFACTOR_ZERO;
2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX);
2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *r700_create_resolve_blend(struct r600_context *rctx)
2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_blend_state blend;
2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&blend, 0, sizeof(blend));
2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend.independent_blend_enable = true;
2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend.rt[0].colormask = 0xf;
2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_RESOLVE_BOX);
2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *r600_create_decompress_blend(struct r600_context *rctx)
2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_blend_state blend;
2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_state *rstate;
2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&blend, 0, sizeof(blend));
2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend.independent_blend_enable = true;
2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend.rt[0].colormask = 0xf;
2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate = r600_create_blend_state_mode(&rctx->context, &blend, V_028808_SPECIAL_EXPAND_SAMPLES);
2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *r600_create_db_flush_dsa(struct r600_context *rctx)
2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_depth_stencil_alpha_state dsa;
2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean quirk = false;
2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 ||
2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635)
2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		quirk = true;
2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&dsa, 0, sizeof(dsa));
2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (quirk) {
2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.depth.enabled = 1;
2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.depth.func = PIPE_FUNC_LEQUAL;
2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.stencil[0].enabled = 1;
2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_KEEP;
2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_INCR;
2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dsa.stencil[0].writemask = 0xff;
2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r600_update_dual_export_state(struct r600_context * rctx)
2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned dual_export = rctx->export_16bpc && rctx->nr_cbufs &&
2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       !rctx->ps_shader->current->ps_depth_export;
2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_shader_control = rctx->ps_shader->current->db_shader_control |
2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     S_02880C_DUAL_EXPORT_ENABLE(dual_export);
2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (db_shader_control != rctx->db_shader_control) {
2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r600_pipe_state rstate;
2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->db_shader_control = db_shader_control;
2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rstate.nregs = 0;
2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_pipe_state_add_reg(&rstate, R_02880C_DB_SHADER_CONTROL, db_shader_control);
2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_context_pipe_state_set(rctx, &rstate);
2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2730