1ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/*
2ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Copyright 2012 Advanced Micro Devices, Inc.
3ca9cf611b63e5576b596c21b73b1b639d250d649Christian König *
4ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Permission is hereby granted, free of charge, to any person obtaining a
5ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * copy of this software and associated documentation files (the "Software"),
6ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * to deal in the Software without restriction, including without limitation
7ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub
8ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * license, and/or sell copies of the Software, and to permit persons to whom
9ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * the Software is furnished to do so, subject to the following conditions:
10ca9cf611b63e5576b596c21b73b1b639d250d649Christian König *
11ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * The above copyright notice and this permission notice (including the next
12ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * paragraph) shall be included in all copies or substantial portions of the
13ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Software.
14ca9cf611b63e5576b596c21b73b1b639d250d649Christian König *
15ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE.
22ca9cf611b63e5576b596c21b73b1b639d250d649Christian König *
23ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Authors:
24ca9cf611b63e5576b596c21b73b1b639d250d649Christian König *      Christian König <christian.koenig@amd.com>
25ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */
26ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
27ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_memory.h"
28ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_framebuffer.h"
29ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "util/u_blitter.h"
30ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "tgsi/tgsi_parse.h"
31ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "radeonsi_pipe.h"
32ce40e4726cf30196b87df387255c64ddc2a97638Christian König#include "radeonsi_shader.h"
33ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "si_state.h"
34ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#include "sid.h"
35ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
36ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/*
37ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Shaders
38ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */
39ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
40ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_pipe_shader_vs(struct pipe_context *ctx, struct si_pipe_shader *shader)
41ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
42ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
43ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct si_pm4_state *pm4;
44ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned num_sgprs, num_user_sgprs;
45ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned nparams, i;
46ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	uint64_t va;
47ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
48ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (si_pipe_shader_create(ctx, shader))
49ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return;
50ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
51ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_delete_state(rctx, vs, shader->pm4);
52ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	pm4 = shader->pm4 = CALLOC_STRUCT(si_pm4_state);
53ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
54ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_inval_shader_cache(pm4);
55ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
56ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* Certain attributes (position, psize, etc.) don't count as params.
57ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	 * VS is required to export at least one param and r600_shader_from_tgsi()
58ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	 * takes care of adding a dummy export.
59ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	 */
60ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	for (nparams = 0, i = 0 ; i < shader->shader.noutput; i++) {
61ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.output[i].name != TGSI_SEMANTIC_POSITION)
62ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			nparams++;
63ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
64ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (nparams < 1)
65ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		nparams = 1;
66ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
67ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_0286C4_SPI_VS_OUT_CONFIG,
68ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_0286C4_VS_EXPORT_COUNT(nparams - 1));
69ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
70ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_02870C_SPI_SHADER_POS_FORMAT,
71ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_02870C_POS0_EXPORT_FORMAT(V_02870C_SPI_SHADER_4COMP) |
72ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_02870C_POS1_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE) |
73ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_02870C_POS2_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE) |
74ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_02870C_POS3_EXPORT_FORMAT(V_02870C_SPI_SHADER_NONE));
75ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
76ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	va = r600_resource_va(ctx->screen, (void *)shader->bo);
77ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ);
78ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B120_SPI_SHADER_PGM_LO_VS, va >> 8);
79ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B124_SPI_SHADER_PGM_HI_VS, va >> 40);
80ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
81ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_user_sgprs = 8;
82ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_sgprs = shader->num_sgprs;
83ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (num_user_sgprs > num_sgprs)
84ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		num_sgprs = num_user_sgprs;
85ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* Last 2 reserved SGPRs are used for VCC */
86ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_sgprs += 2;
87ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	assert(num_sgprs <= 104);
88ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
89ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B128_SPI_SHADER_PGM_RSRC1_VS,
90ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B128_VGPRS((shader->num_vgprs - 1) / 4) |
91ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B128_SGPRS((num_sgprs - 1) / 8));
92ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B12C_SPI_SHADER_PGM_RSRC2_VS,
93ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B12C_USER_SGPR(num_user_sgprs));
94ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
95ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_bind_state(rctx, vs, shader->pm4);
96ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
97ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
98ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *shader)
99ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
100ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
101ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct si_pm4_state *pm4;
102ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned i, exports_ps, num_cout, spi_ps_in_control, db_shader_control;
103ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned num_sgprs, num_user_sgprs;
104ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	int ninterp = 0;
105ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	boolean have_linear = FALSE, have_centroid = FALSE, have_perspective = FALSE;
10607838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	unsigned spi_baryc_cntl, spi_ps_input_ena;
107ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	uint64_t va;
108ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
109ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (si_pipe_shader_create(ctx, shader))
110ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return;
111ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
112ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_delete_state(rctx, ps, shader->pm4);
113ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	pm4 = shader->pm4 = CALLOC_STRUCT(si_pm4_state);
114ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
115ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_inval_shader_cache(pm4);
116ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
117ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
118ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	for (i = 0; i < shader->shader.ninput; i++) {
119ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		ninterp++;
120ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* XXX: Flat shading hangs the GPU */
121ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
122ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		    (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
123ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		     rctx->queued.named.rasterizer->flatshade))
124ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			have_linear = TRUE;
125ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
126ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			have_linear = TRUE;
127ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
128ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			have_perspective = TRUE;
129ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.input[i].centroid)
130ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			have_centroid = TRUE;
131ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
132ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
133ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	for (i = 0; i < shader->shader.noutput; i++) {
134ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.output[i].name == TGSI_SEMANTIC_POSITION)
135ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			db_shader_control |= S_02880C_Z_EXPORT_ENABLE(1);
136ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.output[i].name == TGSI_SEMANTIC_STENCIL)
137ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			db_shader_control |= 0; // XXX OP_VAL or TEST_VAL?
138ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
139ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (shader->shader.uses_kill)
140ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		db_shader_control |= S_02880C_KILL_ENABLE(1);
141ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
142ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	exports_ps = 0;
143ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_cout = 0;
144ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	for (i = 0; i < shader->shader.noutput; i++) {
145ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (shader->shader.output[i].name == TGSI_SEMANTIC_POSITION ||
146ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		    shader->shader.output[i].name == TGSI_SEMANTIC_STENCIL)
147ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			exports_ps |= 1;
148ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		else if (shader->shader.output[i].name == TGSI_SEMANTIC_COLOR) {
149ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			if (shader->shader.fs_write_all)
150ca9cf611b63e5576b596c21b73b1b639d250d649Christian König				num_cout = shader->shader.nr_cbufs;
151ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			else
152ca9cf611b63e5576b596c21b73b1b639d250d649Christian König				num_cout++;
153ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
154ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
155ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (!exports_ps) {
156ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* always at least export 1 component per pixel */
157ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		exports_ps = 2;
158ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
159ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
160ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	spi_ps_in_control = S_0286D8_NUM_INTERP(ninterp);
161ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
162ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	spi_baryc_cntl = 0;
163ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (have_perspective)
164ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		spi_baryc_cntl |= have_centroid ?
165ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			S_0286E0_PERSP_CENTROID_CNTL(1) : S_0286E0_PERSP_CENTER_CNTL(1);
166ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (have_linear)
167ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		spi_baryc_cntl |= have_centroid ?
168ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			S_0286E0_LINEAR_CENTROID_CNTL(1) : S_0286E0_LINEAR_CENTER_CNTL(1);
169ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
170ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_0286E0_SPI_BARYC_CNTL, spi_baryc_cntl);
17107838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	spi_ps_input_ena = shader->spi_ps_input_ena;
17207838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	/* we need to enable at least one of them, otherwise we hang the GPU */
173f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	if (!G_0286CC_PERSP_SAMPLE_ENA(spi_ps_input_ena) &&
174f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena) &&
175f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_PERSP_PULL_MODEL_ENA(spi_ps_input_ena) &&
176f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_LINEAR_SAMPLE_ENA(spi_ps_input_ena) &&
177f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena) &&
178f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena) &&
179f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König	    !G_0286CC_LINE_STIPPLE_TEX_ENA(spi_ps_input_ena)) {
180f1fd94f3550372a91e79c4ff6c0b09821dfb0192Christian König
18107838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König		spi_ps_input_ena |= S_0286CC_PERSP_SAMPLE_ENA(1);
18207838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	}
18307838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	si_pm4_set_reg(pm4, R_0286CC_SPI_PS_INPUT_ENA, spi_ps_input_ena);
18407838603b9a69c05911edbcd351bfce5ad9b5a2cChristian König	si_pm4_set_reg(pm4, R_0286D0_SPI_PS_INPUT_ADDR, spi_ps_input_ena);
185ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_0286D8_SPI_PS_IN_CONTROL, spi_ps_in_control);
186ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
187ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* XXX: Depends on Z buffer format? */
188ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028710_SPI_SHADER_Z_FORMAT, 0);
189ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
190ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	va = r600_resource_va(ctx->screen, (void *)shader->bo);
191ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_add_bo(pm4, shader->bo, RADEON_USAGE_READ);
192ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B020_SPI_SHADER_PGM_LO_PS, va >> 8);
193ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B024_SPI_SHADER_PGM_HI_PS, va >> 40);
194ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
195ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_user_sgprs = 6;
196ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_sgprs = shader->num_sgprs;
197ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (num_user_sgprs > num_sgprs)
198ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		num_sgprs = num_user_sgprs;
199ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* Last 2 reserved SGPRs are used for VCC */
200ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	num_sgprs += 2;
201ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	assert(num_sgprs <= 104);
202ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
203ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B028_SPI_SHADER_PGM_RSRC1_PS,
204ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B028_VGPRS((shader->num_vgprs - 1) / 4) |
205ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B028_SGPRS((num_sgprs - 1) / 8));
206ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_00B02C_SPI_SHADER_PGM_RSRC2_PS,
207ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_00B02C_USER_SGPR(num_user_sgprs));
208ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
209ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_02880C_DB_SHADER_CONTROL, db_shader_control);
210ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
211ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	shader->sprite_coord_enable = rctx->sprite_coord_enable;
212ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_bind_state(rctx, ps, shader->pm4);
213ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
214ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
215ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/*
216ca9cf611b63e5576b596c21b73b1b639d250d649Christian König * Drawing
217ca9cf611b63e5576b596c21b73b1b639d250d649Christian König */
218ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
219ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic unsigned si_conv_pipe_prim(unsigned pprim)
220ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
221ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        static const unsigned prim_conv[] = {
222ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_POINTS]			= V_008958_DI_PT_POINTLIST,
223ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_LINES]			= V_008958_DI_PT_LINELIST,
224ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_LINE_LOOP]			= V_008958_DI_PT_LINELOOP,
225ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_LINE_STRIP]			= V_008958_DI_PT_LINESTRIP,
226ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_TRIANGLES]			= V_008958_DI_PT_TRILIST,
227ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_TRIANGLE_STRIP]		= V_008958_DI_PT_TRISTRIP,
228ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_TRIANGLE_FAN]		= V_008958_DI_PT_TRIFAN,
229ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_QUADS]			= V_008958_DI_PT_QUADLIST,
230ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_QUAD_STRIP]			= V_008958_DI_PT_QUADSTRIP,
231ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_POLYGON]			= V_008958_DI_PT_POLYGON,
232ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_LINES_ADJACENCY]		= ~0,
233ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_LINE_STRIP_ADJACENCY]	= ~0,
234ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_TRIANGLES_ADJACENCY]		= ~0,
235ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		[PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY]	= ~0
236ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        };
237ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned result = prim_conv[pprim];
238ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        if (result == ~0) {
239ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		R600_ERR("unsupported primitive type %d\n", pprim);
240ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        }
241ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	return result;
242ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
243ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
244ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic bool si_update_draw_info_state(struct r600_context *rctx,
245ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			       const struct pipe_draw_info *info)
246ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
247ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
248ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned prim = si_conv_pipe_prim(info->mode);
249ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned ls_mask = 0;
250ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
251ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (pm4 == NULL)
252ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return false;
253ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
254ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (prim == ~0) {
255ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		FREE(pm4);
256ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return false;
257ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
258ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
259ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_008958_VGT_PRIMITIVE_TYPE, prim);
260ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028400_VGT_MAX_VTX_INDX, ~0);
261ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028404_VGT_MIN_VTX_INDX, 0);
2629f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_set_reg(pm4, R_028408_VGT_INDX_OFFSET,
2639f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		       info->indexed ? info->index_bias : info->start);
264ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, info->restart_index);
265ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, info->primitive_restart);
266ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0
267ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0);
268ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_03CFF4_SQ_VTX_START_INST_LOC, info->start_instance);
269ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif
270ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
271ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        if (prim == V_008958_DI_PT_LINELIST)
272ca9cf611b63e5576b596c21b73b1b639d250d649Christian König                ls_mask = 1;
273ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        else if (prim == V_008958_DI_PT_LINESTRIP)
274ca9cf611b63e5576b596c21b73b1b639d250d649Christian König                ls_mask = 2;
275ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028A0C_PA_SC_LINE_STIPPLE,
276ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       S_028A0C_AUTO_RESET_CNTL(ls_mask) |
277ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       rctx->pa_sc_line_stipple);
278ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
279ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        if (info->mode == PIPE_PRIM_QUADS || info->mode == PIPE_PRIM_QUAD_STRIP || info->mode == PIPE_PRIM_POLYGON) {
280ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_pm4_set_reg(pm4, R_028814_PA_SU_SC_MODE_CNTL,
281ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			       S_028814_PROVOKING_VTX_LAST(1) | rctx->pa_su_sc_mode_cntl);
282ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        } else {
283ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_pm4_set_reg(pm4, R_028814_PA_SU_SC_MODE_CNTL, rctx->pa_su_sc_mode_cntl);
284ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        }
285ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_02881C_PA_CL_VS_OUT_CNTL,
286ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       prim == PIPE_PRIM_POINTS ? rctx->pa_cl_vs_out_cntl : 0
287ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       /*| (rctx->rasterizer->clip_plane_enable &
288ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		       rctx->vs_shader->shader.clip_dist_write)*/);
289ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_reg(pm4, R_028810_PA_CL_CLIP_CNTL, rctx->pa_cl_clip_cntl
290ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			/*| (rctx->vs_shader->shader.clip_dist_write ||
291ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			rctx->vs_shader->shader.vs_prohibit_ucps ?
292ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			0 : rctx->rasterizer->clip_plane_enable & 0x3F)*/);
293ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
294ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_state(rctx, draw_info, pm4);
295ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	return true;
296ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
297ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
298ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_alpha_ref(struct r600_context *rctx)
299ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
300ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0
301ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        unsigned alpha_ref;
302ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        struct r600_pipe_state rstate;
303ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
304ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        alpha_ref = rctx->alpha_ref;
305ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        rstate.nregs = 0;
306ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        if (rctx->export_16bpc)
307ca9cf611b63e5576b596c21b73b1b639d250d649Christian König                alpha_ref &= ~0x1FFF;
308ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        si_pm4_set_reg(&rstate, R_028438_SX_ALPHA_REF, alpha_ref);
309ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
310ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_state(rctx, TODO, pm4);
311ca9cf611b63e5576b596c21b73b1b639d250d649Christian König        rctx->alpha_ref_dirty = false;
312ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif
313ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
314ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
315ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_spi_map(struct r600_context *rctx)
316ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
317d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_shader *ps = &rctx->ps_shader->current->shader;
318d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	struct si_shader *vs = &rctx->vs_shader->current->shader;
319ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
320ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	unsigned i, j, tmp;
321ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
322ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	for (i = 0; i < ps->ninput; i++) {
323ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		tmp = 0;
324ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
325ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#if 0
326ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* XXX: Flat shading hangs the GPU */
327ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (ps->input[i].name == TGSI_SEMANTIC_POSITION ||
328ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		    ps->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
329ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		    (ps->input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
330ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		     rctx->rasterizer && rctx->rasterizer->flatshade)) {
331ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			tmp |= S_028644_FLAT_SHADE(1);
332ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
333ca9cf611b63e5576b596c21b73b1b639d250d649Christian König#endif
334ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
335ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (ps->input[i].name == TGSI_SEMANTIC_GENERIC &&
336ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		    rctx->sprite_coord_enable & (1 << ps->input[i].sid)) {
337ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			tmp |= S_028644_PT_SPRITE_TEX(1);
338ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
339ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
340ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		for (j = 0; j < vs->noutput; j++) {
341ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			if (ps->input[i].name == vs->output[j].name &&
342ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			    ps->input[i].sid == vs->output[j].sid) {
343ca9cf611b63e5576b596c21b73b1b639d250d649Christian König				tmp |= S_028644_OFFSET(vs->output[j].param_offset);
344ca9cf611b63e5576b596c21b73b1b639d250d649Christian König				break;
345ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			}
346ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
347ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
348ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (j == vs->noutput) {
349ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			/* No corresponding output found, load defaults into input */
350ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			tmp |= S_028644_OFFSET(0x20);
351ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
352ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
353ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_pm4_set_reg(pm4, R_028644_SPI_PS_INPUT_CNTL_0 + i * 4, tmp);
354ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
355ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
356ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_state(rctx, spi, pm4);
357ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
358ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
359ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_update_derived_state(struct r600_context *rctx)
360ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
361ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct pipe_context * ctx = (struct pipe_context*)rctx;
362d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	unsigned ps_dirty = 0;
363ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
364ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (!rctx->blitter->running) {
365ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (rctx->have_depth_fb || rctx->have_depth_texture)
3661b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer			si_flush_depth_textures(rctx);
367ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
368ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
369d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	si_shader_select(ctx, rctx->ps_shader, &ps_dirty);
370ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
371ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (rctx->alpha_ref_dirty) {
372ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_update_alpha_ref(rctx);
373ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
374ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
375d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (!rctx->vs_shader->current->pm4) {
376d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pipe_shader_vs(ctx, rctx->vs_shader->current);
377ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
378ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
379d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (!rctx->ps_shader->current->pm4) {
380d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pipe_shader_ps(ctx, rctx->ps_shader->current);
381d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		ps_dirty = 0;
382ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
383d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (!rctx->ps_shader->current->bo) {
384d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		if (!rctx->dummy_pixel_shader->pm4)
38582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer			si_pipe_shader_ps(ctx, rctx->dummy_pixel_shader);
386d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		else
38782cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer			si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4);
388d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
389d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		ps_dirty = 0;
390d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	}
391d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer
392d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	if (ps_dirty) {
393d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		si_pm4_bind_state(rctx, ps, rctx->ps_shader->current->pm4);
394d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer		rctx->shader_dirty = true;
39582cd9c0fc2838a153006a646b0d356ed54b8680eMichel Dänzer	}
396ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
397ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (rctx->shader_dirty) {
398ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		si_update_spi_map(rctx);
399ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		rctx->shader_dirty = false;
400ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
401ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
402ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
403ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königstatic void si_vertex_buffer_update(struct r600_context *rctx)
404ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
405ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct pipe_context *ctx = &rctx->context;
406ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
407b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	bool bound[PIPE_MAX_ATTRIBS] = {};
408b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	unsigned i, count;
409ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	uint64_t va;
410ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
411ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_inval_vertex_cache(pm4);
412ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
413ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* bind vertex buffer once */
414b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König	count = rctx->vertex_elements->count;
415ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	assert(count <= 256 / 4);
416ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
41754de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König	si_pm4_sh_data_begin(pm4);
41854de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König	for (i = 0 ; i < count; i++) {
419b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		struct pipe_vertex_element *ve = &rctx->vertex_elements->elements[i];
420b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		struct pipe_vertex_buffer *vb;
421b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		struct si_resource *rbuffer;
422b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		unsigned offset;
423b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
424b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		if (ve->vertex_buffer_index >= rctx->nr_vertex_buffers)
425ca9cf611b63e5576b596c21b73b1b639d250d649Christian König			continue;
426b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
427b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		vb = &rctx->vertex_buffer[ve->vertex_buffer_index];
428b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		rbuffer = (struct si_resource*)vb->buffer;
429b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		if (rbuffer == NULL)
430b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			continue;
431b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
432b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		offset = 0;
433b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		offset += vb->buffer_offset;
434b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		offset += ve->src_offset;
435ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
436ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		va = r600_resource_va(ctx->screen, (void*)rbuffer);
437ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		va += offset;
438ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
439ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* Fill in T# buffer resource description */
44054de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König		si_pm4_sh_data_add(pm4, va & 0xFFFFFFFF);
44154de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König		si_pm4_sh_data_add(pm4, (S_008F04_BASE_ADDRESS_HI(va >> 32) |
44254de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König					 S_008F04_STRIDE(vb->stride)));
44354de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König		si_pm4_sh_data_add(pm4, (vb->buffer->width0 - offset) /
44454de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König					 MAX2(vb->stride, 1));
44554de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König		si_pm4_sh_data_add(pm4, rctx->vertex_elements->rsrc_word3[i]);
446b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König
447b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		if (!bound[ve->vertex_buffer_index]) {
448b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			si_pm4_add_bo(pm4, rbuffer, RADEON_USAGE_READ);
449b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König			bound[ve->vertex_buffer_index] = true;
450b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König		}
451ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
45254de6f452c3132a331f22c50cadff9b3ad99c6c2Christian König	si_pm4_sh_data_end(pm4, R_00B148_SPI_SHADER_USER_DATA_VS_6);
453ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_set_state(rctx, vertex_buffers, pm4);
454ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
455ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
4569f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian Königstatic void si_state_draw(struct r600_context *rctx,
4579f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			  const struct pipe_draw_info *info,
4589f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			  const struct pipe_index_buffer *ib)
4599f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König{
4609f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
4619f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4629f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	/* queries need some special values
4639f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	 * (this is non-zero if any query is active) */
4649f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if (rctx->num_cs_dw_queries_suspend) {
4659f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		struct si_state_dsa *dsa = rctx->queued.named.dsa;
4669f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4679f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_set_reg(pm4, R_028004_DB_COUNT_CONTROL,
4689f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			       S_028004_PERFECT_ZPASS_COUNTS(1));
4699f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_set_reg(pm4, R_02800C_DB_RENDER_OVERRIDE,
4709f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			       dsa->db_render_override |
4719f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			       S_02800C_NOOP_CULL_DISABLE(1));
4729f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	}
4739f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4749f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	/* draw packet */
4759f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_cmd_begin(pm4, PKT3_INDEX_TYPE);
4769f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if (ib->index_size == 4) {
4779f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, V_028A7C_VGT_INDEX_32 | (R600_BIG_ENDIAN ?
4789f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König				V_028A7C_VGT_DMA_SWAP_32_BIT : 0));
4799f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	} else {
4809f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, V_028A7C_VGT_INDEX_16 | (R600_BIG_ENDIAN ?
4819f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König				V_028A7C_VGT_DMA_SWAP_16_BIT : 0));
4829f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	}
4839f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_cmd_end(pm4, rctx->predicate_drawing);
4849f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4859f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_cmd_begin(pm4, PKT3_NUM_INSTANCES);
4869f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_cmd_add(pm4, info->instance_count);
4879f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_cmd_end(pm4, rctx->predicate_drawing);
4889f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4899f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if (info->indexed) {
4909f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		uint64_t va;
4919f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		va = r600_resource_va(&rctx->screen->screen, ib->buffer);
4929f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		va += ib->offset;
4939f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
4949f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_add_bo(pm4, (struct si_resource *)ib->buffer, RADEON_USAGE_READ);
4959f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_2);
4969f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, (ib->buffer->width0 - ib->offset) /
4979f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König					rctx->index_buffer.index_size);
4989f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, va);
4999f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, (va >> 32UL) & 0xFF);
5009f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, info->count);
5019f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_DMA);
5029f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_end(pm4, rctx->predicate_drawing);
5039f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	} else {
5049f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_begin(pm4, PKT3_DRAW_INDEX_AUTO);
5059f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, info->count);
5069f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_add(pm4, V_0287F0_DI_SRC_SEL_AUTO_INDEX |
5079f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			       (info->count_from_stream_output ?
5089f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König				S_0287F0_USE_OPAQUE(1) : 0));
5099f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		si_pm4_cmd_end(pm4, rctx->predicate_drawing);
5109f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	}
5119f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_pm4_set_state(rctx, draw, pm4);
5129f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König}
5139f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König
5149f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian Königvoid si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
515ca9cf611b63e5576b596c21b73b1b639d250d649Christian König{
516ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct r600_context *rctx = (struct r600_context *)ctx;
517ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	struct pipe_index_buffer ib = {};
518583c212115795bef65da92761180ce830fafc927Christian König	uint32_t cp_coher_cntl;
519ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5209f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if ((!info->count && (info->indexed || !info->count_from_stream_output)) ||
5219f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	    (info->indexed && !rctx->index_buffer.buffer)) {
522ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return;
523ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
524ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
525ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (!rctx->ps_shader || !rctx->vs_shader)
526ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return;
527ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
528ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_update_derived_state(rctx);
529ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_vertex_buffer_update(rctx);
530ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5319f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if (info->indexed) {
532ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* Initialize the index buffer struct. */
533ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer);
534ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		ib.index_size = rctx->index_buffer.index_size;
5359f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		ib.offset = rctx->index_buffer.offset + info->start * ib.index_size;
536ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
537ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		/* Translate or upload, if needed. */
5389f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		r600_translate_index_buffer(rctx, &ib, info->count);
539ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
540ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		if (ib.user_buffer) {
5419f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König			r600_upload_index_buffer(rctx, &ib, info->count);
542ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		}
543ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5449f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	} else if (info->count_from_stream_output) {
5459f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König		r600_context_draw_opaque_count(rctx, (struct r600_so_target*)info->count_from_stream_output);
546ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
547ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
548d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer	rctx->vs_shader_so_strides = rctx->vs_shader->current->so_strides;
549ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5509f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	if (!si_update_draw_info_state(rctx, info))
551ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		return;
552ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5539f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König	si_state_draw(rctx, info, &ib);
554ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
555583c212115795bef65da92761180ce830fafc927Christian König	cp_coher_cntl = si_pm4_sync_flags(rctx);
556583c212115795bef65da92761180ce830fafc927Christian König	if (cp_coher_cntl) {
557583c212115795bef65da92761180ce830fafc927Christian König		struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
558583c212115795bef65da92761180ce830fafc927Christian König		si_cmd_surface_sync(pm4, cp_coher_cntl);
559583c212115795bef65da92761180ce830fafc927Christian König		si_pm4_set_state(rctx, sync, pm4);
560583c212115795bef65da92761180ce830fafc927Christian König	}
561583c212115795bef65da92761180ce830fafc927Christian König
562ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* Emit states. */
563ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	rctx->pm4_dirty_cdwords += si_pm4_dirty_dw(rctx);
564ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
5651b11395a36a44a902cfb3e1783758544662df73fMichel Dänzer	si_need_cs_space(rctx, 0, TRUE);
566ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
567ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	si_pm4_emit_dirty(rctx);
568ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	rctx->pm4_dirty_cdwords = 0;
569ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
570303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#if 0
571ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	/* Enable stream out if needed. */
572ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (rctx->streamout_start) {
573ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		r600_context_streamout_begin(rctx);
574ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		rctx->streamout_start = FALSE;
575ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
576303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König#endif
577ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
578ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
579696b6cf46609281711add5331b9c3e1d0240ecbcChristian König	rctx->flags |= R600_CONTEXT_DST_CACHES_DIRTY;
580ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
581ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	if (rctx->framebuffer.zsbuf)
582ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	{
583ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		struct pipe_resource *tex = rctx->framebuffer.zsbuf->texture;
584ca9cf611b63e5576b596c21b73b1b639d250d649Christian König		((struct r600_resource_texture *)tex)->dirty_db = TRUE;
585ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	}
586ca9cf611b63e5576b596c21b73b1b639d250d649Christian König
587ca9cf611b63e5576b596c21b73b1b639d250d649Christian König	pipe_resource_reference(&ib.buffer, NULL);
588ca9cf611b63e5576b596c21b73b1b639d250d649Christian König}
589