1f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie/*
2f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * Copyright 2010 Red Hat Inc.
3f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *           2010 Jerome Glisse
4f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *
5f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a
6f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * copy of this software and associated documentation files (the "Software"),
7f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * to deal in the Software without restriction, including without limitation
8f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * on the rights to use, copy, modify, merge, publish, distribute, sub
9f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * license, and/or sell copies of the Software, and to permit persons to whom
10f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * the Software is furnished to do so, subject to the following conditions:
11f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *
12f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * The above copyright notice and this permission notice (including the next
13f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * paragraph) shall be included in all copies or substantial portions of the
14f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * Software.
15f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *
16f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE.
23f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *
24f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie * Authors: Dave Airlie <airlied@redhat.com>
25f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie *          Jerome Glisse <jglisse@redhat.com>
26f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie */
27d7577ae3a6d6e174ab36d244f6bd4dedd63c3d1dHenri Verbeet#include "r600_formats.h"
282d7738eb2bee41656953d1173926f546c6711badMarek Olšák#include "r600d.h"
29f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
30187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák#include "util/u_draw_quad.h"
31e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák#include "util/u_upload_mgr.h"
32330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "tgsi/tgsi_parse.h"
33e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák#include <byteswap.h>
34330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák
35187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák#define R600_PRIM_RECTANGLE_LIST PIPE_PRIM_MAX
36187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
37f126253040654d52db134063a69ebaf0c417d410Marek Olšákstatic void r600_emit_command_buffer(struct r600_context *rctx, struct r600_atom *atom)
38f126253040654d52db134063a69ebaf0c417d410Marek Olšák{
39f126253040654d52db134063a69ebaf0c417d410Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
40f126253040654d52db134063a69ebaf0c417d410Marek Olšák	struct r600_command_buffer *cb = (struct r600_command_buffer*)atom;
41f126253040654d52db134063a69ebaf0c417d410Marek Olšák
42f126253040654d52db134063a69ebaf0c417d410Marek Olšák	assert(cs->cdw + cb->atom.num_dw <= RADEON_MAX_CMDBUF_DWORDS);
43f126253040654d52db134063a69ebaf0c417d410Marek Olšák	memcpy(cs->buf + cs->cdw, cb->buf, 4 * cb->atom.num_dw);
44f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cs->cdw += cb->atom.num_dw;
45f126253040654d52db134063a69ebaf0c417d410Marek Olšák}
46f126253040654d52db134063a69ebaf0c417d410Marek Olšák
47f126253040654d52db134063a69ebaf0c417d410Marek Olšákvoid r600_init_command_buffer(struct r600_command_buffer *cb, unsigned num_dw, enum r600_atom_flags flags)
48f126253040654d52db134063a69ebaf0c417d410Marek Olšák{
49f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cb->atom.emit = r600_emit_command_buffer;
50f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cb->atom.num_dw = 0;
51f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cb->atom.flags = flags;
52f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cb->buf = CALLOC(1, 4 * num_dw);
53f126253040654d52db134063a69ebaf0c417d410Marek Olšák	cb->max_num_dw = num_dw;
54f126253040654d52db134063a69ebaf0c417d410Marek Olšák}
55f126253040654d52db134063a69ebaf0c417d410Marek Olšák
56f126253040654d52db134063a69ebaf0c417d410Marek Olšákvoid r600_release_command_buffer(struct r600_command_buffer *cb)
57f126253040654d52db134063a69ebaf0c417d410Marek Olšák{
58f126253040654d52db134063a69ebaf0c417d410Marek Olšák	FREE(cb->buf);
59f126253040654d52db134063a69ebaf0c417d410Marek Olšák}
60f126253040654d52db134063a69ebaf0c417d410Marek Olšák
610813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšákstatic void r600_emit_surface_sync(struct r600_context *rctx, struct r600_atom *atom)
620813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
630813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
64e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	struct r600_surface_sync_cmd *a = (struct r600_surface_sync_cmd*)atom;
650813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
660813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = PKT3(PKT3_SURFACE_SYNC, 3, 0);
670813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = a->flush_flags;  /* CP_COHER_CNTL */
680813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = 0xffffffff;      /* CP_COHER_SIZE */
690813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = 0;               /* CP_COHER_BASE */
700813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = 0x0000000A;      /* POLL_INTERVAL */
710813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
720813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	a->flush_flags = 0;
730813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
740813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
750813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšákstatic void r600_emit_r6xx_flush_and_inv(struct r600_context *rctx, struct r600_atom *atom)
760813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
770813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
780813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
790813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0);
800813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
810813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
82e2809849ecac69615ece294a55ee355afaac33d3Marek Olšákvoid r600_init_atom(struct r600_atom *atom,
83e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		    void (*emit)(struct r600_context *ctx, struct r600_atom *state),
84e2809849ecac69615ece294a55ee355afaac33d3Marek Olšák		    unsigned num_dw, enum r600_atom_flags flags)
850813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
860813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	atom->emit = emit;
870813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	atom->num_dw = num_dw;
880813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	atom->flags = flags;
890813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
900813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
91bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšákstatic void r600_emit_alphatest_state(struct r600_context *rctx, struct r600_atom *atom)
92bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák{
93bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
94bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	struct r600_alphatest_state *a = (struct r600_alphatest_state*)atom;
95bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	unsigned alpha_ref = a->sx_alpha_ref;
96bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák
97de4fd087cbccd47e703f750968b79525ddbe4554Marek Olšák	if (rctx->chip_class >= EVERGREEN && a->cb0_export_16bpc) {
98bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák		alpha_ref &= ~0x1FFF;
99bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	}
100bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák
101bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	r600_write_context_reg(cs, R_028410_SX_ALPHA_TEST_CONTROL,
102bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák			       a->sx_alpha_test_control |
103bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák			       S_028410_ALPHA_TEST_BYPASS(a->bypass));
104bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	r600_write_context_reg(cs, R_028438_SX_ALPHA_REF, alpha_ref);
105bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák}
106bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák
1070813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšákvoid r600_init_common_atoms(struct r600_context *rctx)
1080813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
109e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	r600_init_atom(&rctx->surface_sync_cmd.atom,	r600_emit_surface_sync,		5, EMIT_EARLY);
110e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	r600_init_atom(&rctx->r6xx_flush_and_inv_cmd,	r600_emit_r6xx_flush_and_inv,	2, EMIT_EARLY);
11141d14eaf193c6b1eb87fe1998808a887f1c6c698Jerome Glisse	r600_init_atom(&rctx->alphatest_state.atom,	r600_emit_alphatest_state,	6, 0);
112bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
1130813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
1140813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
1150813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšákunsigned r600_get_cb_flush_flags(struct r600_context *rctx)
1160813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
1170813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	unsigned flags = 0;
1180813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
1190813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	if (rctx->framebuffer.nr_cbufs) {
1200813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák		flags |= S_0085F0_CB_ACTION_ENA(1) |
1210813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák			 (((1 << rctx->framebuffer.nr_cbufs) - 1) << S_0085F0_CB0_DEST_BASE_ENA_SHIFT);
1220813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	}
1230813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
1240813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	/* Workaround for broken flushing on some R6xx chipsets. */
125b0337b679ad4c2feae59215104cfa60b58a619d5Marek Olšák	if (rctx->family == CHIP_RV670 ||
126b0337b679ad4c2feae59215104cfa60b58a619d5Marek Olšák	    rctx->family == CHIP_RS780 ||
127b0337b679ad4c2feae59215104cfa60b58a619d5Marek Olšák	    rctx->family == CHIP_RS880) {
1280813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák		flags |=  S_0085F0_CB1_DEST_BASE_ENA(1) |
1290813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák			  S_0085F0_DEST_BASE_0_ENA(1);
1300813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	}
1310813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	return flags;
1320813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
1330813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
1340813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšákvoid r600_texture_barrier(struct pipe_context *ctx)
1350813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák{
1360813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1370813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
138e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	rctx->surface_sync_cmd.flush_flags |= S_0085F0_TC_ACTION_ENA(1) | r600_get_cb_flush_flags(rctx);
139e363dd5c7d8ba40984d937ad7487abbb5be439bcMarek Olšák	r600_atom_dirty(rctx, &rctx->surface_sync_cmd.atom);
1400813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák}
1410813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák
142dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšákstatic bool r600_conv_pipe_prim(unsigned pprim, unsigned *prim)
143d737857ed2ff4313fd6046dcd80018c6308a53c5Dave Airlie{
144de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie	static const int prim_conv[] = {
145de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_POINTLIST,
146de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_LINELIST,
147de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_LINELOOP,
148de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_LINESTRIP,
149de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_TRILIST,
150de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_TRISTRIP,
151de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_TRIFAN,
152de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_QUADLIST,
153de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_QUADSTRIP,
154de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		V_008958_DI_PT_POLYGON,
155de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		-1,
156de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		-1,
157de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie		-1,
158187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		-1,
159187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		V_008958_DI_PT_RECTLIST
160de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie	};
161de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie
162de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie	*prim = prim_conv[pprim];
163de0adb691feb2ae7f64dd74ed6bc5a9e0f493631Dave Airlie	if (*prim == -1) {
164d737857ed2ff4313fd6046dcd80018c6308a53c5Dave Airlie		fprintf(stderr, "%s:%d unsupported %d\n", __func__, __LINE__, pprim);
165dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšák		return false;
166d737857ed2ff4313fd6046dcd80018c6308a53c5Dave Airlie	}
167dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšák	return true;
168d737857ed2ff4313fd6046dcd80018c6308a53c5Dave Airlie}
169d737857ed2ff4313fd6046dcd80018c6308a53c5Dave Airlie
170f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie/* common state between evergreen and r600 */
1718d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
1728d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlinstatic void r600_bind_blend_state_internal(struct r600_context *rctx,
1738d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin		struct r600_pipe_blend *blend)
1749612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
1759612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	struct r600_pipe_state *rstate;
1764fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	bool update_cb = false;
1779612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
1789612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rstate = &blend->rstate;
1799612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->states[rstate->id] = rstate;
180e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
1810ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák
1820ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	if (rctx->cb_misc_state.blend_colormask != blend->cb_target_mask) {
1830ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák		rctx->cb_misc_state.blend_colormask = blend->cb_target_mask;
1844fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		update_cb = true;
1850ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	}
186a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák	if (rctx->chip_class <= R700 &&
187a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák	    rctx->cb_misc_state.cb_color_control != blend->cb_color_control) {
188a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		rctx->cb_misc_state.cb_color_control = blend->cb_color_control;
1894fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		update_cb = true;
1904fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	}
1914fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	if (rctx->cb_misc_state.dual_src_blend != blend->dual_src_blend) {
1924fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		rctx->cb_misc_state.dual_src_blend = blend->dual_src_blend;
1934fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		update_cb = true;
1944fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	}
1954fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	if (update_cb) {
196a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
197a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák	}
1989612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
1999612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
2008d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlinvoid r600_bind_blend_state(struct pipe_context *ctx, void *state)
2018d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin{
2028d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	struct r600_context *rctx = (struct r600_context *)ctx;
2038d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	struct r600_pipe_blend *blend = (struct r600_pipe_blend *)state;
2048d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
2058d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	if (blend == NULL)
2068d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin		return;
2078d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
2088d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	rctx->blend = blend;
2098d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	rctx->alpha_to_one = blend->alpha_to_one;
2108d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	rctx->dual_src_blend = blend->dual_src_blend;
2118d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
2128d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	if (!rctx->blend_override)
2138d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin		r600_bind_blend_state_internal(rctx, blend);
2148d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin}
2158d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
216014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšákvoid r600_set_blend_color(struct pipe_context *ctx,
217014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák			  const struct pipe_blend_color *state)
218014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák{
219014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
220014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
221014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák
222014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	if (rstate == NULL)
223014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák		return;
224014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák
225014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	rstate->id = R600_PIPE_STATE_BLEND_COLOR;
22662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028414_CB_BLEND_RED, fui(state->color[0]));
22762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028418_CB_BLEND_GREEN, fui(state->color[1]));
22862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_02841C_CB_BLEND_BLUE, fui(state->color[2]));
22962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	r600_pipe_state_add_reg(rstate, R_028420_CB_BLEND_ALPHA, fui(state->color[3]));
230014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák
231014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	free(rctx->states[R600_PIPE_STATE_BLEND_COLOR]);
232014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	rctx->states[R600_PIPE_STATE_BLEND_COLOR] = rstate;
233014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák	r600_context_pipe_state_set(rctx, rstate);
234014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák}
235014198ec8860d8a0abfd6aa0ddd8db9d26febdbbMarek Olšák
236a2361946e782b57f0c63587841ca41c0ea707070Marek Olšákstatic void r600_set_stencil_ref(struct pipe_context *ctx,
237a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				 const struct r600_stencil_ref *state)
238a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák{
239e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
240a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
241a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
242a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	if (rstate == NULL)
243a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák		return;
244a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
245a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	rstate->id = R600_PIPE_STATE_STENCIL_REF;
246a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	r600_pipe_state_add_reg(rstate,
247a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				R_028430_DB_STENCILREFMASK,
248a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				S_028430_STENCILREF(state->ref_value[0]) |
249a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				S_028430_STENCILMASK(state->valuemask[0]) |
25062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028430_STENCILWRITEMASK(state->writemask[0]));
251a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	r600_pipe_state_add_reg(rstate,
252a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				R_028434_DB_STENCILREFMASK_BF,
253a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				S_028434_STENCILREF_BF(state->ref_value[1]) |
254a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák				S_028434_STENCILMASK_BF(state->valuemask[1]) |
25562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				S_028434_STENCILWRITEMASK_BF(state->writemask[1]));
256a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
257a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	free(rctx->states[R600_PIPE_STATE_STENCIL_REF]);
258a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	rctx->states[R600_PIPE_STATE_STENCIL_REF] = rstate;
259e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
260a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák}
261a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
262a2361946e782b57f0c63587841ca41c0ea707070Marek Olšákvoid r600_set_pipe_stencil_ref(struct pipe_context *ctx,
263a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák			       const struct pipe_stencil_ref *state)
264a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák{
265e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
266a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	struct r600_pipe_dsa *dsa = (struct r600_pipe_dsa*)rctx->states[R600_PIPE_STATE_DSA];
267a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	struct r600_stencil_ref ref;
268a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
269a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	rctx->stencil_ref = *state;
270a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
271a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	if (!dsa)
272a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák		return;
273a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
274a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.ref_value[0] = state->ref_value[0];
275a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.ref_value[1] = state->ref_value[1];
276a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.valuemask[0] = dsa->valuemask[0];
277a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.valuemask[1] = dsa->valuemask[1];
278a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.writemask[0] = dsa->writemask[0];
279a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.writemask[1] = dsa->writemask[1];
280a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
281a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	r600_set_stencil_ref(ctx, &ref);
282a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák}
283a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
284f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeetvoid r600_bind_dsa_state(struct pipe_context *ctx, void *state)
285f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet{
286e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
287f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	struct r600_pipe_dsa *dsa = state;
288f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	struct r600_pipe_state *rstate;
289a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	struct r600_stencil_ref ref;
290f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet
291f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	if (state == NULL)
292f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet		return;
293f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	rstate = &dsa->rstate;
294f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet	rctx->states[rstate->id] = rstate;
295e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, rstate);
296a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
297a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.ref_value[0] = rctx->stencil_ref.ref_value[0];
298a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.ref_value[1] = rctx->stencil_ref.ref_value[1];
299a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.valuemask[0] = dsa->valuemask[0];
300a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.valuemask[1] = dsa->valuemask[1];
301a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.writemask[0] = dsa->writemask[0];
302a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	ref.writemask[1] = dsa->writemask[1];
303a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák
304a2361946e782b57f0c63587841ca41c0ea707070Marek Olšák	r600_set_stencil_ref(ctx, &ref);
305bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák
306bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	/* Update alphatest state. */
307bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	if (rctx->alphatest_state.sx_alpha_test_control != dsa->sx_alpha_test_control ||
308bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	    rctx->alphatest_state.sx_alpha_ref != dsa->alpha_ref) {
309bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák		rctx->alphatest_state.sx_alpha_test_control = dsa->sx_alpha_test_control;
310bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák		rctx->alphatest_state.sx_alpha_ref = dsa->alpha_ref;
311bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák		r600_atom_dirty(rctx, &rctx->alphatest_state.atom);
312bc2f5fc01e678ecd19f921e5bc7bd55c131dde66Marek Olšák	}
313f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet}
314f60235e73a5260f92630ce472e06d8c5c00414fbHenri Verbeet
315aacd653834264b70a2537aff7914762b39f0683fMarek Olšákvoid r600_set_max_scissor(struct r600_context *rctx)
316aacd653834264b70a2537aff7914762b39f0683fMarek Olšák{
317aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	/* Set a scissor state such that it doesn't do anything. */
318aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	struct pipe_scissor_state scissor;
319aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	scissor.minx = 0;
320aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	scissor.miny = 0;
321aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	scissor.maxx = 8192;
322aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	scissor.maxy = 8192;
323aacd653834264b70a2537aff7914762b39f0683fMarek Olšák
324aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	r600_set_scissor_state(rctx, &scissor);
325aacd653834264b70a2537aff7914762b39f0683fMarek Olšák}
326aacd653834264b70a2537aff7914762b39f0683fMarek Olšák
3279612b482e2c8e994709bcaab79185224b4d76670Dave Airlievoid r600_bind_rs_state(struct pipe_context *ctx, void *state)
3289612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
3299612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	struct r600_pipe_rasterizer *rs = (struct r600_pipe_rasterizer *)state;
330e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
3319612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3329612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	if (state == NULL)
3339612b482e2c8e994709bcaab79185224b4d76670Dave Airlie		return;
3349612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3359612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->sprite_coord_enable = rs->sprite_coord_enable;
336725a820b926575265e6790601a0defd9c30947dcVadim Girlin	rctx->two_side = rs->two_side;
3372000086fcd5174f121f61dd6df5948c67101e148Marek Olšák	rctx->pa_sc_line_stipple = rs->pa_sc_line_stipple;
338a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák	rctx->pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
33926cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák	rctx->multisample_enable = rs->multisample_enable;
340e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
3419612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->rasterizer = rs;
3429612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3439612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	rctx->states[rs->rstate.id] = &rs->rstate;
344e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, &rs->rstate);
3450b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse
346b3b946b0ab88c1d7edeab183d8ad5125ba223392Henri Verbeet	if (rctx->chip_class >= EVERGREEN) {
3470b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		evergreen_polygon_offset_update(rctx);
3480b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	} else {
3490b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse		r600_polygon_offset_update(rctx);
3500b841b0349d7aca218eac4e9d9b7b1406ad71944Jerome Glisse	}
351aacd653834264b70a2537aff7914762b39f0683fMarek Olšák
352aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	/* Workaround for a missing scissor enable on r600. */
353aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	if (rctx->chip_class == R600) {
354aacd653834264b70a2537aff7914762b39f0683fMarek Olšák		if (rs->scissor_enable != rctx->scissor_enable) {
355aacd653834264b70a2537aff7914762b39f0683fMarek Olšák			rctx->scissor_enable = rs->scissor_enable;
356aacd653834264b70a2537aff7914762b39f0683fMarek Olšák
357aacd653834264b70a2537aff7914762b39f0683fMarek Olšák			if (rs->scissor_enable) {
358aacd653834264b70a2537aff7914762b39f0683fMarek Olšák				r600_set_scissor_state(rctx, &rctx->scissor_state);
359aacd653834264b70a2537aff7914762b39f0683fMarek Olšák			} else {
360aacd653834264b70a2537aff7914762b39f0683fMarek Olšák				r600_set_max_scissor(rctx);
361aacd653834264b70a2537aff7914762b39f0683fMarek Olšák			}
362aacd653834264b70a2537aff7914762b39f0683fMarek Olšák		}
363aacd653834264b70a2537aff7914762b39f0683fMarek Olšák	}
3649612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
3659612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3669612b482e2c8e994709bcaab79185224b4d76670Dave Airlievoid r600_delete_rs_state(struct pipe_context *ctx, void *state)
3679612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
368e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
3699612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	struct r600_pipe_rasterizer *rs = (struct r600_pipe_rasterizer *)state;
3709612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3719612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	if (rctx->rasterizer == rs) {
3729612b482e2c8e994709bcaab79185224b4d76670Dave Airlie		rctx->rasterizer = NULL;
3739612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	}
3749612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	if (rctx->states[rs->rstate.id] == &rs->rstate) {
3759612b482e2c8e994709bcaab79185224b4d76670Dave Airlie		rctx->states[rs->rstate.id] = NULL;
3769612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	}
3779612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	free(rs);
3789612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
3799612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3809612b482e2c8e994709bcaab79185224b4d76670Dave Airlievoid r600_sampler_view_destroy(struct pipe_context *ctx,
3819612b482e2c8e994709bcaab79185224b4d76670Dave Airlie			       struct pipe_sampler_view *state)
3829612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
3839612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	struct r600_pipe_sampler_view *resource = (struct r600_pipe_sampler_view *)state;
3849612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
3859612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	pipe_resource_reference(&state->texture, NULL);
3869612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	FREE(resource);
3879612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
3889612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
389d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paulstatic void r600_bind_samplers(struct pipe_context *pipe,
390d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul                               unsigned shader,
391d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul			       unsigned start,
3922df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			       unsigned count, void **states)
3932df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
394d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	struct r600_context *rctx = (struct r600_context *)pipe;
395d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	struct r600_textures_info *dst;
3962df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	int seamless_cube_map = -1;
3972df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	unsigned i;
3982df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
399d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	assert(start == 0); /* XXX fix below */
400d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul
401d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	switch (shader) {
402d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	case PIPE_SHADER_VERTEX:
403d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		dst = &rctx->vs_samplers;
404d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		break;
405d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	case PIPE_SHADER_FRAGMENT:
406d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		dst = &rctx->ps_samplers;
407d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		break;
408d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	default:
409d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		debug_error("bad shader in r600_bind_samplers()");
410d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		return;
411d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	}
412d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul
4132df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	memcpy(dst->samplers, states, sizeof(void*) * count);
4142df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	dst->n_samplers = count;
4152df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	dst->atom_sampler.num_dw = 0;
4162df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4172df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	for (i = 0; i < count; i++) {
4182df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		struct r600_pipe_sampler_state *sampler = states[i];
4192df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4202df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		if (sampler == NULL) {
4212df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			continue;
4222df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		}
4232df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		if (sampler->border_color_use) {
4242df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			dst->atom_sampler.num_dw += 11;
4252df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			rctx->flags |= R600_PARTIAL_FLUSH;
4262df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		} else {
4272df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse			dst->atom_sampler.num_dw += 5;
4282df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		}
4292df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		seamless_cube_map = sampler->seamless_cube_map;
4302df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
4312df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	if (rctx->chip_class <= R700 && seamless_cube_map != -1 && seamless_cube_map != rctx->seamless_cube_map.enabled) {
4322df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		/* change in TA_CNTL_AUX need a pipeline flush */
4332df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		rctx->flags |= R600_PARTIAL_FLUSH;
4342df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		rctx->seamless_cube_map.enabled = seamless_cube_map;
4352df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_atom_dirty(rctx, &rctx->seamless_cube_map.atom);
4362df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
4372df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	if (dst->atom_sampler.num_dw) {
4382df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_atom_dirty(rctx, &dst->atom_sampler);
4392df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
4402df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
4412df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4422df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissevoid r600_bind_vs_samplers(struct pipe_context *ctx, unsigned count, void **states)
4432df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
444d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	r600_bind_samplers(ctx, PIPE_SHADER_VERTEX, 0, count, states);
4452df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
4462df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4472df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissevoid r600_bind_ps_samplers(struct pipe_context *ctx, unsigned count, void **states)
4482df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
449d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	r600_bind_samplers(ctx, PIPE_SHADER_FRAGMENT, 0, count, states);
4502df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
4512df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4522df399c34bb39122a45bdd5b430b48346542e1cbJerome Glissevoid r600_delete_sampler(struct pipe_context *ctx, void *state)
4532df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse{
4542df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	free(state);
4552df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse}
4562df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
4579612b482e2c8e994709bcaab79185224b4d76670Dave Airlievoid r600_delete_state(struct pipe_context *ctx, void *state)
4589612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
459e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
4609612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	struct r600_pipe_state *rstate = (struct r600_pipe_state *)state;
4619612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
4629612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	if (rctx->states[rstate->id] == rstate) {
4639612b482e2c8e994709bcaab79185224b4d76670Dave Airlie		rctx->states[rstate->id] = NULL;
4649612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	}
4659612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	for (int i = 0; i < rstate->nregs; i++) {
4666101b6d442b06a347c001fe85848d636ab7df260Marek Olšák		pipe_resource_reference((struct pipe_resource**)&rstate->regs[i].bo, NULL);
4679612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	}
4689612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	free(rstate);
4699612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
4709612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
471a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlievoid r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
472a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
473e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
474a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	struct r600_vertex_element *v = (struct r600_vertex_element*)state;
475a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
476a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	rctx->vertex_elements = v;
477a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	if (v) {
4780813e58a3e41faf6f2072d034dfdc6198a3a1feeMarek Olšák		r600_inval_shader_cache(rctx);
479aa8a2224a3df111a1613f0baefebc00883e1b70bMarek Olšák
480fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse		rctx->states[v->rstate.id] = &v->rstate;
481e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		r600_context_pipe_state_set(rctx, &v->rstate);
482a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	}
483a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
484a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
4859612b482e2c8e994709bcaab79185224b4d76670Dave Airlievoid r600_delete_vertex_element(struct pipe_context *ctx, void *state)
4869612b482e2c8e994709bcaab79185224b4d76670Dave Airlie{
487e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
488fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	struct r600_vertex_element *v = (struct r600_vertex_element*)state;
4899612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
490fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	if (rctx->states[v->rstate.id] == &v->rstate) {
491fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse		rctx->states[v->rstate.id] = NULL;
492fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	}
4939612b482e2c8e994709bcaab79185224b4d76670Dave Airlie	if (rctx->vertex_elements == state)
4949612b482e2c8e994709bcaab79185224b4d76670Dave Airlie		rctx->vertex_elements = NULL;
495fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse
4966101b6d442b06a347c001fe85848d636ab7df260Marek Olšák	pipe_resource_reference((struct pipe_resource**)&v->fetch_shader, NULL);
497fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	FREE(state);
4989612b482e2c8e994709bcaab79185224b4d76670Dave Airlie}
4999612b482e2c8e994709bcaab79185224b4d76670Dave Airlie
500f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlievoid r600_set_index_buffer(struct pipe_context *ctx,
501f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie			   const struct pipe_index_buffer *ib)
502f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie{
503e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
504f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
50531714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák	if (ib) {
50631714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák		pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
50778222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		memcpy(&rctx->index_buffer, ib, sizeof(*ib));
50878222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, ib->buffer);
50931714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák	} else {
51031714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák		pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
51131714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák	}
512f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie}
513f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
514585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšákvoid r600_vertex_buffers_dirty(struct r600_context *rctx)
515585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák{
516585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	if (rctx->vertex_buffer_state.dirty_mask) {
517585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		r600_inval_vertex_cache(rctx);
518585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		rctx->vertex_buffer_state.atom.num_dw = (rctx->chip_class >= EVERGREEN ? 12 : 11) *
519585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák					       util_bitcount(rctx->vertex_buffer_state.dirty_mask);
520585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		r600_atom_dirty(rctx, &rctx->vertex_buffer_state.atom);
521585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	}
522585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák}
523585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák
524f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlievoid r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
525585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák			     const struct pipe_vertex_buffer *input)
526f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie{
527e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
528585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	struct r600_vertexbuf_state *state = &rctx->vertex_buffer_state;
529585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	struct pipe_vertex_buffer *vb = state->vb;
530c2f444c54db82a53f63fa7a103770ee5eedc3559Tom Stellard	unsigned i;
531585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	/* This sets 1-bit for buffers with index >= count. */
532585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	uint32_t disable_mask = ~((1ull << count) - 1);
533585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	/* These are the new buffers set by this function. */
534585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	uint32_t new_buffer_mask = 0;
535585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák
536585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	/* Set buffers with index >= count to NULL. */
537585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	uint32_t remaining_buffers_mask =
538585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		rctx->vertex_buffer_state.enabled_mask & disable_mask;
539585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák
540585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	while (remaining_buffers_mask) {
541585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		i = u_bit_scan(&remaining_buffers_mask);
542585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		pipe_resource_reference(&vb[i].buffer, NULL);
543585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	}
5448c631cfeae29b5236928f759e222aa35e6e4984cMarek Olšák
545585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	/* Set vertex buffers. */
546585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	for (i = 0; i < count; i++) {
547585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		if (memcmp(&input[i], &vb[i], sizeof(struct pipe_vertex_buffer))) {
548585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák			if (input[i].buffer) {
549585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				vb[i].stride = input[i].stride;
550585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				vb[i].buffer_offset = input[i].buffer_offset;
551585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				pipe_resource_reference(&vb[i].buffer, input[i].buffer);
552585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				new_buffer_mask |= 1 << i;
55378222e63630280b96488de0d51d1b2578e26f814Jerome Glisse				r600_context_add_resource_size(ctx, input[i].buffer);
554585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák			} else {
555585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				pipe_resource_reference(&vb[i].buffer, NULL);
556585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák				disable_mask |= 1 << i;
557585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák			}
558585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák		}
559585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák        }
56023b948057ad33cf0b27e5c88a8e9ff7dbfa0573cMarek Olšák
561585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	rctx->vertex_buffer_state.enabled_mask &= ~disable_mask;
562585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	rctx->vertex_buffer_state.dirty_mask &= rctx->vertex_buffer_state.enabled_mask;
563585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	rctx->vertex_buffer_state.enabled_mask |= new_buffer_mask;
564585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	rctx->vertex_buffer_state.dirty_mask |= new_buffer_mask;
565585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák
566585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák	r600_vertex_buffers_dirty(rctx);
567f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie}
568f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
5695d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšákvoid r600_sampler_views_dirty(struct r600_context *rctx,
5705d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			      struct r600_samplerview_state *state)
5715d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák{
5725d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	if (state->dirty_mask) {
5735d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_inval_texture_cache(rctx);
5745d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		state->atom.num_dw = (rctx->chip_class >= EVERGREEN ? 14 : 13) *
5755d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák				     util_bitcount(state->dirty_mask);
5765d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		r600_atom_dirty(rctx, &state->atom);
5775d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	}
5785d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák}
5795d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
580d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paulvoid r600_set_sampler_views(struct pipe_context *pipe,
581d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul			    unsigned shader,
582d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul			    unsigned start,
583ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			    unsigned count,
5845d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			    struct pipe_sampler_view **views)
585ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák{
586d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	struct r600_context *rctx = (struct r600_context *) pipe;
587d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	struct r600_textures_info *dst;
588ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	struct r600_pipe_sampler_view **rviews = (struct r600_pipe_sampler_view **)views;
589ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	unsigned i;
5905d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	/* This sets 1-bit for textures with index >= count. */
5915d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	uint32_t disable_mask = ~((1ull << count) - 1);
5925d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	/* These are the new textures set by this function. */
5935d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	uint32_t new_mask = 0;
594ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
5955d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	/* Set textures with index >= count to NULL. */
596d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	uint32_t remaining_mask;
597d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul
598d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	assert(start == 0); /* XXX fix below */
599d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul
600d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	switch (shader) {
601d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	case PIPE_SHADER_VERTEX:
602d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		dst = &rctx->vs_samplers;
603d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		break;
604d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	case PIPE_SHADER_FRAGMENT:
605d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		dst = &rctx->ps_samplers;
606d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		break;
607d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	default:
608d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		debug_error("bad shader in r600_set_sampler_views()");
609d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul		return;
610d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	}
611d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul
612d663a557fd27d7c238248e19f22f2e6b05f03030Brian Paul	remaining_mask = dst->views.enabled_mask & disable_mask;
6135d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
6145d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	while (remaining_mask) {
6155d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		i = u_bit_scan(&remaining_mask);
6165d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		assert(dst->views.views[i]);
6175d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák
6185d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], NULL);
6195d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	}
620ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
621ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	for (i = 0; i < count; i++) {
6225d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák		if (rviews[i] == dst->views.views[i]) {
623ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			continue;
624ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák		}
625ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
626ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák		if (rviews[i]) {
627951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák			struct r600_texture *rtex =
628951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák				(struct r600_texture*)rviews[i]->base.texture;
62980755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák
63080755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák			if (rtex->is_depth && !rtex->is_flushing_texture) {
63148edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák				dst->views.compressed_depthtex_mask |= 1 << i;
63280755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák			} else {
63348edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák				dst->views.compressed_depthtex_mask &= ~(1 << i);
63480755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák			}
635ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
63664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			/* Track compressed colorbuffers for Evergreen (Cayman doesn't need this). */
63764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák			if (rctx->chip_class != CAYMAN && rtex->cmask_size && rtex->fmask_size) {
638a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák				dst->views.compressed_colortex_mask |= 1 << i;
639a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			} else {
640a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák				dst->views.compressed_colortex_mask &= ~(1 << i);
641a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			}
642a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
643ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			/* Changing from array to non-arrays textures and vice
644ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			 * versa requires updating TEX_ARRAY_OVERRIDE on R6xx-R7xx. */
645ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			if (rctx->chip_class <= R700 &&
646ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			    (rviews[i]->base.texture->target == PIPE_TEXTURE_1D_ARRAY ||
647ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			     rviews[i]->base.texture->target == PIPE_TEXTURE_2D_ARRAY) != dst->is_array_sampler[i]) {
6482df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse				r600_atom_dirty(rctx, &dst->atom_sampler);
649ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák			}
650ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
6515d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], views[i]);
6525d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			new_mask |= 1 << i;
65378222e63630280b96488de0d51d1b2578e26f814Jerome Glisse			r600_context_add_resource_size(pipe, views[i]->texture);
654ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák		} else {
6555d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], NULL);
6565d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák			disable_mask |= 1 << i;
657ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák		}
658ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák	}
659ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
6605d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	dst->views.enabled_mask &= ~disable_mask;
6615d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	dst->views.dirty_mask &= dst->views.enabled_mask;
6625d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	dst->views.enabled_mask |= new_mask;
6635d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	dst->views.dirty_mask |= new_mask;
66448edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák	dst->views.compressed_depthtex_mask &= dst->views.enabled_mask;
665a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	dst->views.compressed_colortex_mask &= dst->views.enabled_mask;
666ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
6675d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák	r600_sampler_views_dirty(rctx, &dst->views);
668ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák}
669ba48f47ebf7f017db0507b92a3ca83e404dc586cMarek Olšák
670f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlievoid *r600_create_vertex_elements(struct pipe_context *ctx,
671f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie				  unsigned count,
672f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie				  const struct pipe_vertex_element *elements)
673f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie{
674e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
675f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	struct r600_vertex_element *v = CALLOC_STRUCT(r600_vertex_element);
676f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
677f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	assert(count < 32);
678f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	if (!v)
679f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie		return NULL;
680f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
681f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	v->count = count;
682889238c8b1e6b8ac5eed30ec3122be94216ca7cfMarek Olšák	memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count);
683f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie
684fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	if (r600_vertex_elements_build_fetch_shader(rctx, v)) {
685fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse		FREE(v);
686fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse		return NULL;
687fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse	}
688fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse
689f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie	return v;
690f39e6c9c816b603a4ed8fd8cda8569b7e13c1f68Dave Airlie}
691a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
6924acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin/* Compute the key for the hw shader variant */
6934acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinstatic INLINE unsigned r600_shader_selector_key(struct pipe_context * ctx,
6944acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		struct r600_pipe_shader_selector * sel)
695a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
6964acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_context *rctx = (struct r600_context *)ctx;
6974acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	unsigned key;
6984acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
6994acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (sel->type == PIPE_SHADER_FRAGMENT) {
7000c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		key = rctx->two_side |
70126cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák		      ((rctx->alpha_to_one && rctx->multisample_enable && !rctx->cb0_is_integer) << 1) |
70226cb887ea213be2445e0fd64364d9264ed4fbfd2Marek Olšák		      (MIN2(sel->nr_ps_max_color_exports, rctx->nr_cbufs + rctx->dual_src_blend) << 2);
7034acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	} else
7044acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		key = 0;
7054acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7064acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	return key;
7074acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin}
7084acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7094acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin/* Select the hw shader variant depending on the current state.
7104acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin * (*dirty) is set to 1 if current variant was changed */
7114acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinstatic int r600_shader_select(struct pipe_context *ctx,
7124acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin        struct r600_pipe_shader_selector* sel,
7134acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin        unsigned *dirty)
7144acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin{
7154acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	unsigned key;
7164acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_context *rctx = (struct r600_context *)ctx;
7174acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader * shader = NULL;
718a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	int r;
719a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
7204acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	key = r600_shader_selector_key(ctx, sel);
721eafd331cf3b024001abd3f64861f41cd33a9acb2Vadim Girlin
7224acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	/* Check if we don't need to change anything.
7234acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	 * This path is also used for most shaders that don't need multiple
7244acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	 * variants, it will cost just a computation of the key and this
7254acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	 * test. */
7264acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (likely(sel->current && sel->current->key == key)) {
7274acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		return 0;
7284acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	}
7294acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7304acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	/* lookup if we have other variants in the list */
7314acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (sel->num_shaders > 1) {
7324acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		struct r600_pipe_shader *p = sel->current, *c = p->next_variant;
7334acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7344acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		while (c && c->key != key) {
7354acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			p = c;
7364acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			c = c->next_variant;
7374acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		}
7384acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7394acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (c) {
7404acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			p->next_variant = c->next_variant;
7414acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			shader = c;
7424acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		}
7434acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	}
7444acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7454acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (unlikely(!shader)) {
7464acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		shader = CALLOC(1, sizeof(struct r600_pipe_shader));
7474acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		shader->selector = sel;
7484acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7494acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		r = r600_pipe_shader_create(ctx, shader);
7504acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (unlikely(r)) {
7514acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
7524acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin					sel->type, key, r);
7534acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			sel->current = NULL;
7544acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			return r;
7554acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		}
7564acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7570c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		/* We don't know the value of nr_ps_max_color_exports until we built
7580c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		 * at least one variant, so we may need to recompute the key after
7590c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin		 * building first variant. */
7604acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (sel->type == PIPE_SHADER_FRAGMENT &&
7610c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin				sel->num_shaders == 0) {
7620c47d9dcab80923c61b3f5375128e9b511b842fbVadim Girlin			sel->nr_ps_max_color_exports = shader->shader.nr_ps_max_color_exports;
7634acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			key = r600_shader_selector_key(ctx, sel);
7644acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		}
7654acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7664acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		shader->key = key;
7674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		sel->num_shaders++;
7684acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	}
7694acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7704acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (dirty)
7714acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		*dirty = 1;
7724acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7734acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	shader->next_variant = sel->current;
7744acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	sel->current = shader;
7754acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7764acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (rctx->chip_class < EVERGREEN && rctx->ps_shader && rctx->vs_shader) {
7774acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		r600_adjust_gprs(rctx);
778a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	}
7794acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7804fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	if (rctx->ps_shader &&
7814fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	    rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
7824fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
7834fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
7844fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	}
7854acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	return 0;
7864acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin}
7874acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7884acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinstatic void *r600_create_shader_state(struct pipe_context *ctx,
7894acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			       const struct pipe_shader_state *state,
7904acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			       unsigned pipe_shader_type)
7914acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin{
7924acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader_selector *sel = CALLOC_STRUCT(r600_pipe_shader_selector);
7934acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	int r;
7944acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7954acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	sel->type = pipe_shader_type;
7964acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	sel->tokens = tgsi_dup_tokens(state->tokens);
7974acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	sel->so = state->stream_output;
7984acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
7994acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	r = r600_shader_select(ctx, sel, NULL);
8004acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (r)
8014acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	    return NULL;
8024acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
8034acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	return sel;
8044acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin}
8054acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
8064acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinvoid *r600_create_shader_state_ps(struct pipe_context *ctx,
8074acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		const struct pipe_shader_state *state)
8084acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin{
8094acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	return r600_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
8104acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin}
8114acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
8124acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinvoid *r600_create_shader_state_vs(struct pipe_context *ctx,
8134acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		const struct pipe_shader_state *state)
8144acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin{
8154acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	return r600_create_shader_state(ctx, state, PIPE_SHADER_VERTEX);
816a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
817a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
818a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlievoid r600_bind_ps_shader(struct pipe_context *ctx, void *state)
819a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
820e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
821a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8224acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (!state)
823f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák		state = rctx->dummy_pixel_shader;
824f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák
8254acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	rctx->ps_shader = (struct r600_pipe_shader_selector *)state;
8264acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	r600_context_pipe_state_set(rctx, &rctx->ps_shader->current->rstate);
827f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák
82878222e63630280b96488de0d51d1b2578e26f814Jerome Glisse	r600_context_add_resource_size(ctx, (struct pipe_resource *)rctx->ps_shader->current->bo);
82978222e63630280b96488de0d51d1b2578e26f814Jerome Glisse
830a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák	if (rctx->chip_class <= R700) {
831a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
832f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák
833a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		if (rctx->cb_misc_state.multiwrite != multiwrite) {
834a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák			rctx->cb_misc_state.multiwrite = multiwrite;
835a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák			r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
836a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		}
837a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák
838a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák		if (rctx->vs_shader)
839a1a1ff5ec09acda0c4849c9e41a37ae82a80f000Marek Olšák			r600_adjust_gprs(rctx);
84004554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie	}
8414fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák
8424fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
8434fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
8444fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák		r600_atom_dirty(rctx, &rctx->cb_misc_state.atom);
8454fe74412cfdba9af6ce878aebbb0c367f19cbb4bMarek Olšák	}
846a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
847a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
848a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlievoid r600_bind_vs_shader(struct pipe_context *ctx, void *state)
849a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
850e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
851a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8524acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	rctx->vs_shader = (struct r600_pipe_shader_selector *)state;
853afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	if (state) {
8544acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		r600_context_pipe_state_set(rctx, &rctx->vs_shader->current->rstate);
8554acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
85678222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, (struct pipe_resource *)rctx->vs_shader->current->bo);
85778222e63630280b96488de0d51d1b2578e26f814Jerome Glisse
8584acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		if (rctx->chip_class < EVERGREEN && rctx->ps_shader)
8594acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			r600_adjust_gprs(rctx);
860afc56b1861c1dae4137493af4c0e6dacc6ee41f9Jerome Glisse	}
8614acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin}
8624acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
8634acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlinstatic void r600_delete_shader_selector(struct pipe_context *ctx,
8644acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		struct r600_pipe_shader_selector *sel)
8654acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin{
8664acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader *p = sel->current, *c;
8674acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	while (p) {
8684acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		c = p->next_variant;
8694acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		r600_pipe_shader_destroy(ctx, p);
8704acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		free(p);
8714acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		p = c;
87204554c7d3a3b28e8103e50ed54f1ac57c6c11017Dave Airlie	}
8734acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
8744acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	free(sel->tokens);
8754acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	free(sel);
876a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
877a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8784acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin
879a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlievoid r600_delete_ps_shader(struct pipe_context *ctx, void *state)
880a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
881e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
8824acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
883a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8844acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (rctx->ps_shader == sel) {
885a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie		rctx->ps_shader = NULL;
886a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	}
887a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8884acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	r600_delete_shader_selector(ctx, sel);
889a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
890a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
891a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlievoid r600_delete_vs_shader(struct pipe_context *ctx, void *state)
892a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie{
893e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
8944acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
895a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
8964acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (rctx->vs_shader == sel) {
897a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie		rctx->vs_shader = NULL;
898a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie	}
899a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie
9004acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	r600_delete_shader_selector(ctx, sel);
901a20c2347a0bb9e0e1591b070ee5d0cac81168114Dave Airlie}
9022d7738eb2bee41656953d1173926f546c6711badMarek Olšák
90368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšákvoid r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state)
90468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák{
9057022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák	if (state->dirty_mask) {
9067022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák		r600_inval_shader_cache(rctx);
9077022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák		state->atom.num_dw = rctx->chip_class >= EVERGREEN ? util_bitcount(state->dirty_mask)*20
9087022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák								   : util_bitcount(state->dirty_mask)*19;
9097022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák		r600_atom_dirty(rctx, &state->atom);
9107022f49b52cb8b414a3716a08deb741cce9ed75cMarek Olšák	}
91168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák}
91268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
91315730a8207374936e354d945730070cb29c9547cMarek Olšákvoid r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
914507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák			      struct pipe_constant_buffer *input)
91515730a8207374936e354d945730070cb29c9547cMarek Olšák{
916e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
91768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	struct r600_constbuf_state *state;
918507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	struct pipe_constant_buffer *cb;
9190b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák	const uint8_t *ptr;
92015730a8207374936e354d945730070cb29c9547cMarek Olšák
92168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	switch (shader) {
92268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	case PIPE_SHADER_VERTEX:
92368bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		state = &rctx->vs_constbuf_state;
92468bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		break;
92568bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	case PIPE_SHADER_FRAGMENT:
92668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		state = &rctx->ps_constbuf_state;
92768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		break;
92868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	default:
92968bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		return;
93068bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	}
93168bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák
93215730a8207374936e354d945730070cb29c9547cMarek Olšák	/* Note that the state tracker can unbind constant buffers by
93315730a8207374936e354d945730070cb29c9547cMarek Olšák	 * passing NULL here.
93415730a8207374936e354d945730070cb29c9547cMarek Olšák	 */
935507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	if (unlikely(!input)) {
93668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		state->enabled_mask &= ~(1 << index);
93768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		state->dirty_mask &= ~(1 << index);
93868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák		pipe_resource_reference(&state->cb[index].buffer, NULL);
93915730a8207374936e354d945730070cb29c9547cMarek Olšák		return;
94015730a8207374936e354d945730070cb29c9547cMarek Olšák	}
94115730a8207374936e354d945730070cb29c9547cMarek Olšák
94268bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	cb = &state->cb[index];
943507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák	cb->buffer_size = input->buffer_size;
944573758fd094431c8b3220786cea28dfdb4cfad1cDave Airlie
9450b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák	ptr = input->user_buffer;
946e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák
947e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák	if (ptr) {
948e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák		/* Upload the user buffer. */
949e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák		if (R600_BIG_ENDIAN) {
950e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			uint32_t *tmpPtr;
951507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák			unsigned i, size = input->buffer_size;
952e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák
953e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			if (!(tmpPtr = malloc(size))) {
954e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák				R600_ERR("Failed to allocate BE swap buffer.\n");
955e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák				return;
956e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			}
957e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák
958e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			for (i = 0; i < size / 4; ++i) {
959e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák				tmpPtr[i] = bswap_32(((uint32_t *)ptr)[i]);
960e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			}
961e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák
962428855eea3e99d94474df6df0cb8dfc4a8819702Marek Olšák			u_upload_data(rctx->uploader, 0, size, tmpPtr, &cb->buffer_offset, &cb->buffer);
963e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák			free(tmpPtr);
964e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák		} else {
965507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák			u_upload_data(rctx->uploader, 0, input->buffer_size, ptr, &cb->buffer_offset, &cb->buffer);
966e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák		}
96778222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		/* account it in gtt */
96878222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		rctx->gtt += input->buffer_size;
969e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák	} else {
970e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák		/* Setup the hw buffer. */
971507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák		cb->buffer_offset = input->buffer_offset;
972507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák		pipe_resource_reference(&cb->buffer, input->buffer);
97378222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, input->buffer);
974e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák	}
975e9abb2cd6e93681504fbcf323c790e3950304734Marek Olšák
97668bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	state->enabled_mask |= 1 << index;
97768bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	state->dirty_mask |= 1 << index;
97868bbfc1afe210d82acfb14a78b0fd8c436a8f78cMarek Olšák	r600_constant_buffers_dirty(rctx, state);
97915730a8207374936e354d945730070cb29c9547cMarek Olšák}
98015730a8207374936e354d945730070cb29c9547cMarek Olšák
981543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšákstruct pipe_stream_output_target *
982543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšákr600_create_so_target(struct pipe_context *ctx,
983543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		      struct pipe_resource *buffer,
984543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		      unsigned buffer_offset,
985543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		      unsigned buffer_size)
986543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák{
987e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
988543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct r600_so_target *t;
989543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	void *ptr;
990543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
991543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t = CALLOC_STRUCT(r600_so_target);
992543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if (!t) {
993543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		return NULL;
994543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
995543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
996543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t->b.reference.count = 1;
997543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t->b.context = ctx;
998543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	pipe_resource_reference(&t->b.buffer, buffer);
999543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t->b.buffer_offset = buffer_offset;
1000543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t->b.buffer_size = buffer_size;
1001543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1002543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	t->filled_size = (struct r600_resource*)
1003543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák		pipe_buffer_create(ctx->screen, PIPE_BIND_CUSTOM, PIPE_USAGE_STATIC, 4);
10040a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák	ptr = rctx->ws->buffer_map(t->filled_size->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
1005543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	memset(ptr, 0, t->filled_size->buf->size);
10060a6120244e66494db070ce875c0a464fbc5b15a1Marek Olšák	rctx->ws->buffer_unmap(t->filled_size->cs_buf);
1007543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1008543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	return &t->b;
1009543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák}
1010543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1011543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšákvoid r600_so_target_destroy(struct pipe_context *ctx,
1012543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			    struct pipe_stream_output_target *target)
1013543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák{
1014543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	struct r600_so_target *t = (struct r600_so_target*)target;
1015543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	pipe_resource_reference(&t->b.buffer, NULL);
1016543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	pipe_resource_reference((struct pipe_resource**)&t->filled_size, NULL);
1017543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	FREE(t);
1018543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák}
1019543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1020543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšákvoid r600_set_so_targets(struct pipe_context *ctx,
1021543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			 unsigned num_targets,
1022543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			 struct pipe_stream_output_target **targets,
1023543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák			 unsigned append_bitmask)
1024543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák{
1025e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1026543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	unsigned i;
1027543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1028543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Stop streamout. */
1029cc2cd8b356e137c83600d5e1804fd6162ce687c9Marek Olšák	if (rctx->num_so_targets && !rctx->streamout_start) {
1030e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		r600_context_streamout_end(rctx);
1031543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1032543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1033543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	/* Set the new targets. */
1034543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	for (i = 0; i < num_targets; i++) {
1035e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], targets[i]);
103678222e63630280b96488de0d51d1b2578e26f814Jerome Glisse		r600_context_add_resource_size(ctx, targets[i]->buffer);
1037543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1038e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	for (; i < rctx->num_so_targets; i++) {
1039e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák		pipe_so_target_reference((struct pipe_stream_output_target**)&rctx->so_targets[i], NULL);
1040543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	}
1041543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1042e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	rctx->num_so_targets = num_targets;
1043e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	rctx->streamout_start = num_targets != 0;
1044e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	rctx->streamout_append_bitmask = append_bitmask;
1045543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák}
1046543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák
1047a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšákvoid r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
1048a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák{
1049a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	struct r600_context *rctx = (struct r600_context*)pipe;
1050a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
1051a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	if (rctx->sample_mask.sample_mask == (uint16_t)sample_mask)
1052a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák		return;
1053a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
1054a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	rctx->sample_mask.sample_mask = sample_mask;
1055a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák	r600_atom_dirty(rctx, &rctx->sample_mask.atom);
1056a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák}
1057a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák
1058e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákstatic void r600_update_derived_state(struct r600_context *rctx)
1059765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák{
1060e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin	struct pipe_context * ctx = (struct pipe_context*)rctx;
10618d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	unsigned ps_dirty = 0, blend_override;
1062e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
1063a19e6a8f2840be9a59e46c8d408658715ae47bf0Marek Olšák	if (!rctx->blitter->running) {
106448edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák		/* Decompress textures if needed. */
106548edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák		if (rctx->vs_samplers.views.compressed_depthtex_mask) {
106648edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák			r600_decompress_depth_textures(rctx, &rctx->vs_samplers.views);
106780755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák		}
106848edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák		if (rctx->ps_samplers.views.compressed_depthtex_mask) {
106948edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák			r600_decompress_depth_textures(rctx, &rctx->ps_samplers.views);
1070d1ca16b2738644d17c10e736ca36981f69f5fa87Marek Olšák		}
1071a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		if (rctx->vs_samplers.views.compressed_colortex_mask) {
1072a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			r600_decompress_color_textures(rctx, &rctx->vs_samplers.views);
1073a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		}
1074a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		if (rctx->ps_samplers.views.compressed_colortex_mask) {
1075a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			r600_decompress_color_textures(rctx, &rctx->ps_samplers.views);
1076a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		}
1077765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák	}
1078765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák
10794acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	r600_shader_select(ctx, rctx->ps_shader, &ps_dirty);
1080765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák
10811a9d2b764295f561aa9c24f504bd8cf3f95e7f54Vadim Girlin	if (rctx->ps_shader && ((rctx->sprite_coord_enable &&
10824acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		(rctx->ps_shader->current->sprite_coord_enable != rctx->sprite_coord_enable)) ||
10834acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		(rctx->rasterizer && rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade))) {
1084e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
1085e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin		if (rctx->chip_class >= EVERGREEN)
10864acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			evergreen_pipe_shader_ps(ctx, rctx->ps_shader->current);
1087e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin		else
10884acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin			r600_pipe_shader_ps(ctx, rctx->ps_shader->current);
1089e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
10904acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		ps_dirty = 1;
1091e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin	}
1092e532c710c60f0895e32af6562ac2855aa7d5eb63Vadim Girlin
10934acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin	if (ps_dirty)
10944acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin		r600_context_pipe_state_set(rctx, &rctx->ps_shader->current->rstate);
10958d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
10968d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	blend_override = (rctx->dual_src_blend &&
10978d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin			rctx->ps_shader->current->nr_ps_color_outputs < 2);
10988d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
10998d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	if (blend_override != rctx->blend_override) {
11008d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin		rctx->blend_override = blend_override;
11018d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin		r600_bind_blend_state_internal(rctx,
11028d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin				blend_override ? rctx->no_blend : rctx->blend);
11038d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin	}
11048d1a9a984f33d8e45f932a9f47cdd57da617a919Vadim Girlin
1105b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse	if (rctx->chip_class >= EVERGREEN) {
1106470d00c0e270c6079232d0d5ab10bf3219768fafVadim Girlin		evergreen_update_dual_export_state(rctx);
1107b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse	} else {
1108b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse		r600_update_dual_export_state(rctx);
1109b75f1d973c7b626dba567b792be5a3539855a705Jerome Glisse	}
1110765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák}
1111765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák
1112428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšákstatic unsigned r600_conv_prim_to_gs_out(unsigned mode)
1113428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák{
1114428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák	static const int prim_conv[] = {
1115428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_POINTLIST,
1116428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_LINESTRIP,
1117428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_LINESTRIP,
1118428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_LINESTRIP,
1119428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1120428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1121428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1122428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1123428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1124428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1125428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_LINESTRIP,
1126428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_LINESTRIP,
1127428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1128187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP,
1129428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák		V_028A6C_OUTPRIM_TYPE_TRISTRIP
1130428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák	};
1131428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák	assert(mode < Elements(prim_conv));
1132428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák
1133428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák	return prim_conv[mode];
1134428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák}
1135428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák
1136344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšákvoid r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo)
11372d7738eb2bee41656953d1173926f546c6711badMarek Olšák{
1138e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	struct r600_context *rctx = (struct r600_context *)ctx;
1139344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	struct pipe_draw_info info = *dinfo;
1140344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	struct pipe_index_buffer ib = {};
11410ea76916e63f8fc556f5e8f5a46c196d317cd5adMarek Olšák	unsigned prim, ls_mask = 0;
11423b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák	struct r600_block *dirty_block = NULL, *next_block = NULL;
11432fe521fa419ee153afb6295289dc5e95d3229858Marek Olšák	struct r600_atom *state = NULL, *next_state = NULL;
11448f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	struct radeon_winsys_cs *cs = rctx->cs;
11458f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	uint64_t va;
114634e53adc51ade8d53d74b6ae35bec90f1a6b9b29Marek Olšák	uint8_t *ptr;
11472d7738eb2bee41656953d1173926f546c6711badMarek Olšák
1148543b2331d7b45a29ccd3530daa2389e87e65d89bMarek Olšák	if ((!info.count && (info.indexed || !info.count_from_stream_output)) ||
1149344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	    !r600_conv_pipe_prim(info.mode, &prim)) {
1150f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák		assert(0);
1151dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšák		return;
1152dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšák	}
1153dc651aff0c725846c86a32c1c076d66b3b38318fMarek Olšák
1154f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák	if (!rctx->vs_shader) {
1155f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák		assert(0);
1156e98521e0f3ef430adc0eb2587ffe83844e24be06Vadim Girlin		return;
1157f71f5edf78572ae87b9efb897df49efab1a53558Marek Olšák	}
1158e98521e0f3ef430adc0eb2587ffe83844e24be06Vadim Girlin
1159765503bb5dc21dd9cacf11039fa1555b887804f2Marek Olšák	r600_update_derived_state(rctx);
1160c4519c3aec37f5cb3db8fe7e8ead13ae04e792b5Marek Olšák
11612df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	/* partial flush triggered by border color change */
11622df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	if (rctx->flags & R600_PARTIAL_FLUSH) {
11632df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		rctx->flags &= ~R600_PARTIAL_FLUSH;
11642df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_write_value(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
11652df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse		r600_write_value(cs, EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4));
11662df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse	}
11672df399c34bb39122a45bdd5b430b48346542e1cbJerome Glisse
1168344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	if (info.indexed) {
1169344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák		/* Initialize the index buffer struct. */
117031714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák		pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer);
1171bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák		ib.user_buffer = rctx->index_buffer.user_buffer;
117231714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák		ib.index_size = rctx->index_buffer.index_size;
117331714ea4d5a20285f398286fe45b53d0609926ddMarek Olšák		ib.offset = rctx->index_buffer.offset + info.start * ib.index_size;
11742d7738eb2bee41656953d1173926f546c6711badMarek Olšák
1175344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák		/* Translate or upload, if needed. */
1176344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák		r600_translate_index_buffer(rctx, &ib, info.count);
11772d7738eb2bee41656953d1173926f546c6711badMarek Olšák
1178bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák		ptr = (uint8_t*)ib.user_buffer;
1179bf469f4edc60bd1c5fd770cb231b8d5ab801427fMarek Olšák		if (!ib.buffer && ptr) {
1180428855eea3e99d94474df6df0cb8dfc4a8819702Marek Olšák			u_upload_data(rctx->uploader, 0, info.count * ib.index_size,
118134e53adc51ade8d53d74b6ae35bec90f1a6b9b29Marek Olšák				      ptr, &ib.offset, &ib.buffer);
1182344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák		}
11832d7738eb2bee41656953d1173926f546c6711badMarek Olšák	} else {
1184344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák		info.index_bias = info.start;
11852d7738eb2bee41656953d1173926f546c6711badMarek Olšák	}
11862d7738eb2bee41656953d1173926f546c6711badMarek Olšák
11879eb86f89a9d6471a92519064547a3937a6f89762Dave Airlie	if (rctx->vgt.id != R600_PIPE_STATE_VGT) {
11889eb86f89a9d6471a92519064547a3937a6f89762Dave Airlie		rctx->vgt.id = R600_PIPE_STATE_VGT;
11899eb86f89a9d6471a92519064547a3937a6f89762Dave Airlie		rctx->vgt.nregs = 0;
119062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_008958_VGT_PRIMITIVE_TYPE, prim);
119162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_028A6C_VGT_GS_OUT_PRIM_TYPE, 0);
119262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_028408_VGT_INDX_OFFSET, info.index_bias);
119362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, info.restart_index);
119462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, info.primitive_restart);
119562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_03CFF4_SQ_VTX_START_INST_LOC, info.start_instance);
119662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_028A0C_PA_SC_LINE_STIPPLE, 0);
119762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_02881C_PA_CL_VS_OUT_CNTL, 0);
119862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie		r600_pipe_state_add_reg(&rctx->vgt, R_028810_PA_CL_CLIP_CNTL, 0);
1199b0dc2d0c3b964c2670554a91b4ee79360fd5934aDave Airlie	}
1200b0dc2d0c3b964c2670554a91b4ee79360fd5934aDave Airlie
1201b0dc2d0c3b964c2670554a91b4ee79360fd5934aDave Airlie	rctx->vgt.nregs = 0;
1202b0dc2d0c3b964c2670554a91b4ee79360fd5934aDave Airlie	r600_pipe_state_mod_reg(&rctx->vgt, prim);
1203428146c14fed5b41e3da9e72488396f214b23b0dMarek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, r600_conv_prim_to_gs_out(info.mode));
1204344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, info.index_bias);
1205344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, info.restart_index);
1206344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, info.primitive_restart);
1207344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, info.start_instance);
1208391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie
1209391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie	if (prim == V_008958_DI_PT_LINELIST)
1210391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie		ls_mask = 1;
12115130196c0b3cbdb1944918d7f8d4db24d026deeaMarek Olšák	else if (prim == V_008958_DI_PT_LINESTRIP ||
12125130196c0b3cbdb1944918d7f8d4db24d026deeaMarek Olšák		 prim == V_008958_DI_PT_LINELOOP)
1213391e33ffbf01180d66d4c4e9a6c91fc17f9feacaDave Airlie		ls_mask = 2;
12142000086fcd5174f121f61dd6df5948c67101e148Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt, S_028A0C_AUTO_RESET_CNTL(ls_mask) | rctx->pa_sc_line_stipple);
121597acf2ca59defd3bcba946cdb014ee7b440f9186Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt,
12164acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				rctx->vs_shader->current->pa_cl_vs_out_cntl |
12174acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				(rctx->rasterizer->clip_plane_enable & rctx->vs_shader->current->shader.clip_dist_write));
1218a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák	r600_pipe_state_mod_reg(&rctx->vgt,
1219a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák				rctx->pa_cl_clip_cntl |
12204acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				(rctx->vs_shader->current->shader.clip_dist_write ||
12214acf71f01ea1edb253cd38cc059d4af1a2a40bf4Vadim Girlin				 rctx->vs_shader->current->shader.vs_prohibit_ucps ?
1222a494301f7fd4c93df67396d296a3edc6acfa44c3Marek Olšák				 0 : rctx->rasterizer->clip_plane_enable & 0x3F));
12239eb86f89a9d6471a92519064547a3937a6f89762Dave Airlie
1224e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák	r600_context_pipe_state_set(rctx, &rctx->vgt);
12252d7738eb2bee41656953d1173926f546c6711badMarek Olšák
1226c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák	/* Enable stream out if needed. */
1227c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák	if (rctx->streamout_start) {
1228c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák		r600_context_streamout_begin(rctx);
1229c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák		rctx->streamout_start = FALSE;
1230c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák	}
1231c3c83af380d703cdc24475bd39baa1722c333b44Marek Olšák
12328f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	/* Emit states (the function expects that we emit at most 17 dwords here). */
1233f237fd431b512f1d67c88a8d29581b5bef143bbfMarek Olšák	r600_need_cs_space(rctx, 0, TRUE);
12343b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák
12352fe521fa419ee153afb6295289dc5e95d3229858Marek Olšák	LIST_FOR_EACH_ENTRY_SAFE(state, next_state, &rctx->dirty_states, head) {
12362fe521fa419ee153afb6295289dc5e95d3229858Marek Olšák		r600_emit_atom(rctx, state);
12372fe521fa419ee153afb6295289dc5e95d3229858Marek Olšák	}
12383b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák	LIST_FOR_EACH_ENTRY_SAFE(dirty_block, next_block, &rctx->dirty,list) {
1239e00e1586dd94c1bbcd1ecfd9649fde9281be1977Tom Stellard		r600_context_block_emit_dirty(rctx, dirty_block, 0 /* pkt_flags */);
12403b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák	}
12413b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák	rctx->pm4_dirty_cdwords = 0;
12423b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák
12438f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	/* draw packet */
12448f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	cs->buf[cs->cdw++] = PKT3(PKT3_NUM_INSTANCES, 0, rctx->predicate_drawing);
12458f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	cs->buf[cs->cdw++] = info.instance_count;
12468f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák	if (info.indexed) {
1247d9ba1b0beb6a78e208128e758bd22173fe4a8234Marek Olšák		cs->buf[cs->cdw++] = PKT3(PKT3_INDEX_TYPE, 0, rctx->predicate_drawing);
1248d9ba1b0beb6a78e208128e758bd22173fe4a8234Marek Olšák		cs->buf[cs->cdw++] = ib.index_size == 4 ?
1249d9ba1b0beb6a78e208128e758bd22173fe4a8234Marek Olšák					(VGT_INDEX_32 | (R600_BIG_ENDIAN ? VGT_DMA_SWAP_32_BIT : 0)) :
1250d9ba1b0beb6a78e208128e758bd22173fe4a8234Marek Olšák					(VGT_INDEX_16 | (R600_BIG_ENDIAN ? VGT_DMA_SWAP_16_BIT : 0));
1251d9ba1b0beb6a78e208128e758bd22173fe4a8234Marek Olšák
12528f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		va = r600_resource_va(ctx->screen, ib.buffer);
12538f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		va += ib.offset;
12548f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = PKT3(PKT3_DRAW_INDEX, 3, rctx->predicate_drawing);
12558f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = va;
12568f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = (va >> 32UL) & 0xFF;
12578f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = info.count;
12588f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = V_0287F0_DI_SRC_SEL_DMA;
12598f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, rctx->predicate_drawing);
12608f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = r600_context_bo_reloc(rctx, (struct r600_resource*)ib.buffer, RADEON_USAGE_READ);
12612d7738eb2bee41656953d1173926f546c6711badMarek Olšák	} else {
1262ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák		if (info.count_from_stream_output) {
1263ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			struct r600_so_target *t = (struct r600_so_target*)info.count_from_stream_output;
1264ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			uint64_t va = r600_resource_va(&rctx->screen->screen, (void*)t->filled_size);
1265ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák
1266ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			r600_write_context_reg(cs, R_028B30_VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE, t->stride_in_dw);
1267ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák
1268ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = PKT3(PKT3_COPY_DW, 4, 0);
1269ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = COPY_DW_SRC_IS_MEM | COPY_DW_DST_IS_REG;
1270ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = va & 0xFFFFFFFFUL;     /* src address lo */
1271ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = (va >> 32UL) & 0xFFUL; /* src address hi */
1272ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = R_028B2C_VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE >> 2; /* dst register */
1273ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = 0; /* unused */
1274ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák
1275ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0);
1276ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák			cs->buf[cs->cdw++] = r600_context_bo_reloc(rctx, t->filled_size, RADEON_USAGE_READ);
1277ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák		}
1278ff9a49328e5d8b647aeb7511a01e5a41592a2799Marek Olšák
12798f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = PKT3(PKT3_DRAW_INDEX_AUTO, 1, rctx->predicate_drawing);
12808f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = info.count;
12818f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák		cs->buf[cs->cdw++] = V_0287F0_DI_SRC_SEL_AUTO_INDEX |
12828f5c172c854a52b2a69b8383a55c76f1faa5f704Marek Olšák					(info.count_from_stream_output ? S_0287F0_USE_OPAQUE(1) : 0);
12832d7738eb2bee41656953d1173926f546c6711badMarek Olšák	}
12842d7738eb2bee41656953d1173926f546c6711badMarek Olšák
12853b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák	rctx->flags |= R600_CONTEXT_DST_CACHES_DIRTY | R600_CONTEXT_DRAW_PENDING;
12863b0467192057cc561b6d495d6445b2ed04fc3ebfMarek Olšák
1287dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák	/* Set the depth buffer as dirty. */
1288dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák	if (rctx->framebuffer.zsbuf) {
1289dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák		struct pipe_surface *surf = rctx->framebuffer.zsbuf;
1290951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák		struct r600_texture *rtex = (struct r600_texture *)surf->texture;
1291dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák
129248edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák		rtex->dirty_level_mask |= 1 << surf->u.tex.level;
129338b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet	}
1294a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	if (rctx->compressed_cb_mask) {
1295a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		struct pipe_surface *surf;
1296a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		struct r600_texture *rtex;
1297a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		unsigned mask = rctx->compressed_cb_mask;
1298a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
1299a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		do {
1300a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			unsigned i = u_bit_scan(&mask);
1301a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			surf = rctx->framebuffer.cbufs[i];
1302a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			rtex = (struct r600_texture*)surf->texture;
1303a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
1304a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák			rtex->dirty_level_mask |= 1 << surf->u.tex.level;
1305a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák
1306a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák		} while (mask);
1307a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák	}
130838b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet
1309344039d81d3cc079dd73b3b703ff613c344904e0Marek Olšák	pipe_resource_reference(&ib.buffer, NULL);
13102d7738eb2bee41656953d1173926f546c6711badMarek Olšák}
131142502b6f03230b828121f60143190c39bc5c8ddaDave Airlie
1312187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšákvoid r600_draw_rectangle(struct blitter_context *blitter,
1313187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák			 unsigned x1, unsigned y1, unsigned x2, unsigned y2, float depth,
1314187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák			 enum blitter_attrib_type type, const union pipe_color_union *attrib)
1315187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák{
1316187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	struct r600_context *rctx = (struct r600_context*)util_blitter_get_pipe(blitter);
1317187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	struct pipe_viewport_state viewport;
1318187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	struct pipe_resource *buf = NULL;
1319187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	unsigned offset = 0;
1320187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	float *vb;
1321187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1322187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	if (type == UTIL_BLITTER_ATTRIB_TEXCOORD) {
1323187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		util_blitter_draw_rectangle(blitter, x1, y1, x2, y2, depth, type, attrib);
1324187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		return;
1325187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	}
1326187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1327187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	/* Some operations (like color resolve on r6xx) don't work
1328187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	 * with the conventional primitive types.
1329187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	 * One that works is PT_RECTLIST, which we use here. */
1330187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1331187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	/* setup viewport */
1332187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.scale[0] = 1.0f;
1333187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.scale[1] = 1.0f;
1334187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.scale[2] = 1.0f;
1335187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.scale[3] = 1.0f;
1336187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.translate[0] = 0.0f;
1337187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.translate[1] = 0.0f;
1338187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.translate[2] = 0.0f;
1339187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	viewport.translate[3] = 0.0f;
1340187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	rctx->context.set_viewport_state(&rctx->context, &viewport);
1341187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1342187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	/* Upload vertices. The hw rectangle has only 3 vertices,
1343187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	 * I guess the 4th one is derived from the first 3.
1344187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	 * The vertex specification should match u_blitter's vertex element state. */
1345187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, &offset, &buf, (void**)&vb);
1346187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[0] = x1;
1347187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[1] = y1;
1348187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[2] = depth;
1349187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[3] = 1;
1350187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1351187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[8] = x1;
1352187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[9] = y2;
1353187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[10] = depth;
1354187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[11] = 1;
1355187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1356187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[16] = x2;
1357187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[17] = y1;
1358187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[18] = depth;
1359187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	vb[19] = 1;
1360187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1361187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	if (attrib) {
1362187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		memcpy(vb+4, attrib->f, sizeof(float)*4);
1363187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		memcpy(vb+12, attrib->f, sizeof(float)*4);
1364187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák		memcpy(vb+20, attrib->f, sizeof(float)*4);
1365187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	}
1366187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
1367187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	/* draw */
1368187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	util_draw_vertex_buffer(&rctx->context, NULL, buf, offset,
1369187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák				R600_PRIM_RECTANGLE_LIST, 3, 2);
1370187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák	pipe_resource_reference(&buf, NULL);
1371187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák}
1372187d7fb2fec7da889f25366696faaac4c2e8f9c4Marek Olšák
137362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlievoid _r600_pipe_state_add_reg_bo(struct r600_context *ctx,
137462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				 struct r600_pipe_state *state,
137562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				 uint32_t offset, uint32_t value,
137662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				 uint32_t range_id, uint32_t block_id,
137762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				 struct r600_resource *bo,
137862b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				 enum radeon_bo_usage usage)
137962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie
138042502b6f03230b828121f60143190c39bc5c8ddaDave Airlie{
13814423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie	struct r600_range *range;
13824423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie	struct r600_block *block;
13834423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie
138447dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák	if (bo) assert(usage);
138547dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák
13864423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie	range = &ctx->range[range_id];
13874423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie	block = range->blocks[block_id];
138851d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].block = block;
138951d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].id = (offset - block->start_offset) >> 2;
13904423c79ddf6853d1d4594afda3e1262c1b9af4f5Dave Airlie
139142502b6f03230b828121f60143190c39bc5c8ddaDave Airlie	state->regs[state->nregs].value = value;
139242502b6f03230b828121f60143190c39bc5c8ddaDave Airlie	state->regs[state->nregs].bo = bo;
139347dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák	state->regs[state->nregs].bo_usage = usage;
139451d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie
139551d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->nregs++;
139651d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	assert(state->nregs < R600_BLOCK_MAX_REG);
139751d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie}
139851d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie
139962b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlievoid _r600_pipe_state_add_reg(struct r600_context *ctx,
140062b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie			      struct r600_pipe_state *state,
140162b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie			      uint32_t offset, uint32_t value,
140262b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie			      uint32_t range_id, uint32_t block_id)
140362b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie{
140462b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie	_r600_pipe_state_add_reg_bo(ctx, state, offset, value,
140562b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie				    range_id, block_id, NULL, 0);
140662b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie}
140762b0323cf6af90aa2be89ec76ec3693213b0de5eDave Airlie
140851d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlievoid r600_pipe_state_add_reg_noblock(struct r600_pipe_state *state,
140978293b99b23268e6698f1267aaf40647c17d95a5Marek Olšák				     uint32_t offset, uint32_t value,
14106101b6d442b06a347c001fe85848d636ab7df260Marek Olšák				     struct r600_resource *bo,
141147dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák				     enum radeon_bo_usage usage)
141251d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie{
141347dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák	if (bo) assert(usage);
141447dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák
141551d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].id = offset;
141651d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].block = NULL;
141751d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].value = value;
141851d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie	state->regs[state->nregs].bo = bo;
141947dcfb8dab517e2c92af2f4813b0f5ad200b8b07Marek Olšák	state->regs[state->nregs].bo_usage = usage;
142051d0892ee2daaa442a48abff2329e1485dd337e8Dave Airlie
142142502b6f03230b828121f60143190c39bc5c8ddaDave Airlie	state->nregs++;
142242502b6f03230b828121f60143190c39bc5c8ddaDave Airlie	assert(state->nregs < R600_BLOCK_MAX_REG);
142342502b6f03230b828121f60143190c39bc5c8ddaDave Airlie}
14249a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák
14259a20130e5f703e9e9279965183993b95907c7d6bMarek Olšákuint32_t r600_translate_stencil_op(int s_op)
14269a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák{
14279a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	switch (s_op) {
14289a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_KEEP:
14299a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_KEEP;
14309a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_ZERO:
14319a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_ZERO;
14329a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_REPLACE:
14339a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_REPLACE;
14349a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_INCR:
14359a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_INCR;
14369a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_DECR:
14379a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_DECR;
14389a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_INCR_WRAP:
14399a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_INCR_WRAP;
14409a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_DECR_WRAP:
14419a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_DECR_WRAP;
14429a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_STENCIL_OP_INVERT:
14439a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return V_028800_STENCIL_INVERT;
14449a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	default:
14459a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		R600_ERR("Unknown stencil op %d", s_op);
14469a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		assert(0);
14479a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		break;
14489a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	}
14499a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	return 0;
14509a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák}
14519a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák
14529a20130e5f703e9e9279965183993b95907c7d6bMarek Olšákuint32_t r600_translate_fill(uint32_t func)
14539a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák{
14549a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	switch(func) {
14559a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_POLYGON_MODE_FILL:
14569a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return 2;
14579a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_POLYGON_MODE_LINE:
14589a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return 1;
14599a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	case PIPE_POLYGON_MODE_POINT:
14609a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return 0;
14619a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	default:
14629a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		assert(0);
14639a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák		return 0;
14649a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák	}
14659a20130e5f703e9e9279965183993b95907c7d6bMarek Olšák}
14665cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák
14675cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšákunsigned r600_tex_wrap(unsigned wrap)
14685cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák{
14695cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	switch (wrap) {
14705cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	default:
14715cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_REPEAT:
14725cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_WRAP;
14735cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_CLAMP:
14745cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
14755cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
14765cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
14775cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
14785cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_CLAMP_BORDER;
14795cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_MIRROR_REPEAT:
14805cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_MIRROR;
14815cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_MIRROR_CLAMP:
14825cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
14835cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
14845cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
14855cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
14865cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
14875cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	}
14885cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák}
14895cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák
14905cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšákunsigned r600_tex_filter(unsigned filter)
14915cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák{
14925cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	switch (filter) {
14935cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	default:
14945cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_FILTER_NEAREST:
14955cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_XY_FILTER_POINT;
14965cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_FILTER_LINEAR:
14975cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
14985cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	}
14995cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák}
15005cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák
15015cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšákunsigned r600_tex_mipfilter(unsigned filter)
15025cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák{
15035cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	switch (filter) {
15045cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_MIPFILTER_NEAREST:
15055cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_Z_FILTER_POINT;
15065cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_MIPFILTER_LINEAR:
15075cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
15085cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	default:
15095cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_TEX_MIPFILTER_NONE:
15105cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_Z_FILTER_NONE;
15115cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	}
15125cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák}
15135cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák
15145cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšákunsigned r600_tex_compare(unsigned compare)
15155cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák{
15165cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	switch (compare) {
15175cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	default:
15185cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_NEVER:
15195cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
15205cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_LESS:
15215cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
15225cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_EQUAL:
15235cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
15245cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_LEQUAL:
15255cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
15265cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_GREATER:
15275cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
15285cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_NOTEQUAL:
15295cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
15305cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_GEQUAL:
15315cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
15325cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	case PIPE_FUNC_ALWAYS:
15335cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák		return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
15345cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák	}
15355cc9aa0e02f222fd6a8f16f65d8c7f5eda06f893Marek Olšák}
1536