r600_state.c revision 58c243905b0cfcbf1b0299a0f7f0ea90755e36cc
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
2372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Authors:
2472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *      Jerome Glisse
2572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
2672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include <stdio.h>
277a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse#include <errno.h>
28742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_inlines.h"
29742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_format.h"
30742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "util/u_memory.h"
31b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie#include "util/u_pack_color.h"
3272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
34742ee7935da60dda974795243d2e0fcf31accb59Jerome Glisse#include "r600_resource.h"
3572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
364af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic void clean_flush(struct r600_context *rctx, struct radeon_state *flush);
374af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic int setup_cb_flush(struct r600_context *rctx, struct radeon_state *flush);
384af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic int setup_db_flush(struct r600_context *rctx, struct radeon_state *flush);
394af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie
4049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airliestatic struct r600_context_state *r600_new_context_state(unsigned type)
4149b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie{
4249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate = CALLOC_STRUCT(r600_context_state);
4349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	if (rstate == NULL)
4449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie		return NULL;
4549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->type = type;
4649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->refcount = 1;
4749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
4849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie}
4915ce70252c5357081a61f3494261c7e343174301Jerome Glisse
506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_blend_state(struct pipe_context *ctx,
516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_blend_state *state)
526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
5449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate;
556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
5649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_blend_type);
5749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.blend = *state;
589ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->blend(rctx, &rstate->rstate[0], &rstate->state.blend);
5949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie
6049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_dsa_state(struct pipe_context *ctx,
6449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie				   const struct pipe_depth_stencil_alpha_state *state)
656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
6649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate;
676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
6849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_dsa_type);
6949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.dsa = *state;
7049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
726f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
736f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_rs_state(struct pipe_context *ctx,
746f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_rasterizer_state *state)
756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
7649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate;
776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
7849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_rasterizer_type);
7949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.rasterizer = *state;
8049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_sampler_state(struct pipe_context *ctx,
846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_sampler_state *state)
856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
8749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate;
886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
8949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_sampler_type);
9049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.sampler = *state;
919ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->sampler(rctx, &rstate->rstate[0], &rstate->state.sampler, 0);
929ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->sampler_border(rctx, &rstate->rstate[1], &rstate->state.sampler, 0);
9349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
956f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
963a672785df247e6f8ce95616166b74d4fd10ede0Dave Airliestatic void r600_remove_sampler_view(struct r600_shader_sampler_states *sampler,
973a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie				     struct r600_context_state *rstate)
983a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie{
993a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	int i, j;
1003a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie
1013a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	for (i = 0; i < sampler->nview; i++) {
1023a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie		for (j = 0; j < rstate->nrstate; j++) {
1033a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie			if (sampler->view[i] == &rstate->rstate[j])
1043a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie				sampler->view[i] = NULL;
1053a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie		}
1063a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	}
1073a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie}
1086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_sampler_view_destroy(struct pipe_context *ctx,
1096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse				      struct pipe_sampler_view *state)
1106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate = (struct r600_context_state *)state;
1123a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	struct r600_context *rctx = r600_context(ctx);
1136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
1143a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	/* need to search list of vs/ps sampler views and remove it from any - uggh */
1153a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	r600_remove_sampler_view(&rctx->ps_sampler, rstate);
1163a672785df247e6f8ce95616166b74d4fd10ede0Dave Airlie	r600_remove_sampler_view(&rctx->vs_sampler, rstate);
1176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	r600_context_state_decref(rstate);
1186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
1196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
1206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *ctx,
1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse							struct pipe_resource *texture,
1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse							const struct pipe_sampler_view *state)
1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
1259ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	struct r600_context *rctx = r600_context(ctx);
1266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
12749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_sampler_view_type);
12849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.sampler_view = *state;
12949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.sampler_view.texture = NULL;
1306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	pipe_reference(NULL, &texture->reference);
1316f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rstate->state.sampler_view.texture = texture;
1326f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rstate->state.sampler_view.reference.count = 1;
13342c1f27149828e5b5143f5e53ca3bd7c04a4e762Jerome Glisse	rstate->state.sampler_view.context = ctx;
1349ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->resource(ctx, &rstate->rstate[0], &rstate->state.sampler_view, 0);
1356f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return &rstate->state.sampler_view;
1366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
1376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
138191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_sampler_view(struct pipe_context *ctx,
139191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				  unsigned count,
140191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				  struct pipe_sampler_view **views,
141191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				  struct r600_shader_sampler_states *sampler,
142191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				  unsigned shader_id)
143f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{
144f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_context *rctx = r600_context(ctx);
145f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_context_state *rstate;
146f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	unsigned i;
147f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
148191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nview; i++) {
149191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		radeon_draw_unbind(&rctx->draw, sampler->view[i]);
150f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	}
151191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
152f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	for (i = 0; i < count; i++) {
153f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		rstate = (struct r600_context_state *)views[i];
154f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		if (rstate) {
155f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse			rstate->nrstate = 0;
156f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		}
157f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	}
158f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	for (i = 0; i < count; i++) {
159f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		rstate = (struct r600_context_state *)views[i];
160f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		if (rstate) {
161f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse			if (rstate->nrstate >= R600_MAX_RSTATE)
162f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse				continue;
163f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse			if (rstate->nrstate) {
164f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse				memcpy(&rstate->rstate[rstate->nrstate], &rstate->rstate[0], sizeof(struct radeon_state));
165f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse			}
166191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_state_convert(&rstate->rstate[rstate->nrstate], R600_STATE_RESOURCE, i, shader_id);
167191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			sampler->view[i] = &rstate->rstate[rstate->nrstate];
168f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse			rstate->nrstate++;
169f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		}
170f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	}
171191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	sampler->nview = count;
172f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse}
173f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
174191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_ps_sampler_view(struct pipe_context *ctx,
175f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse					unsigned count,
176f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse					struct pipe_sampler_view **views)
177f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{
178f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_context *rctx = r600_context(ctx);
179191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_set_sampler_view(ctx, count, views, &rctx->ps_sampler, R600_SHADER_PS);
180191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie}
181f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
182191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_set_vs_sampler_view(struct pipe_context *ctx,
183191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie					unsigned count,
184191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie					struct pipe_sampler_view **views)
185191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{
186191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	struct r600_context *rctx = r600_context(ctx);
187191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_set_sampler_view(ctx, count, views, &rctx->vs_sampler, R600_SHADER_VS);
188f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse}
189f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
1906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_shader_state(struct pipe_context *ctx,
1916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_shader_state *state)
1926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
1936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
19449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	struct r600_context_state *rstate;
19549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	int r;
1966f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
19749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_shader_type);
19849b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.shader = *state;
19949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	r =  r600_pipe_shader_create(&rctx->context, rstate, rstate->state.shader.tokens);
20049b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	if (r) {
20149b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie		r600_context_state_decref(rstate);
20249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie		return NULL;
20349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	}
20449b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	return rstate;
2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
2066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void *r600_create_vertex_elements(struct pipe_context *ctx,
2086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse				unsigned count,
2096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse				const struct pipe_vertex_element *elements)
2106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
2116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_vertex_element *v = CALLOC_STRUCT(r600_vertex_element);
2126f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	assert(count < 32);
2146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	v->count = count;
2156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	memcpy(v->elements, elements, count * sizeof(struct pipe_vertex_element));
2166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	v->refcount = 1;
2176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return v;
2186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
2196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
220f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glissestatic void r600_delete_vertex_element(struct pipe_context *ctx, void *state)
221f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{
222f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_vertex_element *v = (struct r600_vertex_element*)state;
223f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
224f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	if (v == NULL)
225f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		return;
226f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	if (--v->refcount)
227f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		return;
228f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	free(v);
229f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse}
230f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
231f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glissestatic void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
232f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse{
233f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_context *rctx = r600_context(ctx);
234f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	struct r600_vertex_element *v = (struct r600_vertex_element*)state;
235f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
236f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	r600_delete_vertex_element(ctx, rctx->vertex_elements);
237f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	rctx->vertex_elements = v;
238f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	if (v) {
239f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse		v->refcount++;
240f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	}
241f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse}
242f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse
2434ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_rasterizer_state(struct pipe_context *ctx, void *state)
2446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
2456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
2466f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate = (struct r600_context_state *)state;
2476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	if (state == NULL)
2496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return;
2504ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->rasterizer = r600_context_state_decref(rctx->rasterizer);
2514ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->rasterizer = r600_context_state_incref(rstate);
2524ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie}
2534ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie
2544ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_blend_state(struct pipe_context *ctx, void *state)
2554ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie{
2564ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	struct r600_context *rctx = r600_context(ctx);
2574ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	struct r600_context_state *rstate = (struct r600_context_state *)state;
2584ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie
2594ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	if (state == NULL)
2606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return;
2614ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->blend = r600_context_state_decref(rctx->blend);
2624ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->blend = r600_context_state_incref(rstate);
2634ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie
2644ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie}
2654ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie
2664ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airliestatic void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
2674ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie{
2684ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	struct r600_context *rctx = r600_context(ctx);
2694ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	struct r600_context_state *rstate = (struct r600_context_state *)state;
2704ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie
2714ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	if (state == NULL)
2724ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie		return;
2734ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->dsa = r600_context_state_decref(rctx->dsa);
2744ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->dsa = r600_context_state_incref(rstate);
2756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
2766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_bind_ps_shader(struct pipe_context *ctx, void *state)
2786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
2796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
2806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate = (struct r600_context_state *)state;
2816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->ps_shader = r600_context_state_decref(rctx->ps_shader);
2836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->ps_shader = r600_context_state_incref(rstate);
2846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
2856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_bind_vs_shader(struct pipe_context *ctx, void *state)
2876f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
2886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
2896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate = (struct r600_context_state *)state;
2906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
2916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->vs_shader = r600_context_state_decref(rctx->vs_shader);
2926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->vs_shader = r600_context_state_incref(rstate);
2936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
2946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
295191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_sampler_shader(struct pipe_context *ctx,
296191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				     unsigned count, void **states,
297191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie				     struct r600_shader_sampler_states *sampler, unsigned shader_id)
2986f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
2996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
3006f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
3016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	unsigned i;
3026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
303191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nsampler; i++) {
304191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		radeon_draw_unbind(&rctx->draw, sampler->sampler[i]);
305f8d11b2e8ebaab2845080900ff4a2068f9a20b5fJerome Glisse	}
306191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nborder; i++) {
307191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		radeon_draw_unbind(&rctx->draw, sampler->border[i]);
308b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie	}
30931b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse	for (i = 0; i < count; i++) {
31031b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse		rstate = (struct r600_context_state *)states[i];
31131b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse		if (rstate) {
31231b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse			rstate->nrstate = 0;
31331b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse		}
3146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	}
3156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	for (i = 0; i < count; i++) {
3166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		rstate = (struct r600_context_state *)states[i];
31715ce70252c5357081a61f3494261c7e343174301Jerome Glisse		if (rstate) {
31831b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse			if (rstate->nrstate >= R600_MAX_RSTATE)
31931b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse				continue;
32031b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse			if (rstate->nrstate) {
32131b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse				memcpy(&rstate->rstate[rstate->nrstate], &rstate->rstate[0], sizeof(struct radeon_state));
322b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie				memcpy(&rstate->rstate[rstate->nrstate+1], &rstate->rstate[1], sizeof(struct radeon_state));
32331b84acbd2ae2dc7555844c5a2eead932b8759a7Jerome Glisse			}
324191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_state_convert(&rstate->rstate[rstate->nrstate], R600_STATE_SAMPLER, i, shader_id);
325191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_state_convert(&rstate->rstate[rstate->nrstate + 1], R600_STATE_SAMPLER_BORDER, i, shader_id);
326191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			sampler->sampler[i] = &rstate->rstate[rstate->nrstate];
327191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			sampler->border[i] = &rstate->rstate[rstate->nrstate + 1];
328b5fcf8274916afdf29aca5e8db7611687b03abe4Dave Airlie			rstate->nrstate += 2;
32915ce70252c5357081a61f3494261c7e343174301Jerome Glisse		}
3306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	}
331191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	sampler->nsampler = count;
332191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	sampler->nborder = count;
3336f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
3346f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
335191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_ps_sampler(struct pipe_context *ctx,
3366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					unsigned count, void **states)
3376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
3386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
339191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_bind_sampler_shader(ctx, count, states, &rctx->ps_sampler, R600_SHADER_PS);
340191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie}
3416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
342191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_vs_sampler(struct pipe_context *ctx,
343191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie					unsigned count, void **states)
344191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{
345191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	struct r600_context *rctx = r600_context(ctx);
346191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_bind_sampler_shader(ctx, count, states, &rctx->vs_sampler, R600_SHADER_VS);
3476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
34972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glissestatic void r600_delete_state(struct pipe_context *ctx, void *state)
35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
3516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate = (struct r600_context_state *)state;
35272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
3536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	r600_context_state_decref(rstate);
35472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
35572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
3566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_blend_color(struct pipe_context *ctx,
3576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_blend_color *color)
3586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
3597bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie	struct r600_context *rctx = r600_context(ctx);
3607bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie
3617bcd39ce50b7b710bb8561c430f345ebe91ab9a3Dave Airlie	rctx->blend_color = *color;
3626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
3636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
3646f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_clip_state(struct pipe_context *ctx,
3656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse				const struct pipe_clip_state *state)
3666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
3673e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie	struct r600_context *rctx = r600_context(ctx);
3683e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie	struct r600_context_state *rstate;
3693e58007892cb2e89cb979ab172b7160adc84a44dDave Airlie
370ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie	r600_context_state_decref(rctx->clip);
371ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie
37249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_clip_type);
37349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.clip = *state;
3749ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->ucp(rctx, &rstate->rstate[0], &rstate->state.clip);
3754ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->clip = rstate;
3766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
3776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
3786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_framebuffer_state(struct pipe_context *ctx,
3796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_framebuffer_state *state)
3806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
3816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
3826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
38349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	int i;
3846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
385040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie	if (rctx->framebuffer) {
386040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie		for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++)
387040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie			radeon_draw_unbind(&rctx->draw, &rctx->framebuffer->rstate[i+1]);
388040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie		radeon_draw_unbind(&rctx->draw, &rctx->framebuffer->rstate[0]);
389040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie	}
3904af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	clean_flush(rctx, &rctx->hw_states.cb_flush);
3914af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	clean_flush(rctx, &rctx->hw_states.db_flush);
392ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie
393040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie	r600_context_state_decref(rctx->framebuffer);
394040411de267bd6b0d82a621430cbbbb943fd455aDave Airlie
39549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_framebuffer_type);
39649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.framebuffer = *state;
39749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	for (i = 0; i < rstate->state.framebuffer.nr_cbufs; i++) {
3985b82777311965d26e534bd522afb0f679622d504Dave Airlie		pipe_reference(NULL, &state->cbufs[i]->reference);
39949b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	}
4005b82777311965d26e534bd522afb0f679622d504Dave Airlie	pipe_reference(NULL, &state->zsbuf->reference);
4014ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->framebuffer = rstate;
40249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	for (i = 0; i < state->nr_cbufs; i++) {
4039ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie		rctx->vtbl->cb(rctx, &rstate->rstate[i+1], state, i);
40415ce70252c5357081a61f3494261c7e343174301Jerome Glisse	}
40515ce70252c5357081a61f3494261c7e343174301Jerome Glisse	if (state->zsbuf) {
4069ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie		rctx->vtbl->db(rctx, &rstate->rstate[0], state);
40715ce70252c5357081a61f3494261c7e343174301Jerome Glisse	}
4084af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	/* setup flush states */
4094af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	setup_cb_flush(rctx, &rctx->hw_states.cb_flush);
4104af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	setup_db_flush(rctx, &rctx->hw_states.db_flush);
4114af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie
4124ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	return;
4136f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_polygon_stipple(struct pipe_context *ctx,
4166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					 const struct pipe_poly_stipple *state)
4176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
4216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_scissor_state(struct pipe_context *ctx,
4256f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_scissor_state *state)
4266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
4286f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
4296f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
430ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie	r600_context_state_decref(rctx->scissor);
431ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie
43249b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_scissor_type);
43349b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.scissor = *state;
4344ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->scissor = rstate;
4356f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4366f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_stencil_ref(struct pipe_context *ctx,
4386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse				const struct pipe_stencil_ref *state)
4396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4406f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
4416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
4426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
443ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie	r600_context_state_decref(rctx->stencil_ref);
444ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie
44549b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_stencil_ref_type);
44649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.stencil_ref = *state;
4474ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->stencil_ref = rstate;
4486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_vertex_buffers(struct pipe_context *ctx,
4516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					unsigned count,
4526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_vertex_buffer *buffers)
4536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4546f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
4556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	unsigned i;
4560d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie	boolean any_user_buffers = FALSE;
4576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	for (i = 0; i < rctx->nvertex_buffer; i++) {
4596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		pipe_resource_reference(&rctx->vertex_buffer[i].buffer, NULL);
4606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	}
4616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	memcpy(rctx->vertex_buffer, buffers, sizeof(struct pipe_vertex_buffer) * count);
4626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	for (i = 0; i < count; i++) {
4636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		rctx->vertex_buffer[i].buffer = NULL;
4640d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie		if (r600_buffer_is_user_buffer(buffers[i].buffer))
4650d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie			any_user_buffers = TRUE;
4666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		pipe_resource_reference(&rctx->vertex_buffer[i].buffer, buffers[i].buffer);
4676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	}
4680d76bb5d4c5c867155f7fb381c46018e1560b790Dave Airlie	rctx->any_user_vbs = any_user_buffers;
4696f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->nvertex_buffer = count;
4706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
4716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
4726d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wustatic void r600_set_index_buffer(struct pipe_context *ctx,
4736d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu				  const struct pipe_index_buffer *ib)
4746d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu{
4756d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	struct r600_context *rctx = r600_context(ctx);
4766d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
4776d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	if (ib) {
4786d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
4796d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		memcpy(&rctx->index_buffer, ib, sizeof(rctx->index_buffer));
480313df4156279f84ebc5b98a7540820b994762650Jerome Glisse	} else {
4816d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
4826d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		memset(&rctx->index_buffer, 0, sizeof(rctx->index_buffer));
4836d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	}
4846d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
4856d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	/* TODO make this more like a state */
4866d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu}
4876d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
4886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic void r600_set_viewport_state(struct pipe_context *ctx,
4896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse					const struct pipe_viewport_state *state)
4906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
4916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
4926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	struct r600_context_state *rstate;
4936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
494ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie	r600_context_state_decref(rctx->viewport);
495ce7077423fc9ea003606dd28ca87311644b7e5c2Dave Airlie
49649b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate = r600_new_context_state(pipe_viewport_type);
49749b4f5259bdbfce4f84a6997ccb36376f953068cDave Airlie	rstate->state.viewport = *state;
4989ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->viewport(rctx, &rstate->rstate[0], &rstate->state.viewport);
4994ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->viewport = rstate;
5006f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
5016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
5026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissevoid r600_init_state_functions(struct r600_context *rctx)
5036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
5046f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_blend_state = r600_create_blend_state;
5056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_depth_stencil_alpha_state = r600_create_dsa_state;
5066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_fs_state = r600_create_shader_state;
5076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_rasterizer_state = r600_create_rs_state;
5086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_sampler_state = r600_create_sampler_state;
5096f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_sampler_view = r600_create_sampler_view;
5106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_vertex_elements_state = r600_create_vertex_elements;
5116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.create_vs_state = r600_create_shader_state;
5124ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->context.bind_blend_state = r600_bind_blend_state;
5134ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->context.bind_depth_stencil_alpha_state = r600_bind_dsa_state;
5146f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.bind_fragment_sampler_states = r600_bind_ps_sampler;
5156f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.bind_fs_state = r600_bind_ps_shader;
5164ca207b174c3500c13e8a994f2ff2bc5c94fb18fDave Airlie	rctx->context.bind_rasterizer_state = r600_bind_rasterizer_state;
5176f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.bind_vertex_elements_state = r600_bind_vertex_elements;
5186f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.bind_vertex_sampler_states = r600_bind_vs_sampler;
5196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.bind_vs_state = r600_bind_vs_shader;
5206f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_blend_state = r600_delete_state;
5216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_depth_stencil_alpha_state = r600_delete_state;
5226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_fs_state = r600_delete_state;
5236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_rasterizer_state = r600_delete_state;
5246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_sampler_state = r600_delete_state;
5256f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_vertex_elements_state = r600_delete_vertex_element;
5266f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.delete_vs_state = r600_delete_state;
5276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_blend_color = r600_set_blend_color;
5286f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_clip_state = r600_set_clip_state;
52950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
530363dfb83f1ca7f1ab09eec30aeb89732c5ce3e02Jerome Glisse	if (radeon_get_family_class(rctx->rw) == EVERGREEN)
53150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		rctx->context.set_constant_buffer = eg_set_constant_buffer;
53250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	else if (rctx->screen->use_mem_constant)
533d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		rctx->context.set_constant_buffer = r600_set_constant_buffer_mem;
534d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	else
535d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		rctx->context.set_constant_buffer = r600_set_constant_buffer_file;
53650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
5376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_fragment_sampler_views = r600_set_ps_sampler_view;
5386f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_framebuffer_state = r600_set_framebuffer_state;
5396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_polygon_stipple = r600_set_polygon_stipple;
5406f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_sample_mask = r600_set_sample_mask;
5416f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_scissor_state = r600_set_scissor_state;
5426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_stencil_ref = r600_set_stencil_ref;
5436f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_vertex_buffers = r600_set_vertex_buffers;
5446d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	rctx->context.set_index_buffer = r600_set_index_buffer;
5456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_vertex_sampler_views = r600_set_vs_sampler_view;
5466f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.set_viewport_state = r600_set_viewport_state;
5476f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
5486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
5496f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
5506f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestruct r600_context_state *r600_context_state_incref(struct r600_context_state *rstate)
5516f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
5526f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	if (rstate == NULL)
5536f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return NULL;
5546f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	rstate->refcount++;
5556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return rstate;
5566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
5576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
5586f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestruct r600_context_state *r600_context_state_decref(struct r600_context_state *rstate)
5596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse{
5606f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	unsigned i;
5616f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
5626f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	if (rstate == NULL)
5636f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return NULL;
5646f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	if (--rstate->refcount)
5656f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return NULL;
5666f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	switch (rstate->type) {
5676f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_sampler_view_type:
5686f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		pipe_resource_reference(&rstate->state.sampler_view.texture, NULL);
5696f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		break;
5706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_framebuffer_type:
5716f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		for (i = 0; i < rstate->state.framebuffer.nr_cbufs; i++) {
5726f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			pipe_surface_reference(&rstate->state.framebuffer.cbufs[i], NULL);
5734af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie			radeon_state_fini(&rstate->rstate[i+1]);
5746f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		}
5756f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		pipe_surface_reference(&rstate->state.framebuffer.zsbuf, NULL);
5766f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		break;
5776f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_viewport_type:
5786f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_depth_type:
5796f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_rasterizer_type:
5806f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_poly_stipple_type:
5816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_scissor_type:
5826f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_clip_type:
5836f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_stencil_type:
5846f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_alpha_type:
5856f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_dsa_type:
5866f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_blend_type:
5876f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_stencil_ref_type:
5886f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_shader_type:
5896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	case pipe_sampler_type:
5906f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		break;
5916f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	default:
5926f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		R600_ERR("invalid type %d\n", rstate->type);
5936f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return NULL;
5946f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	}
59567234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	radeon_state_fini(&rstate->rstate[0]);
5966f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	FREE(rstate);
5976f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return NULL;
5986f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse}
5996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
600191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airliestatic void r600_bind_shader_sampler(struct r600_context *rctx, struct r600_shader_sampler_states *sampler)
601191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie{
602191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	int i;
603191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
604191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nsampler; i++) {
605191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		if (sampler->sampler[i])
606191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_draw_bind(&rctx->draw, sampler->sampler[i]);
607191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	}
608191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
609191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nborder; i++) {
610191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		if (sampler->border[i])
611191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_draw_bind(&rctx->draw, sampler->border[i]);
612191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	}
613191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
614191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	for (i = 0; i < sampler->nview; i++) {
615191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie		if (sampler->view[i])
616191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie			radeon_draw_bind(&rctx->draw, sampler->view[i]);
617191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	}
618191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie}
619191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
6204af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airliestatic void clean_flush(struct r600_context *rctx, struct radeon_state *flush)
6214af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie{
6224af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	struct r600_screen *rscreen = rctx->screen;
6234af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	int i;
6244af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie
6254af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	for (i = 0 ; i < flush->nbo; i++) {
6264af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie		radeon_ws_bo_reference(rscreen->rw, &flush->bo[i], NULL);
6274af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	}
6284af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	flush->nbo = 0;
6294af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie	radeon_state_fini(flush);
6304af55364ccb50e4f19cbb59ac6f51d86f58dedbaDave Airlie}
63142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
63242da02743358fd4b212f47d2727340dcd0578b5aDave Airliestatic int setup_cb_flush(struct r600_context *rctx, struct radeon_state *flush)
63342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie{
63442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_screen *rscreen = rctx->screen;
63542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_resource_texture *rtex;
63642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_resource *rbuffer;
63742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct pipe_surface *surf;
63842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	int i;
63942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
64042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	radeon_state_init(flush, rscreen->rw, R600_STATE_CB_FLUSH, 0, 0);
64142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
64242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++) {
64342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		surf = rctx->framebuffer->state.framebuffer.cbufs[i];
64442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
64542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		rtex = (struct r600_resource_texture*)surf->texture;
64642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		rbuffer = &rtex->resource;
64742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		/* just need to the bo to the flush list */
648f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie		radeon_ws_bo_reference(rscreen->rw, &flush->bo[i], rbuffer->bo);
64942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		flush->placement[i] = RADEON_GEM_DOMAIN_VRAM;
65042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	}
65142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	flush->nbo = rctx->framebuffer->state.framebuffer.nr_cbufs;
65242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	return radeon_state_pm4(flush);
65342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie}
65442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
65542da02743358fd4b212f47d2727340dcd0578b5aDave Airliestatic int setup_db_flush(struct r600_context *rctx, struct radeon_state *flush)
65642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie{
65742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_screen *rscreen = rctx->screen;
65842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_resource_texture *rtex;
65942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct r600_resource *rbuffer;
66042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	struct pipe_surface *surf;
66142da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
66242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	surf = rctx->framebuffer->state.framebuffer.zsbuf;
66342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
66442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	if (!surf)
66542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie		return 0;
66642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
66742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	radeon_state_init(flush, rscreen->rw, R600_STATE_DB_FLUSH, 0, 0);
66842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	rtex = (struct r600_resource_texture*)surf->texture;
66942da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	rbuffer = &rtex->resource;
67042da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	/* just need to the bo to the flush list */
671f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	radeon_ws_bo_reference(rscreen->rw, &flush->bo[0], rbuffer->bo);
67242da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	flush->placement[0] = RADEON_GEM_DOMAIN_VRAM;
67342da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
67442da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	flush->nbo = 1;
67542da02743358fd4b212f47d2727340dcd0578b5aDave Airlie	return radeon_state_pm4(flush);
67642da02743358fd4b212f47d2727340dcd0578b5aDave Airlie}
67742da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
678ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisseint r600_context_hw_states(struct pipe_context *ctx)
67972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
680ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse	struct r600_context *rctx = r600_context(ctx);
6816f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	unsigned i;
68250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
68366e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	/* build new states */
6849ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->rasterizer(rctx, &rctx->hw_states.rasterizer);
6859ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->scissor(rctx, &rctx->hw_states.scissor);
6869ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->dsa(rctx, &rctx->hw_states.dsa);
6879ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	rctx->vtbl->cb_cntl(rctx, &rctx->hw_states.cb_cntl);
68842da02743358fd4b212f47d2727340dcd0578b5aDave Airlie
68966e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	/* bind states */
69050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	radeon_draw_bind(&rctx->draw, &rctx->config);
69150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
69266e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_draw_bind(&rctx->draw, &rctx->hw_states.rasterizer);
69366e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_draw_bind(&rctx->draw, &rctx->hw_states.scissor);
69466e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_draw_bind(&rctx->draw, &rctx->hw_states.dsa);
69566e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_draw_bind(&rctx->draw, &rctx->hw_states.cb_cntl);
69666e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse
69750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	radeon_draw_bind(&rctx->draw, &rctx->hw_states.db_flush);
69850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	radeon_draw_bind(&rctx->draw, &rctx->hw_states.cb_flush);
6996f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse
70015ce70252c5357081a61f3494261c7e343174301Jerome Glisse	if (rctx->viewport) {
70167234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse		radeon_draw_bind(&rctx->draw, &rctx->viewport->rstate[0]);
702de0b76cab22caa9fc7260f80acb8f151ccced6c5Jerome Glisse	}
70315ce70252c5357081a61f3494261c7e343174301Jerome Glisse	if (rctx->blend) {
70467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse		radeon_draw_bind(&rctx->draw, &rctx->blend->rstate[0]);
705de0b76cab22caa9fc7260f80acb8f151ccced6c5Jerome Glisse	}
70615ce70252c5357081a61f3494261c7e343174301Jerome Glisse	if (rctx->clip) {
70767234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse		radeon_draw_bind(&rctx->draw, &rctx->clip->rstate[0]);
70815ce70252c5357081a61f3494261c7e343174301Jerome Glisse	}
70915ce70252c5357081a61f3494261c7e343174301Jerome Glisse	for (i = 0; i < rctx->framebuffer->state.framebuffer.nr_cbufs; i++) {
71067234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse		radeon_draw_bind(&rctx->draw, &rctx->framebuffer->rstate[i+1]);
71115ce70252c5357081a61f3494261c7e343174301Jerome Glisse	}
71215ce70252c5357081a61f3494261c7e343174301Jerome Glisse	if (rctx->framebuffer->state.framebuffer.zsbuf) {
71367234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse		radeon_draw_bind(&rctx->draw, &rctx->framebuffer->rstate[0]);
71415ce70252c5357081a61f3494261c7e343174301Jerome Glisse	}
715191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
716191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_bind_shader_sampler(rctx, &rctx->vs_sampler);
717191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie	r600_bind_shader_sampler(rctx, &rctx->ps_sampler);
718191bfc5c3be219e2389fec004a51ea3239f434c8Dave Airlie
7196f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
72072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
721