nv50_state.c revision fea9eb284248adda65afdc3833385d4b03bb25aa
147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_state.h"
247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h"
347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_util.h"
4c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs#include "pipe/p_inlines.h"
547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h"
747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
83250bacd2411d3f1af50135599380b2140238535Ben Skeggs#include "nouveau/nouveau_stateobj.h"
93250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
1147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe,
1247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_blend_state *cso)
1347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
143250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
153250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
163250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj);
173250bacd2411d3f1af50135599380b2140238535Ben Skeggs	unsigned cmask = 0, i;
183250bacd2411d3f1af50135599380b2140238535Ben Skeggs
193250bacd2411d3f1af50135599380b2140238535Ben Skeggs	/*XXX ignored:
203250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 * 	- dither
213250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 */
223250bacd2411d3f1af50135599380b2140238535Ben Skeggs
233250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->blend_enable == 0) {
243250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
253250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
263250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 0);
273250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
283250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
293250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
303250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 1);
313250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5);
323250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->rgb_func));
334bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_src_factor));
344bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_dst_factor));
353250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->alpha_func));
364bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_src_factor));
373250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1);
384bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_dst_factor));
393250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
403250bacd2411d3f1af50135599380b2140238535Ben Skeggs
413250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->logicop_enable == 0 ) {
423250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1);
433250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 0);
443250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
453250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2);
463250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 1);
473250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_logicop_func(cso->logicop_func));
483250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
493250bacd2411d3f1af50135599380b2140238535Ben Skeggs
503250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_R)
513250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 0);
523250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_G)
533250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 4);
543250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_B)
553250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 8);
563250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_A)
573250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 12);
583250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8);
593250bacd2411d3f1af50135599380b2140238535Ben Skeggs	for (i = 0; i < 8; i++)
603250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data(so, cmask);
613250bacd2411d3f1af50135599380b2140238535Ben Skeggs
623250bacd2411d3f1af50135599380b2140238535Ben Skeggs	bso->pipe = *cso;
633250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(so, &bso->so);
643250bacd2411d3f1af50135599380b2140238535Ben Skeggs	return (void *)bso;
6547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
6647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
6747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
6847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso)
6947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
703250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
713250bacd2411d3f1af50135599380b2140238535Ben Skeggs
723250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->blend = hwcso;
733250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND;
7447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
7547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
7647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
7747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso)
7847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
793250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = hwcso;
803250bacd2411d3f1af50135599380b2140238535Ben Skeggs
813250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(NULL, &bso->so);
823250bacd2411d3f1af50135599380b2140238535Ben Skeggs	FREE(bso);
8347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
8447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
8547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
8647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_create(struct pipe_context *pipe,
8747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			  const struct pipe_sampler_state *cso)
8847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
89c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	unsigned *tsc = CALLOC(8, sizeof(unsigned));
90c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
91c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	tsc[0] = 0x00024080;
92c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	tsc[1] = 0x00000062;
93c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
94c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	return (void *)tsc;
9547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
9647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
9747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
989a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
9947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
100c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
101c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
102c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
103c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->sampler_nr = nr;
104c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nv50->sampler_nr; i++)
105c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs		nv50->sampler[i] = sampler[i];
106c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
107c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_SAMPLER;
10847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
10947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
11047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
11147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
11247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
113c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	FREE(hwcso);
11447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
11547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
11679bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsstatic void
1179a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
1189a4938d7033101122b627786273ff37229b5558aBen Skeggs			 struct pipe_texture **pt)
11979bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
120c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
121c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
122c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
123c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nr; i++)
124c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs		pipe_texture_reference(&nv50->miptree[i], pt[i]);
125c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = nr; i < nv50->miptree_nr; i++)
126c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs		pipe_texture_reference(&nv50->miptree[i], NULL);
127c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
128c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->miptree_nr = nr;
129c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_TEXTURE;
13079bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs}
13179bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs
13247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
13347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_create(struct pipe_context *pipe,
13447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			     const struct pipe_rasterizer_state *cso)
13547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
136cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
137cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
138cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso =
139cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		CALLOC_STRUCT(nv50_rasterizer_stateobj);
140cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
141cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	/*XXX: ignored
142cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- light_twosize
143cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_smooth
144cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- multisample
145cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_sprite / sprite_coord_mode
146cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 */
147cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
148cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_SHADE_MODEL, 1);
149cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->flatshade ? NV50TCL_SHADE_MODEL_FLAT :
150cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs				       NV50TCL_SHADE_MODEL_SMOOTH);
151cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
152cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
153cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->line_width));
154cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_SMOOTH_ENABLE, 1);
155cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->line_smooth ? 1 : 0);
156cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->line_stipple_enable) {
157cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
158cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 1);
159cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_PATTERN, 1);
160cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, (cso->line_stipple_pattern << 16) |
161cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			       cso->line_stipple_factor);
162cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
163cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
164cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 0);
165cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
166cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
167cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POINT_SIZE, 1);
168cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->point_size));
169cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
170cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
171cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
172cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
173cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
174cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
175cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
176cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
177cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
178cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data(so, cso->poly_smooth ? 1 : 0);
179cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
180cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
181cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->cull_mode != PIPE_WINDING_NONE);
182cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
183cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CCW);
184cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
185cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
186cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
187cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
188cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
189cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
190cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
191cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
192cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
193cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
194cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
195cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
196cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
197cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
198cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
199cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CW);
200cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
201cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
202cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
203cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
204cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
205cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
206cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
207cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
208cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
209cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
210cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
211cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
212cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
213cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
214cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
215cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
216cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_ENABLE, 1);
217cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->poly_stipple_enable ? 1 : 0);
218cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
219cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
220cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_POINT) ||
221cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_POINT))
222cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
223cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
224cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
225cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_LINE) ||
226cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_LINE))
227cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
228cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
229cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
230cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_FILL) ||
231cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_FILL))
232cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
233cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
234cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
235cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
236cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->offset_cw || cso->offset_ccw) {
237cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_FACTOR, 1);
238cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, fui(cso->offset_scale));
239cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_UNITS, 1);
240fea9eb284248adda65afdc3833385d4b03bb25aaBen Skeggs		so_data  (so, fui(cso->offset_units));
241cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
242cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
243cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	rso->pipe = *cso;
244cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(so, &rso->so);
245cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	return (void *)rso;
24647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
24747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
24847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
24947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
25047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
251cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
252cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
253cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->rasterizer = hwcso;
254cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->dirty |= NV50_NEW_RASTERIZER;
25547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
25647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
25747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
25847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso)
25947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
260cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso = hwcso;
261cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
262cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(NULL, &rso->so);
263cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	FREE(rso);
26447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
26547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
26647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
2673af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
2683af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs			const struct pipe_depth_stencil_alpha_state *cso)
26947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
27006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
27106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = CALLOC_STRUCT(nv50_zsa_stateobj);
27206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
27306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
27406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_method(so, tesla, NV50TCL_DEPTH_WRITE_ENABLE, 1);
2755a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs	so_data  (so, cso->depth.writemask ? 1 : 0);
276101305f37f7268354a50b825bcb66894e4a0b777Ben Skeggs	if (cso->depth.enabled) {
27706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
2785a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs		so_data  (so, 1);
27906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_FUNC, 1);
28006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->depth.func));
28106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
28206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
28306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
28406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
28506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
28606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[0].enabled) {
28706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 5);
28806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
28906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
29006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
29106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
29206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
29306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_STENCIL_FRONT_FUNC_REF, 3);
29406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].ref_value);
29506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].write_mask);
29606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].value_mask);
29706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
29806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
29906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
30006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
30106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
30206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[1].enabled) {
30306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 8);
30406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
30506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
30606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
30706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
30806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
30906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].ref_value);
31006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].write_mask);
31106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].value_mask);
31206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
31306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
31406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
31506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
31606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
31706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->alpha.enabled) {
31806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
31906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
32006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
32106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, fui(cso->alpha.ref));
32206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->alpha.func));
32306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
32406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
32506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
32606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
32706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
32806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	zsa->pipe = *cso;
32906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(so, &zsa->so);
33006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	return (void *)zsa;
33147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
33247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
33347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
3343af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_bind(struct pipe_context *pipe, void *hwcso)
33547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
33606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
33706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
33806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->zsa = hwcso;
33906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->dirty |= NV50_NEW_ZSA;
34047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
34147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
34247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
3433af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_delete(struct pipe_context *pipe, void *hwcso)
34447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
34506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = hwcso;
34606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
34706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(NULL, &zsa->so);
34806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	FREE(zsa);
34947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
35047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
35147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
35247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe,
35347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
35447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
355f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
356f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
357f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	p->pipe = *cso;
358b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_VERTEX;
359f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
360f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
36147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
36247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
36347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
36447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso)
36547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
366f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
367f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
368f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vertprog = hwcso;
369f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_VERTPROG;
37047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
37147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
37247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
37347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
37447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
375f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
376f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
377f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50_program_destroy(nv50, hwcso);
378f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	FREE(hwcso);
37947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
38047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
38147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
38247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe,
38347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
38447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
385f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
386f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
387f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	p->pipe = *cso;
388b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_FRAGMENT;
389f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
390f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
39147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
39247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
39347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
39447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso)
39547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
396f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
397f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
398f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->fragprog = hwcso;
399f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_FRAGPROG;
40047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
40147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
40247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
40347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
40447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
405f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
406f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
407f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50_program_destroy(nv50, hwcso);
408f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	FREE(hwcso);
40947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
41047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
41147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
41247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe,
41347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_blend_color *bcol)
41447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
4152fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
4162fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
4172fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->blend_colour = *bcol;
4182fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND_COLOUR;
41947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
42047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
42147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
42247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe,
42347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		    const struct pipe_clip_state *clip)
42447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
42547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
42647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
42747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
42847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
42947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_constant_buffer *buf )
43047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
431f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
432f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
433f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_VERTEX) {
434f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_VERTEX] = buf->buffer;
435716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_VERTPROG_CB;
436f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	} else
437f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_FRAGMENT) {
438f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_FRAGMENT] = buf->buffer;
439716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_FRAGPROG_CB;
440f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	}
44147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
44247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
44347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
44447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe,
44547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			   const struct pipe_framebuffer_state *fb)
44647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
447cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
448cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs
449cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->framebuffer = *fb;
450cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->dirty |= NV50_NEW_FRAMEBUFFER;
45147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
45247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
45347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
45447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe,
45547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_poly_stipple *stipple)
45647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
4572fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
4582fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
4592fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->stipple = *stipple;
4602fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_STIPPLE;
46147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
46247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
46347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
46447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe,
46547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		       const struct pipe_scissor_state *s)
46647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
4672fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
4682fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
4692fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->scissor = *s;
4702fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_SCISSOR;
47147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
47247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
47347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
47447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe,
47547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_viewport_state *vpt)
47647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
4772fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
4782fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
4792fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->viewport = *vpt;
4802fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_VIEWPORT;
48147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
48247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
48347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
484bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
485bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			const struct pipe_vertex_buffer *vb)
48647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
487f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
488f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
489f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count);
490f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxbuf_nr = count;
491f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
492f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
49347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
49447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
49547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
496bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_elements(struct pipe_context *pipe, unsigned count,
497bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			 const struct pipe_vertex_element *ve)
49847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
499f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
500f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
501f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxelt, ve, sizeof(*ve) * count);
502f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxelt_nr = count;
503f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
504f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
50547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
50647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
50747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
50847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50)
50947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
51047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_blend_state = nv50_blend_state_create;
51147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_blend_state = nv50_blend_state_bind;
51247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_blend_state = nv50_blend_state_delete;
51347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
51447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_sampler_state = nv50_sampler_state_create;
5159a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.bind_sampler_states = nv50_sampler_state_bind;
51647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
5179a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.set_sampler_textures = nv50_set_sampler_texture;
51847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
51947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
52047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
52147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_rasterizer_state = nv50_rasterizer_state_delete;
52247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
5233af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.create_depth_stencil_alpha_state =
5243af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_create;
5253af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.bind_depth_stencil_alpha_state =
5263af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_bind;
5273af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.delete_depth_stencil_alpha_state =
5283af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_delete;
52947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
53047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_vs_state = nv50_vp_state_create;
53147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_vs_state = nv50_vp_state_bind;
53247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_vs_state = nv50_vp_state_delete;
53347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
53447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_fs_state = nv50_fp_state_create;
53547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_fs_state = nv50_fp_state_bind;
53647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_fs_state = nv50_fp_state_delete;
53747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
53847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_blend_color = nv50_set_blend_color;
53947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_clip_state = nv50_set_clip_state;
54047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
54147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
54247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
54347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_scissor_state = nv50_set_scissor_state;
54447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_viewport_state = nv50_set_viewport_state;
54547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
546bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_buffers = nv50_set_vertex_buffers;
547bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_elements = nv50_set_vertex_elements;
54847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
54947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
550