1bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König/*
2bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Copyright 2012 Advanced Micro Devices, Inc.
3bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
4bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Permission is hereby granted, free of charge, to any person obtaining a
5bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * copy of this software and associated documentation files (the "Software"),
6bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * to deal in the Software without restriction, including without limitation
7bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub
8bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * license, and/or sell copies of the Software, and to permit persons to whom
9bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * the Software is furnished to do so, subject to the following conditions:
10bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
11bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * The above copyright notice and this permission notice (including the next
12bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * paragraph) shall be included in all copies or substantial portions of the
13bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Software.
14bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
15bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE.
22bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *
23bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Authors:
24bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König *      Christian König <christian.koenig@amd.com>
25bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König */
26bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König
2763636ae52aefc275115d1f3daac4e75285583485Christian König#include "util/u_memory.h"
28835098a5290e59bb7b468eb987db67b0e1913c67Christian König#include "util/u_framebuffer.h"
29ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_blitter.h"
3073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#include "util/u_pack_color.h"
313c09f11e5cefd437bb8185539430786dc245c96fChristian König#include "tgsi/tgsi_parse.h"
3263636ae52aefc275115d1f3daac4e75285583485Christian König#include "radeonsi_pipe.h"
33ce40e4726cf30196b87df387255c64ddc2a97638Christian König#include "radeonsi_shader.h"
34bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#include "si_state.h"
3563636ae52aefc275115d1f3daac4e75285583485Christian König#include "sid.h"
3663636ae52aefc275115d1f3daac4e75285583485Christian König
3763636ae52aefc275115d1f3daac4e75285583485Christian König/*
3876660dfccede74782ac0d409da171ddbd61fae41Christian König * inferred framebuffer and blender state
3976660dfccede74782ac0d409da171ddbd61fae41Christian König */
4076660dfccede74782ac0d409da171ddbd61fae41Christian Königstatic void si_update_fb_blend_state(struct r600_context *rctx)
4176660dfccede74782ac0d409da171ddbd61fae41Christian König{
4251d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	struct si_pm4_state *pm4;
4376660dfccede74782ac0d409da171ddbd61fae41Christian König	struct si_state_blend *blend = rctx->queued.named.blend;
4476660dfccede74782ac0d409da171ddbd61fae41Christian König	uint32_t mask;
4576660dfccede74782ac0d409da171ddbd61fae41Christian König
4651d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	if (blend == NULL)
4751d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer		return;
4851d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer
4951d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	pm4 = CALLOC_STRUCT(si_pm4_state);
5051d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	if (pm4 == NULL)
5176660dfccede74782ac0d409da171ddbd61fae41Christian König		return;
5276660dfccede74782ac0d409da171ddbd61fae41Christian König
5376660dfccede74782ac0d409da171ddbd61fae41Christian König	mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1;
5476660dfccede74782ac0d409da171ddbd61fae41Christian König	mask &= blend->cb_target_mask;
5576660dfccede74782ac0d409da171ddbd61fae41Christian König	si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask);
5676660dfccede74782ac0d409da171ddbd61fae41Christian König
5776660dfccede74782ac0d409da171ddbd61fae41Christian König	si_pm4_set_state(rctx, fb_blend, pm4);
5876660dfccede74782ac0d409da171ddbd61fae41Christian König}
5976660dfccede74782ac0d409da171ddbd61fae41Christian König
6076660dfccede74782ac0d409da171ddbd61fae41Christian König/*
6163636ae52aefc275115d1f3daac4e75285583485Christian König * Blender functions
6263636ae52aefc275115d1f3daac4e75285583485Christian König */
6363636ae52aefc275115d1f3daac4e75285583485Christian König
6463636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_function(int blend_func)
6563636ae52aefc275115d1f3daac4e75285583485Christian König{
6663636ae52aefc275115d1f3daac4e75285583485Christian König	switch (blend_func) {
6763636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_ADD:
6863636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_DST_PLUS_SRC;
6963636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_SUBTRACT:
7063636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_SRC_MINUS_DST;
7163636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_REVERSE_SUBTRACT:
7263636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_DST_MINUS_SRC;
7363636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_MIN:
7463636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_MIN_DST_SRC;
7563636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_MAX:
7663636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_MAX_DST_SRC;
7763636ae52aefc275115d1f3daac4e75285583485Christian König	default:
7863636ae52aefc275115d1f3daac4e75285583485Christian König		R600_ERR("Unknown blend function %d\n", blend_func);
7963636ae52aefc275115d1f3daac4e75285583485Christian König		assert(0);
8063636ae52aefc275115d1f3daac4e75285583485Christian König		break;
8163636ae52aefc275115d1f3daac4e75285583485Christian König	}
8263636ae52aefc275115d1f3daac4e75285583485Christian König	return 0;
8363636ae52aefc275115d1f3daac4e75285583485Christian König}
8463636ae52aefc275115d1f3daac4e75285583485Christian König
8563636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_factor(int blend_fact)
8663636ae52aefc275115d1f3daac4e75285583485Christian König{
8763636ae52aefc275115d1f3daac4e75285583485Christian König	switch (blend_fact) {
8863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_ONE:
8963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE;
9063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_COLOR:
9163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_COLOR;
9263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_ALPHA:
9363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_ALPHA;
9463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_DST_ALPHA:
9563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_DST_ALPHA;
9663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_DST_COLOR:
9763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_DST_COLOR;
9863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
9963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_ALPHA_SATURATE;
10063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_CONST_COLOR:
10163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_CONSTANT_COLOR;
10263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_CONST_ALPHA:
10363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_CONSTANT_ALPHA;
10463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_ZERO:
10563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ZERO;
10663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
10763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
10863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
10963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
11063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
11163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
11263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_DST_COLOR:
11363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_DST_COLOR;
11463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
11563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR;
11663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
11763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA;
11863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC1_COLOR:
11963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC1_COLOR;
12063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC1_ALPHA:
12163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC1_ALPHA;
12263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
12363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_INV_SRC1_COLOR;
12463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
12563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_INV_SRC1_ALPHA;
12663636ae52aefc275115d1f3daac4e75285583485Christian König	default:
12763636ae52aefc275115d1f3daac4e75285583485Christian König		R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
12863636ae52aefc275115d1f3daac4e75285583485Christian König		assert(0);
12963636ae52aefc275115d1f3daac4e75285583485Christian König		break;
13063636ae52aefc275115d1f3daac4e75285583485Christian König	}
13163636ae52aefc275115d1f3daac4e75285583485Christian König	return 0;
13263636ae52aefc275115d1f3daac4e75285583485Christian König}
13363636ae52aefc275115d1f3daac4e75285583485Christian König
13463636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void *si_create_blend_state(struct pipe_context *ctx,
13563636ae52aefc275115d1f3daac4e75285583485Christian König				   const struct pipe_blend_state *state)
13663636ae52aefc275115d1f3daac4e75285583485Christian König{
13763636ae52aefc275115d1f3daac4e75285583485Christian König	struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend);
13863636ae52aefc275115d1f3daac4e75285583485Christian König	struct si_pm4_state *pm4 = &blend->pm4;
13963636ae52aefc275115d1f3daac4e75285583485Christian König
14063636ae52aefc275115d1f3daac4e75285583485Christian König	uint32_t color_control;
14163636ae52aefc275115d1f3daac4e75285583485Christian König
14263636ae52aefc275115d1f3daac4e75285583485Christian König	if (blend == NULL)
14363636ae52aefc275115d1f3daac4e75285583485Christian König		return NULL;
14463636ae52aefc275115d1f3daac4e75285583485Christian König
14563636ae52aefc275115d1f3daac4e75285583485Christian König	color_control = S_028808_MODE(V_028808_CB_NORMAL);
14663636ae52aefc275115d1f3daac4e75285583485Christian König	if (state->logicop_enable) {
14763636ae52aefc275115d1f3daac4e75285583485Christian König		color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4));
14863636ae52aefc275115d1f3daac4e75285583485Christian König	} else {
14963636ae52aefc275115d1f3daac4e75285583485Christian König		color_control |= S_028808_ROP3(0xcc);
15063636ae52aefc275115d1f3daac4e75285583485Christian König	}
15163636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control);
15263636ae52aefc275115d1f3daac4e75285583485Christian König
15363636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0);
15463636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0);
15563636ae52aefc275115d1f3daac4e75285583485Christian König
15663636ae52aefc275115d1f3daac4e75285583485Christian König	blend->cb_target_mask = 0;
15763636ae52aefc275115d1f3daac4e75285583485Christian König	for (int i = 0; i < 8; i++) {
15863636ae52aefc275115d1f3daac4e75285583485Christian König		/* state->rt entries > 0 only written if independent blending */
15963636ae52aefc275115d1f3daac4e75285583485Christian König		const int j = state->independent_blend_enable ? i : 0;
16063636ae52aefc275115d1f3daac4e75285583485Christian König
16163636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned eqRGB = state->rt[j].rgb_func;
16263636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned srcRGB = state->rt[j].rgb_src_factor;
16363636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned dstRGB = state->rt[j].rgb_dst_factor;
16463636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned eqA = state->rt[j].alpha_func;
16563636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned srcA = state->rt[j].alpha_src_factor;
16663636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned dstA = state->rt[j].alpha_dst_factor;
16763636ae52aefc275115d1f3daac4e75285583485Christian König
16863636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned blend_cntl = 0;
16963636ae52aefc275115d1f3daac4e75285583485Christian König
17063636ae52aefc275115d1f3daac4e75285583485Christian König		/* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
17163636ae52aefc275115d1f3daac4e75285583485Christian König		blend->cb_target_mask |= state->rt[j].colormask << (4 * i);
17263636ae52aefc275115d1f3daac4e75285583485Christian König
17363636ae52aefc275115d1f3daac4e75285583485Christian König		if (!state->rt[j].blend_enable) {
17463636ae52aefc275115d1f3daac4e75285583485Christian König			si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
17563636ae52aefc275115d1f3daac4e75285583485Christian König			continue;
17663636ae52aefc275115d1f3daac4e75285583485Christian König		}
17763636ae52aefc275115d1f3daac4e75285583485Christian König
17863636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_ENABLE(1);
17963636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB));
18063636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB));
18163636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB));
18263636ae52aefc275115d1f3daac4e75285583485Christian König
18363636ae52aefc275115d1f3daac4e75285583485Christian König		if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
18463636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1);
18563636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA));
18663636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA));
18763636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA));
18863636ae52aefc275115d1f3daac4e75285583485Christian König		}
18963636ae52aefc275115d1f3daac4e75285583485Christian König		si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
19063636ae52aefc275115d1f3daac4e75285583485Christian König	}
19163636ae52aefc275115d1f3daac4e75285583485Christian König
19263636ae52aefc275115d1f3daac4e75285583485Christian König	return blend;
19363636ae52aefc275115d1f3daac4e75285583485Christian König}
19463636ae52aefc275115d1f3daac4e75285583485Christian König
19563636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_bind_blend_state(struct pipe_context *ctx, void *state)
19663636ae52aefc275115d1f3daac4e75285583485Christian König{
19763636ae52aefc275115d1f3daac4e75285583485Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
19863636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state);
19976660dfccede74782ac0d409da171ddbd61fae41Christian König	si_update_fb_blend_state(rctx);
20063636ae52aefc275115d1f3daac4e75285583485Christian König}
20163636ae52aefc275115d1f3daac4e75285583485Christian König
20263636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_delete_blend_state(struct pipe_context *ctx, void *state)
20363636ae52aefc275115d1f3daac4e75285583485Christian König{
20463636ae52aefc275115d1f3daac4e75285583485Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
20563636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state);
20663636ae52aefc275115d1f3daac4e75285583485Christian König}
20763636ae52aefc275115d1f3daac4e75285583485Christian König
2080a091a48242513e53a99976239405e8cb72d96beChristian Königstatic void si_set_blend_color(struct pipe_context *ctx,
2090a091a48242513e53a99976239405e8cb72d96beChristian König			       const struct pipe_blend_color *state)
2100a091a48242513e53a99976239405e8cb72d96beChristian König{
2110a091a48242513e53a99976239405e8cb72d96beChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2120a091a48242513e53a99976239405e8cb72d96beChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2130a091a48242513e53a99976239405e8cb72d96beChristian König
2140a091a48242513e53a99976239405e8cb72d96beChristian König        if (pm4 == NULL)
2150a091a48242513e53a99976239405e8cb72d96beChristian König                return;
2160a091a48242513e53a99976239405e8cb72d96beChristian König
2170a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0]));
2180a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1]));
2190a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2]));
2200a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3]));
2210a091a48242513e53a99976239405e8cb72d96beChristian König
2220a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_state(rctx, blend_color, pm4);
2230a091a48242513e53a99976239405e8cb72d96beChristian König}
2240a091a48242513e53a99976239405e8cb72d96beChristian König
225835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
226835098a5290e59bb7b468eb987db67b0e1913c67Christian König * Clipping, scissors and viewport
227835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
228835098a5290e59bb7b468eb987db67b0e1913c67Christian König
2299cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian Königstatic void si_set_clip_state(struct pipe_context *ctx,
2309cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			      const struct pipe_clip_state *state)
2319cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König{
2329cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
2339cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2349cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2359cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	if (pm4 == NULL)
2369cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		return;
2379cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2389cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	for (int i = 0; i < 6; i++) {
2399cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16,
2409cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][0]));
2419cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16,
2429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][1]));
2439cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16,
2449cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][2]));
2459cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16,
2469cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][3]));
2479cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König        }
2489cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2499cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	si_pm4_set_state(rctx, clip, pm4);
2509cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König}
2519cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
25243f414f7b76902a728d26231d4cc047b794df10bChristian Königstatic void si_set_scissor_state(struct pipe_context *ctx,
25343f414f7b76902a728d26231d4cc047b794df10bChristian König				 const struct pipe_scissor_state *state)
25443f414f7b76902a728d26231d4cc047b794df10bChristian König{
25543f414f7b76902a728d26231d4cc047b794df10bChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
25643f414f7b76902a728d26231d4cc047b794df10bChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
25743f414f7b76902a728d26231d4cc047b794df10bChristian König	uint32_t tl, br;
25843f414f7b76902a728d26231d4cc047b794df10bChristian König
25943f414f7b76902a728d26231d4cc047b794df10bChristian König	if (pm4 == NULL)
26043f414f7b76902a728d26231d4cc047b794df10bChristian König		return;
26143f414f7b76902a728d26231d4cc047b794df10bChristian König
26243f414f7b76902a728d26231d4cc047b794df10bChristian König	tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny);
26343f414f7b76902a728d26231d4cc047b794df10bChristian König	br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy);
26443f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl);
26543f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br);
26643f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl);
26743f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br);
26843f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl);
26943f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br);
27043f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl);
27143f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br);
27243f414f7b76902a728d26231d4cc047b794df10bChristian König
27343f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_state(rctx, scissor, pm4);
27443f414f7b76902a728d26231d4cc047b794df10bChristian König}
27543f414f7b76902a728d26231d4cc047b794df10bChristian König
2767e011d92c9746ba4050890442db6e504fa42c4adChristian Königstatic void si_set_viewport_state(struct pipe_context *ctx,
2777e011d92c9746ba4050890442db6e504fa42c4adChristian König				  const struct pipe_viewport_state *state)
2787e011d92c9746ba4050890442db6e504fa42c4adChristian König{
2797e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2807e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport);
2817e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct si_pm4_state *pm4 = &viewport->pm4;
2827e011d92c9746ba4050890442db6e504fa42c4adChristian König
2837e011d92c9746ba4050890442db6e504fa42c4adChristian König	if (viewport == NULL)
2847e011d92c9746ba4050890442db6e504fa42c4adChristian König		return;
2857e011d92c9746ba4050890442db6e504fa42c4adChristian König
2867e011d92c9746ba4050890442db6e504fa42c4adChristian König	viewport->viewport = *state;
2877e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000);
2887e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000);
2897e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]));
2907e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]));
2917e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]));
2927e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]));
2937e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]));
2947e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]));
2957e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F);
2967e011d92c9746ba4050890442db6e504fa42c4adChristian König
2977e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_state(rctx, viewport, viewport);
2987e011d92c9746ba4050890442db6e504fa42c4adChristian König}
2997e011d92c9746ba4050890442db6e504fa42c4adChristian König
300835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
301bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König * inferred state between framebuffer and rasterizer
302bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König */
303bd18a316e1495f501911d89c8b373382d1f8c8c2Christian Königstatic void si_update_fb_rs_state(struct r600_context *rctx)
304bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König{
305bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	struct si_state_rasterizer *rs = rctx->queued.named.rasterizer;
30651d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	struct si_pm4_state *pm4;
307bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	unsigned offset_db_fmt_cntl = 0, depth;
308bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	float offset_units;
309bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
31051d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	if (!rs || !rctx->framebuffer.zsbuf)
311bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		return;
312bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
313bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	offset_units = rctx->queued.named.rasterizer->offset_units;
314bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	switch (rctx->framebuffer.zsbuf->texture->format) {
315bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z24X8_UNORM:
316bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
317bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -24;
318bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 2.0f;
319bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
320bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z32_FLOAT:
321bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
322bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -23;
323bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 1.0f;
324bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
325bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
326bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z16_UNORM:
327bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -16;
328bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 4.0f;
329bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
330bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	default:
331bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		return;
332bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	}
333bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
33451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	pm4 = CALLOC_STRUCT(si_pm4_state);
335bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	/* FIXME some of those reg can be computed with cso */
336bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
337bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
338bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		       fui(rctx->queued.named.rasterizer->offset_scale));
339bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units));
340bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE,
341bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		       fui(rctx->queued.named.rasterizer->offset_scale));
342bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units));
343bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl);
344bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
345bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_state(rctx, fb_rs, pm4);
346bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König}
347bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
348bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König/*
349f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König * Rasterizer
350f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König */
351f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
352f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic uint32_t si_translate_fill(uint32_t func)
353f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
354f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	switch(func) {
355f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_FILL:
356f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_TRIANGLES;
357f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_LINE:
358f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_LINES;
359f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_POINT:
360f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_POINTS;
361f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	default:
362f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		assert(0);
363f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_POINTS;
364f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
365f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
366f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
367f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void *si_create_rs_state(struct pipe_context *ctx,
368f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				const struct pipe_rasterizer_state *state)
369f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
370f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer);
371f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_pm4_state *pm4 = &rs->pm4;
372f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned tmp;
373f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned prov_vtx = 1, polygon_dual_mode;
374f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned clip_rule;
375f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	float psize_min, psize_max;
376f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
377f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (rs == NULL) {
378f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return NULL;
379f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
380f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
381f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
382f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				state->fill_back != PIPE_POLYGON_MODE_FILL);
383f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
384f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->flatshade_first)
385f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		prov_vtx = 0;
386f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
387f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->flatshade = state->flatshade;
388f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->sprite_coord_enable = state->sprite_coord_enable;
389f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_sc_line_stipple = state->line_stipple_enable ?
390f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
391f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
392f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_su_sc_mode_cntl =
393f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_PROVOKING_VTX_LAST(prov_vtx) |
394f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
395f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) |
396f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_FACE(!state->front_ccw) |
397f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
398f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
399f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
400f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_MODE(polygon_dual_mode) |
401f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) |
402f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back));
403f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_cl_clip_cntl =
404f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_PS_UCP_MODE(3) |
405f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
406f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
407f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
408f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_cl_vs_out_cntl =
409f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) |
410f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex);
411f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
412f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	clip_rule = state->scissor ? 0xAAAA : 0xFFFF;
413f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
414f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* offset */
415f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->offset_units = state->offset_units;
416f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->offset_scale = state->offset_scale * 12.0f;
417f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
418f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* XXX: Flat shading hangs the GPU */
419f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = S_0286D4_FLAT_SHADE_ENA(0);
420f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->sprite_coord_enable) {
421f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
422f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) |
423f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) |
424f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) |
425f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1);
426f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
427f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
428f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		}
429f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
430f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp);
431f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
432f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000);
433f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* point size 12.4 fixed point */
434f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = (unsigned)(state->point_size * 8.0);
435f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp));
436f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
437f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->point_size_per_vertex) {
438f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_min = util_get_min_point_size(state);
439f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_max = 8192;
440f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	} else {
441f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		/* Force the point size to be as if the vertex output was disabled. */
442f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_min = state->point_size;
443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_max = state->point_size;
444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* Divide by two, because 0.5 = 1 pixel. */
446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX,
447f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
448f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)));
449f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
450f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = (unsigned)state->line_width * 8;
451f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp));
452f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0,
453f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable));
454f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
455f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400);
456f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL,
457f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028BE4_PIX_CENTER(state->gl_rasterization_rules));
458f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000);
459f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000);
460f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000);
461f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000);
462f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
463f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp));
464f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule);
465f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
466f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	return rs;
467f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
468f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
469f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_bind_rs_state(struct pipe_context *ctx, void *state)
470f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
471f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
472f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state;
473f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
474f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state == NULL)
475f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return;
476f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
477f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	// TODO
478f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->sprite_coord_enable = rs->sprite_coord_enable;
479f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple;
480f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl;
481f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
482f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl;
483f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
484f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_bind_state(rctx, rasterizer, rs);
485bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_update_fb_rs_state(rctx);
486f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
487f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
488f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_delete_rs_state(struct pipe_context *ctx, void *state)
489f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
490f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
491f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state);
492f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
493f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
494f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König/*
495e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König * infeered state between dsa and stencil ref
496e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König */
497e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_update_dsa_stencil_ref(struct r600_context *rctx)
498e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{
499e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
500e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	struct pipe_stencil_ref *ref = &rctx->stencil_ref;
501e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        struct si_state_dsa *dsa = rctx->queued.named.dsa;
502e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
503e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        if (pm4 == NULL)
504e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König                return;
505e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
506e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK,
507e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILTESTVAL(ref->ref_value[0]) |
508e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILMASK(dsa->valuemask[0]) |
509e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILWRITEMASK(dsa->writemask[0]));
510e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF,
511e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) |
512e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILMASK_BF(dsa->valuemask[1]) |
513e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILWRITEMASK_BF(dsa->writemask[1]));
514e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
515e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_state(rctx, dsa_stencil_ref, pm4);
516e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König}
517e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
518e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx,
519e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König				    const struct pipe_stencil_ref *state)
520e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{
521e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        struct r600_context *rctx = (struct r600_context *)ctx;
522e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        rctx->stencil_ref = *state;
523e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_update_dsa_stencil_ref(rctx);
524e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König}
525e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
526e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
527e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König/*
528b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König * DSA
529b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König */
530b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
5317dace3a3cf894adb51a21ff6b08f58608ea33831Christian Königstatic uint32_t si_translate_stencil_op(int s_op)
532b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
5337dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	switch (s_op) {
5347dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_KEEP:
5357dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_KEEP;
5367dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_ZERO:
5377dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ZERO;
5387dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_REPLACE:
5397dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_REPLACE_TEST;
5407dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INCR:
5417dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ADD_CLAMP;
5427dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_DECR:
5437dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_SUB_CLAMP;
5447dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INCR_WRAP:
5457dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ADD_WRAP;
5467dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_DECR_WRAP:
5477dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_SUB_WRAP;
5487dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INVERT:
5497dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_INVERT;
5507dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	default:
5517dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		R600_ERR("Unknown stencil op %d", s_op);
5527dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		assert(0);
5537dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		break;
5547dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	}
5557dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	return 0;
556b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
557b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
558b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_dsa_state(struct pipe_context *ctx,
559b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König				 const struct pipe_depth_stencil_alpha_state *state)
560b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
561b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa);
562b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct si_pm4_state *pm4 = &dsa->pm4;
563b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned db_depth_control, /* alpha_test_control, */ alpha_ref;
564b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned db_render_override, db_render_control;
5657dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	uint32_t db_stencil_control = 0;
566b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
567b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (dsa == NULL) {
568b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		return NULL;
569b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
570b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
571b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->valuemask[0] = state->stencil[0].valuemask;
572b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->valuemask[1] = state->stencil[1].valuemask;
573b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->writemask[0] = state->stencil[0].writemask;
574b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->writemask[1] = state->stencil[1].writemask;
575b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
576b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
577b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
578b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_028800_ZFUNC(state->depth.func);
579b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
580b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* stencil */
581b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (state->stencil[0].enabled) {
582b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		db_depth_control |= S_028800_STENCIL_ENABLE(1);
5837dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func);
5847dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op));
5857dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op));
5867dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op));
587b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
588b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		if (state->stencil[1].enabled) {
589b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König			db_depth_control |= S_028800_BACKFACE_ENABLE(1);
5907dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func);
5917dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op));
5927dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op));
5937dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op));
594b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		}
595b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
596b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
597b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* alpha */
598b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	//alpha_test_control = 0;
599b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	alpha_ref = 0;
600b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (state->alpha.enabled) {
601b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		//alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
602b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		//alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
603b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		alpha_ref = fui(state->alpha.ref_value);
604b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
605b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->alpha_ref = alpha_ref;
606b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
607b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* misc */
608b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_render_control = 0;
609b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
610b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
611b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
612b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* TODO db_render_override depends on query */
613b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000);
614b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000);
615b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000);
616b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000);
617b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	//si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control);
618b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control);
619b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control);
620b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override);
6217dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control);
622b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0);
623b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0);
624b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0);
625b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00);
626b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->db_render_override = db_render_override;
627b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
628b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	return dsa;
629b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
630b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
631b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state)
632b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
633b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct r600_context *rctx = (struct r600_context *)ctx;
634b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct si_state_dsa *dsa = state;
635b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
636b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        if (state == NULL)
637b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König                return;
638b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
639b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_bind_state(rctx, dsa, dsa);
640e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_update_dsa_stencil_ref(rctx);
641b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
642b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	// TODO
643b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        rctx->alpha_ref = dsa->alpha_ref;
644b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        rctx->alpha_ref_dirty = true;
645b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
646b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
647b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state)
648b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
649b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
650b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state);
651b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
652b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
653b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_db_flush_dsa(struct r600_context *rctx)
654b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
655b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct pipe_depth_stencil_alpha_state dsa;
656b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct si_state_dsa *state;
657b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
658b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	memset(&dsa, 0, sizeof(dsa));
659b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
660b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
661b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL,
662b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_DEPTH_COPY(1) |
663b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_STENCIL_COPY(1) |
664b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_COPY_CENTROID(1));
665b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        return state;
666b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
667b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
668b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König/*
669835098a5290e59bb7b468eb987db67b0e1913c67Christian König * format translation
670835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
671835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorformat(enum pipe_format format)
672835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
673835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
674835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
675835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UNORM:
676835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UINT:
677835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_SINT:
678835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UNORM:
679835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UINT:
680835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_SINT:
681835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UNORM:
682835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UINT:
683835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SINT:
684835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SRGB:
685835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UNORM:
686835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SNORM:
687835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UINT:
688835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SINT:
689835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8;
690835098a5290e59bb7b468eb987db67b0e1913c67Christian König
691835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 16-bit buffers. */
692835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G6R5_UNORM:
693835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_5_6_5;
694835098a5290e59bb7b468eb987db67b0e1913c67Christian König
695835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5A1_UNORM:
696835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5X1_UNORM:
697835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_1_5_5_5;
698835098a5290e59bb7b468eb987db67b0e1913c67Christian König
699835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4A4_UNORM:
700835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4X4_UNORM:
701835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_4_4_4_4;
702835098a5290e59bb7b468eb987db67b0e1913c67Christian König
703835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UNORM:
704835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UINT:
705835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SINT:
706835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SRGB:
707835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UNORM:
708835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UINT:
709835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_SINT:
710835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_8;
711835098a5290e59bb7b468eb987db67b0e1913c67Christian König
712835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
713835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UNORM:
714835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UINT:
715835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_SINT:
716835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_FLOAT:
717835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_FLOAT:
718835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16;
719835098a5290e59bb7b468eb987db67b0e1913c67Christian König
720835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 32-bit buffers. */
721835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_SRGB:
722835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_UNORM:
723835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8R8G8B8_UNORM:
724835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_SRGB:
725835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_UNORM:
726835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8X8_UNORM:
727835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SNORM:
728835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UNORM:
729835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8X8_UNORM:
730835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
731835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8B8G8R8_UNORM:
732835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8R8G8B8_UNORM:
733835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8_UNORM:
734835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SSCALED:
735835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_USCALED:
736835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SINT:
737835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UINT:
738835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_8_8_8;
739835098a5290e59bb7b468eb987db67b0e1913c67Christian König
740835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10A2_UNORM:
741835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10X2_SNORM:
742835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UNORM:
743835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UINT:
744835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
745835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_2_10_10_10;
746835098a5290e59bb7b468eb987db67b0e1913c67Christian König
747835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
748835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
749835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_24;
750835098a5290e59bb7b468eb987db67b0e1913c67Christian König
751835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8Z24_UNORM:
752835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
753835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_24_8;
754835098a5290e59bb7b468eb987db67b0e1913c67Christian König
755835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
756835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_X24_8_32_FLOAT;
757835098a5290e59bb7b468eb987db67b0e1913c67Christian König
758835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_FLOAT:
759835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
760835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32;
761835098a5290e59bb7b468eb987db67b0e1913c67Christian König
762835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SSCALED:
763835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UNORM:
764835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UINT:
765835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SINT:
766835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16_16;
767835098a5290e59bb7b468eb987db67b0e1913c67Christian König
768835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R11G11B10_FLOAT:
769835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_10_11_11;
770835098a5290e59bb7b468eb987db67b0e1913c67Christian König
771835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 64-bit buffers. */
772835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_USCALED:
773835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_SSCALED:
774835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UINT:
775835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SINT:
776835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_USCALED:
777835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SSCALED:
778835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UNORM:
779835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SNORM:
780835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_FLOAT:
781835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_FLOAT:
782835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16_16_16_16;
783835098a5290e59bb7b468eb987db67b0e1913c67Christian König
784835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_FLOAT:
785835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_USCALED:
786835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SSCALED:
787835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SINT:
788835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_UINT:
789835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32_32;
790835098a5290e59bb7b468eb987db67b0e1913c67Christian König
791835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 128-bit buffers. */
792835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SNORM:
793835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UNORM:
794835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SSCALED:
795835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_USCALED:
796835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SINT:
797835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UINT:
798835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_FLOAT:
799835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32_32_32_32;
800835098a5290e59bb7b468eb987db67b0e1913c67Christian König
801835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* YUV buffers. */
802835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_UYVY:
803835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_YUYV:
804835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 96-bit buffers. */
805835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32_FLOAT:
806835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
807835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L4A4_UNORM:
808835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R4A4_UNORM:
809835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A4R4_UNORM:
810835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
811835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U; /* Unsupported. */
812835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
813835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
814835098a5290e59bb7b468eb987db67b0e1913c67Christian König
815835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorswap(enum pipe_format format)
816835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
817835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
818835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
819835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L4A4_UNORM:
820835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A4R4_UNORM:
821835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
822835098a5290e59bb7b468eb987db67b0e1913c67Christian König
823835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UNORM:
824835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UINT:
825835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_SINT:
826835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R4A4_UNORM:
827835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT_REV;
828835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UNORM:
829835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UNORM:
830835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UINT:
831835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_SINT:
832835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UINT:
833835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SINT:
834835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SRGB:
835835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UNORM:
836835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SNORM:
837835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UINT:
838835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SINT:
839835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
840835098a5290e59bb7b468eb987db67b0e1913c67Christian König
841835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 16-bit buffers. */
842835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G6R5_UNORM:
843835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
844835098a5290e59bb7b468eb987db67b0e1913c67Christian König
845835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5A1_UNORM:
846835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5X1_UNORM:
847835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
848835098a5290e59bb7b468eb987db67b0e1913c67Christian König
849835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4A4_UNORM:
850835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4X4_UNORM:
851835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
852835098a5290e59bb7b468eb987db67b0e1913c67Christian König
853835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
854835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
855835098a5290e59bb7b468eb987db67b0e1913c67Christian König
856835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UNORM:
857835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UINT:
858835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SINT:
859835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SRGB:
860835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
861835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UNORM:
862835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UINT:
863835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_SINT:
864835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
865835098a5290e59bb7b468eb987db67b0e1913c67Christian König
866835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UNORM:
867835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UINT:
868835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_SINT:
869835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_FLOAT:
870835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
871835098a5290e59bb7b468eb987db67b0e1913c67Christian König
872835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 32-bit buffers. */
873835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_SRGB:
874835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
875835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_SRGB:
876835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
877835098a5290e59bb7b468eb987db67b0e1913c67Christian König
878835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_UNORM:
879835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8X8_UNORM:
880835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
881835098a5290e59bb7b468eb987db67b0e1913c67Christian König
882835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8R8G8B8_UNORM:
883835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8R8G8B8_UNORM:
884835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT_REV;
885835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SNORM:
886835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UNORM:
887835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SSCALED:
888835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_USCALED:
889835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SINT:
890835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UINT:
891835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8X8_UNORM:
892835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
893835098a5290e59bb7b468eb987db67b0e1913c67Christian König
894835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_UNORM:
895835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8B8G8R8_UNORM:
896835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
897835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
898835098a5290e59bb7b468eb987db67b0e1913c67Christian König
899835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
900835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
901835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
902835098a5290e59bb7b468eb987db67b0e1913c67Christian König
903835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8Z24_UNORM:
904835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
905835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
906835098a5290e59bb7b468eb987db67b0e1913c67Christian König
907835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10A2_UNORM:
908835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10X2_SNORM:
909835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
910835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
911835098a5290e59bb7b468eb987db67b0e1913c67Christian König
912835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UNORM:
913835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UINT:
914835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
915835098a5290e59bb7b468eb987db67b0e1913c67Christian König
916835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R11G11B10_FLOAT:
917835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_FLOAT:
918835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_UINT:
919835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_SINT:
920835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
921835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_FLOAT:
922835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UNORM:
923835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UINT:
924835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SINT:
925835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
926835098a5290e59bb7b468eb987db67b0e1913c67Christian König
927835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 64-bit buffers. */
928835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_FLOAT:
929835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_UINT:
930835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SINT:
931835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UNORM:
932835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SNORM:
933835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_USCALED:
934835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SSCALED:
935835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UINT:
936835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SINT:
937835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_FLOAT:
938835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
939835098a5290e59bb7b468eb987db67b0e1913c67Christian König
940835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 128-bit buffers. */
941835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_FLOAT:
942835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SNORM:
943835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UNORM:
944835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SSCALED:
945835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_USCALED:
946835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SINT:
947835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UINT:
948835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
949835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
950835098a5290e59bb7b468eb987db67b0e1913c67Christian König		R600_ERR("unsupported colorswap format %d\n", format);
951835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U;
952835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
953835098a5290e59bb7b468eb987db67b0e1913c67Christian König	return ~0U;
954835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
955835098a5290e59bb7b468eb987db67b0e1913c67Christian König
956835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat)
957835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
958835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (R600_BIG_ENDIAN) {
959835098a5290e59bb7b468eb987db67b0e1913c67Christian König		switch(colorformat) {
960835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 8-bit buffers. */
961835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8:
962835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_NONE;
963835098a5290e59bb7b468eb987db67b0e1913c67Christian König
964835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 16-bit buffers. */
965835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_5_6_5:
966835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_1_5_5_5:
967835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_4_4_4_4:
968835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16:
969835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_8:
970835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN16;
971835098a5290e59bb7b468eb987db67b0e1913c67Christian König
972835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 32-bit buffers. */
973835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_8_8_8:
974835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_2_10_10_10:
975835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_24:
976835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_24_8:
977835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16_16:
978835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
979835098a5290e59bb7b468eb987db67b0e1913c67Christian König
980835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 64-bit buffers. */
981835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16_16_16_16:
982835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN16;
983835098a5290e59bb7b468eb987db67b0e1913c67Christian König
984835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_32_32:
985835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
986835098a5290e59bb7b468eb987db67b0e1913c67Christian König
987835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 128-bit buffers. */
988835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_32_32_32_32:
989835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
990835098a5290e59bb7b468eb987db67b0e1913c67Christian König		default:
991835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_NONE; /* Unsupported. */
992835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
993835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
994835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_ENDIAN_NONE;
995835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
996835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
997835098a5290e59bb7b468eb987db67b0e1913c67Christian König
998f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer/* Returns the size in bits of the widest component of a CB format */
999f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzerstatic unsigned si_colorformat_max_comp_size(uint32_t colorformat)
1000f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer{
1001f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	switch(colorformat) {
1002f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_4_4_4_4:
1003f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 4;
1004f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1005f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_1_5_5_5:
1006f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_5_5_5_1:
1007f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 5;
1008f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1009f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_5_6_5:
1010f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 6;
1011f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1012f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_8:
1013f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_8_8:
1014f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_8_8_8_8:
1015f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 8;
1016f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1017f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_10_10_10_2:
1018f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_2_10_10_10:
1019f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 10;
1020f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1021f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_10_11_11:
1022f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_11_11_10:
1023f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 11;
1024f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1025f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_16:
1026f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_16_16:
1027f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_16_16_16_16:
1028f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 16;
1029f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1030f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_8_24:
1031f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_24_8:
1032f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 24;
1033f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1034f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_32:
1035f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_32_32:
1036f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_32_32_32_32:
1037f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	case V_028C70_COLOR_X24_8_32_FLOAT:
1038f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		return 32;
1039f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	}
1040f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1041f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	assert(!"Unknown maximum component size");
1042f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	return 0;
1043f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer}
1044f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1045835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_dbformat(enum pipe_format format)
1046835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1047835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
1048835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
1049835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_16;
1050835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
1051835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1052835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_24; /* XXX no longer supported on SI */
1053835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
1054835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
1055835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_32_FLOAT;
1056835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
1057835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U;
1058835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1059835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1060835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1061835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
106273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König * Texture translation
106373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König */
106473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
106573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic uint32_t si_translate_texformat(struct pipe_screen *screen,
106673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       enum pipe_format format,
106773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       const struct util_format_description *desc,
106873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       int first_non_void)
106973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
107073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	boolean uniform = TRUE;
107173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	int i;
107273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
107373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Colorspace (return non-RGB formats directly). */
107473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->colorspace) {
107573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Depth stencil formats */
107673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_ZS:
107773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (format) {
107873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z16_UNORM:
107973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16;
108073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_X24S8_UINT:
108173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z24X8_UNORM:
108273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z24_UNORM_S8_UINT:
108373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_24_8;
108473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8X24_UINT:
108573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_X8Z24_UNORM:
108673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8_UINT_Z24_UNORM:
108773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_24;
108873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8_UINT:
108973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8;
109073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z32_FLOAT:
109173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32;
109273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
109373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_X24_8_32;
109473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		default:
109573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
109673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
109773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
109873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_YUV:
109973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown; /* TODO */
110073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
110173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_SRGB:
110273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
110373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
110473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
110573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
110673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
110773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
110873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* TODO compressed formats */
110973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
111073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) {
111173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F14_IMG_DATA_FORMAT_5_9_9_9;
111273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	} else if (format == PIPE_FORMAT_R11G11B10_FLOAT) {
111373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F14_IMG_DATA_FORMAT_10_11_11;
111473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
111573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
111673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* R8G8Bx_SNORM - TODO CxV8U8 */
111773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
111873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* See whether the components are of the same size. */
111973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	for (i = 1; i < desc->nr_channels; i++) {
112073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		uniform = uniform && desc->channel[0].size == desc->channel[i].size;
112173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
112273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
112373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Non-uniform formats. */
112473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (!uniform) {
112573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch(desc->nr_channels) {
112673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 3:
112773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 5 &&
112873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 6 &&
112973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 5) {
113073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_5_6_5;
113173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
113273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
113373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
113473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 5 &&
113573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 5 &&
113673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 5 &&
113773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[3].size == 1) {
113873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_1_5_5_5;
113973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
114073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 10 &&
114173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 10 &&
114273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 10 &&
114373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[3].size == 2) {
114473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_2_10_10_10;
114573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
114673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
114773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
114873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown;
114973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
115073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
115173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (first_non_void < 0 || first_non_void > 3)
115273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown;
115373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
115473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* uniform formats */
115573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->channel[first_non_void].size) {
115673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 4:
115773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
115873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
115973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_4_4;
116073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
116173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_4_4_4_4;
116273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
116373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
116473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 8:
116573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
116673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
116773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8;
116873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
116973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_8;
117073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
117173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_8_8_8;
117273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
117373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
117473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 16:
117573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
117673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
117773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16;
117873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
117973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16_16;
118073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
118173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16_16_16_16;
118273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
118373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
118473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 32:
118573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
118673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
118773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32;
118873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
118973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32;
119073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 3:
119173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32_32;
119273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
119373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32_32_32;
119473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
119573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
119673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
119773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königout_unknown:
119873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */
119973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return ~0;
120073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
120173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
120273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_wrap(unsigned wrap)
120373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
120473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (wrap) {
120573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
120673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_REPEAT:
120773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_WRAP;
120873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP:
120973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_HALF_BORDER;
121073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
121173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL;
121273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
121373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_BORDER;
121473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_REPEAT:
121573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR;
121673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP:
121773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
121873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
121973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
122073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
122173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER;
122273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
122373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
122473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
122573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_filter(unsigned filter)
122673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
122773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (filter) {
122873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
122973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_FILTER_NEAREST:
123073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_XY_FILTER_POINT;
123173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_FILTER_LINEAR:
123273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_XY_FILTER_BILINEAR;
123373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
123473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
123573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
123673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_mipfilter(unsigned filter)
123773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
123873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (filter) {
123973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_NEAREST:
124073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_POINT;
124173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_LINEAR:
124273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_LINEAR;
124373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
124473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_NONE:
124573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_NONE;
124673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
124773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
124873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
124973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_compare(unsigned compare)
125073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
125173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (compare) {
125273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
125373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_NEVER:
125473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER;
125573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_LESS:
125673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS;
125773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_EQUAL:
125873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL;
125973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_LEQUAL:
126073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
126173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_GREATER:
126273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER;
126373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_NOTEQUAL:
126473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
126573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_GEQUAL:
126673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
126773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_ALWAYS:
126873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS;
126973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
127073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
127173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
127273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_dim(unsigned dim)
127373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
127473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (dim) {
127573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
127673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_1D:
127773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_1D;
127873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_1D_ARRAY:
127973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_1D_ARRAY;
128073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_2D:
128173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_RECT:
128273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_2D;
128373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_2D_ARRAY:
128473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_2D_ARRAY;
128573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_3D:
128673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_3D;
128773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_CUBE:
128873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_CUBE;
128973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
129073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
129173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
129273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König/*
129353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König * Format support testing
129453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König */
129553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
129653d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
129753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
129853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_texformat(screen, format, util_format_description(format),
129953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König				      util_format_get_first_non_void_channel(format)) != ~0U;
130053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
130153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
1302b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian Königstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen,
1303b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  enum pipe_format format,
1304b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  const struct util_format_description *desc,
1305b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  int first_non_void)
130653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
1307302c66ff813221998bbdcd56887a440aa3c60650Christian König	unsigned type = desc->channel[first_non_void].type;
1308302c66ff813221998bbdcd56887a440aa3c60650Christian König	int i;
1309302c66ff813221998bbdcd56887a440aa3c60650Christian König
1310302c66ff813221998bbdcd56887a440aa3c60650Christian König	if (type == UTIL_FORMAT_TYPE_FIXED)
1311302c66ff813221998bbdcd56887a440aa3c60650Christian König		return V_008F0C_BUF_DATA_FORMAT_INVALID;
131253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
1313302c66ff813221998bbdcd56887a440aa3c60650Christian König	/* See whether the components are of the same size. */
1314302c66ff813221998bbdcd56887a440aa3c60650Christian König	for (i = 0; i < desc->nr_channels; i++) {
1315302c66ff813221998bbdcd56887a440aa3c60650Christian König		if (desc->channel[first_non_void].size != desc->channel[i].size)
1316302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_INVALID;
1317302c66ff813221998bbdcd56887a440aa3c60650Christian König	}
131853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
1319302c66ff813221998bbdcd56887a440aa3c60650Christian König	switch (desc->channel[first_non_void].size) {
1320302c66ff813221998bbdcd56887a440aa3c60650Christian König	case 8:
1321302c66ff813221998bbdcd56887a440aa3c60650Christian König		switch (desc->nr_channels) {
1322302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 1:
1323302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_8;
1324302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 2:
1325302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_8_8;
1326302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 3:
1327302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 4:
1328302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
1329302c66ff813221998bbdcd56887a440aa3c60650Christian König		}
1330302c66ff813221998bbdcd56887a440aa3c60650Christian König		break;
1331302c66ff813221998bbdcd56887a440aa3c60650Christian König	case 16:
1332302c66ff813221998bbdcd56887a440aa3c60650Christian König		switch (desc->nr_channels) {
1333302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 1:
1334302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_16;
1335302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 2:
1336302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_16_16;
1337302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 3:
1338302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 4:
1339302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
1340302c66ff813221998bbdcd56887a440aa3c60650Christian König		}
1341302c66ff813221998bbdcd56887a440aa3c60650Christian König		break;
1342302c66ff813221998bbdcd56887a440aa3c60650Christian König	case 32:
1343302c66ff813221998bbdcd56887a440aa3c60650Christian König		if (type != UTIL_FORMAT_TYPE_FLOAT)
1344302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_INVALID;
1345302c66ff813221998bbdcd56887a440aa3c60650Christian König
1346302c66ff813221998bbdcd56887a440aa3c60650Christian König		switch (desc->nr_channels) {
1347302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 1:
1348302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_32;
1349302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 2:
1350302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_32_32;
1351302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 3:
1352302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_32_32_32;
1353302c66ff813221998bbdcd56887a440aa3c60650Christian König		case 4:
1354302c66ff813221998bbdcd56887a440aa3c60650Christian König			return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
1355302c66ff813221998bbdcd56887a440aa3c60650Christian König		}
1356302c66ff813221998bbdcd56887a440aa3c60650Christian König		break;
1357302c66ff813221998bbdcd56887a440aa3c60650Christian König	}
135853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
1359302c66ff813221998bbdcd56887a440aa3c60650Christian König	return V_008F0C_BUF_DATA_FORMAT_INVALID;
136053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
136153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
136253d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format)
136353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
1364302c66ff813221998bbdcd56887a440aa3c60650Christian König	const struct util_format_description *desc;
1365302c66ff813221998bbdcd56887a440aa3c60650Christian König	int first_non_void;
1366302c66ff813221998bbdcd56887a440aa3c60650Christian König	unsigned data_format;
1367302c66ff813221998bbdcd56887a440aa3c60650Christian König
1368302c66ff813221998bbdcd56887a440aa3c60650Christian König	desc = util_format_description(format);
1369302c66ff813221998bbdcd56887a440aa3c60650Christian König	first_non_void = util_format_get_first_non_void_channel(format);
1370302c66ff813221998bbdcd56887a440aa3c60650Christian König	data_format = si_translate_vertexformat(screen, format, desc, first_non_void);
1371302c66ff813221998bbdcd56887a440aa3c60650Christian König	return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID;
137253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
137353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
137453d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_colorbuffer_format_supported(enum pipe_format format)
137553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
137653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_colorformat(format) != ~0U &&
137753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		si_translate_colorswap(format) != ~0U;
137853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
137953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
138053d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_zs_format_supported(enum pipe_format format)
138153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
138253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_dbformat(format) != ~0U;
138353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
138453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
138553d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen,
138653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_format format,
138753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_texture_target target,
138853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned sample_count,
138953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned usage)
139053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
139153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	unsigned retval = 0;
139253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
139353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (target >= PIPE_MAX_TEXTURE_TYPES) {
139453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		R600_ERR("r600: unsupported texture type %d\n", target);
139553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
139653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
139753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
139853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (!util_format_is_supported(format, usage))
139953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
140053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
140153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	/* Multisample */
140253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (sample_count > 1)
140353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
140453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
140553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
140653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_sampler_format_supported(screen, format)) {
140753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_SAMPLER_VIEW;
140853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
140953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
141053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & (PIPE_BIND_RENDER_TARGET |
141153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_DISPLAY_TARGET |
141253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_SCANOUT |
141353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_SHARED)) &&
141453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_colorbuffer_format_supported(format)) {
141553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= usage &
141653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			  (PIPE_BIND_RENDER_TARGET |
141753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_DISPLAY_TARGET |
141853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_SCANOUT |
141953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_SHARED);
142053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
142153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
142253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
142353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_zs_format_supported(format)) {
142453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_DEPTH_STENCIL;
142553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
142653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
142753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
142853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_vertex_format_supported(screen, format)) {
142953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_VERTEX_BUFFER;
143053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
143153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
143253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (usage & PIPE_BIND_TRANSFER_READ)
143353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_TRANSFER_READ;
143453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (usage & PIPE_BIND_TRANSFER_WRITE)
143553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_TRANSFER_WRITE;
143653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
143753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return retval == usage;
143853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
143953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
144053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König/*
1441835098a5290e59bb7b468eb987db67b0e1913c67Christian König * framebuffer handling
1442835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
1443835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1444835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4,
1445835098a5290e59bb7b468eb987db67b0e1913c67Christian König		  const struct pipe_framebuffer_state *state, int cb)
1446835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1447835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_resource_texture *rtex;
1448835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_surface *surf;
1449835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned level = state->cbufs[cb]->u.tex.level;
1450835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned pitch, slice;
1451835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned color_info, color_attrib;
1452835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned format, swap, ntype, endian;
1453835098a5290e59bb7b468eb987db67b0e1913c67Christian König	uint64_t offset;
1454835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned blocksize;
1455835098a5290e59bb7b468eb987db67b0e1913c67Christian König	const struct util_format_description *desc;
1456835098a5290e59bb7b468eb987db67b0e1913c67Christian König	int i;
1457835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned blend_clamp = 0, blend_bypass = 0;
1458f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	unsigned max_comp_size;
1459835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1460835098a5290e59bb7b468eb987db67b0e1913c67Christian König	surf = (struct r600_surface *)state->cbufs[cb];
1461835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture;
1462835098a5290e59bb7b468eb987db67b0e1913c67Christian König	blocksize = util_format_get_blocksize(rtex->real_format);
1463835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1464835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->depth)
1465835098a5290e59bb7b468eb987db67b0e1913c67Christian König		rctx->have_depth_fb = TRUE;
1466835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1467835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->depth && !rtex->is_flushing_texture) {
1468835098a5290e59bb7b468eb987db67b0e1913c67Christian König	        r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE);
1469835098a5290e59bb7b468eb987db67b0e1913c67Christian König		rtex = rtex->flushed_depth_texture;
1470835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1471835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1472835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset = rtex->surface.level[level].offset;
1473835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1474835098a5290e59bb7b468eb987db67b0e1913c67Christian König		offset += rtex->surface.level[level].slice_size *
1475835098a5290e59bb7b468eb987db67b0e1913c67Christian König			  state->cbufs[cb]->u.tex.first_layer;
1476835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1477835098a5290e59bb7b468eb987db67b0e1913c67Christian König	pitch = (rtex->surface.level[level].nblk_x) / 8 - 1;
1478835098a5290e59bb7b468eb987db67b0e1913c67Christian König	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1479835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (slice) {
1480835098a5290e59bb7b468eb987db67b0e1913c67Christian König		slice = slice - 1;
1481835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1482835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1483835098a5290e59bb7b468eb987db67b0e1913c67Christian König	color_attrib = S_028C74_TILE_MODE_INDEX(8);
1484835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (rtex->surface.level[level].mode) {
1485835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1486835098a5290e59bb7b468eb987db67b0e1913c67Christian König		color_attrib = S_028C74_TILE_MODE_INDEX(8);
1487835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1488835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_1D:
1489835098a5290e59bb7b468eb987db67b0e1913c67Christian König		color_attrib = S_028C74_TILE_MODE_INDEX(9);
1490835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1491835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_2D:
1492835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) {
1493835098a5290e59bb7b468eb987db67b0e1913c67Christian König			switch (blocksize) {
1494835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 1:
1495835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(10);
1496835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1497835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 2:
1498835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(11);
1499835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1500835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 4:
1501835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(12);
1502835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1503835098a5290e59bb7b468eb987db67b0e1913c67Christian König			}
1504835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1505835098a5290e59bb7b468eb987db67b0e1913c67Christian König		} else switch (blocksize) {
1506835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 1:
1507835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(14);
1508835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1509835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 2:
1510835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(15);
1511835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1512835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 4:
1513835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(16);
1514835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1515835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 8:
1516835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(17);
1517835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1518835098a5290e59bb7b468eb987db67b0e1913c67Christian König		default:
1519835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(13);
1520835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1521835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1522835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1523835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1524835098a5290e59bb7b468eb987db67b0e1913c67Christian König	desc = util_format_description(surf->base.format);
1525835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (i = 0; i < 4; i++) {
1526835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
1527835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1528835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1529835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1530835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) {
1531835098a5290e59bb7b468eb987db67b0e1913c67Christian König		ntype = V_028C70_NUMBER_FLOAT;
1532835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1533835098a5290e59bb7b468eb987db67b0e1913c67Christian König		ntype = V_028C70_NUMBER_UNORM;
1534835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
1535835098a5290e59bb7b468eb987db67b0e1913c67Christian König			ntype = V_028C70_NUMBER_SRGB;
1536835098a5290e59bb7b468eb987db67b0e1913c67Christian König		else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
1537835098a5290e59bb7b468eb987db67b0e1913c67Christian König			if (desc->channel[i].normalized)
1538835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_SNORM;
1539835098a5290e59bb7b468eb987db67b0e1913c67Christian König			else if (desc->channel[i].pure_integer)
1540835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_SINT;
1541835098a5290e59bb7b468eb987db67b0e1913c67Christian König		} else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1542835098a5290e59bb7b468eb987db67b0e1913c67Christian König			if (desc->channel[i].normalized)
1543835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_UNORM;
1544835098a5290e59bb7b468eb987db67b0e1913c67Christian König			else if (desc->channel[i].pure_integer)
1545835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_UINT;
1546835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1547835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1548835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1549835098a5290e59bb7b468eb987db67b0e1913c67Christian König	format = si_translate_colorformat(surf->base.format);
1550835098a5290e59bb7b468eb987db67b0e1913c67Christian König	swap = si_translate_colorswap(surf->base.format);
1551835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
1552835098a5290e59bb7b468eb987db67b0e1913c67Christian König		endian = V_028C70_ENDIAN_NONE;
1553835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1554835098a5290e59bb7b468eb987db67b0e1913c67Christian König		endian = si_colorformat_endian_swap(format);
1555835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1556835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1557835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* blend clamp should be set for all NORM/SRGB types */
1558835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (ntype == V_028C70_NUMBER_UNORM ||
1559835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    ntype == V_028C70_NUMBER_SNORM ||
1560835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    ntype == V_028C70_NUMBER_SRGB)
1561835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_clamp = 1;
1562835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1563835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* set blend bypass according to docs if SINT/UINT or
1564835098a5290e59bb7b468eb987db67b0e1913c67Christian König	   8/24 COLOR variants */
1565835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT ||
1566835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 ||
1567835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    format == V_028C70_COLOR_X24_8_32_FLOAT) {
1568835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_clamp = 0;
1569835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_bypass = 1;
1570835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1571835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1572835098a5290e59bb7b468eb987db67b0e1913c67Christian König	color_info = S_028C70_FORMAT(format) |
1573835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_COMP_SWAP(swap) |
1574835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_BLEND_CLAMP(blend_clamp) |
1575835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_BLEND_BYPASS(blend_bypass) |
1576835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_NUMBER_TYPE(ntype) |
1577835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_ENDIAN(endian);
1578835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1579835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->alpha_ref_dirty = true;
1580835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1581835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture);
1582835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset >>= 8;
1583835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1584835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* FIXME handle enabling of CB beyond BASE8 which has different offset */
1585835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
1586835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset);
1587835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch));
1588835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice));
1589835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1590835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1591835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000);
1592835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1593835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C,
1594835098a5290e59bb7b468eb987db67b0e1913c67Christian König			       S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) |
1595835098a5290e59bb7b468eb987db67b0e1913c67Christian König			       S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer));
1596835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1597835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info);
1598835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib);
1599f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer
1600f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	/* Determine pixel shader export format */
1601f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	max_comp_size = si_colorformat_max_comp_size(format);
1602f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	if (ntype == V_028C70_NUMBER_SRGB ||
1603f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	    ((ntype == V_028C70_NUMBER_UNORM || ntype == V_028C70_NUMBER_SNORM) &&
1604f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	     max_comp_size <= 10) ||
1605f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	    (ntype == V_028C70_NUMBER_FLOAT && max_comp_size <= 16)) {
1606f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		rctx->export_16bpc |= 1 << cb;
1607f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		rctx->spi_shader_col_format |= V_028714_SPI_SHADER_FP16_ABGR << (4 * cb);
1608f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	} else
1609f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		rctx->spi_shader_col_format |= V_028714_SPI_SHADER_32_ABGR << (4 * cb);
1610835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1611835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1612835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4,
1613835098a5290e59bb7b468eb987db67b0e1913c67Christian König		  const struct pipe_framebuffer_state *state)
1614835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1615835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_resource_texture *rtex;
1616835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_surface *surf;
161786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	unsigned level, pitch, slice, format;
161886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	uint32_t z_info, s_info;
161986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	uint64_t z_offs, s_offs;
1620835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1621835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (state->zsbuf == NULL) {
1622835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1623835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
1624835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return;
1625835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1626835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1627835098a5290e59bb7b468eb987db67b0e1913c67Christian König	surf = (struct r600_surface *)state->zsbuf;
1628835098a5290e59bb7b468eb987db67b0e1913c67Christian König	level = surf->base.u.tex.level;
1629835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rtex = (struct r600_resource_texture*)surf->base.texture;
1630835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1631835098a5290e59bb7b468eb987db67b0e1913c67Christian König	format = si_translate_dbformat(rtex->real_format);
1632835098a5290e59bb7b468eb987db67b0e1913c67Christian König
163386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
163486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs += rtex->surface.level[level].offset;
163586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
163686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
163786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs += rtex->surface.stencil_offset;
163886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs += rtex->surface.level[level].offset / 4;
163986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
164086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs >>= 8;
164186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs >>= 8;
164286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
1643835098a5290e59bb7b468eb987db67b0e1913c67Christian König	pitch = (rtex->surface.level[level].nblk_x / 8) - 1;
1644835098a5290e59bb7b468eb987db67b0e1913c67Christian König	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1645835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (slice) {
1646835098a5290e59bb7b468eb987db67b0e1913c67Christian König		slice = slice - 1;
1647835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1648835098a5290e59bb7b468eb987db67b0e1913c67Christian König
164986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_info = S_028040_FORMAT(format);
165086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_info = S_028044_FORMAT(1);
1651835098a5290e59bb7b468eb987db67b0e1913c67Christian König
165286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) {
165386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		z_info |= S_028040_TILE_MODE_INDEX(4);
165486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		s_info |= S_028044_TILE_MODE_INDEX(4);
1655835098a5290e59bb7b468eb987db67b0e1913c67Christian König
165686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	} else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) {
165786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		switch (format) {
165886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_16:
165986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(5);
166086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(5);
166186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			break;
166286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_24:
166386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_32_FLOAT:
166486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(6);
166586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(6);
166686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			break;
166786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		default:
166886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(7);
166986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(7);
167086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		}
1671835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1672835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
167386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		R600_ERR("Invalid DB tiling mode %d!\n",
167486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			 rtex->surface.level[level].mode);
167586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1676835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
167786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		return;
1678835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1679835098a5290e59bb7b468eb987db67b0e1913c67Christian König
168086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW,
168186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		       S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) |
168286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		       S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer));
168386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
168486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1);
1685835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (format != ~0U) {
168686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info);
1687835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1688835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1689835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1690835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
169186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
169286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
169386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info);
169486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	} else {
169586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
169686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	}
169786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
169886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
169986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs);
170086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs);
170186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs);
170286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs);
170386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
170486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch));
170586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice));
1706835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1707835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1708835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_set_framebuffer_state(struct pipe_context *ctx,
1709835098a5290e59bb7b468eb987db67b0e1913c67Christian König				     const struct pipe_framebuffer_state *state)
1710835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1711835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
1712835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
1713835098a5290e59bb7b468eb987db67b0e1913c67Christian König	uint32_t shader_mask, tl, br;
1714835098a5290e59bb7b468eb987db67b0e1913c67Christian König	int tl_x, tl_y, br_x, br_y;
1715835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1716835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (pm4 == NULL)
1717835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return;
1718835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1719835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_inval_fb_cache(pm4, state->nr_cbufs);
1720835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1721835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (state->zsbuf)
1722835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_inval_zsbuf_cache(pm4);
1723835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1724835098a5290e59bb7b468eb987db67b0e1913c67Christian König	util_copy_framebuffer_state(&rctx->framebuffer, state);
1725835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1726835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* build states */
1727835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->have_depth_fb = 0;
1728f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	rctx->export_16bpc = 0;
1729f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	rctx->spi_shader_col_format = 0;
1730835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (int i = 0; i < state->nr_cbufs; i++) {
1731835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_cb(rctx, pm4, state, i);
1732835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1733f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	assert(!(rctx->export_16bpc & ~0xff));
1734835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_db(rctx, pm4, state);
1735835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1736835098a5290e59bb7b468eb987db67b0e1913c67Christian König	shader_mask = 0;
1737835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (int i = 0; i < state->nr_cbufs; i++) {
1738835098a5290e59bb7b468eb987db67b0e1913c67Christian König		shader_mask |= 0xf << (i * 4);
1739835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1740835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl_x = 0;
1741835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl_y = 0;
1742835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br_x = state->width;
1743835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br_y = state->height;
1744835098a5290e59bb7b468eb987db67b0e1913c67Christian König#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */
1745835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* EG hw workaround */
1746835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (br_x == 0)
1747835098a5290e59bb7b468eb987db67b0e1913c67Christian König		tl_x = 1;
1748835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (br_y == 0)
1749835098a5290e59bb7b468eb987db67b0e1913c67Christian König		tl_y = 1;
1750835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* cayman hw workaround */
1751835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rctx->chip_class == CAYMAN) {
1752835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (br_x == 1 && br_y == 1)
1753835098a5290e59bb7b468eb987db67b0e1913c67Christian König			br_x = 2;
1754835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1755835098a5290e59bb7b468eb987db67b0e1913c67Christian König#endif
1756835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y);
1757835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
1758835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1759835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl);
1760835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br);
1761835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl);
1762835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br);
1763835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl);
1764835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br);
1765835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl);
1766835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br);
1767835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000);
1768835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
1769835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask);
1770f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer	si_pm4_set_reg(pm4, R_028714_SPI_SHADER_COL_FORMAT,
1771f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		       rctx->spi_shader_col_format);
1772835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000);
1773835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1774835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_state(rctx, framebuffer, pm4);
1775bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_update_fb_rs_state(rctx);
177676660dfccede74782ac0d409da171ddbd61fae41Christian König	si_update_fb_blend_state(rctx);
1777835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1778835098a5290e59bb7b468eb987db67b0e1913c67Christian König
17793c09f11e5cefd437bb8185539430786dc245c96fChristian König/*
17803c09f11e5cefd437bb8185539430786dc245c96fChristian König * shaders
17813c09f11e5cefd437bb8185539430786dc245c96fChristian König */
17823c09f11e5cefd437bb8185539430786dc245c96fChristian König
1783d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer/* Compute the key for the hw shader variant */
1784d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic INLINE unsigned si_shader_selector_key(struct pipe_context *ctx,
1785d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer					      struct si_pipe_shader_selector *sel)
1786d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{
1787d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct r600_context *rctx = (struct r600_context *)ctx;
1788d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned key = 0;
1789d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1790d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (sel->type == PIPE_SHADER_FRAGMENT) {
1791d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		if (sel->fs_write_all)
1792d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			key |= rctx->framebuffer.nr_cbufs;
1793f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		key |= rctx->export_16bpc << 4;
1794d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		/*if (rctx->queued.named.rasterizer)
1795f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer			  key |= rctx->queued.named.rasterizer->flatshade << 12;*/
1796f402acdbe244e5de9b2b616e0a908f5d1416ce89Michel Dänzer		/*key |== rctx->two_side << 13;*/
1797d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1798d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1799d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	return key;
1800d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer}
1801d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1802d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer/* Select the hw shader variant depending on the current state.
1803d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer * (*dirty) is set to 1 if current variant was changed */
1804d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerint si_shader_select(struct pipe_context *ctx,
1805d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		     struct si_pipe_shader_selector *sel,
1806d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		     unsigned *dirty)
1807d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{
1808d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned key;
1809d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader * shader = NULL;
1810d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	int r;
1811d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1812d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	key = si_shader_selector_key(ctx, sel);
1813d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1814d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	/* Check if we don't need to change anything.
1815d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	 * This path is also used for most shaders that don't need multiple
1816d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	 * variants, it will cost just a computation of the key and this
1817d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	 * test. */
1818d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (likely(sel->current && sel->current->key == key)) {
1819d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		return 0;
1820d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1821d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1822d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	/* lookup if we have other variants in the list */
1823d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (sel->num_shaders > 1) {
1824d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		struct si_pipe_shader *p = sel->current, *c = p->next_variant;
1825d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1826d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		while (c && c->key != key) {
1827d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			p = c;
1828d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			c = c->next_variant;
1829d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		}
1830d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1831d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		if (c) {
1832d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			p->next_variant = c->next_variant;
1833d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			shader = c;
1834d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		}
1835d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1836d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1837d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (unlikely(!shader)) {
1838d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		shader = CALLOC(1, sizeof(struct si_pipe_shader));
1839d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		shader->selector = sel;
1840d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1841d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		r = si_pipe_shader_create(ctx, shader);
1842d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		if (unlikely(r)) {
1843d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
1844d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				 sel->type, key, r);
1845d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			sel->current = NULL;
1846d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			return r;
1847d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		}
1848d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1849d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		/* We don't know the value of fs_write_all property until we built
1850d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		 * at least one variant, so we may need to recompute the key (include
1851d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		 * rctx->framebuffer.nr_cbufs) after building first variant. */
1852d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		if (sel->type == PIPE_SHADER_FRAGMENT &&
1853d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		    sel->num_shaders == 0 &&
1854d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		    shader->shader.fs_write_all) {
1855d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			sel->fs_write_all = 1;
1856d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer			key = si_shader_selector_key(ctx, sel);
1857d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		}
1858d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1859d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		shader->key = key;
1860d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		sel->num_shaders++;
1861d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1862d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1863d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (dirty)
1864d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		*dirty = 1;
1865d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1866d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	shader->next_variant = sel->current;
1867d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	sel->current = shader;
1868d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1869d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	return 0;
1870d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer}
1871d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
18723c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void *si_create_shader_state(struct pipe_context *ctx,
1873d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				    const struct pipe_shader_state *state,
1874d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				    unsigned pipe_shader_type)
18753c09f11e5cefd437bb8185539430786dc245c96fChristian König{
1876d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector *sel = CALLOC_STRUCT(si_pipe_shader_selector);
1877d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	int r;
18783c09f11e5cefd437bb8185539430786dc245c96fChristian König
1879d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	sel->type = pipe_shader_type;
1880d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	sel->tokens = tgsi_dup_tokens(state->tokens);
1881d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	sel->so = state->stream_output;
1882d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1883d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	r = si_shader_select(ctx, sel, NULL);
1884d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (r) {
1885d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	    free(sel);
1886d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	    return NULL;
1887d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1888d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1889d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	return sel;
1890d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer}
1891d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1892d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void *si_create_fs_state(struct pipe_context *ctx,
1893d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				const struct pipe_shader_state *state)
1894d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{
1895d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
1896d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer}
18973c09f11e5cefd437bb8185539430786dc245c96fChristian König
1898d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void *si_create_vs_state(struct pipe_context *ctx,
1899d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				const struct pipe_shader_state *state)
1900d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{
1901d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	return si_create_shader_state(ctx, state, PIPE_SHADER_VERTEX);
19023c09f11e5cefd437bb8185539430786dc245c96fChristian König}
19033c09f11e5cefd437bb8185539430786dc245c96fChristian König
19043c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state)
19053c09f11e5cefd437bb8185539430786dc245c96fChristian König{
19063c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
1907d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector *sel = state;
19083c09f11e5cefd437bb8185539430786dc245c96fChristian König
1909d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (rctx->vs_shader == sel)
19103c09f11e5cefd437bb8185539430786dc245c96fChristian König		return;
19113c09f11e5cefd437bb8185539430786dc245c96fChristian König
19123c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->shader_dirty = true;
1913d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	rctx->vs_shader = sel;
19141fb8ee62faf081e6a5588e99620a9883e3788c46Christian König
1915d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (sel && sel->current)
1916d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_bind_state(rctx, vs, sel->current->pm4);
1917d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	else
1918d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4);
19193c09f11e5cefd437bb8185539430786dc245c96fChristian König}
19203c09f11e5cefd437bb8185539430786dc245c96fChristian König
19213c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state)
19223c09f11e5cefd437bb8185539430786dc245c96fChristian König{
19233c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
1924d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector *sel = state;
19253c09f11e5cefd437bb8185539430786dc245c96fChristian König
1926d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (rctx->ps_shader == sel)
19273c09f11e5cefd437bb8185539430786dc245c96fChristian König		return;
19283c09f11e5cefd437bb8185539430786dc245c96fChristian König
19293c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->shader_dirty = true;
1930d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	rctx->ps_shader = sel;
19311fb8ee62faf081e6a5588e99620a9883e3788c46Christian König
1932d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (sel && sel->current)
1933d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_bind_state(rctx, ps, sel->current->pm4);
1934d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	else
1935d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_bind_state(rctx, ps, rctx->dummy_pixel_shader->pm4);
19363c09f11e5cefd437bb8185539430786dc245c96fChristian König}
19373c09f11e5cefd437bb8185539430786dc245c96fChristian König
1938d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstatic void si_delete_shader_selector(struct pipe_context *ctx,
1939d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer				      struct si_pipe_shader_selector *sel)
1940d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer{
1941d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct r600_context *rctx = (struct r600_context *)ctx;
1942d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader *p = sel->current, *c;
1943d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1944d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	while (p) {
1945d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		c = p->next_variant;
1946d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_delete_state(rctx, vs, p->pm4);
1947d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pipe_shader_destroy(ctx, p);
1948d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		free(p);
1949d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		p = c;
1950d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
1951d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
1952d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	free(sel->tokens);
1953d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	free(sel);
1954d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer }
1955d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
19563c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state)
19573c09f11e5cefd437bb8185539430786dc245c96fChristian König{
19583c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
1959d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state;
19603c09f11e5cefd437bb8185539430786dc245c96fChristian König
1961d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (rctx->vs_shader == sel) {
19623c09f11e5cefd437bb8185539430786dc245c96fChristian König		rctx->vs_shader = NULL;
19633c09f11e5cefd437bb8185539430786dc245c96fChristian König	}
19643c09f11e5cefd437bb8185539430786dc245c96fChristian König
1965d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	si_delete_shader_selector(ctx, sel);
19663c09f11e5cefd437bb8185539430786dc245c96fChristian König}
19673c09f11e5cefd437bb8185539430786dc245c96fChristian König
19683c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state)
19693c09f11e5cefd437bb8185539430786dc245c96fChristian König{
19703c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
1971d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_pipe_shader_selector *sel = (struct si_pipe_shader_selector *)state;
19723c09f11e5cefd437bb8185539430786dc245c96fChristian König
1973d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (rctx->ps_shader == sel) {
19743c09f11e5cefd437bb8185539430786dc245c96fChristian König		rctx->ps_shader = NULL;
19753c09f11e5cefd437bb8185539430786dc245c96fChristian König	}
19763c09f11e5cefd437bb8185539430786dc245c96fChristian König
1977d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	si_delete_shader_selector(ctx, sel);
19783c09f11e5cefd437bb8185539430786dc245c96fChristian König}
19793c09f11e5cefd437bb8185539430786dc245c96fChristian König
1980baf20397569fb499f736e5ad2350b008b8207fadChristian König/*
1981baf20397569fb499f736e5ad2350b008b8207fadChristian König * Samplers
1982baf20397569fb499f736e5ad2350b008b8207fadChristian König */
1983baf20397569fb499f736e5ad2350b008b8207fadChristian König
198473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx,
198573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König							struct pipe_resource *texture,
198673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König							const struct pipe_sampler_view *state)
198773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
198873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view);
198973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture;
199073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	const struct util_format_description *desc = util_format_description(state->format);
199173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned blocksize = util_format_get_blocksize(tmp->real_format);
199273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned format, num_format, /*endian,*/ tiling_index;
199373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	uint32_t pitch = 0;
199473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned char state_swizzle[4], swizzle[4];
19959aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	unsigned height, depth, width, offset_level, last_level;
199673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	int first_non_void;
199773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	uint64_t va;
199873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
199973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (view == NULL)
200073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return NULL;
200173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
200273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* initialize base object */
200373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base = *state;
200473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.texture = NULL;
200573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	pipe_reference(NULL, &texture->reference);
200673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.texture = texture;
200773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.reference.count = 1;
200873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.context = ctx;
200973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
201073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[0] = state->swizzle_r;
201173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[1] = state->swizzle_g;
201273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[2] = state->swizzle_b;
201373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[3] = state->swizzle_a;
201473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle);
201573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
201673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	first_non_void = util_format_get_first_non_void_channel(state->format);
201773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->channel[first_non_void].type) {
201873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_FLOAT:
201973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
202073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
202173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_SIGNED:
202273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_SNORM;
202373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
202473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_UNSIGNED:
202573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
202673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_UNORM;
202773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
202873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
202973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void);
203073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (format == ~0) {
203173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		format = 0;
203273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
203373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
203473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (tmp->depth && !tmp->is_flushing_texture) {
203573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		r600_texture_depth_flush(ctx, texture, TRUE);
203673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tmp = tmp->flushed_depth_texture;
203773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
203873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
203973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* not supported any more */
204073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	//endian = si_colorformat_endian_swap(format);
204173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
20429aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	offset_level = state->u.tex.first_level;
20439aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	last_level = state->u.tex.last_level - offset_level;
20449aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	width = tmp->surface.level[offset_level].npix_x;
20459aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	height = tmp->surface.level[offset_level].npix_y;
20469aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	depth = tmp->surface.level[offset_level].npix_z;
20479aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	pitch = tmp->surface.level[offset_level].nblk_x * util_format_get_blockwidth(state->format);
204873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
204973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
205073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	        height = 1;
205173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		depth = texture->array_size;
205273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	} else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
205373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		depth = texture->array_size;
205473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
205573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
205673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	tiling_index = 8;
205773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (tmp->surface.level[state->u.tex.first_level].mode) {
205873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_LINEAR_ALIGNED:
205973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tiling_index = 8;
206073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
206173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_1D:
206273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tiling_index = 9;
206373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
206473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_2D:
206573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) {
206673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			switch (blocksize) {
206773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 1:
206873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 10;
206973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
207073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 2:
207173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 11;
207273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
207373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 4:
207473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 12;
207573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
207673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
207773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
207873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		} else switch (blocksize) {
207973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
208073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 14;
208173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
208273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
208373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 15;
208473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
208573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
208673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 16;
208773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
208873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 8:
208973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 17;
209073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
209173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		default:
209273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 13;
209373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
209473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
209573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
209673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
209773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	va = r600_resource_va(ctx->screen, texture);
20989aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	va += tmp->surface.level[offset_level].offset;
20999aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	view->state[0] = va >> 8;
21009aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König	view->state[1] = (S_008F14_BASE_ADDRESS_HI(va >> 40) |
210173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F14_DATA_FORMAT(format) |
210273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F14_NUM_FORMAT(num_format));
210373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[2] = (S_008F18_WIDTH(width - 1) |
210473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F18_HEIGHT(height - 1));
210573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) |
210673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) |
210773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) |
210873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) |
21099aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König			  S_008F1C_BASE_LEVEL(offset_level) |
21109aacd5cc67ccbc3984bce6a0b40768a6cec2ec2dChristian König			  S_008F1C_LAST_LEVEL(last_level) |
211173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_TILING_INDEX(tiling_index) |
211273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_TYPE(si_tex_dim(texture->target)));
211373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1));
211473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) |
211573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F24_LAST_ARRAY(state->u.tex.last_layer));
211673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[6] = 0;
211773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[7] = 0;
211873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
211973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return &view->base;
212073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
212173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
21229b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_sampler_view_destroy(struct pipe_context *ctx,
21239b213c871a080472660eff271c72a3fcc5d3f578Christian König				    struct pipe_sampler_view *state)
21249b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21259b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state;
21269b213c871a080472660eff271c72a3fcc5d3f578Christian König
21279b213c871a080472660eff271c72a3fcc5d3f578Christian König	pipe_resource_reference(&state->texture, NULL);
21289b213c871a080472660eff271c72a3fcc5d3f578Christian König	FREE(resource);
21299b213c871a080472660eff271c72a3fcc5d3f578Christian König}
21309b213c871a080472660eff271c72a3fcc5d3f578Christian König
213173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void *si_create_sampler_state(struct pipe_context *ctx,
213273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				     const struct pipe_sampler_state *state)
213373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
213473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state);
213573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	union util_color uc;
213673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
213773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned border_color_type;
213873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
213973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (rstate == NULL) {
214073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return NULL;
214173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
214273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
214373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
214473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (uc.ui) {
214573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0x000000FF:
214673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK;
214773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
214873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0x00000000:
214973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK;
215073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
215173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0xFFFFFFFF:
215273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE;
215373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
215473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default: /* Use border color pointer */
215573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER;
215673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
215773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
215873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) |
215973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) |
216073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) |
216173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  (state->max_anisotropy & 0x7) << 9 | /* XXX */
216273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
216373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
216473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  aniso_flag_offset << 16 | /* XXX */
216573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map));
216673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
216773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)));
216873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
216973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) |
217073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) |
217173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter)));
217273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type);
217373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
217473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#if 0
217573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (border_color_type == 3) {
217673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]));
217773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]));
217873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]));
217973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]));
218073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
218173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#endif
218273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return rstate;
218373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
218473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
2185baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
2186baf20397569fb499f736e5ad2350b008b8207fadChristian König				   struct pipe_sampler_view **views)
2187baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2188baf20397569fb499f736e5ad2350b008b8207fadChristian König	assert(count == 0);
2189baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2190baf20397569fb499f736e5ad2350b008b8207fadChristian König
2191baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
2192baf20397569fb499f736e5ad2350b008b8207fadChristian König				   struct pipe_sampler_view **views)
2193baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2194baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2195baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views;
2196baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2197ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König	int i, j;
2198baf20397569fb499f736e5ad2350b008b8207fadChristian König	int has_depth = 0;
2199baf20397569fb499f736e5ad2350b008b8207fadChristian König
2200baf20397569fb499f736e5ad2350b008b8207fadChristian König	if (!count)
2201baf20397569fb499f736e5ad2350b008b8207fadChristian König		goto out;
2202baf20397569fb499f736e5ad2350b008b8207fadChristian König
2203baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_inval_texture_cache(pm4);
2204baf20397569fb499f736e5ad2350b008b8207fadChristian König
2205ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König	si_pm4_sh_data_begin(pm4);
2206ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König	for (i = 0; i < count; i++) {
2207baf20397569fb499f736e5ad2350b008b8207fadChristian König		pipe_sampler_view_reference(
2208baf20397569fb499f736e5ad2350b008b8207fadChristian König			(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
2209baf20397569fb499f736e5ad2350b008b8207fadChristian König			views[i]);
2210baf20397569fb499f736e5ad2350b008b8207fadChristian König
22111a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer		if (views[i]) {
22121a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer			struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
22131a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer
22141a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer			si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
2215ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
22161a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer			for (j = 0; j < Elements(resource[i]->state); ++j) {
22171a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer				si_pm4_sh_data_add(pm4, resource[i]->state[j]);
22181a25ebe3ce95a6a4aef7c844dbe95909976b68daMichel Dänzer			}
2219ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König		}
2220baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
2221baf20397569fb499f736e5ad2350b008b8207fadChristian König
2222baf20397569fb499f736e5ad2350b008b8207fadChristian König	for (i = count; i < NUM_TEX_UNITS; i++) {
2223baf20397569fb499f736e5ad2350b008b8207fadChristian König		if (rctx->ps_samplers.views[i])
2224baf20397569fb499f736e5ad2350b008b8207fadChristian König			pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL);
2225baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
2226baf20397569fb499f736e5ad2350b008b8207fadChristian König
2227ec5b698525ccd9d5cd734e723e284dea7cc2041dChristian König	si_pm4_sh_data_end(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4);
2228baf20397569fb499f736e5ad2350b008b8207fadChristian König
2229baf20397569fb499f736e5ad2350b008b8207fadChristian Königout:
2230baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_state(rctx, ps_sampler_views, pm4);
2231baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->have_depth_texture = has_depth;
2232baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ps_samplers.n_views = count;
2233baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2234baf20397569fb499f736e5ad2350b008b8207fadChristian König
2235baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states)
2236baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2237ad15c8c0f199e293b5c49a9c614cfaa19edb9a62Christian König	assert(count == 0);
2238baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2239baf20397569fb499f736e5ad2350b008b8207fadChristian König
2240baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states)
2241baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2242baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2243baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states;
2244baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2245cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König	int i, j;
2246baf20397569fb499f736e5ad2350b008b8207fadChristian König
2247baf20397569fb499f736e5ad2350b008b8207fadChristian König	if (!count)
2248baf20397569fb499f736e5ad2350b008b8207fadChristian König		goto out;
2249baf20397569fb499f736e5ad2350b008b8207fadChristian König
2250baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_inval_texture_cache(pm4);
2251baf20397569fb499f736e5ad2350b008b8207fadChristian König
2252cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König	si_pm4_sh_data_begin(pm4);
2253cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König	for (i = 0; i < count; i++) {
2254cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König		for (j = 0; j < Elements(rstates[i]->val); ++j) {
2255cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König			si_pm4_sh_data_add(pm4, rstates[i]->val[j]);
2256cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König		}
2257baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
2258cf76edd300b3e58a906d07404e7d7533a6d54a41Christian König	si_pm4_sh_data_end(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2);
2259baf20397569fb499f736e5ad2350b008b8207fadChristian König
2260baf20397569fb499f736e5ad2350b008b8207fadChristian König	memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count);
2261baf20397569fb499f736e5ad2350b008b8207fadChristian König
2262baf20397569fb499f736e5ad2350b008b8207fadChristian Königout:
2263baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_state(rctx, ps_sampler, pm4);
2264baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ps_samplers.n_samplers = count;
2265baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2266baf20397569fb499f736e5ad2350b008b8207fadChristian König
226773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
226873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
226973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
227073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
227173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state)
227273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
227373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	free(state);
227473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
227573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
22760d6b0b512acadbc5d64039063b5649fc401b3367Christian König/*
22770d6b0b512acadbc5d64039063b5649fc401b3367Christian König * Constants
22780d6b0b512acadbc5d64039063b5649fc401b3367Christian König */
22790d6b0b512acadbc5d64039063b5649fc401b3367Christian Königstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
22800d6b0b512acadbc5d64039063b5649fc401b3367Christian König			    struct pipe_constant_buffer *cb)
22810d6b0b512acadbc5d64039063b5649fc401b3367Christian König{
22820d6b0b512acadbc5d64039063b5649fc401b3367Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
2283fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL;
228451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	struct si_pm4_state *pm4;
22850d6b0b512acadbc5d64039063b5649fc401b3367Christian König	uint64_t va_offset;
22860d6b0b512acadbc5d64039063b5649fc401b3367Christian König	uint32_t offset;
22870d6b0b512acadbc5d64039063b5649fc401b3367Christian König
22880d6b0b512acadbc5d64039063b5649fc401b3367Christian König	/* Note that the state tracker can unbind constant buffers by
22890d6b0b512acadbc5d64039063b5649fc401b3367Christian König	 * passing NULL here.
22900d6b0b512acadbc5d64039063b5649fc401b3367Christian König	 */
229151d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	if (cb == NULL)
22920d6b0b512acadbc5d64039063b5649fc401b3367Christian König		return;
22930d6b0b512acadbc5d64039063b5649fc401b3367Christian König
229451d9f37a72b3c7893204efbbeca034d1581d30f1Michel Dänzer	pm4 = CALLOC_STRUCT(si_pm4_state);
22950d6b0b512acadbc5d64039063b5649fc401b3367Christian König	si_pm4_inval_shader_cache(pm4);
22960d6b0b512acadbc5d64039063b5649fc401b3367Christian König
22970d6b0b512acadbc5d64039063b5649fc401b3367Christian König	if (cb->user_buffer)
22980d6b0b512acadbc5d64039063b5649fc401b3367Christian König		r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset);
22990d6b0b512acadbc5d64039063b5649fc401b3367Christian König	else
23000d6b0b512acadbc5d64039063b5649fc401b3367Christian König		offset = 0;
23010d6b0b512acadbc5d64039063b5649fc401b3367Christian König	va_offset = r600_resource_va(ctx->screen, (void*)rbuffer);
23020d6b0b512acadbc5d64039063b5649fc401b3367Christian König	va_offset += offset;
23030d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23040d6b0b512acadbc5d64039063b5649fc401b3367Christian König	si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ);
23050d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23060d6b0b512acadbc5d64039063b5649fc401b3367Christian König	switch (shader) {
23070d6b0b512acadbc5d64039063b5649fc401b3367Christian König	case PIPE_SHADER_VERTEX:
23080d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset);
23090d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32);
23100d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_state(rctx, vs_const, pm4);
23110d6b0b512acadbc5d64039063b5649fc401b3367Christian König		break;
23120d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23130d6b0b512acadbc5d64039063b5649fc401b3367Christian König	case PIPE_SHADER_FRAGMENT:
23140d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset);
23150d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32);
23160d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_state(rctx, ps_const, pm4);
23170d6b0b512acadbc5d64039063b5649fc401b3367Christian König		break;
23180d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23190d6b0b512acadbc5d64039063b5649fc401b3367Christian König	default:
23200d6b0b512acadbc5d64039063b5649fc401b3367Christian König		R600_ERR("unsupported %d\n", shader);
23210d6b0b512acadbc5d64039063b5649fc401b3367Christian König	}
23220d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23230d6b0b512acadbc5d64039063b5649fc401b3367Christian König	if (cb->buffer != &rbuffer->b.b)
2324fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König		si_resource_reference(&rbuffer, NULL);
23250d6b0b512acadbc5d64039063b5649fc401b3367Christian König}
23260d6b0b512acadbc5d64039063b5649fc401b3367Christian König
23279b213c871a080472660eff271c72a3fcc5d3f578Christian König/*
23289b213c871a080472660eff271c72a3fcc5d3f578Christian König * Vertex elements & buffers
23299b213c871a080472660eff271c72a3fcc5d3f578Christian König */
23309b213c871a080472660eff271c72a3fcc5d3f578Christian König
23319b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void *si_create_vertex_elements(struct pipe_context *ctx,
23329b213c871a080472660eff271c72a3fcc5d3f578Christian König				       unsigned count,
23339b213c871a080472660eff271c72a3fcc5d3f578Christian König				       const struct pipe_vertex_element *elements)
23349b213c871a080472660eff271c72a3fcc5d3f578Christian König{
23359b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element);
2336b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	int i;
23379b213c871a080472660eff271c72a3fcc5d3f578Christian König
2338b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	assert(count < PIPE_MAX_ATTRIBS);
23399b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (!v)
23409b213c871a080472660eff271c72a3fcc5d3f578Christian König		return NULL;
23419b213c871a080472660eff271c72a3fcc5d3f578Christian König
23429b213c871a080472660eff271c72a3fcc5d3f578Christian König	v->count = count;
2343b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	for (i = 0; i < count; ++i) {
2344b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		const struct util_format_description *desc;
2345b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		unsigned data_format, num_format;
2346b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		int first_non_void;
2347b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2348b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		desc = util_format_description(elements[i].src_format);
2349b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		first_non_void = util_format_get_first_non_void_channel(elements[i].src_format);
2350b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format,
2351b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König							desc, first_non_void);
2352b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2353b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		switch (desc->channel[first_non_void].type) {
2354b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_FIXED:
2355b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */
2356b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2357b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_SIGNED:
2358b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_SNORM;
2359b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2360b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_UNSIGNED:
2361b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_UNORM;
2362b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2363b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_FLOAT:
2364b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		default:
2365b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
2366b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		}
2367b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2368b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
2369b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
2370b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
2371b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
2372b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_NUM_FORMAT(num_format) |
2373b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DATA_FORMAT(data_format);
2374b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	}
23759b213c871a080472660eff271c72a3fcc5d3f578Christian König	memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count);
23769b213c871a080472660eff271c72a3fcc5d3f578Christian König
23779b213c871a080472660eff271c72a3fcc5d3f578Christian König	return v;
23789b213c871a080472660eff271c72a3fcc5d3f578Christian König}
23799b213c871a080472660eff271c72a3fcc5d3f578Christian König
23809b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state)
23819b213c871a080472660eff271c72a3fcc5d3f578Christian König{
23829b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
23839b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_vertex_element *v = (struct si_vertex_element*)state;
23849b213c871a080472660eff271c72a3fcc5d3f578Christian König
23859b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->vertex_elements = v;
23869b213c871a080472660eff271c72a3fcc5d3f578Christian König}
23879b213c871a080472660eff271c72a3fcc5d3f578Christian König
23889b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state)
23899b213c871a080472660eff271c72a3fcc5d3f578Christian König{
23909b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
23919b213c871a080472660eff271c72a3fcc5d3f578Christian König
23929b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (rctx->vertex_elements == state)
23939b213c871a080472660eff271c72a3fcc5d3f578Christian König		rctx->vertex_elements = NULL;
23949b213c871a080472660eff271c72a3fcc5d3f578Christian König	FREE(state);
23959b213c871a080472660eff271c72a3fcc5d3f578Christian König}
23969b213c871a080472660eff271c72a3fcc5d3f578Christian König
23979b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
23989b213c871a080472660eff271c72a3fcc5d3f578Christian König				  const struct pipe_vertex_buffer *buffers)
23999b213c871a080472660eff271c72a3fcc5d3f578Christian König{
24009b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
24019b213c871a080472660eff271c72a3fcc5d3f578Christian König
24029b213c871a080472660eff271c72a3fcc5d3f578Christian König	util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count);
24039b213c871a080472660eff271c72a3fcc5d3f578Christian König}
24049b213c871a080472660eff271c72a3fcc5d3f578Christian König
24059b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_index_buffer(struct pipe_context *ctx,
24069b213c871a080472660eff271c72a3fcc5d3f578Christian König				const struct pipe_index_buffer *ib)
24079b213c871a080472660eff271c72a3fcc5d3f578Christian König{
24089b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
24099b213c871a080472660eff271c72a3fcc5d3f578Christian König
24109b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (ib) {
24119b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
24129b213c871a080472660eff271c72a3fcc5d3f578Christian König	        memcpy(&rctx->index_buffer, ib, sizeof(*ib));
24139b213c871a080472660eff271c72a3fcc5d3f578Christian König	} else {
24149b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
24159b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
24169b213c871a080472660eff271c72a3fcc5d3f578Christian König}
24179b213c871a080472660eff271c72a3fcc5d3f578Christian König
24189b213c871a080472660eff271c72a3fcc5d3f578Christian König/*
24199b213c871a080472660eff271c72a3fcc5d3f578Christian König * Misc
24209b213c871a080472660eff271c72a3fcc5d3f578Christian König */
24219b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_polygon_stipple(struct pipe_context *ctx,
24229b213c871a080472660eff271c72a3fcc5d3f578Christian König				   const struct pipe_poly_stipple *state)
24239b213c871a080472660eff271c72a3fcc5d3f578Christian König{
24249b213c871a080472660eff271c72a3fcc5d3f578Christian König}
24259b213c871a080472660eff271c72a3fcc5d3f578Christian König
24269b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_texture_barrier(struct pipe_context *ctx)
24279b213c871a080472660eff271c72a3fcc5d3f578Christian König{
24289b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
24299b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
24309b213c871a080472660eff271c72a3fcc5d3f578Christian König
24319b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_inval_texture_cache(pm4);
24329b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs);
24339b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_set_state(rctx, texture_barrier, pm4);
24349b213c871a080472660eff271c72a3fcc5d3f578Christian König}
24359b213c871a080472660eff271c72a3fcc5d3f578Christian König
243663636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx)
243763636ae52aefc275115d1f3daac4e75285583485Christian König{
243863636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.create_blend_state = si_create_blend_state;
243963636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.bind_blend_state = si_bind_blend_state;
244063636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.delete_blend_state = si_delete_blend_state;
24410a091a48242513e53a99976239405e8cb72d96beChristian König	rctx->context.set_blend_color = si_set_blend_color;
24429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.create_rasterizer_state = si_create_rs_state;
2444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.bind_rasterizer_state = si_bind_rs_state;
2445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.delete_rasterizer_state = si_delete_rs_state;
2446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
2447b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state;
2448b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state;
2449b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state;
2450b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx);
2451b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
24529cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	rctx->context.set_clip_state = si_set_clip_state;
245343f414f7b76902a728d26231d4cc047b794df10bChristian König	rctx->context.set_scissor_state = si_set_scissor_state;
24547e011d92c9746ba4050890442db6e504fa42c4adChristian König	rctx->context.set_viewport_state = si_set_viewport_state;
2455e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	rctx->context.set_stencil_ref = si_set_pipe_stencil_ref;
2456835098a5290e59bb7b468eb987db67b0e1913c67Christian König
2457835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->context.set_framebuffer_state = si_set_framebuffer_state;
24583c09f11e5cefd437bb8185539430786dc245c96fChristian König
2459d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	rctx->context.create_vs_state = si_create_vs_state;
2460d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	rctx->context.create_fs_state = si_create_fs_state;
24613c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.bind_vs_state = si_bind_vs_shader;
24623c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.bind_fs_state = si_bind_ps_shader;
24633c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.delete_vs_state = si_delete_vs_shader;
24643c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.delete_fs_state = si_delete_ps_shader;
2465baf20397569fb499f736e5ad2350b008b8207fadChristian König
246673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.create_sampler_state = si_create_sampler_state;
2467baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler;
2468baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler;
246973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.delete_sampler_state = si_delete_sampler_state;
2470baf20397569fb499f736e5ad2350b008b8207fadChristian König
247173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.create_sampler_view = si_create_sampler_view;
2472baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view;
2473baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view;
24749b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.sampler_view_destroy = si_sampler_view_destroy;
24750d6b0b512acadbc5d64039063b5649fc401b3367Christian König
247673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.set_sample_mask = si_set_sample_mask;
247773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
24780d6b0b512acadbc5d64039063b5649fc401b3367Christian König	rctx->context.set_constant_buffer = si_set_constant_buffer;
2479ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
24809b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.create_vertex_elements_state = si_create_vertex_elements;
24819b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.bind_vertex_elements_state = si_bind_vertex_elements;
24829b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.delete_vertex_elements_state = si_delete_vertex_element;
24839b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_vertex_buffers = si_set_vertex_buffers;
24849b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_index_buffer = si_set_index_buffer;
24859b213c871a080472660eff271c72a3fcc5d3f578Christian König
24869b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.create_stream_output_target = si_create_so_target;
24879b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.stream_output_target_destroy = si_so_target_destroy;
24889b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_stream_output_targets = si_set_so_targets;
24899b213c871a080472660eff271c72a3fcc5d3f578Christian König
24909b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.texture_barrier = si_texture_barrier;
24919b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_polygon_stipple = si_set_polygon_stipple;
24929b213c871a080472660eff271c72a3fcc5d3f578Christian König
2493ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	rctx->context.draw_vbo = si_draw_vbo;
249463636ae52aefc275115d1f3daac4e75285583485Christian König}
2495e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König
2496840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx)
2497840f05da6b92ba5266385836533842b9a9fc5da9Christian König{
2498840f05da6b92ba5266385836533842b9a9fc5da9Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2499840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2500708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König	si_pm4_cmd_begin(pm4, PKT3_CONTEXT_CONTROL);
2501708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König	si_pm4_cmd_add(pm4, 0x80000000);
2502708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König	si_pm4_cmd_add(pm4, 0x80000000);
2503708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König	si_pm4_cmd_end(pm4, false);
2504708337e62e86cfb2df893f0733bb7c5a4938fab6Christian König
2505840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0);
2506840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2507840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0);
2508840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0);
2509840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0);
2510840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0);
2511840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0);
2512840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0);
2513840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0);
2514840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0);
2515840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0);
2516840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0);
2517840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0);
2518840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0);
2519840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0);
2520840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0);
2521840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0);
2522840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0);
2523840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0);
2524840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM,
2525840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_SWITCH_ON_EOP(1) |
2526840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_PARTIAL_VS_WAVE_ON(1) |
2527840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_PRIMGROUP_SIZE(63));
2528840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000);
2529840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0);
2530840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1);
2531840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2532840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0);
2533840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210);
2534840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98);
2535840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2536840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000);
2537840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2538840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_state(rctx, init, pm4);
2539840f05da6b92ba5266385836533842b9a9fc5da9Christian König}
2540