nv50_state.c revision a8da04cb861b8f9caf3acd33f52f64621f0c15e2
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/*
2857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Copyright 2008 Ben Skeggs
3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
4857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"),
6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation
7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions:
10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in
12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software.
13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * SOFTWARE.
21857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */
22857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs
2347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_state.h"
2447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h"
2547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_util.h"
26c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs#include "pipe/p_inlines.h"
2747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
28a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton#include "tgsi/util/tgsi_parse.h"
29a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton
3047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h"
31866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs#include "nv50_texture.h"
3247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
333250bacd2411d3f1af50135599380b2140238535Ben Skeggs#include "nouveau/nouveau_stateobj.h"
343250bacd2411d3f1af50135599380b2140238535Ben Skeggs
3547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
3647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe,
3747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_blend_state *cso)
3847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
393250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
403250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
413250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj);
423250bacd2411d3f1af50135599380b2140238535Ben Skeggs	unsigned cmask = 0, i;
433250bacd2411d3f1af50135599380b2140238535Ben Skeggs
443250bacd2411d3f1af50135599380b2140238535Ben Skeggs	/*XXX ignored:
453250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 * 	- dither
463250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 */
473250bacd2411d3f1af50135599380b2140238535Ben Skeggs
483250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->blend_enable == 0) {
493250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
503250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
513250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 0);
523250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
533250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
543250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
553250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 1);
563250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5);
573250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->rgb_func));
584bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_src_factor));
594bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_dst_factor));
603250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->alpha_func));
614bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_src_factor));
623250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1);
634bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_dst_factor));
643250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
653250bacd2411d3f1af50135599380b2140238535Ben Skeggs
663250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->logicop_enable == 0 ) {
673250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1);
683250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 0);
693250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
703250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2);
713250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 1);
723250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_logicop_func(cso->logicop_func));
733250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
743250bacd2411d3f1af50135599380b2140238535Ben Skeggs
753250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_R)
763250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 0);
773250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_G)
783250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 4);
793250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_B)
803250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 8);
813250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_A)
823250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 12);
833250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8);
843250bacd2411d3f1af50135599380b2140238535Ben Skeggs	for (i = 0; i < 8; i++)
853250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data(so, cmask);
863250bacd2411d3f1af50135599380b2140238535Ben Skeggs
873250bacd2411d3f1af50135599380b2140238535Ben Skeggs	bso->pipe = *cso;
883250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(so, &bso->so);
893250bacd2411d3f1af50135599380b2140238535Ben Skeggs	return (void *)bso;
9047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
9147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
9247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
9347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso)
9447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
953250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
963250bacd2411d3f1af50135599380b2140238535Ben Skeggs
973250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->blend = hwcso;
983250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND;
9947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
10047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
10147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
10247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso)
10347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
1043250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = hwcso;
1053250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1063250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(NULL, &bso->so);
1073250bacd2411d3f1af50135599380b2140238535Ben Skeggs	FREE(bso);
10847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
10947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
110866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggsstatic INLINE unsigned
111866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggswrap_mode(unsigned wrap)
112866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs{
113866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (wrap) {
114866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_REPEAT:
115866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_REPEAT;
116866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_REPEAT:
117866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_REPEAT;
118866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
119866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP_TO_EDGE;
120866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
121866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP_TO_BORDER;
122866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP:
123866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP;
124866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
125866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP_TO_EDGE;
126866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
127866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP_TO_BORDER;
128866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP:
129866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP;
130866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
131866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		NOUVEAU_ERR("unknown wrap mode: %d\n", wrap);
132866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_REPEAT;
133866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
134866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs}
13547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
13647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_create(struct pipe_context *pipe,
13747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			  const struct pipe_sampler_state *cso)
13847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
139c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	unsigned *tsc = CALLOC(8, sizeof(unsigned));
140c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
141866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	tsc[0] = (0x00024000 |
142866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_s) << 0) |
143866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_t) << 3) |
144866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_r) << 6));
145866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
146866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->mag_img_filter) {
147866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
148866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_LINEAR;
149866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
150866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
151866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
152866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_NEAREST;
153866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
154866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
155866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
156866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_img_filter) {
157866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
158866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_LINEAR;
159866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
160866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
161866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
162866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_NEAREST;
163866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
164866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
165866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
166866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_mip_filter) {
167866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_LINEAR:
168866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_LINEAR;
169866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
170866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NEAREST:
171866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NEAREST;
172866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
173866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NONE:
174866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
175866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NONE;
176866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
177866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
178c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
179c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	return (void *)tsc;
18047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
18147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
18247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
1839a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
18447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
185c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
186c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
187c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
188c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->sampler_nr = nr;
189c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nv50->sampler_nr; i++)
190c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs		nv50->sampler[i] = sampler[i];
191c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
192c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_SAMPLER;
19347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
19447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
19547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
19647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
19747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
198c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	FREE(hwcso);
19947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
20047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
20179bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsstatic void
2029a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
2039a4938d7033101122b627786273ff37229b5558aBen Skeggs			 struct pipe_texture **pt)
20479bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
205c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
206c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
207c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
208c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nr; i++)
209bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs		pipe_texture_reference((void *)&nv50->miptree[i], pt[i]);
210c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = nr; i < nv50->miptree_nr; i++)
211bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs		pipe_texture_reference((void *)&nv50->miptree[i], NULL);
212c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
213c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->miptree_nr = nr;
214c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_TEXTURE;
21579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs}
21679bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs
21747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
21847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_create(struct pipe_context *pipe,
21947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			     const struct pipe_rasterizer_state *cso)
22047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
221cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
222cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
223cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso =
224cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		CALLOC_STRUCT(nv50_rasterizer_stateobj);
225cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
226cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	/*XXX: ignored
227cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- light_twosize
228cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_smooth
229cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- multisample
230cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_sprite / sprite_coord_mode
231cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 */
232cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
233cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_SHADE_MODEL, 1);
234cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->flatshade ? NV50TCL_SHADE_MODEL_FLAT :
235cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs				       NV50TCL_SHADE_MODEL_SMOOTH);
236cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
237cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
238cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->line_width));
239cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_SMOOTH_ENABLE, 1);
240cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->line_smooth ? 1 : 0);
241cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->line_stipple_enable) {
242cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
243cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 1);
244cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_PATTERN, 1);
245e52d37d56c91e152bc149230410ed700ff1cffe2Ben Skeggs		so_data  (so, (cso->line_stipple_pattern << 8) |
246cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			       cso->line_stipple_factor);
247cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
248cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
249cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 0);
250cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
251cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
252cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POINT_SIZE, 1);
253cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->point_size));
254cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
255cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
256cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
257cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
258cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
259cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
260cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
261cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
262cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
263cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data(so, cso->poly_smooth ? 1 : 0);
264cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
265cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
266cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->cull_mode != PIPE_WINDING_NONE);
267cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
268cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CCW);
269cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
270cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
271cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
272cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
273cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
274cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
275cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
276cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
277cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
278cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
279cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
280cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
281cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
282cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
283cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
284cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CW);
285cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
286cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
287cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
288cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
289cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
290cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
291cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
292cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
293cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
294cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
295cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
296cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
297cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
298cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
299cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
300cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
301cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_ENABLE, 1);
302cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->poly_stipple_enable ? 1 : 0);
303cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
304cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
305cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_POINT) ||
306cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_POINT))
307cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
308cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
309cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
310cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_LINE) ||
311cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_LINE))
312cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
313cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
314cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
315cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_FILL) ||
316cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_FILL))
317cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
318cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
319cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
320cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
321cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->offset_cw || cso->offset_ccw) {
322cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_FACTOR, 1);
323cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, fui(cso->offset_scale));
324cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_UNITS, 1);
325fea9eb284248adda65afdc3833385d4b03bb25aaBen Skeggs		so_data  (so, fui(cso->offset_units));
326cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
327cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
328cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	rso->pipe = *cso;
329cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(so, &rso->so);
330cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	return (void *)rso;
33147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
33247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
33347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
33447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
33547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
336cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
337cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
338cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->rasterizer = hwcso;
339cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->dirty |= NV50_NEW_RASTERIZER;
34047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
34147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
34247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
34347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso)
34447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
345cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso = hwcso;
346cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
347cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(NULL, &rso->so);
348cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	FREE(rso);
34947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
35047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
35147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
3523af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
3533af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs			const struct pipe_depth_stencil_alpha_state *cso)
35447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
35506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
35606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = CALLOC_STRUCT(nv50_zsa_stateobj);
35706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
35806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
35906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_method(so, tesla, NV50TCL_DEPTH_WRITE_ENABLE, 1);
3605a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs	so_data  (so, cso->depth.writemask ? 1 : 0);
361101305f37f7268354a50b825bcb66894e4a0b777Ben Skeggs	if (cso->depth.enabled) {
36206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
3635a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs		so_data  (so, 1);
36406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_FUNC, 1);
36506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->depth.func));
36606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
36706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
36806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
36906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
37006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
37170f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs	/*XXX: yes, I know they're backwards.. header needs fixing */
37206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[0].enabled) {
37370f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 5);
37406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
37506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
37606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
37706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
37806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
37970f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs		so_method(so, tesla, NV50TCL_STENCIL_BACK_FUNC_REF, 3);
38006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].ref_value);
38106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].write_mask);
38206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].value_mask);
38306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
38470f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
38506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
38606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
38706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
38806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[1].enabled) {
38970f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 8);
39006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
39106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
39206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
39306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
39406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
39506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].ref_value);
39606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].write_mask);
39706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].value_mask);
39806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
39970f0f0ebdfa40de0fe03ca94294d372b9fa4642dBen Skeggs		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
40006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
40106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
40206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
40306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->alpha.enabled) {
40406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
40506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
40606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
40706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, fui(cso->alpha.ref));
40806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->alpha.func));
40906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
41006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
41106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
41206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
41306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
41406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	zsa->pipe = *cso;
41506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(so, &zsa->so);
41606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	return (void *)zsa;
41747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
41847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
41947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
4203af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_bind(struct pipe_context *pipe, void *hwcso)
42147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
42206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
42306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
42406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->zsa = hwcso;
42506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->dirty |= NV50_NEW_ZSA;
42647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
42747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
42847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
4293af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_delete(struct pipe_context *pipe, void *hwcso)
43047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
43106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = hwcso;
43206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
43306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(NULL, &zsa->so);
43406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	FREE(zsa);
43547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
43647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
43747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
43847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe,
43947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
44047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
441f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
442f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
443a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
444b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_VERTEX;
445f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
446f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
44747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
44847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
44947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
45047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso)
45147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
452f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
453f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
454f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vertprog = hwcso;
455f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_VERTPROG;
45647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
45747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
45847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
45947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
46047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
461f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
462a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
463f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
464a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
465a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE((void*)p->pipe.tokens);
466a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
46747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
46847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
46947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
47047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe,
47147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
47247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
473f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
474f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
475a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
476b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_FRAGMENT;
477f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
478f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
47947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
48047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
48147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
48247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso)
48347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
484f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
485f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
486f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->fragprog = hwcso;
487f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_FRAGPROG;
48847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
48947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
49047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
49147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
49247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
493f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
494a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
495f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
496a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
497a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE((void*)p->pipe.tokens);
498a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
49947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
50047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
50147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
50247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe,
50347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_blend_color *bcol)
50447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5052fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5062fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5072fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->blend_colour = *bcol;
5082fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND_COLOUR;
50947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
51047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
51147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
51247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe,
51347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		    const struct pipe_clip_state *clip)
51447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
51547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
51647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
51747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
51847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
51947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_constant_buffer *buf )
52047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
521f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
522f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
523f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_VERTEX) {
524f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_VERTEX] = buf->buffer;
525716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_VERTPROG_CB;
526f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	} else
527f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_FRAGMENT) {
528f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_FRAGMENT] = buf->buffer;
529716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_FRAGPROG_CB;
530f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	}
53147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
53247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
53347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
53447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe,
53547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			   const struct pipe_framebuffer_state *fb)
53647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
537cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
538cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs
539cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->framebuffer = *fb;
540cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->dirty |= NV50_NEW_FRAMEBUFFER;
54147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
54247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
54347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
54447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe,
54547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_poly_stipple *stipple)
54647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5472fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5482fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5492fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->stipple = *stipple;
5502fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_STIPPLE;
55147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
55247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
55347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
55447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe,
55547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		       const struct pipe_scissor_state *s)
55647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5572fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5582fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5592fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->scissor = *s;
5602fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_SCISSOR;
56147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
56247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
56347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
56447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe,
56547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_viewport_state *vpt)
56647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5672fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5682fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5692fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->viewport = *vpt;
5702fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_VIEWPORT;
57147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
57247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
57347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
574bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
575bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			const struct pipe_vertex_buffer *vb)
57647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
577f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
578f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
579f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count);
580f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxbuf_nr = count;
581f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
582f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
58347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
58447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
58547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
586bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_elements(struct pipe_context *pipe, unsigned count,
587bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			 const struct pipe_vertex_element *ve)
58847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
589f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
590f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
591f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxelt, ve, sizeof(*ve) * count);
592f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxelt_nr = count;
593f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
594f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
59547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
59647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
59747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
59847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50)
59947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
60047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_blend_state = nv50_blend_state_create;
60147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_blend_state = nv50_blend_state_bind;
60247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_blend_state = nv50_blend_state_delete;
60347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
60447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_sampler_state = nv50_sampler_state_create;
6059a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.bind_sampler_states = nv50_sampler_state_bind;
60647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
6079a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.set_sampler_textures = nv50_set_sampler_texture;
60847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
60947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
61047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
61147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_rasterizer_state = nv50_rasterizer_state_delete;
61247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
6133af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.create_depth_stencil_alpha_state =
6143af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_create;
6153af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.bind_depth_stencil_alpha_state =
6163af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_bind;
6173af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.delete_depth_stencil_alpha_state =
6183af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_delete;
61947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
62047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_vs_state = nv50_vp_state_create;
62147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_vs_state = nv50_vp_state_bind;
62247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_vs_state = nv50_vp_state_delete;
62347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
62447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_fs_state = nv50_fp_state_create;
62547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_fs_state = nv50_fp_state_bind;
62647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_fs_state = nv50_fp_state_delete;
62747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
62847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_blend_color = nv50_set_blend_color;
62947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_clip_state = nv50_set_clip_state;
63047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
63147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
63247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
63347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_scissor_state = nv50_set_scissor_state;
63447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_viewport_state = nv50_set_viewport_state;
63547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
636bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_buffers = nv50_set_vertex_buffers;
637bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_elements = nv50_set_vertex_elements;
63847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
63947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
640