1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2012 Advanced Micro Devices, Inc.
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 * Authors:
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *      Christian König <christian.koenig@amd.com>
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_framebuffer.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_blitter.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeonsi_pipe.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeonsi_shader.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "si_state.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "sid.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * inferred framebuffer and blender state
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_fb_blend_state(struct r600_context *rctx)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_blend *blend = rctx->queued.named.blend;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t mask;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (blend == NULL)
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pm4 = CALLOC_STRUCT(si_pm4_state);
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pm4 == NULL)
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mask &= blend->cb_target_mask;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask);
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, fb_blend, pm4);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Blender functions
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_blend_function(int blend_func)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (blend_func) {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_ADD:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_COMB_DST_PLUS_SRC;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_SUBTRACT:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_COMB_SRC_MINUS_DST;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_REVERSE_SUBTRACT:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_COMB_DST_MINUS_SRC;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_MIN:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_COMB_MIN_DST_SRC;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLEND_MAX:
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_COMB_MAX_DST_SRC;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Unknown blend function %d\n", blend_func);
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_blend_factor(int blend_fact)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (blend_fact) {
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_ONE:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_COLOR:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_SRC_COLOR;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_ALPHA:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_SRC_ALPHA;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_DST_ALPHA:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_DST_ALPHA;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_DST_COLOR:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_DST_COLOR;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_SRC_ALPHA_SATURATE;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_CONST_COLOR:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_CONSTANT_COLOR;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_CONST_ALPHA:
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_CONSTANT_ALPHA;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_ZERO:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ZERO;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_DST_COLOR:
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_DST_COLOR;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC1_COLOR:
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_SRC1_COLOR;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_SRC1_ALPHA:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_SRC1_ALPHA;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_INV_SRC1_COLOR;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028780_BLEND_INV_SRC1_ALPHA;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_blend_state(struct pipe_context *ctx,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   const struct pipe_blend_state *state)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = &blend->pm4;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t color_control;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (blend == NULL)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	color_control = S_028808_MODE(V_028808_CB_NORMAL);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->logicop_enable) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4));
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_control |= S_028808_ROP3(0xcc);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blend->cb_target_mask = 0;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < 8; i++) {
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* state->rt entries > 0 only written if independent blending */
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const int j = state->independent_blend_enable ? i : 0;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned eqRGB = state->rt[j].rgb_func;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned srcRGB = state->rt[j].rgb_src_factor;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dstRGB = state->rt[j].rgb_dst_factor;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned eqA = state->rt[j].alpha_func;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned srcA = state->rt[j].alpha_src_factor;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dstA = state->rt[j].alpha_dst_factor;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned blend_cntl = 0;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend->cb_target_mask |= state->rt[j].colormask << (4 * i);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!state->rt[j].blend_enable) {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			continue;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_cntl |= S_028780_ENABLE(1);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB));
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB));
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB));
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA));
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA));
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA));
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return blend;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_blend_state(struct pipe_context *ctx, void *state)
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_fb_blend_state(rctx);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_blend_state(struct pipe_context *ctx, void *state)
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_blend_color(struct pipe_context *ctx,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const struct pipe_blend_color *state)
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (pm4 == NULL)
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0]));
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1]));
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2]));
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3]));
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, blend_color, pm4);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clipping, scissors and viewport
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_clip_state(struct pipe_context *ctx,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const struct pipe_clip_state *state)
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pm4 == NULL)
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < 6; i++) {
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       fui(state->ucp[i][0]));
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       fui(state->ucp[i][1]));
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16,
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       fui(state->ucp[i][2]));
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16,
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       fui(state->ucp[i][3]));
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        }
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, clip, pm4);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_scissor_state(struct pipe_context *ctx,
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const struct pipe_scissor_state *state)
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t tl, br;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pm4 == NULL)
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy);
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, scissor, pm4);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_viewport_state(struct pipe_context *ctx,
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const struct pipe_viewport_state *state)
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = &viewport->pm4;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (viewport == NULL)
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	viewport->viewport = *state;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000);
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]));
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]));
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]));
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]));
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]));
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]));
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, viewport, viewport);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * inferred state between framebuffer and rasterizer
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_fb_rs_state(struct r600_context *rctx)
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_rasterizer *rs = rctx->queued.named.rasterizer;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned offset_db_fmt_cntl = 0, depth;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	float offset_units;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!rs || !rctx->framebuffer.zsbuf)
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset_units = rctx->queued.named.rasterizer->offset_units;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (rctx->framebuffer.zsbuf->texture->format) {
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = -24;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset_units *= 2.0f;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = -23;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset_units *= 1.0f;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = -16;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset_units *= 4.0f;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pm4 = CALLOC_STRUCT(si_pm4_state);
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* FIXME some of those reg can be computed with cso */
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       fui(rctx->queued.named.rasterizer->offset_scale));
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units));
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       fui(rctx->queued.named.rasterizer->offset_scale));
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units));
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, fb_rs, pm4);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rasterizer
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_fill(uint32_t func)
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch(func) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_POLYGON_MODE_FILL:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028814_X_DRAW_TRIANGLES;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_POLYGON_MODE_LINE:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028814_X_DRAW_LINES;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_POLYGON_MODE_POINT:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028814_X_DRAW_POINTS;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028814_X_DRAW_POINTS;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_rs_state(struct pipe_context *ctx,
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const struct pipe_rasterizer_state *state)
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = &rs->pm4;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned tmp;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned prov_vtx = 1, polygon_dual_mode;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned clip_rule;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	float psize_min, psize_max;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rs == NULL) {
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				state->fill_back != PIPE_POLYGON_MODE_FILL);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->flatshade_first)
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		prov_vtx = 0;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->flatshade = state->flatshade;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->sprite_coord_enable = state->sprite_coord_enable;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_sc_line_stipple = state->line_stipple_enable ?
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_su_sc_mode_cntl =
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_PROVOKING_VTX_LAST(prov_vtx) |
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) |
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_FACE(!state->front_ccw) |
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLY_MODE(polygon_dual_mode) |
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) |
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back));
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_cl_clip_cntl =
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_PS_UCP_MODE(3) |
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->pa_cl_vs_out_cntl =
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) |
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex);
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	clip_rule = state->scissor ? 0xAAAA : 0xFFFF;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* offset */
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->offset_units = state->offset_units;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs->offset_scale = state->offset_scale * 12.0f;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* XXX: Flat shading hangs the GPU */
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = S_0286D4_FLAT_SHADE_ENA(0);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->sprite_coord_enable) {
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) |
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) |
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) |
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000);
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* point size 12.4 fixed point */
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = (unsigned)(state->point_size * 8.0);
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp));
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->point_size_per_vertex) {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_min = util_get_min_point_size(state);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_max = 8192;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* Force the point size to be as if the vertex output was disabled. */
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_min = state->point_size;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		psize_max = state->point_size;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Divide by two, because 0.5 = 1 pixel. */
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX,
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)));
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tmp = (unsigned)state->line_width * 8;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp));
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0,
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable));
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			S_028BE4_PIX_CENTER(state->gl_rasterization_rules));
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000);
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000);
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000);
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp));
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rs;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_rs_state(struct pipe_context *ctx, void *state)
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state == NULL)
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	// TODO
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->sprite_coord_enable = rs->sprite_coord_enable;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_bind_state(rctx, rasterizer, rs);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_fb_rs_state(rctx);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_rs_state(struct pipe_context *ctx, void *state)
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * infeered state between dsa and stencil ref
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_update_dsa_stencil_ref(struct r600_context *rctx)
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_stencil_ref *ref = &rctx->stencil_ref;
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct si_state_dsa *dsa = rctx->queued.named.dsa;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (pm4 == NULL)
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK,
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028430_STENCILTESTVAL(ref->ref_value[0]) |
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028430_STENCILMASK(dsa->valuemask[0]) |
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028430_STENCILWRITEMASK(dsa->writemask[0]));
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF,
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) |
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028434_STENCILMASK_BF(dsa->valuemask[1]) |
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028434_STENCILWRITEMASK_BF(dsa->writemask[1]));
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, dsa_stencil_ref, pm4);
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx,
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    const struct pipe_stencil_ref *state)
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct r600_context *rctx = (struct r600_context *)ctx;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rctx->stencil_ref = *state;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_dsa_stencil_ref(rctx);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DSA
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_stencil_op(int s_op)
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (s_op) {
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_KEEP:
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_KEEP;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_ZERO:
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_ZERO;
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_REPLACE:
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_REPLACE_TEST;
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_INCR:
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_ADD_CLAMP;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_DECR:
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_SUB_CLAMP;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_INCR_WRAP:
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_ADD_WRAP;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_DECR_WRAP:
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_SUB_WRAP;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_STENCIL_OP_INVERT:
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_02842C_STENCIL_INVERT;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Unknown stencil op %d", s_op);
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(0);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_dsa_state(struct pipe_context *ctx,
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const struct pipe_depth_stencil_alpha_state *state)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa);
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = &dsa->pm4;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_depth_control, /* alpha_test_control, */ alpha_ref;
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned db_render_override, db_render_control;
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t db_stencil_control = 0;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dsa == NULL) {
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->valuemask[0] = state->stencil[0].valuemask;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->valuemask[1] = state->stencil[1].valuemask;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->writemask[0] = state->stencil[0].writemask;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->writemask[1] = state->stencil[1].writemask;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028800_ZFUNC(state->depth.func);
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* stencil */
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->stencil[0].enabled) {
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCIL_ENABLE(1);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func);
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op));
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op));
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op));
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (state->stencil[1].enabled) {
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_BACKFACE_ENABLE(1);
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op));
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op));
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op));
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* alpha */
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	//alpha_test_control = 0;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	alpha_ref = 0;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->alpha.enabled) {
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		//alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		//alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		alpha_ref = fui(state->alpha.ref_value);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->alpha_ref = alpha_ref;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* misc */
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_render_control = 0;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* TODO db_render_override depends on query */
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000);
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000);
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	//si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control);
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control);
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control);
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override);
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control);
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0);
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0);
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0);
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00);
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	dsa->db_render_override = db_render_override;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return dsa;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state)
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct r600_context *rctx = (struct r600_context *)ctx;
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct si_state_dsa *dsa = state;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        if (state == NULL)
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_bind_state(rctx, dsa, dsa);
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_dsa_stencil_ref(rctx);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	// TODO
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rctx->alpha_ref = dsa->alpha_ref;
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        rctx->alpha_ref_dirty = true;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state)
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state);
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_db_flush_dsa(struct r600_context *rctx)
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct pipe_depth_stencil_alpha_state dsa;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        struct si_state_dsa *state;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memset(&dsa, 0, sizeof(dsa));
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL,
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028000_DEPTH_COPY(1) |
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028000_STENCIL_COPY(1) |
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028000_COPY_CENTROID(1));
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return state;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format translation
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_colorformat(enum pipe_format format)
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 8-bit buffers. */
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UNORM:
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UINT:
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SINT:
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UNORM:
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UINT:
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SINT:
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UNORM:
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UINT:
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SINT:
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SRGB:
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UNORM:
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SNORM:
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UINT:
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SINT:
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_8;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 16-bit buffers. */
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G6R5_UNORM:
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_5_6_5;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5A1_UNORM:
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5X1_UNORM:
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_1_5_5_5;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4A4_UNORM:
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4X4_UNORM:
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_4_4_4_4;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UNORM:
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UINT:
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SINT:
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SRGB:
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UNORM:
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UINT:
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SINT:
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_8_8;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UNORM:
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UINT:
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SINT:
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_FLOAT:
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_FLOAT:
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_16;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 32-bit buffers. */
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_SRGB:
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_UNORM:
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8R8G8B8_UNORM:
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_SRGB:
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_UNORM:
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8X8_UNORM:
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SNORM:
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UNORM:
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8X8_UNORM:
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8B8G8R8_UNORM:
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8R8G8B8_UNORM:
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8_UNORM:
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SSCALED:
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_USCALED:
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SINT:
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UINT:
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_8_8_8_8;
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10A2_UNORM:
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10X2_SNORM:
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UNORM:
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UINT:
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_2_10_10_10;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_8_24;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8Z24_UNORM:
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_24_8;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_X24_8_32_FLOAT;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_FLOAT:
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_32;
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SSCALED:
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UNORM:
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UINT:
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SINT:
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_16_16;
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R11G11B10_FLOAT:
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_10_11_11;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 64-bit buffers. */
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16_USCALED:
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16_SSCALED:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UINT:
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SINT:
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_USCALED:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SSCALED:
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UNORM:
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SNORM:
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16_FLOAT:
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_FLOAT:
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_16_16_16_16;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_FLOAT:
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_USCALED:
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_SSCALED:
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_SINT:
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_UINT:
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_32_32;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 128-bit buffers. */
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SNORM:
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UNORM:
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SSCALED:
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_USCALED:
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SINT:
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UINT:
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_FLOAT:
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_COLOR_32_32_32_32;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* YUV buffers. */
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_UYVY:
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_YUYV:
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 96-bit buffers. */
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32_FLOAT:
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 8-bit buffers. */
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L4A4_UNORM:
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R4A4_UNORM:
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A4R4_UNORM:
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U; /* Unsupported. */
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_colorswap(enum pipe_format format)
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 8-bit buffers. */
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L4A4_UNORM:
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A4R4_UNORM:
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UNORM:
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_UINT:
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8_SINT:
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R4A4_UNORM:
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT_REV;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UNORM:
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UNORM:
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_UINT:
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_I8_SINT:
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_UINT:
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SINT:
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8_SRGB:
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UNORM:
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SNORM:
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_UINT:
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8_SINT:
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 16-bit buffers. */
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G6R5_UNORM:
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD_REV;
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5A1_UNORM:
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B5G5R5X1_UNORM:
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4A4_UNORM:
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B4G4R4X4_UNORM:
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UNORM:
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_UINT:
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SINT:
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_L8A8_SRGB:
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UNORM:
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_UINT:
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8_SINT:
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UNORM:
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_UINT:
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_SINT:
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16_FLOAT:
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 32-bit buffers. */
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_SRGB:
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD_REV;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_SRGB:
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8A8_UNORM:
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B8G8R8X8_UNORM:
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8R8G8B8_UNORM:
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8R8G8B8_UNORM:
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT_REV;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SNORM:
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UNORM:
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SSCALED:
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_USCALED:
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_SINT:
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8A8_UINT:
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R8G8B8X8_UNORM:
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_A8B8G8R8_UNORM:
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8B8G8R8_UNORM:
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD_REV;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_X8Z24_UNORM:
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10A2_UNORM:
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10G10B10X2_SNORM:
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UNORM:
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_B10G10R10A2_UINT:
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_ALT;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R11G11B10_FLOAT:
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_FLOAT:
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_UINT:
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32_SINT:
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_FLOAT:
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UNORM:
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_UINT:
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16_SINT:
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 64-bit buffers. */
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_FLOAT:
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_UINT:
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32_SINT:
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UNORM:
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SNORM:
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_USCALED:
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SSCALED:
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_UINT:
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_SINT:
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R16G16B16A16_FLOAT:
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* 128-bit buffers. */
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_FLOAT:
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SNORM:
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UNORM:
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SSCALED:
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_USCALED:
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_SINT:
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_R32G32B32A32_UINT:
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_SWAP_STD;
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("unsupported colorswap format %d\n", format);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ~0U;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat)
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (R600_BIG_ENDIAN) {
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(colorformat) {
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 8-bit buffers. */
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_8:
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_NONE;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 16-bit buffers. */
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_5_6_5:
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_1_5_5_5:
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_4_4_4_4:
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_16:
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_8_8:
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_8IN16;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 32-bit buffers. */
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_8_8_8_8:
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_2_10_10_10:
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_8_24:
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_24_8:
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_16_16:
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_8IN32;
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 64-bit buffers. */
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_16_16_16_16:
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_8IN16;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_32_32:
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_8IN32;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* 128-bit buffers. */
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028C70_COLOR_32_32_32_32:
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_8IN32;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_028C70_ENDIAN_NONE; /* Unsupported. */
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028C70_ENDIAN_NONE;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Returns the size in bits of the widest component of a CB format */
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_colorformat_max_comp_size(uint32_t colorformat)
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch(colorformat) {
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_4_4_4_4:
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 4;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_1_5_5_5:
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_5_5_5_1:
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 5;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_5_6_5:
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 6;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_8:
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_8_8:
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_8_8_8_8:
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 8;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_10_10_10_2:
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_2_10_10_10:
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 10;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_10_11_11:
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_11_11_10:
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 11;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_16:
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_16_16:
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_16_16_16_16:
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 16;
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_8_24:
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_24_8:
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 24;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_32:
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_32_32:
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_32_32_32_32:
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case V_028C70_COLOR_X24_8_32_FLOAT:
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 32;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(!"Unknown maximum component size");
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_dbformat(enum pipe_format format)
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (format) {
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z16_UNORM:
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028040_Z_16;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24X8_UNORM:
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028040_Z_24; /* XXX no longer supported on SI */
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT:
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_028040_Z_32_FLOAT;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return ~0U;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture translation
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_texformat(struct pipe_screen *screen,
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       enum pipe_format format,
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       const struct util_format_description *desc,
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       int first_non_void)
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	boolean uniform = TRUE;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Colorspace (return non-RGB formats directly). */
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (desc->colorspace) {
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Depth stencil formats */
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_COLORSPACE_ZS:
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (format) {
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z16_UNORM:
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_16;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_X24S8_UINT:
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z24X8_UNORM:
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_24_8;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_S8X24_UINT:
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_X8Z24_UNORM:
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_S8_UINT_Z24_UNORM:
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_8_24;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_S8_UINT:
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_8;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z32_FLOAT:
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_32;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_X24_8_32;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_unknown;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_COLORSPACE_YUV:
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out_unknown; /* TODO */
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_COLORSPACE_SRGB:
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* TODO compressed formats */
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) {
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F14_IMG_DATA_FORMAT_5_9_9_9;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (format == PIPE_FORMAT_R11G11B10_FLOAT) {
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F14_IMG_DATA_FORMAT_10_11_11;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R8G8Bx_SNORM - TODO CxV8U8 */
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* See whether the components are of the same size. */
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 1; i < desc->nr_channels; i++) {
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uniform = uniform && desc->channel[0].size == desc->channel[i].size;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Non-uniform formats. */
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!uniform) {
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(desc->nr_channels) {
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->channel[0].size == 5 &&
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[1].size == 6 &&
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[2].size == 5) {
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return V_008F14_IMG_DATA_FORMAT_5_6_5;
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_unknown;
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->channel[0].size == 5 &&
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[1].size == 5 &&
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[2].size == 5 &&
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[3].size == 1) {
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return V_008F14_IMG_DATA_FORMAT_1_5_5_5;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->channel[0].size == 10 &&
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[1].size == 10 &&
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[2].size == 10 &&
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    desc->channel[3].size == 2) {
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return V_008F14_IMG_DATA_FORMAT_2_10_10_10;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			goto out_unknown;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out_unknown;
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (first_non_void < 0 || first_non_void > 3)
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out_unknown;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* uniform formats */
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (desc->channel[first_non_void].size) {
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 4:
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_4_4;
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_4_4_4_4;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 8:
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_8;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_8_8;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_8_8_8_8;
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 16:
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_16;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_16_16;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_16_16_16_16;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 32:
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_32;
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_32_32;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_32_32_32;
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F14_IMG_DATA_FORMAT_32_32_32_32;
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout_unknown:
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return ~0;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_wrap(unsigned wrap)
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (wrap) {
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_REPEAT:
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_WRAP;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_CLAMP:
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_CLAMP_HALF_BORDER;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_CLAMP_BORDER;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_MIRROR_REPEAT:
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_MIRROR;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_MIRROR_CLAMP:
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_filter(unsigned filter)
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (filter) {
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_FILTER_NEAREST:
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F38_SQ_TEX_XY_FILTER_POINT;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_FILTER_LINEAR:
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F38_SQ_TEX_XY_FILTER_BILINEAR;
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_mipfilter(unsigned filter)
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (filter) {
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_MIPFILTER_NEAREST:
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F38_SQ_TEX_Z_FILTER_POINT;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_MIPFILTER_LINEAR:
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F38_SQ_TEX_Z_FILTER_LINEAR;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEX_MIPFILTER_NONE:
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F38_SQ_TEX_Z_FILTER_NONE;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_compare(unsigned compare)
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (compare) {
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_NEVER:
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER;
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_LESS:
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS;
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_EQUAL:
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL;
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_LEQUAL:
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_GREATER:
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER;
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_NOTEQUAL:
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_GEQUAL:
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_FUNC_ALWAYS:
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS;
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned si_tex_dim(unsigned dim)
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (dim) {
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_1D:
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_1D;
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_1D_ARRAY:
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_1D_ARRAY;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_2D:
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_RECT:
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_2D;
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_2D_ARRAY:
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_2D_ARRAY;
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_3D:
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_3D;
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_TEXTURE_CUBE:
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F1C_SQ_RSRC_IMG_CUBE;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format support testing
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return si_translate_texformat(screen, format, util_format_description(format),
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      util_format_get_first_non_void_channel(format)) != ~0U;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen,
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  enum pipe_format format,
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  const struct util_format_description *desc,
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  int first_non_void)
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned type = desc->channel[first_non_void].type;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (type == UTIL_FORMAT_TYPE_FIXED)
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return V_008F0C_BUF_DATA_FORMAT_INVALID;
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* See whether the components are of the same size. */
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < desc->nr_channels; i++) {
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->channel[first_non_void].size != desc->channel[i].size)
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_INVALID;
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (desc->channel[first_non_void].size) {
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 8:
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_8;
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_8_8;
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 16:
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_16;
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_16_16;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 32:
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (type != UTIL_FORMAT_TYPE_FLOAT)
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_INVALID;
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->nr_channels) {
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_32;
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_32_32;
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 3:
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_32_32_32;
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return V_008F0C_BUF_DATA_FORMAT_INVALID;
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format)
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const struct util_format_description *desc;
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int first_non_void;
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned data_format;
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	desc = util_format_description(format);
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	first_non_void = util_format_get_first_non_void_channel(format);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	data_format = si_translate_vertexformat(screen, format, desc, first_non_void);
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID;
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_colorbuffer_format_supported(enum pipe_format format)
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return si_translate_colorformat(format) != ~0U &&
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_translate_colorswap(format) != ~0U;
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool si_is_zs_format_supported(enum pipe_format format)
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return si_translate_dbformat(format) != ~0U;
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool si_is_format_supported(struct pipe_screen *screen,
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    enum pipe_format format,
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    enum pipe_texture_target target,
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    unsigned sample_count,
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    unsigned usage)
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned retval = 0;
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (target >= PIPE_MAX_TEXTURE_TYPES) {
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("r600: unsupported texture type %d\n", target);
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return FALSE;
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!util_format_is_supported(format, usage))
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return FALSE;
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Multisample */
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sample_count > 1)
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return FALSE;
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    si_is_sampler_format_supported(screen, format)) {
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_SAMPLER_VIEW;
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & (PIPE_BIND_RENDER_TARGET |
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_DISPLAY_TARGET |
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_SCANOUT |
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      PIPE_BIND_SHARED)) &&
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    si_is_colorbuffer_format_supported(format)) {
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= usage &
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (PIPE_BIND_RENDER_TARGET |
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_DISPLAY_TARGET |
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_SCANOUT |
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   PIPE_BIND_SHARED);
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    si_is_zs_format_supported(format)) {
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_DEPTH_STENCIL;
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    si_is_vertex_format_supported(screen, format)) {
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_VERTEX_BUFFER;
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (usage & PIPE_BIND_TRANSFER_READ)
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_TRANSFER_READ;
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (usage & PIPE_BIND_TRANSFER_WRITE)
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		retval |= PIPE_BIND_TRANSFER_WRITE;
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return retval == usage;
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * framebuffer handling
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4,
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  const struct pipe_framebuffer_state *state, int cb)
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_resource_texture *rtex;
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_surface *surf;
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned level = state->cbufs[cb]->u.tex.level;
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned pitch, slice;
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned color_info, color_attrib;
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned format, swap, ntype, endian;
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint64_t offset;
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned blocksize;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const struct util_format_description *desc;
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned blend_clamp = 0, blend_bypass = 0;
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned max_comp_size;
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf = (struct r600_surface *)state->cbufs[cb];
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture;
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	blocksize = util_format_get_blocksize(rtex->real_format);
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->depth)
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->have_depth_fb = TRUE;
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->depth && !rtex->is_flushing_texture) {
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	        r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE);
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rtex = rtex->flushed_depth_texture;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset = rtex->surface.level[level].offset;
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset += rtex->surface.level[level].slice_size *
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  state->cbufs[cb]->u.tex.first_layer;
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = (rtex->surface.level[level].nblk_x) / 8 - 1;
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (slice) {
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slice = slice - 1;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	color_attrib = S_028C74_TILE_MODE_INDEX(8);
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (rtex->surface.level[level].mode) {
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_attrib = S_028C74_TILE_MODE_INDEX(8);
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_1D:
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		color_attrib = S_028C74_TILE_MODE_INDEX(9);
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_2D:
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) {
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (blocksize) {
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 1:
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				color_attrib = S_028C74_TILE_MODE_INDEX(10);
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 2:
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				color_attrib = S_028C74_TILE_MODE_INDEX(11);
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 4:
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				color_attrib = S_028C74_TILE_MODE_INDEX(12);
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else switch (blocksize) {
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_attrib = S_028C74_TILE_MODE_INDEX(14);
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_attrib = S_028C74_TILE_MODE_INDEX(15);
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_attrib = S_028C74_TILE_MODE_INDEX(16);
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 8:
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_attrib = S_028C74_TILE_MODE_INDEX(17);
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			color_attrib = S_028C74_TILE_MODE_INDEX(13);
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	desc = util_format_description(surf->base.format);
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < 4; i++) {
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) {
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ntype = V_028C70_NUMBER_FLOAT;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ntype = V_028C70_NUMBER_UNORM;
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ntype = V_028C70_NUMBER_SRGB;
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->channel[i].normalized)
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ntype = V_028C70_NUMBER_SNORM;
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else if (desc->channel[i].pure_integer)
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ntype = V_028C70_NUMBER_SINT;
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->channel[i].normalized)
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ntype = V_028C70_NUMBER_UNORM;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else if (desc->channel[i].pure_integer)
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				ntype = V_028C70_NUMBER_UINT;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = si_translate_colorformat(surf->base.format);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	swap = si_translate_colorswap(surf->base.format);
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		endian = V_028C70_ENDIAN_NONE;
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		endian = si_colorformat_endian_swap(format);
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* blend clamp should be set for all NORM/SRGB types */
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ntype == V_028C70_NUMBER_UNORM ||
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ntype == V_028C70_NUMBER_SNORM ||
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ntype == V_028C70_NUMBER_SRGB)
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_clamp = 1;
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* set blend bypass according to docs if SINT/UINT or
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   8/24 COLOR variants */
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT ||
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 ||
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    format == V_028C70_COLOR_X24_8_32_FLOAT) {
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_clamp = 0;
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		blend_bypass = 1;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	color_info = S_028C70_FORMAT(format) |
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028C70_COMP_SWAP(swap) |
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028C70_BLEND_CLAMP(blend_clamp) |
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028C70_BLEND_BYPASS(blend_bypass) |
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028C70_NUMBER_TYPE(ntype) |
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		S_028C70_ENDIAN(endian);
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->alpha_ref_dirty = true;
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture);
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset >>= 8;
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* FIXME handle enabling of CB beyond BASE8 which has different offset */
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset);
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch));
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice));
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000);
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C,
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) |
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer));
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info);
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib);
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Determine pixel shader export format */
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	max_comp_size = si_colorformat_max_comp_size(format);
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ntype == V_028C70_NUMBER_SRGB ||
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ((ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM) &&
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     max_comp_size <= 10) ||
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (ntype == V_028C70_NUMBER_FLOAT && max_comp_size <= 16)) {
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->export_16bpc |= 1 << cb;
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->spi_shader_col_format |= V_028714_SPI_SHADER_FP16_ABGR << (4 * cb);
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->spi_shader_col_format |= V_028714_SPI_SHADER_32_ABGR << (4 * cb);
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4,
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  const struct pipe_framebuffer_state *state)
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_resource_texture *rtex;
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_surface *surf;
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned level, pitch, slice, format;
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t z_info, s_info;
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint64_t z_offs, s_offs;
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->zsbuf == NULL) {
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	surf = (struct r600_surface *)state->zsbuf;
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	level = surf->base.u.tex.level;
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rtex = (struct r600_resource_texture*)surf->base.texture;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = si_translate_dbformat(rtex->real_format);
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	z_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	z_offs += rtex->surface.level[level].offset;
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	s_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	s_offs += rtex->surface.stencil_offset;
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	z_offs += rtex->surface.level[level].offset / 4;
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	z_offs >>= 8;
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	s_offs >>= 8;
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = (rtex->surface.level[level].nblk_x / 8) - 1;
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (slice) {
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slice = slice - 1;
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	z_info = S_028040_FORMAT(format);
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	s_info = S_028044_FORMAT(1);
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) {
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		z_info |= S_028040_TILE_MODE_INDEX(4);
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		s_info |= S_028044_TILE_MODE_INDEX(4);
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) {
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (format) {
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028040_Z_16:
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			z_info |= S_028040_TILE_MODE_INDEX(5);
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s_info |= S_028044_TILE_MODE_INDEX(5);
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028040_Z_24:
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case V_028040_Z_32_FLOAT:
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			z_info |= S_028040_TILE_MODE_INDEX(6);
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s_info |= S_028044_TILE_MODE_INDEX(6);
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			z_info |= S_028040_TILE_MODE_INDEX(7);
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			s_info |= S_028044_TILE_MODE_INDEX(7);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("Invalid DB tiling mode %d!\n",
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 rtex->surface.level[level].mode);
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW,
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) |
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer));
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1);
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (format != ~0U) {
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info);
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info);
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs);
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs);
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs);
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs);
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch));
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice));
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_framebuffer_state(struct pipe_context *ctx,
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const struct pipe_framebuffer_state *state)
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t shader_mask, tl, br;
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tl_x, tl_y, br_x, br_y;
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (pm4 == NULL)
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_fb_cache(pm4, state->nr_cbufs);
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (state->zsbuf)
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_inval_zsbuf_cache(pm4);
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_copy_framebuffer_state(&rctx->framebuffer, state);
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* build states */
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->have_depth_fb = 0;
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->export_16bpc = 0;
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->spi_shader_col_format = 0;
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < state->nr_cbufs; i++) {
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_cb(rctx, pm4, state, i);
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(!(rctx->export_16bpc & ~0xff));
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_db(rctx, pm4, state);
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader_mask = 0;
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (int i = 0; i < state->nr_cbufs; i++) {
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader_mask |= 0xf << (i * 4);
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl_x = 0;
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl_y = 0;
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br_x = state->width;
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br_y = state->height;
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* EG hw workaround */
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (br_x == 0)
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tl_x = 1;
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (br_y == 0)
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tl_y = 1;
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* cayman hw workaround */
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->chip_class == CAYMAN) {
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (br_x == 1 && br_y == 1)
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			br_x = 2;
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y);
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl);
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br);
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl);
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br);
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl);
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br);
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl);
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br);
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000);
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask);
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028714_SPI_SHADER_COL_FORMAT,
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       rctx->spi_shader_col_format);
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000);
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, framebuffer, pm4);
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_fb_rs_state(rctx);
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_update_fb_blend_state(rctx);
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * shaders
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Compute the key for the hw shader variant */
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned si_shader_selector_key(struct pipe_context *ctx,
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					      struct si_pipe_shader_selector *sel)
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned key = 0;
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sel->type == PIPE_SHADER_FRAGMENT) {
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (sel->fs_write_all)
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			key |= rctx->framebuffer.nr_cbufs;
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		key |= rctx->export_16bpc << 4;
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/*if (rctx->queued.named.rasterizer)
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  key |= rctx->queued.named.rasterizer->flatshade << 12;*/
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/*key |== rctx->two_side << 13;*/
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return key;
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Select the hw shader variant depending on the current state.
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (*dirty) is set to 1 if current variant was changed */
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint si_shader_select(struct pipe_context *ctx,
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct si_pipe_shader_selector *sel,
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     unsigned *dirty)
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned key;
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader * shader = NULL;
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	key = si_shader_selector_key(ctx, sel);
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Check if we don't need to change anything.
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * This path is also used for most shaders that don't need multiple
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * variants, it will cost just a computation of the key and this
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * test. */
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (likely(sel->current && sel->current->key == key)) {
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 0;
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* lookup if we have other variants in the list */
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sel->num_shaders > 1) {
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct si_pipe_shader *p = sel->current, *c = p->next_variant;
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		while (c && c->key != key) {
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			p = c;
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			c = c->next_variant;
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (c) {
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			p->next_variant = c->next_variant;
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader = c;
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (unlikely(!shader)) {
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader = CALLOC(1, sizeof(struct si_pipe_shader));
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->selector = sel;
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r = si_pipe_shader_create(ctx, shader);
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (unlikely(r)) {
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 sel->type, key, r);
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sel->current = NULL;
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return r;
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* We don't know the value of fs_write_all property until we built
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * at least one variant, so we may need to recompute the key (include
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * rctx->framebuffer.nr_cbufs) after building first variant. */
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (sel->type == PIPE_SHADER_FRAGMENT &&
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    sel->num_shaders == 0 &&
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    shader->shader.fs_write_all) {
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sel->fs_write_all = 1;
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			key = si_shader_selector_key(ctx, sel);
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		shader->key = key;
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sel->num_shaders++;
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (dirty)
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*dirty = 1;
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	shader->next_variant = sel->current;
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel->current = shader;
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_shader_state(struct pipe_context *ctx,
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    const struct pipe_shader_state *state,
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    unsigned pipe_shader_type)
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader_selector *sel = CALLOC_STRUCT(si_pipe_shader_selector);
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int r;
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel->type = pipe_shader_type;
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel->tokens = tgsi_dup_tokens(state->tokens);
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	sel->so = state->stream_output;
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	r = si_shader_select(ctx, sel, NULL);
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (r) {
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    free(sel);
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return NULL;
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return sel;
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_fs_state(struct pipe_context *ctx,
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const struct pipe_shader_state *state)
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_vs_state(struct pipe_context *ctx,
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const struct pipe_shader_state *state)
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return si_create_shader_state(ctx, state, PIPE_SHADER_VERTEX);
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state)
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader_selector *sel = state;
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->vs_shader == sel)
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->shader_dirty = true;
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->vs_shader = sel;
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sel && sel->current)
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_bind_state(rctx, vs, sel->current->pm4);
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4);
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state)
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader_selector *sel = state;
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->ps_shader == sel)
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->shader_dirty = true;
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->ps_shader = sel;
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (sel && sel->current)
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_bind_state(rctx, ps, sel->current->pm4);
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_bind_state(rctx, ps, rctx->dummy_pixel_shader->pm4);
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_shader_selector(struct pipe_context *ctx,
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      struct si_pipe_shader_selector *sel)
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader *p = sel->current, *c;
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	while (p) {
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		c = p->next_variant;
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_delete_state(rctx, vs, p->pm4);
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pipe_shader_destroy(ctx, p);
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		free(p);
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		p = c;
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(sel->tokens);
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(sel);
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state)
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->vs_shader == sel) {
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->vs_shader = NULL;
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_delete_shader_selector(ctx, sel);
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state)
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state;
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->ps_shader == sel) {
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->ps_shader = NULL;
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_delete_shader_selector(ctx, sel);
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Samplers
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx,
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							struct pipe_resource *texture,
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							const struct pipe_sampler_view *state)
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view);
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture;
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const struct util_format_description *desc = util_format_description(state->format);
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned blocksize = util_format_get_blocksize(tmp->real_format);
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned format, num_format, /*endian,*/ tiling_index;
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t pitch = 0;
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned char state_swizzle[4], swizzle[4];
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned height, depth, width, offset_level, last_level;
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int first_non_void;
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint64_t va;
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (view == NULL)
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* initialize base object */
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base = *state;
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.texture = NULL;
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_reference(NULL, &texture->reference);
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.texture = texture;
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.reference.count = 1;
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->base.context = ctx;
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state_swizzle[0] = state->swizzle_r;
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state_swizzle[1] = state->swizzle_g;
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state_swizzle[2] = state->swizzle_b;
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	state_swizzle[3] = state->swizzle_a;
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle);
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	first_non_void = util_format_get_first_non_void_channel(state->format);
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (desc->channel[first_non_void].type) {
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_TYPE_FLOAT:
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_TYPE_SIGNED:
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_format = V_008F14_IMG_NUM_FORMAT_SNORM;
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case UTIL_FORMAT_TYPE_UNSIGNED:
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		num_format = V_008F14_IMG_NUM_FORMAT_UNORM;
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void);
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (format == ~0) {
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		format = 0;
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (tmp->depth && !tmp->is_flushing_texture) {
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_texture_depth_flush(ctx, texture, TRUE);
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tmp = tmp->flushed_depth_texture;
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* not supported any more */
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	//endian = si_colorformat_endian_swap(format);
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	offset_level = state->u.tex.first_level;
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	last_level = state->u.tex.last_level - offset_level;
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	width = tmp->surface.level[offset_level].npix_x;
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	height = tmp->surface.level[offset_level].npix_y;
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	depth = tmp->surface.level[offset_level].npix_z;
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format);
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	        height = 1;
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = texture->array_size;
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		depth = texture->array_size;
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	tiling_index = 8;
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (tmp->surface.level[state->u.tex.first_level].mode) {
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_LINEAR_ALIGNED:
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tiling_index = 8;
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_1D:
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		tiling_index = 9;
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case RADEON_SURF_MODE_2D:
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) {
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (blocksize) {
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 1:
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tiling_index = 10;
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 2:
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tiling_index = 11;
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case 4:
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				tiling_index = 12;
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else switch (blocksize) {
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 1:
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tiling_index = 14;
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 2:
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tiling_index = 15;
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 4:
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tiling_index = 16;
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case 8:
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tiling_index = 17;
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tiling_index = 13;
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	va = r600_resource_va(ctx->screen, texture);
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	va += tmp->surface.level[offset_level].offset;
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[0] = va >> 8;
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[1] = (S_008F14_BASE_ADDRESS_HI(va >> 40) |
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F14_DATA_FORMAT(format) |
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F14_NUM_FORMAT(num_format));
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[2] = (S_008F18_WIDTH(width - 1) |
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F18_HEIGHT(height - 1));
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) |
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) |
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) |
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) |
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_BASE_LEVEL(offset_level) |
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_LAST_LEVEL(last_level) |
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_TILING_INDEX(tiling_index) |
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F1C_TYPE(si_tex_dim(texture->target)));
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1));
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) |
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F24_LAST_ARRAY(state->u.tex.last_layer));
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[6] = 0;
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	view->state[7] = 0;
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return &view->base;
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_sampler_view_destroy(struct pipe_context *ctx,
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct pipe_sampler_view *state)
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state;
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pipe_resource_reference(&state->texture, NULL);
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	FREE(resource);
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_sampler_state(struct pipe_context *ctx,
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     const struct pipe_sampler_state *state)
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state);
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union util_color uc;
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned border_color_type;
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rstate == NULL) {
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (uc.ui) {
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 0x000000FF:
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK;
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 0x00000000:
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK;
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 0xFFFFFFFF:
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE;
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default: /* Use border color pointer */
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER;
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) |
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) |
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) |
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (state->max_anisotropy & 0x7) << 9 | /* XXX */
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  aniso_flag_offset << 16 | /* XXX */
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map));
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)));
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) |
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) |
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter)));
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type);
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (border_color_type == 3) {
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]));
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]));
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]));
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]));
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return rstate;
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   struct pipe_sampler_view **views)
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(count == 0);
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   struct pipe_sampler_view **views)
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views;
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j;
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int has_depth = 0;
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!count)
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out;
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_texture_cache(pm4);
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_sh_data_begin(pm4);
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < count; i++) {
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_sampler_view_reference(
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			views[i]);
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (views[i]) {
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for (j = 0; j < Elements(resource[i]->state); ++j) {
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				si_pm4_sh_data_add(pm4, resource[i]->state[j]);
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = count; i < NUM_TEX_UNITS; i++) {
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (rctx->ps_samplers.views[i])
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL);
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_sh_data_end(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4);
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout:
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, ps_sampler_views, pm4);
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->have_depth_texture = has_depth;
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->ps_samplers.n_views = count;
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states)
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(count == 0);
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states)
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states;
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, j;
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!count)
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		goto out;
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_texture_cache(pm4);
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_sh_data_begin(pm4);
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < count; i++) {
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (j = 0; j < Elements(rstates[i]->val); ++j) {
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			si_pm4_sh_data_add(pm4, rstates[i]->val[j]);
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_sh_data_end(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2);
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count);
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgout:
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, ps_sampler, pm4);
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->ps_samplers.n_samplers = count;
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state)
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	free(state);
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Constants
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    struct pipe_constant_buffer *cb)
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL;
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4;
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint64_t va_offset;
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t offset;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Note that the state tracker can unbind constant buffers by
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * passing NULL here.
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (cb == NULL)
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	pm4 = CALLOC_STRUCT(si_pm4_state);
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_shader_cache(pm4);
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (cb->user_buffer)
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset);
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offset = 0;
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	va_offset = r600_resource_va(ctx->screen, (void*)rbuffer);
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	va_offset += offset;
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ);
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (shader) {
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_SHADER_VERTEX:
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset);
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32);
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_state(rctx, vs_const, pm4);
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case PIPE_SHADER_FRAGMENT:
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset);
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32);
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_pm4_set_state(rctx, ps_const, pm4);
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		R600_ERR("unsupported %d\n", shader);
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (cb->buffer != &rbuffer->b.b)
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		si_resource_reference(&rbuffer, NULL);
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Vertex elements & buffers
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *si_create_vertex_elements(struct pipe_context *ctx,
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       unsigned count,
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       const struct pipe_vertex_element *elements)
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element);
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(count < PIPE_MAX_ATTRIBS);
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!v)
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return NULL;
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	v->count = count;
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 0; i < count; ++i) {
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const struct util_format_description *desc;
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned data_format, num_format;
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int first_non_void;
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc = util_format_description(elements[i].src_format);
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		first_non_void = util_format_get_first_non_void_channel(elements[i].src_format);
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format,
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							desc, first_non_void);
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (desc->channel[first_non_void].type) {
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case UTIL_FORMAT_TYPE_FIXED:
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case UTIL_FORMAT_TYPE_SIGNED:
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			num_format = V_008F0C_BUF_NUM_FORMAT_SNORM;
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case UTIL_FORMAT_TYPE_UNSIGNED:
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			num_format = V_008F0C_BUF_NUM_FORMAT_UNORM;
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case UTIL_FORMAT_TYPE_FLOAT:
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   S_008F0C_NUM_FORMAT(num_format) |
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   S_008F0C_DATA_FORMAT(data_format);
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count);
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return v;
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state)
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_vertex_element *v = (struct si_vertex_element*)state;
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->vertex_elements = v;
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state)
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rctx->vertex_elements == state)
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		rctx->vertex_elements = NULL;
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	FREE(state);
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  const struct pipe_vertex_buffer *buffers)
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count);
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_index_buffer(struct pipe_context *ctx,
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				const struct pipe_index_buffer *ib)
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (ib) {
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	        memcpy(&rctx->index_buffer, ib, sizeof(*ib));
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Misc
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_set_polygon_stipple(struct pipe_context *ctx,
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   const struct pipe_poly_stipple *state)
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void si_texture_barrier(struct pipe_context *ctx)
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct r600_context *rctx = (struct r600_context *)ctx;
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_texture_cache(pm4);
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs);
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, texture_barrier, pm4);
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_init_state_functions(struct r600_context *rctx)
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_blend_state = si_create_blend_state;
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_blend_state = si_bind_blend_state;
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_blend_state = si_delete_blend_state;
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_blend_color = si_set_blend_color;
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_rasterizer_state = si_create_rs_state;
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_rasterizer_state = si_bind_rs_state;
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_rasterizer_state = si_delete_rs_state;
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state;
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state;
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state;
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx);
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_clip_state = si_set_clip_state;
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_scissor_state = si_set_scissor_state;
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_viewport_state = si_set_viewport_state;
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_stencil_ref = si_set_pipe_stencil_ref;
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_framebuffer_state = si_set_framebuffer_state;
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_vs_state = si_create_vs_state;
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_fs_state = si_create_fs_state;
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vs_state = si_bind_vs_shader;
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_fs_state = si_bind_ps_shader;
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_vs_state = si_delete_vs_shader;
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_fs_state = si_delete_ps_shader;
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_sampler_state = si_create_sampler_state;
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler;
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler;
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_sampler_state = si_delete_sampler_state;
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_sampler_view = si_create_sampler_view;
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view;
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view;
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.sampler_view_destroy = si_sampler_view_destroy;
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_sample_mask = si_set_sample_mask;
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_constant_buffer = si_set_constant_buffer;
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_vertex_elements_state = si_create_vertex_elements;
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.bind_vertex_elements_state = si_bind_vertex_elements;
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.delete_vertex_elements_state = si_delete_vertex_element;
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_vertex_buffers = si_set_vertex_buffers;
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_index_buffer = si_set_index_buffer;
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.create_stream_output_target = si_create_so_target;
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.stream_output_target_destroy = si_so_target_destroy;
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_stream_output_targets = si_set_so_targets;
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.texture_barrier = si_texture_barrier;
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.set_polygon_stipple = si_set_polygon_stipple;
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rctx->context.draw_vbo = si_draw_vbo;
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid si_init_config(struct r600_context *rctx)
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_cmd_begin(pm4, PKT3_CONTEXT_CONTROL);
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_cmd_add(pm4, 0x80000000);
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_cmd_add(pm4, 0x80000000);
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_cmd_end(pm4, false);
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0);
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0);
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0);
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0);
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0);
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0);
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0);
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0);
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0);
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0);
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0);
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0);
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0);
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0);
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0);
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0);
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0);
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0);
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM,
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028AA8_SWITCH_ON_EOP(1) |
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028AA8_PARTIAL_VS_WAVE_ON(1) |
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       S_028AA8_PRIMGROUP_SIZE(63));
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000);
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0);
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1);
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0);
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210);
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98);
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000);
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	si_pm4_set_state(rctx, init, pm4);
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2540