si_state.c revision ce40e4726cf30196b87df387255c64ddc2a97638
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{
4276660dfccede74782ac0d409da171ddbd61fae41Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
4376660dfccede74782ac0d409da171ddbd61fae41Christian König	struct si_state_blend *blend = rctx->queued.named.blend;
4476660dfccede74782ac0d409da171ddbd61fae41Christian König	uint32_t mask;
4576660dfccede74782ac0d409da171ddbd61fae41Christian König
4676660dfccede74782ac0d409da171ddbd61fae41Christian König	if (pm4 == NULL || blend == NULL)
4776660dfccede74782ac0d409da171ddbd61fae41Christian König		return;
4876660dfccede74782ac0d409da171ddbd61fae41Christian König
4976660dfccede74782ac0d409da171ddbd61fae41Christian König	mask = (1ULL << ((unsigned)rctx->framebuffer.nr_cbufs * 4)) - 1;
5076660dfccede74782ac0d409da171ddbd61fae41Christian König	mask &= blend->cb_target_mask;
5176660dfccede74782ac0d409da171ddbd61fae41Christian König	si_pm4_set_reg(pm4, R_028238_CB_TARGET_MASK, mask);
5276660dfccede74782ac0d409da171ddbd61fae41Christian König
5376660dfccede74782ac0d409da171ddbd61fae41Christian König	si_pm4_set_state(rctx, fb_blend, pm4);
5476660dfccede74782ac0d409da171ddbd61fae41Christian König}
5576660dfccede74782ac0d409da171ddbd61fae41Christian König
5676660dfccede74782ac0d409da171ddbd61fae41Christian König/*
5763636ae52aefc275115d1f3daac4e75285583485Christian König * Blender functions
5863636ae52aefc275115d1f3daac4e75285583485Christian König */
5963636ae52aefc275115d1f3daac4e75285583485Christian König
6063636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_function(int blend_func)
6163636ae52aefc275115d1f3daac4e75285583485Christian König{
6263636ae52aefc275115d1f3daac4e75285583485Christian König	switch (blend_func) {
6363636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_ADD:
6463636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_DST_PLUS_SRC;
6563636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_SUBTRACT:
6663636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_SRC_MINUS_DST;
6763636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_REVERSE_SUBTRACT:
6863636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_DST_MINUS_SRC;
6963636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_MIN:
7063636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_MIN_DST_SRC;
7163636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLEND_MAX:
7263636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_COMB_MAX_DST_SRC;
7363636ae52aefc275115d1f3daac4e75285583485Christian König	default:
7463636ae52aefc275115d1f3daac4e75285583485Christian König		R600_ERR("Unknown blend function %d\n", blend_func);
7563636ae52aefc275115d1f3daac4e75285583485Christian König		assert(0);
7663636ae52aefc275115d1f3daac4e75285583485Christian König		break;
7763636ae52aefc275115d1f3daac4e75285583485Christian König	}
7863636ae52aefc275115d1f3daac4e75285583485Christian König	return 0;
7963636ae52aefc275115d1f3daac4e75285583485Christian König}
8063636ae52aefc275115d1f3daac4e75285583485Christian König
8163636ae52aefc275115d1f3daac4e75285583485Christian Königstatic uint32_t si_translate_blend_factor(int blend_fact)
8263636ae52aefc275115d1f3daac4e75285583485Christian König{
8363636ae52aefc275115d1f3daac4e75285583485Christian König	switch (blend_fact) {
8463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_ONE:
8563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE;
8663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_COLOR:
8763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_COLOR;
8863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_ALPHA:
8963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_ALPHA;
9063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_DST_ALPHA:
9163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_DST_ALPHA;
9263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_DST_COLOR:
9363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_DST_COLOR;
9463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
9563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC_ALPHA_SATURATE;
9663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_CONST_COLOR:
9763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_CONSTANT_COLOR;
9863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_CONST_ALPHA:
9963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_CONSTANT_ALPHA;
10063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_ZERO:
10163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ZERO;
10263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
10363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
10463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
10563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
10663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
10763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
10863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_DST_COLOR:
10963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_DST_COLOR;
11063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
11163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_CONSTANT_COLOR;
11263636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
11363636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_ONE_MINUS_CONSTANT_ALPHA;
11463636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC1_COLOR:
11563636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC1_COLOR;
11663636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_SRC1_ALPHA:
11763636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_SRC1_ALPHA;
11863636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
11963636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_INV_SRC1_COLOR;
12063636ae52aefc275115d1f3daac4e75285583485Christian König	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
12163636ae52aefc275115d1f3daac4e75285583485Christian König		return V_028780_BLEND_INV_SRC1_ALPHA;
12263636ae52aefc275115d1f3daac4e75285583485Christian König	default:
12363636ae52aefc275115d1f3daac4e75285583485Christian König		R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
12463636ae52aefc275115d1f3daac4e75285583485Christian König		assert(0);
12563636ae52aefc275115d1f3daac4e75285583485Christian König		break;
12663636ae52aefc275115d1f3daac4e75285583485Christian König	}
12763636ae52aefc275115d1f3daac4e75285583485Christian König	return 0;
12863636ae52aefc275115d1f3daac4e75285583485Christian König}
12963636ae52aefc275115d1f3daac4e75285583485Christian König
13063636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void *si_create_blend_state(struct pipe_context *ctx,
13163636ae52aefc275115d1f3daac4e75285583485Christian König				   const struct pipe_blend_state *state)
13263636ae52aefc275115d1f3daac4e75285583485Christian König{
13363636ae52aefc275115d1f3daac4e75285583485Christian König	struct si_state_blend *blend = CALLOC_STRUCT(si_state_blend);
13463636ae52aefc275115d1f3daac4e75285583485Christian König	struct si_pm4_state *pm4 = &blend->pm4;
13563636ae52aefc275115d1f3daac4e75285583485Christian König
13663636ae52aefc275115d1f3daac4e75285583485Christian König	uint32_t color_control;
13763636ae52aefc275115d1f3daac4e75285583485Christian König
13863636ae52aefc275115d1f3daac4e75285583485Christian König	if (blend == NULL)
13963636ae52aefc275115d1f3daac4e75285583485Christian König		return NULL;
14063636ae52aefc275115d1f3daac4e75285583485Christian König
14163636ae52aefc275115d1f3daac4e75285583485Christian König	color_control = S_028808_MODE(V_028808_CB_NORMAL);
14263636ae52aefc275115d1f3daac4e75285583485Christian König	if (state->logicop_enable) {
14363636ae52aefc275115d1f3daac4e75285583485Christian König		color_control |= S_028808_ROP3(state->logicop_func | (state->logicop_func << 4));
14463636ae52aefc275115d1f3daac4e75285583485Christian König	} else {
14563636ae52aefc275115d1f3daac4e75285583485Christian König		color_control |= S_028808_ROP3(0xcc);
14663636ae52aefc275115d1f3daac4e75285583485Christian König	}
14763636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028808_CB_COLOR_CONTROL, color_control);
14863636ae52aefc275115d1f3daac4e75285583485Christian König
14963636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028C38_PA_SC_AA_MASK_X0Y0_X1Y0, ~0);
15063636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_set_reg(pm4, R_028C3C_PA_SC_AA_MASK_X0Y1_X1Y1, ~0);
15163636ae52aefc275115d1f3daac4e75285583485Christian König
15263636ae52aefc275115d1f3daac4e75285583485Christian König	blend->cb_target_mask = 0;
15363636ae52aefc275115d1f3daac4e75285583485Christian König	for (int i = 0; i < 8; i++) {
15463636ae52aefc275115d1f3daac4e75285583485Christian König		/* state->rt entries > 0 only written if independent blending */
15563636ae52aefc275115d1f3daac4e75285583485Christian König		const int j = state->independent_blend_enable ? i : 0;
15663636ae52aefc275115d1f3daac4e75285583485Christian König
15763636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned eqRGB = state->rt[j].rgb_func;
15863636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned srcRGB = state->rt[j].rgb_src_factor;
15963636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned dstRGB = state->rt[j].rgb_dst_factor;
16063636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned eqA = state->rt[j].alpha_func;
16163636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned srcA = state->rt[j].alpha_src_factor;
16263636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned dstA = state->rt[j].alpha_dst_factor;
16363636ae52aefc275115d1f3daac4e75285583485Christian König
16463636ae52aefc275115d1f3daac4e75285583485Christian König		unsigned blend_cntl = 0;
16563636ae52aefc275115d1f3daac4e75285583485Christian König
16663636ae52aefc275115d1f3daac4e75285583485Christian König		/* we pretend 8 buffer are used, CB_SHADER_MASK will disable unused one */
16763636ae52aefc275115d1f3daac4e75285583485Christian König		blend->cb_target_mask |= state->rt[j].colormask << (4 * i);
16863636ae52aefc275115d1f3daac4e75285583485Christian König
16963636ae52aefc275115d1f3daac4e75285583485Christian König		if (!state->rt[j].blend_enable) {
17063636ae52aefc275115d1f3daac4e75285583485Christian König			si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
17163636ae52aefc275115d1f3daac4e75285583485Christian König			continue;
17263636ae52aefc275115d1f3daac4e75285583485Christian König		}
17363636ae52aefc275115d1f3daac4e75285583485Christian König
17463636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_ENABLE(1);
17563636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_COMB_FCN(si_translate_blend_function(eqRGB));
17663636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_SRCBLEND(si_translate_blend_factor(srcRGB));
17763636ae52aefc275115d1f3daac4e75285583485Christian König		blend_cntl |= S_028780_COLOR_DESTBLEND(si_translate_blend_factor(dstRGB));
17863636ae52aefc275115d1f3daac4e75285583485Christian König
17963636ae52aefc275115d1f3daac4e75285583485Christian König		if (srcA != srcRGB || dstA != dstRGB || eqA != eqRGB) {
18063636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_SEPARATE_ALPHA_BLEND(1);
18163636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_COMB_FCN(si_translate_blend_function(eqA));
18263636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_SRCBLEND(si_translate_blend_factor(srcA));
18363636ae52aefc275115d1f3daac4e75285583485Christian König			blend_cntl |= S_028780_ALPHA_DESTBLEND(si_translate_blend_factor(dstA));
18463636ae52aefc275115d1f3daac4e75285583485Christian König		}
18563636ae52aefc275115d1f3daac4e75285583485Christian König		si_pm4_set_reg(pm4, R_028780_CB_BLEND0_CONTROL + i * 4, blend_cntl);
18663636ae52aefc275115d1f3daac4e75285583485Christian König	}
18763636ae52aefc275115d1f3daac4e75285583485Christian König
18863636ae52aefc275115d1f3daac4e75285583485Christian König	return blend;
18963636ae52aefc275115d1f3daac4e75285583485Christian König}
19063636ae52aefc275115d1f3daac4e75285583485Christian König
19163636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_bind_blend_state(struct pipe_context *ctx, void *state)
19263636ae52aefc275115d1f3daac4e75285583485Christian König{
19363636ae52aefc275115d1f3daac4e75285583485Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
19463636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_bind_state(rctx, blend, (struct si_state_blend *)state);
19576660dfccede74782ac0d409da171ddbd61fae41Christian König	si_update_fb_blend_state(rctx);
19663636ae52aefc275115d1f3daac4e75285583485Christian König}
19763636ae52aefc275115d1f3daac4e75285583485Christian König
19863636ae52aefc275115d1f3daac4e75285583485Christian Königstatic void si_delete_blend_state(struct pipe_context *ctx, void *state)
19963636ae52aefc275115d1f3daac4e75285583485Christian König{
20063636ae52aefc275115d1f3daac4e75285583485Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
20163636ae52aefc275115d1f3daac4e75285583485Christian König	si_pm4_delete_state(rctx, blend, (struct si_state_blend *)state);
20263636ae52aefc275115d1f3daac4e75285583485Christian König}
20363636ae52aefc275115d1f3daac4e75285583485Christian König
2040a091a48242513e53a99976239405e8cb72d96beChristian Königstatic void si_set_blend_color(struct pipe_context *ctx,
2050a091a48242513e53a99976239405e8cb72d96beChristian König			       const struct pipe_blend_color *state)
2060a091a48242513e53a99976239405e8cb72d96beChristian König{
2070a091a48242513e53a99976239405e8cb72d96beChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2080a091a48242513e53a99976239405e8cb72d96beChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2090a091a48242513e53a99976239405e8cb72d96beChristian König
2100a091a48242513e53a99976239405e8cb72d96beChristian König        if (pm4 == NULL)
2110a091a48242513e53a99976239405e8cb72d96beChristian König                return;
2120a091a48242513e53a99976239405e8cb72d96beChristian König
2130a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028414_CB_BLEND_RED, fui(state->color[0]));
2140a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028418_CB_BLEND_GREEN, fui(state->color[1]));
2150a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_02841C_CB_BLEND_BLUE, fui(state->color[2]));
2160a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_reg(pm4, R_028420_CB_BLEND_ALPHA, fui(state->color[3]));
2170a091a48242513e53a99976239405e8cb72d96beChristian König
2180a091a48242513e53a99976239405e8cb72d96beChristian König	si_pm4_set_state(rctx, blend_color, pm4);
2190a091a48242513e53a99976239405e8cb72d96beChristian König}
2200a091a48242513e53a99976239405e8cb72d96beChristian König
221835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
222835098a5290e59bb7b468eb987db67b0e1913c67Christian König * Clipping, scissors and viewport
223835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
224835098a5290e59bb7b468eb987db67b0e1913c67Christian König
2259cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian Königstatic void si_set_clip_state(struct pipe_context *ctx,
2269cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			      const struct pipe_clip_state *state)
2279cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König{
2289cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
2299cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2309cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2319cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	if (pm4 == NULL)
2329cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		return;
2339cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2349cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	for (int i = 0; i < 6; i++) {
2359cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285BC_PA_CL_UCP_0_X + i * 16,
2369cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][0]));
2379cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C0_PA_CL_UCP_0_Y + i * 16,
2389cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][1]));
2399cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C4_PA_CL_UCP_0_Z + i * 16,
2409cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][2]));
2419cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König		si_pm4_set_reg(pm4, R_0285C8_PA_CL_UCP_0_W + i * 16,
2429cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König			       fui(state->ucp[i][3]));
2439cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König        }
2449cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2459cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	si_pm4_set_state(rctx, clip, pm4);
2469cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König}
2479cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
24843f414f7b76902a728d26231d4cc047b794df10bChristian Königstatic void si_set_scissor_state(struct pipe_context *ctx,
24943f414f7b76902a728d26231d4cc047b794df10bChristian König				 const struct pipe_scissor_state *state)
25043f414f7b76902a728d26231d4cc047b794df10bChristian König{
25143f414f7b76902a728d26231d4cc047b794df10bChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
25243f414f7b76902a728d26231d4cc047b794df10bChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
25343f414f7b76902a728d26231d4cc047b794df10bChristian König	uint32_t tl, br;
25443f414f7b76902a728d26231d4cc047b794df10bChristian König
25543f414f7b76902a728d26231d4cc047b794df10bChristian König	if (pm4 == NULL)
25643f414f7b76902a728d26231d4cc047b794df10bChristian König		return;
25743f414f7b76902a728d26231d4cc047b794df10bChristian König
25843f414f7b76902a728d26231d4cc047b794df10bChristian König	tl = S_028240_TL_X(state->minx) | S_028240_TL_Y(state->miny);
25943f414f7b76902a728d26231d4cc047b794df10bChristian König	br = S_028244_BR_X(state->maxx) | S_028244_BR_Y(state->maxy);
26043f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028210_PA_SC_CLIPRECT_0_TL, tl);
26143f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028214_PA_SC_CLIPRECT_0_BR, br);
26243f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028218_PA_SC_CLIPRECT_1_TL, tl);
26343f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_02821C_PA_SC_CLIPRECT_1_BR, br);
26443f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028220_PA_SC_CLIPRECT_2_TL, tl);
26543f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028224_PA_SC_CLIPRECT_2_BR, br);
26643f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_028228_PA_SC_CLIPRECT_3_TL, tl);
26743f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_reg(pm4, R_02822C_PA_SC_CLIPRECT_3_BR, br);
26843f414f7b76902a728d26231d4cc047b794df10bChristian König
26943f414f7b76902a728d26231d4cc047b794df10bChristian König	si_pm4_set_state(rctx, scissor, pm4);
27043f414f7b76902a728d26231d4cc047b794df10bChristian König}
27143f414f7b76902a728d26231d4cc047b794df10bChristian König
2727e011d92c9746ba4050890442db6e504fa42c4adChristian Königstatic void si_set_viewport_state(struct pipe_context *ctx,
2737e011d92c9746ba4050890442db6e504fa42c4adChristian König				  const struct pipe_viewport_state *state)
2747e011d92c9746ba4050890442db6e504fa42c4adChristian König{
2757e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2767e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct si_state_viewport *viewport = CALLOC_STRUCT(si_state_viewport);
2777e011d92c9746ba4050890442db6e504fa42c4adChristian König	struct si_pm4_state *pm4 = &viewport->pm4;
2787e011d92c9746ba4050890442db6e504fa42c4adChristian König
2797e011d92c9746ba4050890442db6e504fa42c4adChristian König	if (viewport == NULL)
2807e011d92c9746ba4050890442db6e504fa42c4adChristian König		return;
2817e011d92c9746ba4050890442db6e504fa42c4adChristian König
2827e011d92c9746ba4050890442db6e504fa42c4adChristian König	viewport->viewport = *state;
2837e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_0282D0_PA_SC_VPORT_ZMIN_0, 0x00000000);
2847e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_0282D4_PA_SC_VPORT_ZMAX_0, 0x3F800000);
2857e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028350_PA_SC_RASTER_CONFIG, 0x00000000);
2867e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_02843C_PA_CL_VPORT_XSCALE_0, fui(state->scale[0]));
2877e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028440_PA_CL_VPORT_XOFFSET_0, fui(state->translate[0]));
2887e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028444_PA_CL_VPORT_YSCALE_0, fui(state->scale[1]));
2897e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028448_PA_CL_VPORT_YOFFSET_0, fui(state->translate[1]));
2907e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_02844C_PA_CL_VPORT_ZSCALE_0, fui(state->scale[2]));
2917e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028450_PA_CL_VPORT_ZOFFSET_0, fui(state->translate[2]));
2927e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_reg(pm4, R_028818_PA_CL_VTE_CNTL, 0x0000043F);
2937e011d92c9746ba4050890442db6e504fa42c4adChristian König
2947e011d92c9746ba4050890442db6e504fa42c4adChristian König	si_pm4_set_state(rctx, viewport, viewport);
2957e011d92c9746ba4050890442db6e504fa42c4adChristian König}
2967e011d92c9746ba4050890442db6e504fa42c4adChristian König
297835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
298bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König * inferred state between framebuffer and rasterizer
299bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König */
300bd18a316e1495f501911d89c8b373382d1f8c8c2Christian Königstatic void si_update_fb_rs_state(struct r600_context *rctx)
301bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König{
302bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	struct si_state_rasterizer *rs = rctx->queued.named.rasterizer;
303bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
304bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	unsigned offset_db_fmt_cntl = 0, depth;
305bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	float offset_units;
306bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
307bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	if (!rs || !rctx->framebuffer.zsbuf) {
308bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		FREE(pm4);
309bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		return;
310bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	}
311bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
312bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	offset_units = rctx->queued.named.rasterizer->offset_units;
313bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	switch (rctx->framebuffer.zsbuf->texture->format) {
314bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z24X8_UNORM:
315bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
316bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -24;
317bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 2.0f;
318bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
319bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z32_FLOAT:
320bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
321bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -23;
322bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 1.0f;
323bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_DB_IS_FLOAT_FMT(1);
324bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
325bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	case PIPE_FORMAT_Z16_UNORM:
326bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		depth = -16;
327bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		offset_units *= 4.0f;
328bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		break;
329bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	default:
330bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		return;
331bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	}
332bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
333bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	/* FIXME some of those reg can be computed with cso */
334bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	offset_db_fmt_cntl |= S_028B78_POLY_OFFSET_NEG_NUM_DB_BITS(depth);
335bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B80_PA_SU_POLY_OFFSET_FRONT_SCALE,
336bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		       fui(rctx->queued.named.rasterizer->offset_scale));
337bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B84_PA_SU_POLY_OFFSET_FRONT_OFFSET, fui(offset_units));
338bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B88_PA_SU_POLY_OFFSET_BACK_SCALE,
339bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König		       fui(rctx->queued.named.rasterizer->offset_scale));
340bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B8C_PA_SU_POLY_OFFSET_BACK_OFFSET, fui(offset_units));
341bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_reg(pm4, R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, offset_db_fmt_cntl);
342bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
343bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_pm4_set_state(rctx, fb_rs, pm4);
344bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König}
345bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König
346bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König/*
347f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König * Rasterizer
348f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König */
349f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
350f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic uint32_t si_translate_fill(uint32_t func)
351f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
352f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	switch(func) {
353f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_FILL:
354f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_TRIANGLES;
355f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_LINE:
356f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_LINES;
357f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	case PIPE_POLYGON_MODE_POINT:
358f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_POINTS;
359f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	default:
360f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		assert(0);
361f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return V_028814_X_DRAW_POINTS;
362f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
363f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
364f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
365f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void *si_create_rs_state(struct pipe_context *ctx,
366f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				const struct pipe_rasterizer_state *state)
367f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
368f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_state_rasterizer *rs = CALLOC_STRUCT(si_state_rasterizer);
369f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_pm4_state *pm4 = &rs->pm4;
370f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned tmp;
371f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned prov_vtx = 1, polygon_dual_mode;
372f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	unsigned clip_rule;
373f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	float psize_min, psize_max;
374f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
375f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (rs == NULL) {
376f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return NULL;
377f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
378f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
379f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
380f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				state->fill_back != PIPE_POLYGON_MODE_FILL);
381f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
382f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->flatshade_first)
383f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		prov_vtx = 0;
384f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
385f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->flatshade = state->flatshade;
386f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->sprite_coord_enable = state->sprite_coord_enable;
387f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_sc_line_stipple = state->line_stipple_enable ?
388f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				S_028A0C_LINE_PATTERN(state->line_stipple_pattern) |
389f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König				S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
390f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_su_sc_mode_cntl =
391f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_PROVOKING_VTX_LAST(prov_vtx) |
392f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_CULL_FRONT(state->rasterizer_discard || (state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
393f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_CULL_BACK(state->rasterizer_discard || (state->cull_face & PIPE_FACE_BACK) ? 1 : 0) |
394f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_FACE(!state->front_ccw) |
395f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
396f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
397f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
398f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLY_MODE(polygon_dual_mode) |
399f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) |
400f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back));
401f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_cl_clip_cntl =
402f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_PS_UCP_MODE(3) |
403f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
404f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
405f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
406f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->pa_cl_vs_out_cntl =
407f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) |
408f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex);
409f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
410f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	clip_rule = state->scissor ? 0xAAAA : 0xFFFF;
411f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
412f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* offset */
413f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->offset_units = state->offset_units;
414f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rs->offset_scale = state->offset_scale * 12.0f;
415f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
416f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* XXX: Flat shading hangs the GPU */
417f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = S_0286D4_FLAT_SHADE_ENA(0);
418f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->sprite_coord_enable) {
419f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
420f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) |
421f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_Y(V_0286D4_SPI_PNT_SPRITE_SEL_T) |
422f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_Z(V_0286D4_SPI_PNT_SPRITE_SEL_0) |
423f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_0286D4_PNT_SPRITE_OVRD_W(V_0286D4_SPI_PNT_SPRITE_SEL_1);
424f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		if (state->sprite_coord_mode != PIPE_SPRITE_COORD_UPPER_LEFT) {
425f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			tmp |= S_0286D4_PNT_SPRITE_TOP_1(1);
426f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		}
427f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
428f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_0286D4_SPI_INTERP_CONTROL_0, tmp);
429f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
430f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028820_PA_CL_NANINF_CNTL, 0x00000000);
431f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* point size 12.4 fixed point */
432f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = (unsigned)(state->point_size * 8.0);
433f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp));
434f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
435f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state->point_size_per_vertex) {
436f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_min = util_get_min_point_size(state);
437f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_max = 8192;
438f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	} else {
439f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		/* Force the point size to be as if the vertex output was disabled. */
440f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_min = state->point_size;
441f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		psize_max = state->point_size;
442f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	}
443f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	/* Divide by two, because 0.5 = 1 pixel. */
444f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A04_PA_SU_POINT_MINMAX,
445f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
446f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)));
447f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
448f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	tmp = (unsigned)state->line_width * 8;
449f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp));
450f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028A48_PA_SC_MODE_CNTL_0,
451f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028A48_LINE_STIPPLE_ENABLE(state->line_stipple_enable));
452f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
453f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BDC_PA_SC_LINE_CNTL, 0x00000400);
454f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BE4_PA_SU_VTX_CNTL,
455f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König			S_028BE4_PIX_CENTER(state->gl_rasterization_rules));
456f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BE8_PA_CL_GB_VERT_CLIP_ADJ, 0x3F800000);
457f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BEC_PA_CL_GB_VERT_DISC_ADJ, 0x3F800000);
458f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BF0_PA_CL_GB_HORZ_CLIP_ADJ, 0x3F800000);
459f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028BF4_PA_CL_GB_HORZ_DISC_ADJ, 0x3F800000);
460f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
461f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_028B7C_PA_SU_POLY_OFFSET_CLAMP, fui(state->offset_clamp));
462f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, clip_rule);
463f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
464f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	return rs;
465f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
466f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
467f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_bind_rs_state(struct pipe_context *ctx, void *state)
468f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
469f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
470f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state;
471f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
472f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	if (state == NULL)
473f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König		return;
474f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
475f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	// TODO
476f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->sprite_coord_enable = rs->sprite_coord_enable;
477f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple;
478f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_su_sc_mode_cntl = rs->pa_su_sc_mode_cntl;
479f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
480f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->pa_cl_vs_out_cntl = rs->pa_cl_vs_out_cntl;
481f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
482f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_bind_state(rctx, rasterizer, rs);
483bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_update_fb_rs_state(rctx);
484f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
485f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
486f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstatic void si_delete_rs_state(struct pipe_context *ctx, void *state)
487f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König{
488f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
489f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	si_pm4_delete_state(rctx, rasterizer, (struct si_state_rasterizer *)state);
490f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}
491f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
492f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König/*
493e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König * infeered state between dsa and stencil ref
494e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König */
495e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_update_dsa_stencil_ref(struct r600_context *rctx)
496e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{
497e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
498e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	struct pipe_stencil_ref *ref = &rctx->stencil_ref;
499e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        struct si_state_dsa *dsa = rctx->queued.named.dsa;
500e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
501e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        if (pm4 == NULL)
502e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König                return;
503e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
504e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_reg(pm4, R_028430_DB_STENCILREFMASK,
505e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILTESTVAL(ref->ref_value[0]) |
506e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILMASK(dsa->valuemask[0]) |
507e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028430_STENCILWRITEMASK(dsa->writemask[0]));
508e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_reg(pm4, R_028434_DB_STENCILREFMASK_BF,
509e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILTESTVAL_BF(ref->ref_value[1]) |
510e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILMASK_BF(dsa->valuemask[1]) |
511e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König		       S_028434_STENCILWRITEMASK_BF(dsa->writemask[1]));
512e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
513e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_pm4_set_state(rctx, dsa_stencil_ref, pm4);
514e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König}
515e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
516e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian Königstatic void si_set_pipe_stencil_ref(struct pipe_context *ctx,
517e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König				    const struct pipe_stencil_ref *state)
518e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König{
519e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        struct r600_context *rctx = (struct r600_context *)ctx;
520e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König        rctx->stencil_ref = *state;
521e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_update_dsa_stencil_ref(rctx);
522e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König}
523e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
524e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König
525e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König/*
526b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König * DSA
527b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König */
528b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
5297dace3a3cf894adb51a21ff6b08f58608ea33831Christian Königstatic uint32_t si_translate_stencil_op(int s_op)
530b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
5317dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	switch (s_op) {
5327dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_KEEP:
5337dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_KEEP;
5347dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_ZERO:
5357dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ZERO;
5367dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_REPLACE:
5377dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_REPLACE_TEST;
5387dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INCR:
5397dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ADD_CLAMP;
5407dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_DECR:
5417dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_SUB_CLAMP;
5427dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INCR_WRAP:
5437dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_ADD_WRAP;
5447dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_DECR_WRAP:
5457dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_SUB_WRAP;
5467dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	case PIPE_STENCIL_OP_INVERT:
5477dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		return V_02842C_STENCIL_INVERT;
5487dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	default:
5497dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		R600_ERR("Unknown stencil op %d", s_op);
5507dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		assert(0);
5517dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		break;
5527dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	}
5537dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	return 0;
554b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
555b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
556b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_dsa_state(struct pipe_context *ctx,
557b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König				 const struct pipe_depth_stencil_alpha_state *state)
558b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
559b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct si_state_dsa *dsa = CALLOC_STRUCT(si_state_dsa);
560b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct si_pm4_state *pm4 = &dsa->pm4;
561b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned db_depth_control, /* alpha_test_control, */ alpha_ref;
562b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	unsigned db_render_override, db_render_control;
5637dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	uint32_t db_stencil_control = 0;
564b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
565b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (dsa == NULL) {
566b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		return NULL;
567b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
568b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
569b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->valuemask[0] = state->stencil[0].valuemask;
570b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->valuemask[1] = state->stencil[1].valuemask;
571b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->writemask[0] = state->stencil[0].writemask;
572b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->writemask[1] = state->stencil[1].writemask;
573b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
574b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
575b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
576b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_028800_ZFUNC(state->depth.func);
577b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
578b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* stencil */
579b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (state->stencil[0].enabled) {
580b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		db_depth_control |= S_028800_STENCIL_ENABLE(1);
5817dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_depth_control |= S_028800_STENCILFUNC(state->stencil[0].func);
5827dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILFAIL(si_translate_stencil_op(state->stencil[0].fail_op));
5837dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILZPASS(si_translate_stencil_op(state->stencil[0].zpass_op));
5847dace3a3cf894adb51a21ff6b08f58608ea33831Christian König		db_stencil_control |= S_02842C_STENCILZFAIL(si_translate_stencil_op(state->stencil[0].zfail_op));
585b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
586b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		if (state->stencil[1].enabled) {
587b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König			db_depth_control |= S_028800_BACKFACE_ENABLE(1);
5887dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_depth_control |= S_028800_STENCILFUNC_BF(state->stencil[1].func);
5897dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILFAIL_BF(si_translate_stencil_op(state->stencil[1].fail_op));
5907dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILZPASS_BF(si_translate_stencil_op(state->stencil[1].zpass_op));
5917dace3a3cf894adb51a21ff6b08f58608ea33831Christian König			db_stencil_control |= S_02842C_STENCILZFAIL_BF(si_translate_stencil_op(state->stencil[1].zfail_op));
592b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		}
593b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
594b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
595b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* alpha */
596b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	//alpha_test_control = 0;
597b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	alpha_ref = 0;
598b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	if (state->alpha.enabled) {
599b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		//alpha_test_control = S_028410_ALPHA_FUNC(state->alpha.func);
600b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		//alpha_test_control |= S_028410_ALPHA_TEST_ENABLE(1);
601b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		alpha_ref = fui(state->alpha.ref_value);
602b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	}
603b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->alpha_ref = alpha_ref;
604b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
605b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* misc */
606b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_render_control = 0;
607b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	db_render_override = S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_DISABLE) |
608b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_02800C_FORCE_HIS_ENABLE0(V_02800C_FORCE_DISABLE) |
609b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		S_02800C_FORCE_HIS_ENABLE1(V_02800C_FORCE_DISABLE);
610b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	/* TODO db_render_override depends on query */
611b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028020_DB_DEPTH_BOUNDS_MIN, 0x00000000);
612b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, 0x00000000);
613b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028028_DB_STENCIL_CLEAR, 0x00000000);
614b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_02802C_DB_DEPTH_CLEAR, 0x3F800000);
615b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	//si_pm4_set_reg(pm4, R_028410_SX_ALPHA_TEST_CONTROL, alpha_test_control);
616b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028800_DB_DEPTH_CONTROL, db_depth_control);
617b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028000_DB_RENDER_CONTROL, db_render_control);
618b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE, db_render_override);
6197dace3a3cf894adb51a21ff6b08f58608ea33831Christian König	si_pm4_set_reg(pm4, R_02842C_DB_STENCIL_CONTROL, db_stencil_control);
620b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC0_DB_SRESULTS_COMPARE_STATE0, 0x0);
621b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC4_DB_SRESULTS_COMPARE_STATE1, 0x0);
622b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028AC8_DB_PRELOAD_CONTROL, 0x0);
623b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(pm4, R_028B70_DB_ALPHA_TO_MASK, 0x0000AA00);
624b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	dsa->db_render_override = db_render_override;
625b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
626b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	return dsa;
627b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
628b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
629b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_bind_dsa_state(struct pipe_context *ctx, void *state)
630b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
631b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct r600_context *rctx = (struct r600_context *)ctx;
632b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct si_state_dsa *dsa = state;
633b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
634b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        if (state == NULL)
635b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König                return;
636b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
637b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_bind_state(rctx, dsa, dsa);
638e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	si_update_dsa_stencil_ref(rctx);
639b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
640b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	// TODO
641b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        rctx->alpha_ref = dsa->alpha_ref;
642b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        rctx->alpha_ref_dirty = true;
643b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
644b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
645b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void si_delete_dsa_state(struct pipe_context *ctx, void *state)
646b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
647b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
648b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_delete_state(rctx, dsa, (struct si_state_dsa *)state);
649b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
650b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
651b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstatic void *si_create_db_flush_dsa(struct r600_context *rctx)
652b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König{
653b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	struct pipe_depth_stencil_alpha_state dsa;
654b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        struct si_state_dsa *state;
655b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
656b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	memset(&dsa, 0, sizeof(dsa));
657b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
658b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	state = rctx->context.create_depth_stencil_alpha_state(&rctx->context, &dsa);
659b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	si_pm4_set_reg(&state->pm4, R_028000_DB_RENDER_CONTROL,
660b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_DEPTH_COPY(1) |
661b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_STENCIL_COPY(1) |
662b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König		       S_028000_COPY_CENTROID(1));
663b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König        return state;
664b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}
665b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
666b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König/*
667835098a5290e59bb7b468eb987db67b0e1913c67Christian König * format translation
668835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
669835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorformat(enum pipe_format format)
670835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
671835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
672835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
673835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UNORM:
674835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UINT:
675835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_SINT:
676835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UNORM:
677835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UINT:
678835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_SINT:
679835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UNORM:
680835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UINT:
681835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SINT:
682835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SRGB:
683835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UNORM:
684835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SNORM:
685835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UINT:
686835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SINT:
687835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8;
688835098a5290e59bb7b468eb987db67b0e1913c67Christian König
689835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 16-bit buffers. */
690835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G6R5_UNORM:
691835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_5_6_5;
692835098a5290e59bb7b468eb987db67b0e1913c67Christian König
693835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5A1_UNORM:
694835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5X1_UNORM:
695835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_1_5_5_5;
696835098a5290e59bb7b468eb987db67b0e1913c67Christian König
697835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4A4_UNORM:
698835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4X4_UNORM:
699835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_4_4_4_4;
700835098a5290e59bb7b468eb987db67b0e1913c67Christian König
701835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UNORM:
702835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UINT:
703835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SINT:
704835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SRGB:
705835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UNORM:
706835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UINT:
707835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_SINT:
708835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_8;
709835098a5290e59bb7b468eb987db67b0e1913c67Christian König
710835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
711835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UNORM:
712835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UINT:
713835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_SINT:
714835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_FLOAT:
715835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_FLOAT:
716835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16;
717835098a5290e59bb7b468eb987db67b0e1913c67Christian König
718835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 32-bit buffers. */
719835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_SRGB:
720835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_UNORM:
721835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8R8G8B8_UNORM:
722835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_SRGB:
723835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_UNORM:
724835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8X8_UNORM:
725835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SNORM:
726835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UNORM:
727835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8X8_UNORM:
728835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
729835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8B8G8R8_UNORM:
730835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8R8G8B8_UNORM:
731835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8_UNORM:
732835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SSCALED:
733835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_USCALED:
734835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SINT:
735835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UINT:
736835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_8_8_8;
737835098a5290e59bb7b468eb987db67b0e1913c67Christian König
738835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10A2_UNORM:
739835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10X2_SNORM:
740835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UNORM:
741835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UINT:
742835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
743835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_2_10_10_10;
744835098a5290e59bb7b468eb987db67b0e1913c67Christian König
745835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
746835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
747835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_8_24;
748835098a5290e59bb7b468eb987db67b0e1913c67Christian König
749835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8Z24_UNORM:
750835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
751835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_24_8;
752835098a5290e59bb7b468eb987db67b0e1913c67Christian König
753835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
754835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_X24_8_32_FLOAT;
755835098a5290e59bb7b468eb987db67b0e1913c67Christian König
756835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_FLOAT:
757835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
758835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32;
759835098a5290e59bb7b468eb987db67b0e1913c67Christian König
760835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SSCALED:
761835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UNORM:
762835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UINT:
763835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SINT:
764835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16_16;
765835098a5290e59bb7b468eb987db67b0e1913c67Christian König
766835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R11G11B10_FLOAT:
767835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_10_11_11;
768835098a5290e59bb7b468eb987db67b0e1913c67Christian König
769835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 64-bit buffers. */
770835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_USCALED:
771835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_SSCALED:
772835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UINT:
773835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SINT:
774835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_USCALED:
775835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SSCALED:
776835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UNORM:
777835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SNORM:
778835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16_FLOAT:
779835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_FLOAT:
780835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_16_16_16_16;
781835098a5290e59bb7b468eb987db67b0e1913c67Christian König
782835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_FLOAT:
783835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_USCALED:
784835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SSCALED:
785835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SINT:
786835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_UINT:
787835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32_32;
788835098a5290e59bb7b468eb987db67b0e1913c67Christian König
789835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 128-bit buffers. */
790835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SNORM:
791835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UNORM:
792835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SSCALED:
793835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_USCALED:
794835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SINT:
795835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UINT:
796835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_FLOAT:
797835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_COLOR_32_32_32_32;
798835098a5290e59bb7b468eb987db67b0e1913c67Christian König
799835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* YUV buffers. */
800835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_UYVY:
801835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_YUYV:
802835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 96-bit buffers. */
803835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32_FLOAT:
804835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
805835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L4A4_UNORM:
806835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R4A4_UNORM:
807835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A4R4_UNORM:
808835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
809835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U; /* Unsupported. */
810835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
811835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
812835098a5290e59bb7b468eb987db67b0e1913c67Christian König
813835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_colorswap(enum pipe_format format)
814835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
815835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
816835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 8-bit buffers. */
817835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L4A4_UNORM:
818835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A4R4_UNORM:
819835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
820835098a5290e59bb7b468eb987db67b0e1913c67Christian König
821835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UNORM:
822835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_UINT:
823835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8_SINT:
824835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R4A4_UNORM:
825835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT_REV;
826835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UNORM:
827835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UNORM:
828835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_UINT:
829835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_I8_SINT:
830835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_UINT:
831835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SINT:
832835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8_SRGB:
833835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UNORM:
834835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SNORM:
835835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_UINT:
836835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8_SINT:
837835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
838835098a5290e59bb7b468eb987db67b0e1913c67Christian König
839835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 16-bit buffers. */
840835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G6R5_UNORM:
841835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
842835098a5290e59bb7b468eb987db67b0e1913c67Christian König
843835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5A1_UNORM:
844835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B5G5R5X1_UNORM:
845835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
846835098a5290e59bb7b468eb987db67b0e1913c67Christian König
847835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4A4_UNORM:
848835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B4G4R4X4_UNORM:
849835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
850835098a5290e59bb7b468eb987db67b0e1913c67Christian König
851835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
852835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
853835098a5290e59bb7b468eb987db67b0e1913c67Christian König
854835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UNORM:
855835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_UINT:
856835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SINT:
857835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_L8A8_SRGB:
858835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
859835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UNORM:
860835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_UINT:
861835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8_SINT:
862835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
863835098a5290e59bb7b468eb987db67b0e1913c67Christian König
864835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UNORM:
865835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_UINT:
866835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_SINT:
867835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16_FLOAT:
868835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
869835098a5290e59bb7b468eb987db67b0e1913c67Christian König
870835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 32-bit buffers. */
871835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_SRGB:
872835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
873835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_SRGB:
874835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
875835098a5290e59bb7b468eb987db67b0e1913c67Christian König
876835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8A8_UNORM:
877835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B8G8R8X8_UNORM:
878835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
879835098a5290e59bb7b468eb987db67b0e1913c67Christian König
880835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8R8G8B8_UNORM:
881835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8R8G8B8_UNORM:
882835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT_REV;
883835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SNORM:
884835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UNORM:
885835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SSCALED:
886835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_USCALED:
887835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_SINT:
888835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8A8_UINT:
889835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R8G8B8X8_UNORM:
890835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
891835098a5290e59bb7b468eb987db67b0e1913c67Christian König
892835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_A8B8G8R8_UNORM:
893835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8B8G8R8_UNORM:
894835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
895835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD_REV;
896835098a5290e59bb7b468eb987db67b0e1913c67Christian König
897835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
898835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
899835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
900835098a5290e59bb7b468eb987db67b0e1913c67Christian König
901835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_X8Z24_UNORM:
902835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_S8_UINT_Z24_UNORM:
903835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
904835098a5290e59bb7b468eb987db67b0e1913c67Christian König
905835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10A2_UNORM:
906835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10G10B10X2_SNORM:
907835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
908835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
909835098a5290e59bb7b468eb987db67b0e1913c67Christian König
910835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UNORM:
911835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_B10G10R10A2_UINT:
912835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_ALT;
913835098a5290e59bb7b468eb987db67b0e1913c67Christian König
914835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R11G11B10_FLOAT:
915835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_FLOAT:
916835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_UINT:
917835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32_SINT:
918835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
919835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_FLOAT:
920835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UNORM:
921835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_UINT:
922835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16_SINT:
923835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
924835098a5290e59bb7b468eb987db67b0e1913c67Christian König
925835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 64-bit buffers. */
926835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_FLOAT:
927835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_UINT:
928835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32_SINT:
929835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UNORM:
930835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SNORM:
931835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_USCALED:
932835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SSCALED:
933835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_UINT:
934835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_SINT:
935835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R16G16B16A16_FLOAT:
936835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
937835098a5290e59bb7b468eb987db67b0e1913c67Christian König
938835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* 128-bit buffers. */
939835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_FLOAT:
940835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SNORM:
941835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UNORM:
942835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SSCALED:
943835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_USCALED:
944835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_SINT:
945835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_R32G32B32A32_UINT:
946835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_SWAP_STD;
947835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
948835098a5290e59bb7b468eb987db67b0e1913c67Christian König		R600_ERR("unsupported colorswap format %d\n", format);
949835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U;
950835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
951835098a5290e59bb7b468eb987db67b0e1913c67Christian König	return ~0U;
952835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
953835098a5290e59bb7b468eb987db67b0e1913c67Christian König
954835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_colorformat_endian_swap(uint32_t colorformat)
955835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
956835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (R600_BIG_ENDIAN) {
957835098a5290e59bb7b468eb987db67b0e1913c67Christian König		switch(colorformat) {
958835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 8-bit buffers. */
959835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8:
960835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_NONE;
961835098a5290e59bb7b468eb987db67b0e1913c67Christian König
962835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 16-bit buffers. */
963835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_5_6_5:
964835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_1_5_5_5:
965835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_4_4_4_4:
966835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16:
967835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_8:
968835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN16;
969835098a5290e59bb7b468eb987db67b0e1913c67Christian König
970835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 32-bit buffers. */
971835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_8_8_8:
972835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_2_10_10_10:
973835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_8_24:
974835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_24_8:
975835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16_16:
976835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
977835098a5290e59bb7b468eb987db67b0e1913c67Christian König
978835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 64-bit buffers. */
979835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_16_16_16_16:
980835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN16;
981835098a5290e59bb7b468eb987db67b0e1913c67Christian König
982835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_32_32:
983835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
984835098a5290e59bb7b468eb987db67b0e1913c67Christian König
985835098a5290e59bb7b468eb987db67b0e1913c67Christian König		/* 128-bit buffers. */
986835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case V_028C70_COLOR_32_32_32_32:
987835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_8IN32;
988835098a5290e59bb7b468eb987db67b0e1913c67Christian König		default:
989835098a5290e59bb7b468eb987db67b0e1913c67Christian König			return V_028C70_ENDIAN_NONE; /* Unsupported. */
990835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
991835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
992835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028C70_ENDIAN_NONE;
993835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
994835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
995835098a5290e59bb7b468eb987db67b0e1913c67Christian König
996835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic uint32_t si_translate_dbformat(enum pipe_format format)
997835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
998835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (format) {
999835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z16_UNORM:
1000835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_16;
1001835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24X8_UNORM:
1002835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
1003835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_24; /* XXX no longer supported on SI */
1004835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT:
1005835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
1006835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return V_028040_Z_32_FLOAT;
1007835098a5290e59bb7b468eb987db67b0e1913c67Christian König	default:
1008835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return ~0U;
1009835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1010835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1011835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1012835098a5290e59bb7b468eb987db67b0e1913c67Christian König/*
101373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König * Texture translation
101473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König */
101573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
101673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic uint32_t si_translate_texformat(struct pipe_screen *screen,
101773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       enum pipe_format format,
101873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       const struct util_format_description *desc,
101973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				       int first_non_void)
102073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
102173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	boolean uniform = TRUE;
102273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	int i;
102373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
102473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Colorspace (return non-RGB formats directly). */
102573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->colorspace) {
102673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Depth stencil formats */
102773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_ZS:
102873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (format) {
102973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z16_UNORM:
103073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16;
103173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_X24S8_UINT:
103273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z24X8_UNORM:
103373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z24_UNORM_S8_UINT:
103473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_24_8;
103573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8X24_UINT:
103673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_X8Z24_UNORM:
103773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8_UINT_Z24_UNORM:
103873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_24;
103973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_S8_UINT:
104073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8;
104173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z32_FLOAT:
104273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32;
104373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
104473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_X24_8_32;
104573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		default:
104673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
104773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
104873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
104973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_YUV:
105073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown; /* TODO */
105173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
105273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_COLORSPACE_SRGB:
105373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
105473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
105573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
105673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
105773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
105873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
105973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* TODO compressed formats */
106073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
106173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) {
106273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F14_IMG_DATA_FORMAT_5_9_9_9;
106373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	} else if (format == PIPE_FORMAT_R11G11B10_FLOAT) {
106473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F14_IMG_DATA_FORMAT_10_11_11;
106573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
106673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
106773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* R8G8Bx_SNORM - TODO CxV8U8 */
106873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
106973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* See whether the components are of the same size. */
107073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	for (i = 1; i < desc->nr_channels; i++) {
107173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		uniform = uniform && desc->channel[0].size == desc->channel[i].size;
107273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
107373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
107473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* Non-uniform formats. */
107573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (!uniform) {
107673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch(desc->nr_channels) {
107773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 3:
107873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 5 &&
107973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 6 &&
108073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 5) {
108173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_5_6_5;
108273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
108373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
108473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
108573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 5 &&
108673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 5 &&
108773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 5 &&
108873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[3].size == 1) {
108973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_1_5_5_5;
109073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
109173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			if (desc->channel[0].size == 10 &&
109273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[1].size == 10 &&
109373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[2].size == 10 &&
109473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			    desc->channel[3].size == 2) {
109573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				return V_008F14_IMG_DATA_FORMAT_2_10_10_10;
109673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
109773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			goto out_unknown;
109873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
109973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown;
110073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
110173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
110273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (first_non_void < 0 || first_non_void > 3)
110373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		goto out_unknown;
110473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
110573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* uniform formats */
110673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->channel[first_non_void].size) {
110773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 4:
110873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
110973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
111073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_4_4;
111173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
111273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_4_4_4_4;
111373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
111473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
111573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 8:
111673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
111773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
111873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8;
111973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
112073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_8;
112173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
112273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_8_8_8_8;
112373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
112473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
112573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 16:
112673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
112773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
112873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16;
112973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
113073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16_16;
113173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
113273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_16_16_16_16;
113373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
113473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
113573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 32:
113673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		switch (desc->nr_channels) {
113773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
113873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32;
113973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
114073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32;
114173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 3:
114273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32_32;
114373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
114473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			return V_008F14_IMG_DATA_FORMAT_32_32_32_32;
114573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
114673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
114773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
114873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königout_unknown:
114973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */
115073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return ~0;
115173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
115273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
115373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_wrap(unsigned wrap)
115473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
115573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (wrap) {
115673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
115773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_REPEAT:
115873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_WRAP;
115973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP:
116073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_HALF_BORDER;
116173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
116273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_LAST_TEXEL;
116373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
116473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_CLAMP_BORDER;
116573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_REPEAT:
116673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR;
116773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP:
116873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
116973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
117073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
117173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
117273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_MIRROR_ONCE_BORDER;
117373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
117473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
117573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
117673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_filter(unsigned filter)
117773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
117873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (filter) {
117973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
118073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_FILTER_NEAREST:
118173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_XY_FILTER_POINT;
118273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_FILTER_LINEAR:
118373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_XY_FILTER_BILINEAR;
118473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
118573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
118673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
118773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_mipfilter(unsigned filter)
118873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
118973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (filter) {
119073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_NEAREST:
119173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_POINT;
119273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_LINEAR:
119373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_LINEAR;
119473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
119573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEX_MIPFILTER_NONE:
119673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F38_SQ_TEX_Z_FILTER_NONE;
119773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
119873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
119973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
120073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_compare(unsigned compare)
120173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
120273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (compare) {
120373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
120473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_NEVER:
120573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER;
120673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_LESS:
120773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESS;
120873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_EQUAL:
120973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_EQUAL;
121073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_LEQUAL:
121173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
121273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_GREATER:
121373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATER;
121473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_NOTEQUAL:
121573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
121673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_GEQUAL:
121773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
121873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_FUNC_ALWAYS:
121973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F30_SQ_TEX_DEPTH_COMPARE_ALWAYS;
122073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
122173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
122273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
122373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic unsigned si_tex_dim(unsigned dim)
122473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
122573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (dim) {
122673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
122773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_1D:
122873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_1D;
122973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_1D_ARRAY:
123073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_1D_ARRAY;
123173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_2D:
123273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_RECT:
123373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_2D;
123473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_2D_ARRAY:
123573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_2D_ARRAY;
123673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_3D:
123773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_3D;
123873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case PIPE_TEXTURE_CUBE:
123973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return V_008F1C_SQ_RSRC_IMG_CUBE;
124073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
124173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
124273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
124373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König/*
124453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König * Format support testing
124553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König */
124653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
124753d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
124853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
124953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_texformat(screen, format, util_format_description(format),
125053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König				      util_format_get_first_non_void_channel(format)) != ~0U;
125153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
125253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
1253b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian Königstatic uint32_t si_translate_vertexformat(struct pipe_screen *screen,
1254b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  enum pipe_format format,
1255b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  const struct util_format_description *desc,
1256b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König					  int first_non_void)
125753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
125853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	uint32_t result;
125953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
126053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_FIXED)
126153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return ~0;
126253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
126353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	result = si_translate_texformat(screen, format, desc, first_non_void);
126453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (result == V_008F0C_BUF_DATA_FORMAT_INVALID ||
126553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    result > V_008F0C_BUF_DATA_FORMAT_32_32_32_32)
126653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		result = ~0;
126753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
126853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return result;
126953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
127053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
127153d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format)
127253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
127353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_vertexformat(screen, format, util_format_description(format),
127453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König					 util_format_get_first_non_void_channel(format)) != ~0U;
127553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
127653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
127753d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_colorbuffer_format_supported(enum pipe_format format)
127853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
127953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_colorformat(format) != ~0U &&
128053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		si_translate_colorswap(format) != ~0U;
128153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
128253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
128353d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königstatic bool si_is_zs_format_supported(enum pipe_format format)
128453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
128553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return si_translate_dbformat(format) != ~0U;
128653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
128753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
128853d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen,
128953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_format format,
129053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    enum pipe_texture_target target,
129153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned sample_count,
129253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			    unsigned usage)
129353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König{
129453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	unsigned retval = 0;
129553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
129653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (target >= PIPE_MAX_TEXTURE_TYPES) {
129753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		R600_ERR("r600: unsupported texture type %d\n", target);
129853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
129953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
130053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
130153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (!util_format_is_supported(format, usage))
130253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
130353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
130453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	/* Multisample */
130553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (sample_count > 1)
130653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		return FALSE;
130753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
130853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
130953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_sampler_format_supported(screen, format)) {
131053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_SAMPLER_VIEW;
131153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
131253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
131353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & (PIPE_BIND_RENDER_TARGET |
131453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_DISPLAY_TARGET |
131553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_SCANOUT |
131653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		      PIPE_BIND_SHARED)) &&
131753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_colorbuffer_format_supported(format)) {
131853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= usage &
131953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			  (PIPE_BIND_RENDER_TARGET |
132053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_DISPLAY_TARGET |
132153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_SCANOUT |
132253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König			   PIPE_BIND_SHARED);
132353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
132453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
132553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
132653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_zs_format_supported(format)) {
132753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_DEPTH_STENCIL;
132853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
132953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
133053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
133153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	    si_is_vertex_format_supported(screen, format)) {
133253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_VERTEX_BUFFER;
133353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	}
133453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
133553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (usage & PIPE_BIND_TRANSFER_READ)
133653d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_TRANSFER_READ;
133753d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	if (usage & PIPE_BIND_TRANSFER_WRITE)
133853d47889e67b3de5267d55b90b2110802a6e7dc0Christian König		retval |= PIPE_BIND_TRANSFER_WRITE;
133953d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
134053d47889e67b3de5267d55b90b2110802a6e7dc0Christian König	return retval == usage;
134153d47889e67b3de5267d55b90b2110802a6e7dc0Christian König}
134253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König
134353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König/*
1344835098a5290e59bb7b468eb987db67b0e1913c67Christian König * framebuffer handling
1345835098a5290e59bb7b468eb987db67b0e1913c67Christian König */
1346835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1347835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_cb(struct r600_context *rctx, struct si_pm4_state *pm4,
1348835098a5290e59bb7b468eb987db67b0e1913c67Christian König		  const struct pipe_framebuffer_state *state, int cb)
1349835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1350835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_resource_texture *rtex;
1351835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_surface *surf;
1352835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned level = state->cbufs[cb]->u.tex.level;
1353835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned pitch, slice;
1354835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned color_info, color_attrib;
1355835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned format, swap, ntype, endian;
1356835098a5290e59bb7b468eb987db67b0e1913c67Christian König	uint64_t offset;
1357835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned blocksize;
1358835098a5290e59bb7b468eb987db67b0e1913c67Christian König	const struct util_format_description *desc;
1359835098a5290e59bb7b468eb987db67b0e1913c67Christian König	int i;
1360835098a5290e59bb7b468eb987db67b0e1913c67Christian König	unsigned blend_clamp = 0, blend_bypass = 0;
1361835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1362835098a5290e59bb7b468eb987db67b0e1913c67Christian König	surf = (struct r600_surface *)state->cbufs[cb];
1363835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture;
1364835098a5290e59bb7b468eb987db67b0e1913c67Christian König	blocksize = util_format_get_blocksize(rtex->real_format);
1365835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1366835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->depth)
1367835098a5290e59bb7b468eb987db67b0e1913c67Christian König		rctx->have_depth_fb = TRUE;
1368835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1369835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->depth && !rtex->is_flushing_texture) {
1370835098a5290e59bb7b468eb987db67b0e1913c67Christian König	        r600_texture_depth_flush(&rctx->context, state->cbufs[cb]->texture, TRUE);
1371835098a5290e59bb7b468eb987db67b0e1913c67Christian König		rtex = rtex->flushed_depth_texture;
1372835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1373835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1374835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset = rtex->surface.level[level].offset;
1375835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1376835098a5290e59bb7b468eb987db67b0e1913c67Christian König		offset += rtex->surface.level[level].slice_size *
1377835098a5290e59bb7b468eb987db67b0e1913c67Christian König			  state->cbufs[cb]->u.tex.first_layer;
1378835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1379835098a5290e59bb7b468eb987db67b0e1913c67Christian König	pitch = (rtex->surface.level[level].nblk_x) / 8 - 1;
1380835098a5290e59bb7b468eb987db67b0e1913c67Christian König	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1381835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (slice) {
1382835098a5290e59bb7b468eb987db67b0e1913c67Christian König		slice = slice - 1;
1383835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1384835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1385835098a5290e59bb7b468eb987db67b0e1913c67Christian König	color_attrib = S_028C74_TILE_MODE_INDEX(8);
1386835098a5290e59bb7b468eb987db67b0e1913c67Christian König	switch (rtex->surface.level[level].mode) {
1387835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_LINEAR_ALIGNED:
1388835098a5290e59bb7b468eb987db67b0e1913c67Christian König		color_attrib = S_028C74_TILE_MODE_INDEX(8);
1389835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1390835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_1D:
1391835098a5290e59bb7b468eb987db67b0e1913c67Christian König		color_attrib = S_028C74_TILE_MODE_INDEX(9);
1392835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1393835098a5290e59bb7b468eb987db67b0e1913c67Christian König	case RADEON_SURF_MODE_2D:
1394835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (rtex->resource.b.b.bind & PIPE_BIND_SCANOUT) {
1395835098a5290e59bb7b468eb987db67b0e1913c67Christian König			switch (blocksize) {
1396835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 1:
1397835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(10);
1398835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1399835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 2:
1400835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(11);
1401835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1402835098a5290e59bb7b468eb987db67b0e1913c67Christian König			case 4:
1403835098a5290e59bb7b468eb987db67b0e1913c67Christian König				color_attrib = S_028C74_TILE_MODE_INDEX(12);
1404835098a5290e59bb7b468eb987db67b0e1913c67Christian König				break;
1405835098a5290e59bb7b468eb987db67b0e1913c67Christian König			}
1406835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1407835098a5290e59bb7b468eb987db67b0e1913c67Christian König		} else switch (blocksize) {
1408835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 1:
1409835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(14);
1410835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1411835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 2:
1412835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(15);
1413835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1414835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 4:
1415835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(16);
1416835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1417835098a5290e59bb7b468eb987db67b0e1913c67Christian König		case 8:
1418835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(17);
1419835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1420835098a5290e59bb7b468eb987db67b0e1913c67Christian König		default:
1421835098a5290e59bb7b468eb987db67b0e1913c67Christian König			color_attrib = S_028C74_TILE_MODE_INDEX(13);
1422835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1423835098a5290e59bb7b468eb987db67b0e1913c67Christian König		break;
1424835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1425835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1426835098a5290e59bb7b468eb987db67b0e1913c67Christian König	desc = util_format_description(surf->base.format);
1427835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (i = 0; i < 4; i++) {
1428835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
1429835098a5290e59bb7b468eb987db67b0e1913c67Christian König			break;
1430835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1431835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1432835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) {
1433835098a5290e59bb7b468eb987db67b0e1913c67Christian König		ntype = V_028C70_NUMBER_FLOAT;
1434835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1435835098a5290e59bb7b468eb987db67b0e1913c67Christian König		ntype = V_028C70_NUMBER_UNORM;
1436835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
1437835098a5290e59bb7b468eb987db67b0e1913c67Christian König			ntype = V_028C70_NUMBER_SRGB;
1438835098a5290e59bb7b468eb987db67b0e1913c67Christian König		else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
1439835098a5290e59bb7b468eb987db67b0e1913c67Christian König			if (desc->channel[i].normalized)
1440835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_SNORM;
1441835098a5290e59bb7b468eb987db67b0e1913c67Christian König			else if (desc->channel[i].pure_integer)
1442835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_SINT;
1443835098a5290e59bb7b468eb987db67b0e1913c67Christian König		} else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1444835098a5290e59bb7b468eb987db67b0e1913c67Christian König			if (desc->channel[i].normalized)
1445835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_UNORM;
1446835098a5290e59bb7b468eb987db67b0e1913c67Christian König			else if (desc->channel[i].pure_integer)
1447835098a5290e59bb7b468eb987db67b0e1913c67Christian König				ntype = V_028C70_NUMBER_UINT;
1448835098a5290e59bb7b468eb987db67b0e1913c67Christian König		}
1449835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1450835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1451835098a5290e59bb7b468eb987db67b0e1913c67Christian König	format = si_translate_colorformat(surf->base.format);
1452835098a5290e59bb7b468eb987db67b0e1913c67Christian König	swap = si_translate_colorswap(surf->base.format);
1453835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
1454835098a5290e59bb7b468eb987db67b0e1913c67Christian König		endian = V_028C70_ENDIAN_NONE;
1455835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1456835098a5290e59bb7b468eb987db67b0e1913c67Christian König		endian = si_colorformat_endian_swap(format);
1457835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1458835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1459835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* blend clamp should be set for all NORM/SRGB types */
1460835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (ntype == V_028C70_NUMBER_UNORM ||
1461835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    ntype == V_028C70_NUMBER_SNORM ||
1462835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    ntype == V_028C70_NUMBER_SRGB)
1463835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_clamp = 1;
1464835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1465835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* set blend bypass according to docs if SINT/UINT or
1466835098a5290e59bb7b468eb987db67b0e1913c67Christian König	   8/24 COLOR variants */
1467835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (ntype == V_028C70_NUMBER_UINT || ntype == V_028C70_NUMBER_SINT ||
1468835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    format == V_028C70_COLOR_8_24 || format == V_028C70_COLOR_24_8 ||
1469835098a5290e59bb7b468eb987db67b0e1913c67Christian König	    format == V_028C70_COLOR_X24_8_32_FLOAT) {
1470835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_clamp = 0;
1471835098a5290e59bb7b468eb987db67b0e1913c67Christian König		blend_bypass = 1;
1472835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1473835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1474835098a5290e59bb7b468eb987db67b0e1913c67Christian König	color_info = S_028C70_FORMAT(format) |
1475835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_COMP_SWAP(swap) |
1476835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_BLEND_CLAMP(blend_clamp) |
1477835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_BLEND_BYPASS(blend_bypass) |
1478835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_NUMBER_TYPE(ntype) |
1479835098a5290e59bb7b468eb987db67b0e1913c67Christian König		S_028C70_ENDIAN(endian);
1480835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1481835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->alpha_ref_dirty = true;
1482835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1483835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset += r600_resource_va(rctx->context.screen, state->cbufs[cb]->texture);
1484835098a5290e59bb7b468eb987db67b0e1913c67Christian König	offset >>= 8;
1485835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1486835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* FIXME handle enabling of CB beyond BASE8 which has different offset */
1487835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
1488835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C60_CB_COLOR0_BASE + cb * 0x3C, offset);
1489835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C64_CB_COLOR0_PITCH + cb * 0x3C, S_028C64_TILE_MAX(pitch));
1490835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C68_CB_COLOR0_SLICE + cb * 0x3C, S_028C68_TILE_MAX(slice));
1491835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1492835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rtex->surface.level[level].mode < RADEON_SURF_MODE_1D) {
1493835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C, 0x00000000);
1494835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1495835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028C6C_CB_COLOR0_VIEW + cb * 0x3C,
1496835098a5290e59bb7b468eb987db67b0e1913c67Christian König			       S_028C6C_SLICE_START(state->cbufs[cb]->u.tex.first_layer) |
1497835098a5290e59bb7b468eb987db67b0e1913c67Christian König			       S_028C6C_SLICE_MAX(state->cbufs[cb]->u.tex.last_layer));
1498835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1499835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C70_CB_COLOR0_INFO + cb * 0x3C, color_info);
1500835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028C74_CB_COLOR0_ATTRIB + cb * 0x3C, color_attrib);
1501835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1502835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1503835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_db(struct r600_context *rctx, struct si_pm4_state *pm4,
1504835098a5290e59bb7b468eb987db67b0e1913c67Christian König		  const struct pipe_framebuffer_state *state)
1505835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1506835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_resource_texture *rtex;
1507835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_surface *surf;
150886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	unsigned level, pitch, slice, format;
150986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	uint32_t z_info, s_info;
151086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	uint64_t z_offs, s_offs;
1511835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1512835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (state->zsbuf == NULL) {
1513835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1514835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
1515835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return;
1516835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1517835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1518835098a5290e59bb7b468eb987db67b0e1913c67Christian König	surf = (struct r600_surface *)state->zsbuf;
1519835098a5290e59bb7b468eb987db67b0e1913c67Christian König	level = surf->base.u.tex.level;
1520835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rtex = (struct r600_resource_texture*)surf->base.texture;
1521835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1522835098a5290e59bb7b468eb987db67b0e1913c67Christian König	format = si_translate_dbformat(rtex->real_format);
1523835098a5290e59bb7b468eb987db67b0e1913c67Christian König
152486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
152586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs += rtex->surface.level[level].offset;
152686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
152786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs = r600_resource_va(rctx->context.screen, surf->base.texture);
152886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs += rtex->surface.stencil_offset;
152986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs += rtex->surface.level[level].offset / 4;
153086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
153186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_offs >>= 8;
153286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_offs >>= 8;
153386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
1534835098a5290e59bb7b468eb987db67b0e1913c67Christian König	pitch = (rtex->surface.level[level].nblk_x / 8) - 1;
1535835098a5290e59bb7b468eb987db67b0e1913c67Christian König	slice = (rtex->surface.level[level].nblk_x * rtex->surface.level[level].nblk_y) / 64;
1536835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (slice) {
1537835098a5290e59bb7b468eb987db67b0e1913c67Christian König		slice = slice - 1;
1538835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1539835098a5290e59bb7b468eb987db67b0e1913c67Christian König
154086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	z_info = S_028040_FORMAT(format);
154186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	s_info = S_028044_FORMAT(1);
1542835098a5290e59bb7b468eb987db67b0e1913c67Christian König
154386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	if (rtex->surface.level[level].mode == RADEON_SURF_MODE_1D) {
154486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		z_info |= S_028040_TILE_MODE_INDEX(4);
154586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		s_info |= S_028044_TILE_MODE_INDEX(4);
1546835098a5290e59bb7b468eb987db67b0e1913c67Christian König
154786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	} else if (rtex->surface.level[level].mode == RADEON_SURF_MODE_2D) {
154886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		switch (format) {
154986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_16:
155086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(5);
155186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(5);
155286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			break;
155386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_24:
155486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		case V_028040_Z_32_FLOAT:
155586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(6);
155686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(6);
155786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			break;
155886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		default:
155986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			z_info |= S_028040_TILE_MODE_INDEX(7);
156086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			s_info |= S_028044_TILE_MODE_INDEX(7);
156186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		}
1562835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1563835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
156486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		R600_ERR("Invalid DB tiling mode %d!\n",
156586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König			 rtex->surface.level[level].mode);
156686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1567835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
156886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		return;
1569835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1570835098a5290e59bb7b468eb987db67b0e1913c67Christian König
157186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028008_DB_DEPTH_VIEW,
157286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		       S_028008_SLICE_START(state->zsbuf->u.tex.first_layer) |
157386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		       S_028008_SLICE_MAX(state->zsbuf->u.tex.last_layer));
157486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
157586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02803C_DB_DEPTH_INFO, 0x1);
1576835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (format != ~0U) {
157786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, z_info);
1578835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1579835098a5290e59bb7b468eb987db67b0e1913c67Christian König	} else {
1580835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_set_reg(pm4, R_028040_DB_Z_INFO, 0);
1581835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
158286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
158386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	if (rtex->surface.flags & RADEON_SURF_SBUFFER) {
158486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, s_info);
158586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	} else {
158686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König		si_pm4_set_reg(pm4, R_028044_DB_STENCIL_INFO, 0);
158786490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	}
158886490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
158986490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_add_bo(pm4, &rtex->resource, RADEON_USAGE_READWRITE);
159086490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028048_DB_Z_READ_BASE, z_offs);
159186490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02804C_DB_STENCIL_READ_BASE, s_offs);
159286490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028050_DB_Z_WRITE_BASE, z_offs);
159386490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028054_DB_STENCIL_WRITE_BASE, s_offs);
159486490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König
159586490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_028058_DB_DEPTH_SIZE, S_028058_PITCH_TILE_MAX(pitch));
159686490bc150dd108d5917bb0f4636a9545fbf1b8eChristian König	si_pm4_set_reg(pm4, R_02805C_DB_DEPTH_SLICE, S_02805C_SLICE_TILE_MAX(slice));
1597835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1598835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1599835098a5290e59bb7b468eb987db67b0e1913c67Christian Königstatic void si_set_framebuffer_state(struct pipe_context *ctx,
1600835098a5290e59bb7b468eb987db67b0e1913c67Christian König				     const struct pipe_framebuffer_state *state)
1601835098a5290e59bb7b468eb987db67b0e1913c67Christian König{
1602835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
1603835098a5290e59bb7b468eb987db67b0e1913c67Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
1604835098a5290e59bb7b468eb987db67b0e1913c67Christian König	uint32_t shader_mask, tl, br;
1605835098a5290e59bb7b468eb987db67b0e1913c67Christian König	int tl_x, tl_y, br_x, br_y;
1606835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1607835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (pm4 == NULL)
1608835098a5290e59bb7b468eb987db67b0e1913c67Christian König		return;
1609835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1610835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_inval_fb_cache(pm4, state->nr_cbufs);
1611835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1612835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (state->zsbuf)
1613835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_pm4_inval_zsbuf_cache(pm4);
1614835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1615835098a5290e59bb7b468eb987db67b0e1913c67Christian König	util_copy_framebuffer_state(&rctx->framebuffer, state);
1616835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1617835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* build states */
1618835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->have_depth_fb = 0;
1619835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (int i = 0; i < state->nr_cbufs; i++) {
1620835098a5290e59bb7b468eb987db67b0e1913c67Christian König		si_cb(rctx, pm4, state, i);
1621835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1622835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_db(rctx, pm4, state);
1623835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1624835098a5290e59bb7b468eb987db67b0e1913c67Christian König	shader_mask = 0;
1625835098a5290e59bb7b468eb987db67b0e1913c67Christian König	for (int i = 0; i < state->nr_cbufs; i++) {
1626835098a5290e59bb7b468eb987db67b0e1913c67Christian König		shader_mask |= 0xf << (i * 4);
1627835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1628835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl_x = 0;
1629835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl_y = 0;
1630835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br_x = state->width;
1631835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br_y = state->height;
1632835098a5290e59bb7b468eb987db67b0e1913c67Christian König#if 0 /* These shouldn't be necessary on SI, see PA_SC_ENHANCE register */
1633835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* EG hw workaround */
1634835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (br_x == 0)
1635835098a5290e59bb7b468eb987db67b0e1913c67Christian König		tl_x = 1;
1636835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (br_y == 0)
1637835098a5290e59bb7b468eb987db67b0e1913c67Christian König		tl_y = 1;
1638835098a5290e59bb7b468eb987db67b0e1913c67Christian König	/* cayman hw workaround */
1639835098a5290e59bb7b468eb987db67b0e1913c67Christian König	if (rctx->chip_class == CAYMAN) {
1640835098a5290e59bb7b468eb987db67b0e1913c67Christian König		if (br_x == 1 && br_y == 1)
1641835098a5290e59bb7b468eb987db67b0e1913c67Christian König			br_x = 2;
1642835098a5290e59bb7b468eb987db67b0e1913c67Christian König	}
1643835098a5290e59bb7b468eb987db67b0e1913c67Christian König#endif
1644835098a5290e59bb7b468eb987db67b0e1913c67Christian König	tl = S_028240_TL_X(tl_x) | S_028240_TL_Y(tl_y);
1645835098a5290e59bb7b468eb987db67b0e1913c67Christian König	br = S_028244_BR_X(br_x) | S_028244_BR_Y(br_y);
1646835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1647835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028240_PA_SC_GENERIC_SCISSOR_TL, tl);
1648835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028244_PA_SC_GENERIC_SCISSOR_BR, br);
1649835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028250_PA_SC_VPORT_SCISSOR_0_TL, tl);
1650835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028254_PA_SC_VPORT_SCISSOR_0_BR, br);
1651835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028030_PA_SC_SCREEN_SCISSOR_TL, tl);
1652835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028034_PA_SC_SCREEN_SCISSOR_BR, br);
1653835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028204_PA_SC_WINDOW_SCISSOR_TL, tl);
1654835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028208_PA_SC_WINDOW_SCISSOR_BR, br);
1655835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028200_PA_SC_WINDOW_OFFSET, 0x00000000);
1656835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE, 0xAAAAAAAA);
1657835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_02823C_CB_SHADER_MASK, shader_mask);
1658835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_reg(pm4, R_028BE0_PA_SC_AA_CONFIG, 0x00000000);
1659835098a5290e59bb7b468eb987db67b0e1913c67Christian König
1660835098a5290e59bb7b468eb987db67b0e1913c67Christian König	si_pm4_set_state(rctx, framebuffer, pm4);
1661bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König	si_update_fb_rs_state(rctx);
166276660dfccede74782ac0d409da171ddbd61fae41Christian König	si_update_fb_blend_state(rctx);
1663835098a5290e59bb7b468eb987db67b0e1913c67Christian König}
1664835098a5290e59bb7b468eb987db67b0e1913c67Christian König
16653c09f11e5cefd437bb8185539430786dc245c96fChristian König/*
16663c09f11e5cefd437bb8185539430786dc245c96fChristian König * shaders
16673c09f11e5cefd437bb8185539430786dc245c96fChristian König */
16683c09f11e5cefd437bb8185539430786dc245c96fChristian König
16693c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void *si_create_shader_state(struct pipe_context *ctx,
16703c09f11e5cefd437bb8185539430786dc245c96fChristian König                             const struct pipe_shader_state *state)
16713c09f11e5cefd437bb8185539430786dc245c96fChristian König{
16723c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct si_pipe_shader *shader = CALLOC_STRUCT(si_pipe_shader);
16733c09f11e5cefd437bb8185539430786dc245c96fChristian König
16743c09f11e5cefd437bb8185539430786dc245c96fChristian König	shader->tokens = tgsi_dup_tokens(state->tokens);
16753c09f11e5cefd437bb8185539430786dc245c96fChristian König	shader->so = state->stream_output;
16763c09f11e5cefd437bb8185539430786dc245c96fChristian König
16773c09f11e5cefd437bb8185539430786dc245c96fChristian König	return shader;
16783c09f11e5cefd437bb8185539430786dc245c96fChristian König}
16793c09f11e5cefd437bb8185539430786dc245c96fChristian König
16803c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_vs_shader(struct pipe_context *ctx, void *state)
16813c09f11e5cefd437bb8185539430786dc245c96fChristian König{
16823c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
16833c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct si_pipe_shader *shader = state;
16843c09f11e5cefd437bb8185539430786dc245c96fChristian König
16853c09f11e5cefd437bb8185539430786dc245c96fChristian König	if (rctx->vs_shader == state)
16863c09f11e5cefd437bb8185539430786dc245c96fChristian König		return;
16873c09f11e5cefd437bb8185539430786dc245c96fChristian König
16883c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->shader_dirty = true;
16893c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->vs_shader = shader;
16901fb8ee62faf081e6a5588e99620a9883e3788c46Christian König
16911fb8ee62faf081e6a5588e99620a9883e3788c46Christian König	if (shader) {
16921fb8ee62faf081e6a5588e99620a9883e3788c46Christian König		si_pm4_bind_state(rctx, vs, shader->pm4);
16931fb8ee62faf081e6a5588e99620a9883e3788c46Christian König	}
16943c09f11e5cefd437bb8185539430786dc245c96fChristian König}
16953c09f11e5cefd437bb8185539430786dc245c96fChristian König
16963c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_bind_ps_shader(struct pipe_context *ctx, void *state)
16973c09f11e5cefd437bb8185539430786dc245c96fChristian König{
16983c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
16993c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct si_pipe_shader *shader = state;
17003c09f11e5cefd437bb8185539430786dc245c96fChristian König
17013c09f11e5cefd437bb8185539430786dc245c96fChristian König	if (rctx->ps_shader == state)
17023c09f11e5cefd437bb8185539430786dc245c96fChristian König		return;
17033c09f11e5cefd437bb8185539430786dc245c96fChristian König
17043c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->shader_dirty = true;
17053c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->ps_shader = shader;
17061fb8ee62faf081e6a5588e99620a9883e3788c46Christian König
17071fb8ee62faf081e6a5588e99620a9883e3788c46Christian König	if (shader) {
17081fb8ee62faf081e6a5588e99620a9883e3788c46Christian König		si_pm4_bind_state(rctx, ps, shader->pm4);
17091fb8ee62faf081e6a5588e99620a9883e3788c46Christian König	}
17103c09f11e5cefd437bb8185539430786dc245c96fChristian König}
17113c09f11e5cefd437bb8185539430786dc245c96fChristian König
17123c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_vs_shader(struct pipe_context *ctx, void *state)
17133c09f11e5cefd437bb8185539430786dc245c96fChristian König{
17143c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
17153c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct si_pipe_shader *shader = (struct si_pipe_shader *)state;
17163c09f11e5cefd437bb8185539430786dc245c96fChristian König
17173c09f11e5cefd437bb8185539430786dc245c96fChristian König	if (rctx->vs_shader == shader) {
17183c09f11e5cefd437bb8185539430786dc245c96fChristian König		rctx->vs_shader = NULL;
17193c09f11e5cefd437bb8185539430786dc245c96fChristian König	}
17203c09f11e5cefd437bb8185539430786dc245c96fChristian König
17213c09f11e5cefd437bb8185539430786dc245c96fChristian König	si_pm4_delete_state(rctx, vs, shader->pm4);
17223c09f11e5cefd437bb8185539430786dc245c96fChristian König	free(shader->tokens);
17233c09f11e5cefd437bb8185539430786dc245c96fChristian König	si_pipe_shader_destroy(ctx, shader);
17243c09f11e5cefd437bb8185539430786dc245c96fChristian König	free(shader);
17253c09f11e5cefd437bb8185539430786dc245c96fChristian König}
17263c09f11e5cefd437bb8185539430786dc245c96fChristian König
17273c09f11e5cefd437bb8185539430786dc245c96fChristian Königstatic void si_delete_ps_shader(struct pipe_context *ctx, void *state)
17283c09f11e5cefd437bb8185539430786dc245c96fChristian König{
17293c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
17303c09f11e5cefd437bb8185539430786dc245c96fChristian König	struct si_pipe_shader *shader = (struct si_pipe_shader *)state;
17313c09f11e5cefd437bb8185539430786dc245c96fChristian König
17323c09f11e5cefd437bb8185539430786dc245c96fChristian König	if (rctx->ps_shader == shader) {
17333c09f11e5cefd437bb8185539430786dc245c96fChristian König		rctx->ps_shader = NULL;
17343c09f11e5cefd437bb8185539430786dc245c96fChristian König	}
17353c09f11e5cefd437bb8185539430786dc245c96fChristian König
17363c09f11e5cefd437bb8185539430786dc245c96fChristian König	si_pm4_delete_state(rctx, ps, shader->pm4);
17373c09f11e5cefd437bb8185539430786dc245c96fChristian König	free(shader->tokens);
17383c09f11e5cefd437bb8185539430786dc245c96fChristian König	si_pipe_shader_destroy(ctx, shader);
17393c09f11e5cefd437bb8185539430786dc245c96fChristian König	free(shader);
17403c09f11e5cefd437bb8185539430786dc245c96fChristian König}
17413c09f11e5cefd437bb8185539430786dc245c96fChristian König
1742baf20397569fb499f736e5ad2350b008b8207fadChristian König/*
1743baf20397569fb499f736e5ad2350b008b8207fadChristian König * Samplers
1744baf20397569fb499f736e5ad2350b008b8207fadChristian König */
1745baf20397569fb499f736e5ad2350b008b8207fadChristian König
174673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic struct pipe_sampler_view *si_create_sampler_view(struct pipe_context *ctx,
174773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König							struct pipe_resource *texture,
174873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König							const struct pipe_sampler_view *state)
174973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
175073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct si_pipe_sampler_view *view = CALLOC_STRUCT(si_pipe_sampler_view);
175173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct r600_resource_texture *tmp = (struct r600_resource_texture*)texture;
175273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	const struct util_format_description *desc = util_format_description(state->format);
175373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned blocksize = util_format_get_blocksize(tmp->real_format);
175473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned format, num_format, /*endian,*/ tiling_index;
175573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	uint32_t pitch = 0;
175673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned char state_swizzle[4], swizzle[4];
175773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned height, depth, width;
175873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	int first_non_void;
175973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	uint64_t va;
176073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
176173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (view == NULL)
176273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return NULL;
176373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
176473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* initialize base object */
176573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base = *state;
176673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.texture = NULL;
176773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	pipe_reference(NULL, &texture->reference);
176873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.texture = texture;
176973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.reference.count = 1;
177073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->base.context = ctx;
177173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
177273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[0] = state->swizzle_r;
177373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[1] = state->swizzle_g;
177473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[2] = state->swizzle_b;
177573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	state_swizzle[3] = state->swizzle_a;
177673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	util_format_compose_swizzles(desc->swizzle, state_swizzle, swizzle);
177773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
177873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	first_non_void = util_format_get_first_non_void_channel(state->format);
177973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (desc->channel[first_non_void].type) {
178073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_FLOAT:
178173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
178273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
178373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_SIGNED:
178473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_SNORM;
178573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
178673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case UTIL_FORMAT_TYPE_UNSIGNED:
178773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default:
178873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		num_format = V_008F14_IMG_NUM_FORMAT_UNORM;
178973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
179073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
179173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	format = si_translate_texformat(ctx->screen, state->format, desc, first_non_void);
179273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (format == ~0) {
179373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		format = 0;
179473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
179573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
179673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (tmp->depth && !tmp->is_flushing_texture) {
179773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		r600_texture_depth_flush(ctx, texture, TRUE);
179873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tmp = tmp->flushed_depth_texture;
179973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
180073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
180173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	/* not supported any more */
180273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	//endian = si_colorformat_endian_swap(format);
180373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
180473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	height = texture->height0;
180573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	depth = texture->depth0;
180673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	width = texture->width0;
180773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	pitch = align(tmp->pitch_in_blocks[0] *
180873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		      util_format_get_blockwidth(state->format), 8);
180973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
181073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
181173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	        height = 1;
181273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		depth = texture->array_size;
181373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	} else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
181473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		depth = texture->array_size;
181573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
181673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
181773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	tiling_index = 8;
181873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (tmp->surface.level[state->u.tex.first_level].mode) {
181973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_LINEAR_ALIGNED:
182073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tiling_index = 8;
182173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
182273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_1D:
182373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		tiling_index = 9;
182473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
182573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case RADEON_SURF_MODE_2D:
182673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		if (tmp->resource.b.b.bind & PIPE_BIND_SCANOUT) {
182773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			switch (blocksize) {
182873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 1:
182973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 10;
183073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
183173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 2:
183273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 11;
183373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
183473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			case 4:
183573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				tiling_index = 12;
183673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				break;
183773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			}
183873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
183973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		} else switch (blocksize) {
184073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 1:
184173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 14;
184273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
184373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 2:
184473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 15;
184573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
184673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 4:
184773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 16;
184873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
184973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		case 8:
185073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 17;
185173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			break;
185273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		default:
185373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			tiling_index = 13;
185473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		}
185573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
185673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
185773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
185873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	va = r600_resource_va(ctx->screen, texture);
185973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (state->u.tex.last_level) {
186073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		view->state[0] = (va + tmp->offset[1]) >> 8;
186173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	} else {
186273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		view->state[0] = (va + tmp->offset[0]) >> 8;
186373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
186473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[1] = (S_008F14_BASE_ADDRESS_HI((va + tmp->offset[0]) >> 40) |
186573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F14_DATA_FORMAT(format) |
186673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F14_NUM_FORMAT(num_format));
186773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[2] = (S_008F18_WIDTH(width - 1) |
186873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F18_HEIGHT(height - 1));
186973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[3] = (S_008F1C_DST_SEL_X(si_map_swizzle(swizzle[0])) |
187073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_Y(si_map_swizzle(swizzle[1])) |
187173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_Z(si_map_swizzle(swizzle[2])) |
187273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) |
187373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_BASE_LEVEL(state->u.tex.first_level) |
187473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_LAST_LEVEL(state->u.tex.last_level) |
187573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_TILING_INDEX(tiling_index) |
187673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F1C_TYPE(si_tex_dim(texture->target)));
187773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1));
187873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) |
187973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F24_LAST_ARRAY(state->u.tex.last_layer));
188073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[6] = 0;
188173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	view->state[7] = 0;
188273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
188373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return &view->base;
188473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
188573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
18869b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_sampler_view_destroy(struct pipe_context *ctx,
18879b213c871a080472660eff271c72a3fcc5d3f578Christian König				    struct pipe_sampler_view *state)
18889b213c871a080472660eff271c72a3fcc5d3f578Christian König{
18899b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state;
18909b213c871a080472660eff271c72a3fcc5d3f578Christian König
18919b213c871a080472660eff271c72a3fcc5d3f578Christian König	pipe_resource_reference(&state->texture, NULL);
18929b213c871a080472660eff271c72a3fcc5d3f578Christian König	FREE(resource);
18939b213c871a080472660eff271c72a3fcc5d3f578Christian König}
18949b213c871a080472660eff271c72a3fcc5d3f578Christian König
189573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void *si_create_sampler_state(struct pipe_context *ctx,
189673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König				     const struct pipe_sampler_state *state)
189773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
189873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	struct si_pipe_sampler_state *rstate = CALLOC_STRUCT(si_pipe_sampler_state);
189973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	union util_color uc;
190073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 2 : 0;
190173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	unsigned border_color_type;
190273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
190373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (rstate == NULL) {
190473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		return NULL;
190573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
190673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
190773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
190873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	switch (uc.ui) {
190973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0x000000FF:
191073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK;
191173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
191273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0x00000000:
191373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK;
191473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
191573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	case 0xFFFFFFFF:
191673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE;
191773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		break;
191873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	default: /* Use border color pointer */
191973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER;
192073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
192173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
192273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) |
192373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) |
192473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) |
192573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  (state->max_anisotropy & 0x7) << 9 | /* XXX */
192673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
192773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
192873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  aniso_flag_offset << 16 | /* XXX */
192973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map));
193073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
193173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)));
193273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
193373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) |
193473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) |
193573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König			  S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter)));
193673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type);
193773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
193873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#if 0
193973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	if (border_color_type == 3) {
194073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A404_TD_PS_SAMPLER0_BORDER_RED, fui(state->border_color.f[0]));
194173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A408_TD_PS_SAMPLER0_BORDER_GREEN, fui(state->border_color.f[1]));
194273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A40C_TD_PS_SAMPLER0_BORDER_BLUE, fui(state->border_color.f[2]));
194373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König		si_pm4_set_reg(pm4, R_00A410_TD_PS_SAMPLER0_BORDER_ALPHA, fui(state->border_color.f[3]));
194473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	}
194573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König#endif
194673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	return rstate;
194773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
194873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
1949baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
1950baf20397569fb499f736e5ad2350b008b8207fadChristian König				   struct pipe_sampler_view **views)
1951baf20397569fb499f736e5ad2350b008b8207fadChristian König{
1952baf20397569fb499f736e5ad2350b008b8207fadChristian König	assert(count == 0);
1953baf20397569fb499f736e5ad2350b008b8207fadChristian König}
1954baf20397569fb499f736e5ad2350b008b8207fadChristian König
1955baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
1956baf20397569fb499f736e5ad2350b008b8207fadChristian König				   struct pipe_sampler_view **views)
1957baf20397569fb499f736e5ad2350b008b8207fadChristian König{
1958baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
1959baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pipe_sampler_view **resource = (struct si_pipe_sampler_view **)views;
1960baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
1961fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	struct si_resource *bo;
1962baf20397569fb499f736e5ad2350b008b8207fadChristian König	int i;
1963baf20397569fb499f736e5ad2350b008b8207fadChristian König	int has_depth = 0;
1964baf20397569fb499f736e5ad2350b008b8207fadChristian König	uint64_t va;
1965baf20397569fb499f736e5ad2350b008b8207fadChristian König	char *ptr;
1966baf20397569fb499f736e5ad2350b008b8207fadChristian König
1967baf20397569fb499f736e5ad2350b008b8207fadChristian König	if (!count)
1968baf20397569fb499f736e5ad2350b008b8207fadChristian König		goto out;
1969baf20397569fb499f736e5ad2350b008b8207fadChristian König
1970baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_inval_texture_cache(pm4);
1971baf20397569fb499f736e5ad2350b008b8207fadChristian König
1972fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE,
1973fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König				       count * sizeof(resource[0]->state));
1974baf20397569fb499f736e5ad2350b008b8207fadChristian König	ptr = rctx->ws->buffer_map(bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
1975baf20397569fb499f736e5ad2350b008b8207fadChristian König
1976baf20397569fb499f736e5ad2350b008b8207fadChristian König	for (i = 0; i < count; i++, ptr += sizeof(resource[0]->state)) {
1977ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
1978ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
1979baf20397569fb499f736e5ad2350b008b8207fadChristian König		pipe_sampler_view_reference(
1980baf20397569fb499f736e5ad2350b008b8207fadChristian König			(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
1981baf20397569fb499f736e5ad2350b008b8207fadChristian König			views[i]);
1982baf20397569fb499f736e5ad2350b008b8207fadChristian König
1983ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
1984ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
1985baf20397569fb499f736e5ad2350b008b8207fadChristian König		if (resource[i]) {
1986ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			if (tex->depth)
1987baf20397569fb499f736e5ad2350b008b8207fadChristian König				has_depth = 1;
1988baf20397569fb499f736e5ad2350b008b8207fadChristian König
1989baf20397569fb499f736e5ad2350b008b8207fadChristian König			memcpy(ptr, resource[i]->state, sizeof(resource[0]->state));
1990baf20397569fb499f736e5ad2350b008b8207fadChristian König		} else
1991baf20397569fb499f736e5ad2350b008b8207fadChristian König			memset(ptr, 0, sizeof(resource[0]->state));
1992baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
1993baf20397569fb499f736e5ad2350b008b8207fadChristian König
1994baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ws->buffer_unmap(bo->cs_buf);
1995baf20397569fb499f736e5ad2350b008b8207fadChristian König
1996baf20397569fb499f736e5ad2350b008b8207fadChristian König	for (i = count; i < NUM_TEX_UNITS; i++) {
1997baf20397569fb499f736e5ad2350b008b8207fadChristian König		if (rctx->ps_samplers.views[i])
1998baf20397569fb499f736e5ad2350b008b8207fadChristian König			pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL);
1999baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
2000baf20397569fb499f736e5ad2350b008b8207fadChristian König
2001baf20397569fb499f736e5ad2350b008b8207fadChristian König	va = r600_resource_va(ctx->screen, (void *)bo);
2002baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_add_bo(pm4, bo, RADEON_USAGE_READ);
2003baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_reg(pm4, R_00B040_SPI_SHADER_USER_DATA_PS_4, va);
2004baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_reg(pm4, R_00B044_SPI_SHADER_USER_DATA_PS_5, va >> 32);
2005baf20397569fb499f736e5ad2350b008b8207fadChristian König
2006baf20397569fb499f736e5ad2350b008b8207fadChristian Königout:
2007baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_state(rctx, ps_sampler_views, pm4);
2008baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->have_depth_texture = has_depth;
2009baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ps_samplers.n_views = count;
2010baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2011baf20397569fb499f736e5ad2350b008b8207fadChristian König
2012baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_vs_sampler(struct pipe_context *ctx, unsigned count, void **states)
2013baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2014ad15c8c0f199e293b5c49a9c614cfaa19edb9a62Christian König	assert(count == 0);
2015baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2016baf20397569fb499f736e5ad2350b008b8207fadChristian König
2017baf20397569fb499f736e5ad2350b008b8207fadChristian Königstatic void si_bind_ps_sampler(struct pipe_context *ctx, unsigned count, void **states)
2018baf20397569fb499f736e5ad2350b008b8207fadChristian König{
2019baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct r600_context *rctx = (struct r600_context *)ctx;
2020baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pipe_sampler_state **rstates = (struct si_pipe_sampler_state **)states;
2021baf20397569fb499f736e5ad2350b008b8207fadChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2022fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	struct si_resource *bo;
2023baf20397569fb499f736e5ad2350b008b8207fadChristian König	uint64_t va;
2024baf20397569fb499f736e5ad2350b008b8207fadChristian König	char *ptr;
2025baf20397569fb499f736e5ad2350b008b8207fadChristian König	int i;
2026baf20397569fb499f736e5ad2350b008b8207fadChristian König
2027baf20397569fb499f736e5ad2350b008b8207fadChristian König	if (!count)
2028baf20397569fb499f736e5ad2350b008b8207fadChristian König		goto out;
2029baf20397569fb499f736e5ad2350b008b8207fadChristian König
2030baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_inval_texture_cache(pm4);
2031baf20397569fb499f736e5ad2350b008b8207fadChristian König
2032fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	bo = si_resource_create_custom(ctx->screen, PIPE_USAGE_IMMUTABLE,
2033fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König				       count * sizeof(rstates[0]->val));
2034baf20397569fb499f736e5ad2350b008b8207fadChristian König	ptr = rctx->ws->buffer_map(bo->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
2035baf20397569fb499f736e5ad2350b008b8207fadChristian König
2036baf20397569fb499f736e5ad2350b008b8207fadChristian König	for (i = 0; i < count; i++, ptr += sizeof(rstates[0]->val)) {
2037baf20397569fb499f736e5ad2350b008b8207fadChristian König		memcpy(ptr, rstates[i]->val, sizeof(rstates[0]->val));
2038baf20397569fb499f736e5ad2350b008b8207fadChristian König	}
2039baf20397569fb499f736e5ad2350b008b8207fadChristian König
2040baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ws->buffer_unmap(bo->cs_buf);
2041baf20397569fb499f736e5ad2350b008b8207fadChristian König
2042baf20397569fb499f736e5ad2350b008b8207fadChristian König	memcpy(rctx->ps_samplers.samplers, states, sizeof(void*) * count);
2043baf20397569fb499f736e5ad2350b008b8207fadChristian König
2044baf20397569fb499f736e5ad2350b008b8207fadChristian König	va = r600_resource_va(ctx->screen, (void *)bo);
2045baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_add_bo(pm4, bo, RADEON_USAGE_READ);
2046baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_reg(pm4, R_00B038_SPI_SHADER_USER_DATA_PS_2, va);
2047baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_reg(pm4, R_00B03C_SPI_SHADER_USER_DATA_PS_3, va >> 32);
2048baf20397569fb499f736e5ad2350b008b8207fadChristian König
2049baf20397569fb499f736e5ad2350b008b8207fadChristian Königout:
2050baf20397569fb499f736e5ad2350b008b8207fadChristian König	si_pm4_set_state(rctx, ps_sampler, pm4);
2051baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->ps_samplers.n_samplers = count;
2052baf20397569fb499f736e5ad2350b008b8207fadChristian König}
2053baf20397569fb499f736e5ad2350b008b8207fadChristian König
205473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
205573dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
205673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
205773dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
205873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian Königstatic void si_delete_sampler_state(struct pipe_context *ctx, void *state)
205973dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König{
206073dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	free(state);
206173dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König}
206273dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
20630d6b0b512acadbc5d64039063b5649fc401b3367Christian König/*
20640d6b0b512acadbc5d64039063b5649fc401b3367Christian König * Constants
20650d6b0b512acadbc5d64039063b5649fc401b3367Christian König */
20660d6b0b512acadbc5d64039063b5649fc401b3367Christian Königstatic void si_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
20670d6b0b512acadbc5d64039063b5649fc401b3367Christian König			    struct pipe_constant_buffer *cb)
20680d6b0b512acadbc5d64039063b5649fc401b3367Christian König{
20690d6b0b512acadbc5d64039063b5649fc401b3367Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
2070fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	struct si_resource *rbuffer = cb ? si_resource(cb->buffer) : NULL;
20710d6b0b512acadbc5d64039063b5649fc401b3367Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
20720d6b0b512acadbc5d64039063b5649fc401b3367Christian König	uint64_t va_offset;
20730d6b0b512acadbc5d64039063b5649fc401b3367Christian König	uint32_t offset;
20740d6b0b512acadbc5d64039063b5649fc401b3367Christian König
20750d6b0b512acadbc5d64039063b5649fc401b3367Christian König	/* Note that the state tracker can unbind constant buffers by
20760d6b0b512acadbc5d64039063b5649fc401b3367Christian König	 * passing NULL here.
20770d6b0b512acadbc5d64039063b5649fc401b3367Christian König	 */
20780d6b0b512acadbc5d64039063b5649fc401b3367Christian König	if (cb == NULL) {
20790d6b0b512acadbc5d64039063b5649fc401b3367Christian König		FREE(pm4);
20800d6b0b512acadbc5d64039063b5649fc401b3367Christian König		return;
20810d6b0b512acadbc5d64039063b5649fc401b3367Christian König	}
20820d6b0b512acadbc5d64039063b5649fc401b3367Christian König
20830d6b0b512acadbc5d64039063b5649fc401b3367Christian König	si_pm4_inval_shader_cache(pm4);
20840d6b0b512acadbc5d64039063b5649fc401b3367Christian König
20850d6b0b512acadbc5d64039063b5649fc401b3367Christian König	if (cb->user_buffer)
20860d6b0b512acadbc5d64039063b5649fc401b3367Christian König		r600_upload_const_buffer(rctx, &rbuffer, cb->user_buffer, cb->buffer_size, &offset);
20870d6b0b512acadbc5d64039063b5649fc401b3367Christian König	else
20880d6b0b512acadbc5d64039063b5649fc401b3367Christian König		offset = 0;
20890d6b0b512acadbc5d64039063b5649fc401b3367Christian König	va_offset = r600_resource_va(ctx->screen, (void*)rbuffer);
20900d6b0b512acadbc5d64039063b5649fc401b3367Christian König	va_offset += offset;
20910d6b0b512acadbc5d64039063b5649fc401b3367Christian König
20920d6b0b512acadbc5d64039063b5649fc401b3367Christian König	si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ);
20930d6b0b512acadbc5d64039063b5649fc401b3367Christian König
20940d6b0b512acadbc5d64039063b5649fc401b3367Christian König	switch (shader) {
20950d6b0b512acadbc5d64039063b5649fc401b3367Christian König	case PIPE_SHADER_VERTEX:
20960d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0, va_offset);
20970d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B134_SPI_SHADER_USER_DATA_VS_1, va_offset >> 32);
20980d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_state(rctx, vs_const, pm4);
20990d6b0b512acadbc5d64039063b5649fc401b3367Christian König		break;
21000d6b0b512acadbc5d64039063b5649fc401b3367Christian König
21010d6b0b512acadbc5d64039063b5649fc401b3367Christian König	case PIPE_SHADER_FRAGMENT:
21020d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B030_SPI_SHADER_USER_DATA_PS_0, va_offset);
21030d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_reg(pm4, R_00B034_SPI_SHADER_USER_DATA_PS_1, va_offset >> 32);
21040d6b0b512acadbc5d64039063b5649fc401b3367Christian König		si_pm4_set_state(rctx, ps_const, pm4);
21050d6b0b512acadbc5d64039063b5649fc401b3367Christian König		break;
21060d6b0b512acadbc5d64039063b5649fc401b3367Christian König
21070d6b0b512acadbc5d64039063b5649fc401b3367Christian König	default:
21080d6b0b512acadbc5d64039063b5649fc401b3367Christian König		R600_ERR("unsupported %d\n", shader);
21090d6b0b512acadbc5d64039063b5649fc401b3367Christian König		return;
21100d6b0b512acadbc5d64039063b5649fc401b3367Christian König	}
21110d6b0b512acadbc5d64039063b5649fc401b3367Christian König
21120d6b0b512acadbc5d64039063b5649fc401b3367Christian König	if (cb->buffer != &rbuffer->b.b)
2113fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König		si_resource_reference(&rbuffer, NULL);
21140d6b0b512acadbc5d64039063b5649fc401b3367Christian König}
21150d6b0b512acadbc5d64039063b5649fc401b3367Christian König
21169b213c871a080472660eff271c72a3fcc5d3f578Christian König/*
21179b213c871a080472660eff271c72a3fcc5d3f578Christian König * Vertex elements & buffers
21189b213c871a080472660eff271c72a3fcc5d3f578Christian König */
21199b213c871a080472660eff271c72a3fcc5d3f578Christian König
21209b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void *si_create_vertex_elements(struct pipe_context *ctx,
21219b213c871a080472660eff271c72a3fcc5d3f578Christian König				       unsigned count,
21229b213c871a080472660eff271c72a3fcc5d3f578Christian König				       const struct pipe_vertex_element *elements)
21239b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21249b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_vertex_element *v = CALLOC_STRUCT(si_vertex_element);
2125b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	int i;
21269b213c871a080472660eff271c72a3fcc5d3f578Christian König
2127b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	assert(count < PIPE_MAX_ATTRIBS);
21289b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (!v)
21299b213c871a080472660eff271c72a3fcc5d3f578Christian König		return NULL;
21309b213c871a080472660eff271c72a3fcc5d3f578Christian König
21319b213c871a080472660eff271c72a3fcc5d3f578Christian König	v->count = count;
2132b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	for (i = 0; i < count; ++i) {
2133b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		const struct util_format_description *desc;
2134b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		unsigned data_format, num_format;
2135b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		int first_non_void;
2136b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2137b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		desc = util_format_description(elements[i].src_format);
2138b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		first_non_void = util_format_get_first_non_void_channel(elements[i].src_format);
2139b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		data_format = si_translate_vertexformat(ctx->screen, elements[i].src_format,
2140b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König							desc, first_non_void);
2141b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2142b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		switch (desc->channel[first_non_void].type) {
2143b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_FIXED:
2144b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_USCALED; /* XXX */
2145b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2146b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_SIGNED:
2147b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_SNORM;
2148b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2149b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_UNSIGNED:
2150b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F0C_BUF_NUM_FORMAT_UNORM;
2151b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			break;
2152b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		case UTIL_FORMAT_TYPE_FLOAT:
2153b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		default:
2154b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			num_format = V_008F14_IMG_NUM_FORMAT_FLOAT;
2155b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		}
2156b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
2157b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		v->rsrc_word3[i] = S_008F0C_DST_SEL_X(si_map_swizzle(desc->swizzle[0])) |
2158b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_Y(si_map_swizzle(desc->swizzle[1])) |
2159b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_Z(si_map_swizzle(desc->swizzle[2])) |
2160b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DST_SEL_W(si_map_swizzle(desc->swizzle[3])) |
2161b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_NUM_FORMAT(num_format) |
2162b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König				   S_008F0C_DATA_FORMAT(data_format);
2163b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	}
21649b213c871a080472660eff271c72a3fcc5d3f578Christian König	memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count);
21659b213c871a080472660eff271c72a3fcc5d3f578Christian König
21669b213c871a080472660eff271c72a3fcc5d3f578Christian König	return v;
21679b213c871a080472660eff271c72a3fcc5d3f578Christian König}
21689b213c871a080472660eff271c72a3fcc5d3f578Christian König
21699b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_bind_vertex_elements(struct pipe_context *ctx, void *state)
21709b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21719b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
21729b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_vertex_element *v = (struct si_vertex_element*)state;
21739b213c871a080472660eff271c72a3fcc5d3f578Christian König
21749b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->vertex_elements = v;
21759b213c871a080472660eff271c72a3fcc5d3f578Christian König}
21769b213c871a080472660eff271c72a3fcc5d3f578Christian König
21779b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_delete_vertex_element(struct pipe_context *ctx, void *state)
21789b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21799b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
21809b213c871a080472660eff271c72a3fcc5d3f578Christian König
21819b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (rctx->vertex_elements == state)
21829b213c871a080472660eff271c72a3fcc5d3f578Christian König		rctx->vertex_elements = NULL;
21839b213c871a080472660eff271c72a3fcc5d3f578Christian König	FREE(state);
21849b213c871a080472660eff271c72a3fcc5d3f578Christian König}
21859b213c871a080472660eff271c72a3fcc5d3f578Christian König
21869b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
21879b213c871a080472660eff271c72a3fcc5d3f578Christian König				  const struct pipe_vertex_buffer *buffers)
21889b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21899b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
21909b213c871a080472660eff271c72a3fcc5d3f578Christian König
21919b213c871a080472660eff271c72a3fcc5d3f578Christian König	util_copy_vertex_buffers(rctx->vertex_buffer, &rctx->nr_vertex_buffers, buffers, count);
21929b213c871a080472660eff271c72a3fcc5d3f578Christian König}
21939b213c871a080472660eff271c72a3fcc5d3f578Christian König
21949b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_index_buffer(struct pipe_context *ctx,
21959b213c871a080472660eff271c72a3fcc5d3f578Christian König				const struct pipe_index_buffer *ib)
21969b213c871a080472660eff271c72a3fcc5d3f578Christian König{
21979b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
21989b213c871a080472660eff271c72a3fcc5d3f578Christian König
21999b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (ib) {
22009b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
22019b213c871a080472660eff271c72a3fcc5d3f578Christian König	        memcpy(&rctx->index_buffer, ib, sizeof(*ib));
22029b213c871a080472660eff271c72a3fcc5d3f578Christian König	} else {
22039b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
22049b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
22059b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22069b213c871a080472660eff271c72a3fcc5d3f578Christian König
22079b213c871a080472660eff271c72a3fcc5d3f578Christian König/*
22089b213c871a080472660eff271c72a3fcc5d3f578Christian König * Stream out
22099b213c871a080472660eff271c72a3fcc5d3f578Christian König */
22109b213c871a080472660eff271c72a3fcc5d3f578Christian König
22119b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic struct pipe_stream_output_target *
22129b213c871a080472660eff271c72a3fcc5d3f578Christian Königsi_create_so_target(struct pipe_context *ctx,
22139b213c871a080472660eff271c72a3fcc5d3f578Christian König		    struct pipe_resource *buffer,
22149b213c871a080472660eff271c72a3fcc5d3f578Christian König		    unsigned buffer_offset,
22159b213c871a080472660eff271c72a3fcc5d3f578Christian König		    unsigned buffer_size)
22169b213c871a080472660eff271c72a3fcc5d3f578Christian König{
22179b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
22189b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_so_target *t;
22199b213c871a080472660eff271c72a3fcc5d3f578Christian König	void *ptr;
22209b213c871a080472660eff271c72a3fcc5d3f578Christian König
22219b213c871a080472660eff271c72a3fcc5d3f578Christian König	t = CALLOC_STRUCT(r600_so_target);
22229b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (!t) {
22239b213c871a080472660eff271c72a3fcc5d3f578Christian König		return NULL;
22249b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
22259b213c871a080472660eff271c72a3fcc5d3f578Christian König
22269b213c871a080472660eff271c72a3fcc5d3f578Christian König	t->b.reference.count = 1;
22279b213c871a080472660eff271c72a3fcc5d3f578Christian König	t->b.context = ctx;
22289b213c871a080472660eff271c72a3fcc5d3f578Christian König	pipe_resource_reference(&t->b.buffer, buffer);
22299b213c871a080472660eff271c72a3fcc5d3f578Christian König	t->b.buffer_offset = buffer_offset;
22309b213c871a080472660eff271c72a3fcc5d3f578Christian König	t->b.buffer_size = buffer_size;
22319b213c871a080472660eff271c72a3fcc5d3f578Christian König
2232fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	t->filled_size = si_resource_create_custom(ctx->screen, PIPE_USAGE_STATIC, 4);
22339b213c871a080472660eff271c72a3fcc5d3f578Christian König	ptr = rctx->ws->buffer_map(t->filled_size->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
22349b213c871a080472660eff271c72a3fcc5d3f578Christian König	memset(ptr, 0, t->filled_size->buf->size);
22359b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->ws->buffer_unmap(t->filled_size->cs_buf);
22369b213c871a080472660eff271c72a3fcc5d3f578Christian König
22379b213c871a080472660eff271c72a3fcc5d3f578Christian König	return &t->b;
22389b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22399b213c871a080472660eff271c72a3fcc5d3f578Christian König
22409b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_so_target_destroy(struct pipe_context *ctx,
22419b213c871a080472660eff271c72a3fcc5d3f578Christian König				 struct pipe_stream_output_target *target)
22429b213c871a080472660eff271c72a3fcc5d3f578Christian König{
22439b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_so_target *t = (struct r600_so_target*)target;
22449b213c871a080472660eff271c72a3fcc5d3f578Christian König	pipe_resource_reference(&t->b.buffer, NULL);
2245fe41287ffa8cb35421cadfb16d4cc27c5fcb8b76Christian König	si_resource_reference(&t->filled_size, NULL);
22469b213c871a080472660eff271c72a3fcc5d3f578Christian König	FREE(t);
22479b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22489b213c871a080472660eff271c72a3fcc5d3f578Christian König
22499b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_so_targets(struct pipe_context *ctx,
22509b213c871a080472660eff271c72a3fcc5d3f578Christian König			      unsigned num_targets,
22519b213c871a080472660eff271c72a3fcc5d3f578Christian König			      struct pipe_stream_output_target **targets,
22529b213c871a080472660eff271c72a3fcc5d3f578Christian König			      unsigned append_bitmask)
22539b213c871a080472660eff271c72a3fcc5d3f578Christian König{
22549b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
22559b213c871a080472660eff271c72a3fcc5d3f578Christian König	unsigned i;
22569b213c871a080472660eff271c72a3fcc5d3f578Christian König
22579b213c871a080472660eff271c72a3fcc5d3f578Christian König	/* Stop streamout. */
22589b213c871a080472660eff271c72a3fcc5d3f578Christian König	if (rctx->num_so_targets) {
22599b213c871a080472660eff271c72a3fcc5d3f578Christian König		r600_context_streamout_end(rctx);
22609b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
22619b213c871a080472660eff271c72a3fcc5d3f578Christian König
22629b213c871a080472660eff271c72a3fcc5d3f578Christian König	/* Set the new targets. */
22639b213c871a080472660eff271c72a3fcc5d3f578Christian König	for (i = 0; i < num_targets; i++) {
22649b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], targets[i]);
22659b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
22669b213c871a080472660eff271c72a3fcc5d3f578Christian König	for (; i < rctx->num_so_targets; i++) {
22679b213c871a080472660eff271c72a3fcc5d3f578Christian König		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], NULL);
22689b213c871a080472660eff271c72a3fcc5d3f578Christian König	}
22699b213c871a080472660eff271c72a3fcc5d3f578Christian König
22709b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->num_so_targets = num_targets;
22719b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->streamout_start = num_targets != 0;
22729b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->streamout_append_bitmask = append_bitmask;
22739b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22749b213c871a080472660eff271c72a3fcc5d3f578Christian König
22759b213c871a080472660eff271c72a3fcc5d3f578Christian König/*
22769b213c871a080472660eff271c72a3fcc5d3f578Christian König * Misc
22779b213c871a080472660eff271c72a3fcc5d3f578Christian König */
22789b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_set_polygon_stipple(struct pipe_context *ctx,
22799b213c871a080472660eff271c72a3fcc5d3f578Christian König				   const struct pipe_poly_stipple *state)
22809b213c871a080472660eff271c72a3fcc5d3f578Christian König{
22819b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22829b213c871a080472660eff271c72a3fcc5d3f578Christian König
22839b213c871a080472660eff271c72a3fcc5d3f578Christian Königstatic void si_texture_barrier(struct pipe_context *ctx)
22849b213c871a080472660eff271c72a3fcc5d3f578Christian König{
22859b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
22869b213c871a080472660eff271c72a3fcc5d3f578Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
22879b213c871a080472660eff271c72a3fcc5d3f578Christian König
22889b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_inval_texture_cache(pm4);
22899b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_inval_fb_cache(pm4, rctx->framebuffer.nr_cbufs);
22909b213c871a080472660eff271c72a3fcc5d3f578Christian König	si_pm4_set_state(rctx, texture_barrier, pm4);
22919b213c871a080472660eff271c72a3fcc5d3f578Christian König}
22929b213c871a080472660eff271c72a3fcc5d3f578Christian König
229363636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx)
229463636ae52aefc275115d1f3daac4e75285583485Christian König{
229563636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.create_blend_state = si_create_blend_state;
229663636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.bind_blend_state = si_bind_blend_state;
229763636ae52aefc275115d1f3daac4e75285583485Christian König	rctx->context.delete_blend_state = si_delete_blend_state;
22980a091a48242513e53a99976239405e8cb72d96beChristian König	rctx->context.set_blend_color = si_set_blend_color;
22999cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König
2300f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.create_rasterizer_state = si_create_rs_state;
2301f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.bind_rasterizer_state = si_bind_rs_state;
2302f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König	rctx->context.delete_rasterizer_state = si_delete_rs_state;
2303f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König
2304b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.create_depth_stencil_alpha_state = si_create_dsa_state;
2305b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.bind_depth_stencil_alpha_state = si_bind_dsa_state;
2306b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->context.delete_depth_stencil_alpha_state = si_delete_dsa_state;
2307b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König	rctx->custom_dsa_flush = si_create_db_flush_dsa(rctx);
2308b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König
23099cbbe0d4e6a7deb01ff580eb3c49763f9f1d94d9Christian König	rctx->context.set_clip_state = si_set_clip_state;
231043f414f7b76902a728d26231d4cc047b794df10bChristian König	rctx->context.set_scissor_state = si_set_scissor_state;
23117e011d92c9746ba4050890442db6e504fa42c4adChristian König	rctx->context.set_viewport_state = si_set_viewport_state;
2312e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König	rctx->context.set_stencil_ref = si_set_pipe_stencil_ref;
2313835098a5290e59bb7b468eb987db67b0e1913c67Christian König
2314835098a5290e59bb7b468eb987db67b0e1913c67Christian König	rctx->context.set_framebuffer_state = si_set_framebuffer_state;
23153c09f11e5cefd437bb8185539430786dc245c96fChristian König
23163c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.create_vs_state = si_create_shader_state;
23173c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.create_fs_state = si_create_shader_state;
23183c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.bind_vs_state = si_bind_vs_shader;
23193c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.bind_fs_state = si_bind_ps_shader;
23203c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.delete_vs_state = si_delete_vs_shader;
23213c09f11e5cefd437bb8185539430786dc245c96fChristian König	rctx->context.delete_fs_state = si_delete_ps_shader;
2322baf20397569fb499f736e5ad2350b008b8207fadChristian König
232373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.create_sampler_state = si_create_sampler_state;
2324baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.bind_vertex_sampler_states = si_bind_vs_sampler;
2325baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.bind_fragment_sampler_states = si_bind_ps_sampler;
232673dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.delete_sampler_state = si_delete_sampler_state;
2327baf20397569fb499f736e5ad2350b008b8207fadChristian König
232873dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.create_sampler_view = si_create_sampler_view;
2329baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.set_vertex_sampler_views = si_set_vs_sampler_view;
2330baf20397569fb499f736e5ad2350b008b8207fadChristian König	rctx->context.set_fragment_sampler_views = si_set_ps_sampler_view;
23319b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.sampler_view_destroy = si_sampler_view_destroy;
23320d6b0b512acadbc5d64039063b5649fc401b3367Christian König
233373dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König	rctx->context.set_sample_mask = si_set_sample_mask;
233473dd906ba0ef06ba03f1a05b08dbca3122016bacChristian König
23350d6b0b512acadbc5d64039063b5649fc401b3367Christian König	rctx->context.set_constant_buffer = si_set_constant_buffer;
2336ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
23379b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.create_vertex_elements_state = si_create_vertex_elements;
23389b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.bind_vertex_elements_state = si_bind_vertex_elements;
23399b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.delete_vertex_elements_state = si_delete_vertex_element;
23409b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_vertex_buffers = si_set_vertex_buffers;
23419b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_index_buffer = si_set_index_buffer;
23429b213c871a080472660eff271c72a3fcc5d3f578Christian König
23439b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.create_stream_output_target = si_create_so_target;
23449b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.stream_output_target_destroy = si_so_target_destroy;
23459b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_stream_output_targets = si_set_so_targets;
23469b213c871a080472660eff271c72a3fcc5d3f578Christian König
23479b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.texture_barrier = si_texture_barrier;
23489b213c871a080472660eff271c72a3fcc5d3f578Christian König	rctx->context.set_polygon_stipple = si_set_polygon_stipple;
23499b213c871a080472660eff271c72a3fcc5d3f578Christian König
2350ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	rctx->context.draw_vbo = si_draw_vbo;
235163636ae52aefc275115d1f3daac4e75285583485Christian König}
2352e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König
2353840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx)
2354840f05da6b92ba5266385836533842b9a9fc5da9Christian König{
2355840f05da6b92ba5266385836533842b9a9fc5da9Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
2356840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2357840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A4C_PA_SC_MODE_CNTL_1, 0x0);
2358840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2359840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A10_VGT_OUTPUT_PATH_CNTL, 0x0);
2360840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A14_VGT_HOS_CNTL, 0x0);
2361840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A18_VGT_HOS_MAX_TESS_LEVEL, 0x0);
2362840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A1C_VGT_HOS_MIN_TESS_LEVEL, 0x0);
2363840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A20_VGT_HOS_REUSE_DEPTH, 0x0);
2364840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A24_VGT_GROUP_PRIM_TYPE, 0x0);
2365840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A28_VGT_GROUP_FIRST_DECR, 0x0);
2366840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A2C_VGT_GROUP_DECR, 0x0);
2367840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A30_VGT_GROUP_VECT_0_CNTL, 0x0);
2368840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A34_VGT_GROUP_VECT_1_CNTL, 0x0);
2369840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A38_VGT_GROUP_VECT_0_FMT_CNTL, 0x0);
2370840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A3C_VGT_GROUP_VECT_1_FMT_CNTL, 0x0);
2371840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A40_VGT_GS_MODE, 0x0);
2372840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A84_VGT_PRIMITIVEID_EN, 0x0);
2373840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028A8C_VGT_PRIMITIVEID_RESET, 0x0);
2374840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0);
2375840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0);
2376840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM,
2377840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_SWITCH_ON_EOP(1) |
2378840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_PARTIAL_VS_WAVE_ON(1) |
2379840f05da6b92ba5266385836533842b9a9fc5da9Christian König		       S_028AA8_PRIMGROUP_SIZE(63));
2380840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AB4_VGT_REUSE_OFF, 0x00000000);
2381840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028AB8_VGT_VTX_CNT_EN, 0x0);
2382840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_008A14_PA_CL_ENHANCE, (3 << 1) | 1);
2383840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2384840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028B54_VGT_SHADER_STAGES_EN, 0);
2385840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028BD4_PA_SC_CENTROID_PRIORITY_0, 0x76543210);
2386840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028BD8_PA_SC_CENTROID_PRIORITY_1, 0xfedcba98);
2387840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2388840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_reg(pm4, R_028804_DB_EQAA, 0x110000);
2389840f05da6b92ba5266385836533842b9a9fc5da9Christian König
2390840f05da6b92ba5266385836533842b9a9fc5da9Christian König	si_pm4_set_state(rctx, init, pm4);
2391840f05da6b92ba5266385836533842b9a9fc5da9Christian König}
2392