nv50_state.c revision 01670ca8073b57029625873b5c8374fb8716e1eb
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"
25c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs#include "pipe/p_inlines.h"
2647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
27fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_parse.h"
28a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton
2947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h"
30866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs#include "nv50_texture.h"
3147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
323250bacd2411d3f1af50135599380b2140238535Ben Skeggs#include "nouveau/nouveau_stateobj.h"
333250bacd2411d3f1af50135599380b2140238535Ben Skeggs
3447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
3547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe,
3647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_blend_state *cso)
3747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
383250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
393250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
403250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj);
413250bacd2411d3f1af50135599380b2140238535Ben Skeggs	unsigned cmask = 0, i;
423250bacd2411d3f1af50135599380b2140238535Ben Skeggs
433250bacd2411d3f1af50135599380b2140238535Ben Skeggs	/*XXX ignored:
443250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 * 	- dither
453250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 */
463250bacd2411d3f1af50135599380b2140238535Ben Skeggs
473250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->blend_enable == 0) {
483250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
493250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
503250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 0);
513250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
523250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
533250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
543250bacd2411d3f1af50135599380b2140238535Ben Skeggs			so_data(so, 1);
553250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5);
563250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->rgb_func));
574bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_src_factor));
584bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->rgb_dst_factor));
593250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_blend_eqn(cso->alpha_func));
604bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_src_factor));
613250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1);
624bde3a72ab0b4246cd779a6d1e2a72943f25c0f6Ben Skeggs		so_data  (so, 0x4000 | nvgl_blend_func(cso->alpha_dst_factor));
633250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
643250bacd2411d3f1af50135599380b2140238535Ben Skeggs
653250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->logicop_enable == 0 ) {
663250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1);
673250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 0);
683250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
693250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2);
703250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 1);
713250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_logicop_func(cso->logicop_func));
723250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
733250bacd2411d3f1af50135599380b2140238535Ben Skeggs
743250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_R)
753250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 0);
763250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_G)
773250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 4);
783250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_B)
793250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 8);
803250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->colormask & PIPE_MASK_A)
813250bacd2411d3f1af50135599380b2140238535Ben Skeggs		cmask |= (1 << 12);
823250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8);
833250bacd2411d3f1af50135599380b2140238535Ben Skeggs	for (i = 0; i < 8; i++)
843250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data(so, cmask);
853250bacd2411d3f1af50135599380b2140238535Ben Skeggs
863250bacd2411d3f1af50135599380b2140238535Ben Skeggs	bso->pipe = *cso;
873250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(so, &bso->so);
88ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &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{
1396c1627a51c237428a79613fcda1412c4660780deBen Skeggs	struct nv50_sampler_stateobj *sso = CALLOC(1, sizeof(*sso));
1406c1627a51c237428a79613fcda1412c4660780deBen Skeggs	unsigned *tsc = sso->tsc;
141534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	float limit;
142c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
143534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	tsc[0] = (0x00026000 |
144866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_s) << 0) |
145866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_t) << 3) |
146866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_r) << 6));
147866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
148866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->mag_img_filter) {
149866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
150866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_LINEAR;
151866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
152866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
153866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
154866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_NEAREST;
155866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
156866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
157866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
158866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_img_filter) {
159866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
160866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_LINEAR;
161866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
162866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
163866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
164866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_NEAREST;
165866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
166866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
167866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
168866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_mip_filter) {
169866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_LINEAR:
170866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_LINEAR;
171866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
172866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NEAREST:
173866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NEAREST;
174866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
175866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NONE:
176866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
177866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NONE;
178866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
179866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
180c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
181f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 16.0)
182f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (7 << 20);
183f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
184f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 12.0)
185f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (6 << 20);
186f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
187f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 10.0)
188f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (5 << 20);
189f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
190f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 8.0)
191f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (4 << 20);
192f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
193f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 6.0)
194f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (3 << 20);
195f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
196f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 4.0)
197f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (2 << 20);
198f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
199f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	if (cso->max_anisotropy >= 2.0)
200f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (1 << 20);
201f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs
20268bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs	if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
20368bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs		tsc[0] |= (1 << 8);
20468bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs		tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7);
20568bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs	}
20668bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs
207534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	limit = CLAMP(cso->lod_bias, -16.0, 15.0);
208df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[1] |= ((int)(limit * 256.0) & 0x1fff) << 12;
209534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
210534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	tsc[2] |= ((int)CLAMP(cso->max_lod, 0.0, 15.0) << 20) |
211534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs		  ((int)CLAMP(cso->min_lod, 0.0, 15.0) << 8);
212534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
213df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[4] = fui(cso->border_color[0]);
214df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[5] = fui(cso->border_color[1]);
215df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[6] = fui(cso->border_color[2]);
216df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[7] = fui(cso->border_color[3]);
217df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller
2186c1627a51c237428a79613fcda1412c4660780deBen Skeggs	sso->normalized = cso->normalized_coords;
2196c1627a51c237428a79613fcda1412c4660780deBen Skeggs	return (void *)sso;
22047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
22147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
22247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
2239a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
22447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
225c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
226c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
227c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
228c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->sampler_nr = nr;
229c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nv50->sampler_nr; i++)
230c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs		nv50->sampler[i] = sampler[i];
231c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
232c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_SAMPLER;
23347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
23447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
23547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
23647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
23747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
238c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	FREE(hwcso);
23947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
24047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
24179bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsstatic void
2429a4938d7033101122b627786273ff37229b5558aBen Skeggsnv50_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
2439a4938d7033101122b627786273ff37229b5558aBen Skeggs			 struct pipe_texture **pt)
24479bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
245c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
246c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	int i;
247c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
248c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = 0; i < nr; i++)
249bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs		pipe_texture_reference((void *)&nv50->miptree[i], pt[i]);
250c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	for (i = nr; i < nv50->miptree_nr; i++)
251bf94027fdde51aed476e9bfdd4326aa9040440b0Ben Skeggs		pipe_texture_reference((void *)&nv50->miptree[i], NULL);
252c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
253c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->miptree_nr = nr;
254c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_TEXTURE;
25579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs}
25679bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs
25747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
25847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_create(struct pipe_context *pipe,
25947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			     const struct pipe_rasterizer_state *cso)
26047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
261cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
262cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
263cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso =
264cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		CALLOC_STRUCT(nv50_rasterizer_stateobj);
265cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
266cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	/*XXX: ignored
267cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- light_twosize
268cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_smooth
269cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- multisample
270cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_sprite / sprite_coord_mode
271cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 */
272cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
273cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_SHADE_MODEL, 1);
274cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->flatshade ? NV50TCL_SHADE_MODEL_FLAT :
275cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs				       NV50TCL_SHADE_MODEL_SMOOTH);
2768313801911426a9a7b0bdbf2d6a4b2232428cc5bChristoph Bumiller	so_method(so, tesla, 0x1684, 1);
2778313801911426a9a7b0bdbf2d6a4b2232428cc5bChristoph Bumiller	so_data  (so, cso->flatshade_first ? 0 : 1);
278cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
2794d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller	so_method(so, tesla, NV50TCL_VERTEX_TWO_SIDE_ENABLE, 1);
2804d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller	so_data  (so, cso->light_twoside);
2814d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller
282cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
283cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->line_width));
284cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_SMOOTH_ENABLE, 1);
285cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->line_smooth ? 1 : 0);
286cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->line_stipple_enable) {
287cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
288cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 1);
289cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_PATTERN, 1);
290e52d37d56c91e152bc149230410ed700ff1cffe2Ben Skeggs		so_data  (so, (cso->line_stipple_pattern << 8) |
291cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			       cso->line_stipple_factor);
292cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
293cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
294cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 0);
295cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
296cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
297cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POINT_SIZE, 1);
298cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->point_size));
299cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
30001670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller	so_method(so, tesla, NV50TCL_POINT_SPRITE_ENABLE, 1);
30101670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller	so_data  (so, cso->point_sprite);
30201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller
303cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
304cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
305cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
306cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
307cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
308cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_cw));
309cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, nvgl_polygon_mode(cso->fill_ccw));
310cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
311cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data(so, cso->poly_smooth ? 1 : 0);
312cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
313cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
314cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->cull_mode != PIPE_WINDING_NONE);
315cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->front_winding == PIPE_WINDING_CCW) {
316cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CCW);
317cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
318cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
319cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
320cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
321cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
322cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
323cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
324cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
325cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
326cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
327cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
328cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
329cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
330cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
331cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
332cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CW);
333cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		switch (cso->cull_mode) {
334cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CCW:
335cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
336cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
337cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_CW:
338cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT);
339cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
340cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		case PIPE_WINDING_BOTH:
341cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
342cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
343cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		default:
344cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			so_data(so, NV50TCL_CULL_FACE_BACK);
345cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			break;
346cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		}
347cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
348cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
349cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_ENABLE, 1);
350cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->poly_stipple_enable ? 1 : 0);
351cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
352cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
353cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_POINT) ||
354cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_POINT))
355cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
356cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
357cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
358cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_LINE) ||
359cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_LINE))
360cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
361cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
362cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
363cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if ((cso->offset_cw && cso->fill_cw == PIPE_POLYGON_MODE_FILL) ||
364cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	    (cso->offset_ccw && cso->fill_ccw == PIPE_POLYGON_MODE_FILL))
365cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 1);
366cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	else
367cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, 0);
368cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
369cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->offset_cw || cso->offset_ccw) {
370cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_FACTOR, 1);
371cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, fui(cso->offset_scale));
372cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_UNITS, 1);
373fea9eb284248adda65afdc3833385d4b03bb25aaBen Skeggs		so_data  (so, fui(cso->offset_units));
374cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
375cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
376cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	rso->pipe = *cso;
377cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(so, &rso->so);
378ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &so);
379cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	return (void *)rso;
38047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
38147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
38247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
38347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
38447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
385cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
386cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
387cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->rasterizer = hwcso;
388cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->dirty |= NV50_NEW_RASTERIZER;
38947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
39047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
39147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
39247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso)
39347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
394cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso = hwcso;
395cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
396cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(NULL, &rso->so);
397cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	FREE(rso);
39847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
39947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
40047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
4013af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
4023af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs			const struct pipe_depth_stencil_alpha_state *cso)
40347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
40406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
40506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = CALLOC_STRUCT(nv50_zsa_stateobj);
40606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_stateobj *so = so_new(64, 0);
40706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
40806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_method(so, tesla, NV50TCL_DEPTH_WRITE_ENABLE, 1);
4095a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs	so_data  (so, cso->depth.writemask ? 1 : 0);
410101305f37f7268354a50b825bcb66894e4a0b777Ben Skeggs	if (cso->depth.enabled) {
41106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
4125a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs		so_data  (so, 1);
41306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_FUNC, 1);
41406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->depth.func));
41506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
41606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
41706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
41806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
41906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
4200204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller	/* XXX: keep hex values until header is updated (names reversed) */
42106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[0].enabled) {
4220204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller		so_method(so, tesla, 0x1380, 8);
42306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
42406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
42506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
42606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
42706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
42806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[0].ref_value);
429a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[0].writemask);
430a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[0].valuemask);
43106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
4320204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller		so_method(so, tesla, 0x1380, 1);
43306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
43406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
43506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
43606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[1].enabled) {
4370204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller		so_method(so, tesla, 0x1594, 5);
43806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
43906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
44006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
44106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
44206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
4430204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller		so_method(so, tesla, 0x0f54, 3);
44406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, cso->stencil[1].ref_value);
445a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[1].writemask);
446a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[1].valuemask);
44706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
4480204c7d8d712c1023b6d75f2f50b0e89d7777de8Christoph Bumiller		so_method(so, tesla, 0x1594, 1);
44906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
45006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
45106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
45206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->alpha.enabled) {
45306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
45406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
45506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
456d6888e811d24eaa7e8d9093be606394f00435c05Zack Rusin		so_data  (so, fui(cso->alpha.ref_value));
45706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->alpha.func));
45806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
45906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
46006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
46106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
46206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
46306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	zsa->pipe = *cso;
46406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(so, &zsa->so);
465ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &so);
46606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	return (void *)zsa;
46747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
46847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
46947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
4703af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_bind(struct pipe_context *pipe, void *hwcso)
47147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
47206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
47306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
47406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->zsa = hwcso;
47506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->dirty |= NV50_NEW_ZSA;
47647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
47747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
47847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
4793af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_delete(struct pipe_context *pipe, void *hwcso)
48047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
48106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = hwcso;
48206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
48306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(NULL, &zsa->so);
48406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	FREE(zsa);
48547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
48647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
48747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
48847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe,
48947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
49047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
491f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
492f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
493a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
494b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_VERTEX;
495f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
496f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
49747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
49847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
49947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
50047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso)
50147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
502f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
503f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
504f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vertprog = hwcso;
505f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_VERTPROG;
50647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
50747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
50847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
50947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
51047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
511f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
512a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
513f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
514a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
515a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE((void*)p->pipe.tokens);
516a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
51747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
51847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
51947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
52047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe,
52147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
52247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
523f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
524f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
525a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
526b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_FRAGMENT;
527f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	tgsi_scan_shader(p->pipe.tokens, &p->info);
528f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
52947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
53047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
53147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
53247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso)
53347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
534f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
535f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
536f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->fragprog = hwcso;
537f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_FRAGPROG;
53847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
53947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
54047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
54147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
54247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
543f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
544a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
545f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
546a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
547a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE((void*)p->pipe.tokens);
548a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
54947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
55047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
55147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
55247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe,
55347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_blend_color *bcol)
55447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5552fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5562fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5572fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->blend_colour = *bcol;
5582fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND_COLOUR;
55947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
56047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
56147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
56247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe,
56347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		    const struct pipe_clip_state *clip)
56447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
56547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
56647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
56747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
56847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
56947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_constant_buffer *buf )
57047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
571f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
572f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
573f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_VERTEX) {
574f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_VERTEX] = buf->buffer;
575716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_VERTPROG_CB;
576f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	} else
577f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_FRAGMENT) {
578f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs		nv50->constbuf[PIPE_SHADER_FRAGMENT] = buf->buffer;
579716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_FRAGPROG_CB;
580f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	}
58147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
58247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
58347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
58447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe,
58547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			   const struct pipe_framebuffer_state *fb)
58647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
587cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
588cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs
589cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->framebuffer = *fb;
590cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->dirty |= NV50_NEW_FRAMEBUFFER;
59147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
59247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
59347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
59447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe,
59547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_poly_stipple *stipple)
59647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
5972fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
5982fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
5992fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->stipple = *stipple;
6002fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_STIPPLE;
60147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
60247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
60347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
60447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe,
60547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		       const struct pipe_scissor_state *s)
60647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
6072fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
6082fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
6092fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->scissor = *s;
6102fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_SCISSOR;
61147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
61247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
61347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
61447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe,
61547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_viewport_state *vpt)
61647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
6172fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
6182fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
6192fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->viewport = *vpt;
6202fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_VIEWPORT;
62147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
62247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
62347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
624bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
625bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			const struct pipe_vertex_buffer *vb)
62647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
627f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
628f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
629f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count);
630f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxbuf_nr = count;
631f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
632f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
63347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
63447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
63547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
636bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_elements(struct pipe_context *pipe, unsigned count,
637bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			 const struct pipe_vertex_element *ve)
63847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
639f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
640f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
641f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	memcpy(nv50->vtxelt, ve, sizeof(*ve) * count);
642f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vtxelt_nr = count;
643f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
644f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
64547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
64647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
64747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
64847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50)
64947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
65047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_blend_state = nv50_blend_state_create;
65147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_blend_state = nv50_blend_state_bind;
65247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_blend_state = nv50_blend_state_delete;
65347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
65447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_sampler_state = nv50_sampler_state_create;
6559a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.bind_sampler_states = nv50_sampler_state_bind;
65647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
6579a4938d7033101122b627786273ff37229b5558aBen Skeggs	nv50->pipe.set_sampler_textures = nv50_set_sampler_texture;
65847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
65947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
66047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
66147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_rasterizer_state = nv50_rasterizer_state_delete;
66247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
6633af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.create_depth_stencil_alpha_state =
6643af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_create;
6653af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.bind_depth_stencil_alpha_state =
6663af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_bind;
6673af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.delete_depth_stencil_alpha_state =
6683af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_delete;
66947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
67047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_vs_state = nv50_vp_state_create;
67147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_vs_state = nv50_vp_state_bind;
67247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_vs_state = nv50_vp_state_delete;
67347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
67447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_fs_state = nv50_fp_state_create;
67547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_fs_state = nv50_fp_state_bind;
67647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_fs_state = nv50_fp_state_delete;
67747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
67847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_blend_color = nv50_set_blend_color;
67947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_clip_state = nv50_set_clip_state;
68047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
68147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
68247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
68347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_scissor_state = nv50_set_scissor_state;
68447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_viewport_state = nv50_set_viewport_state;
68547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
686bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_buffers = nv50_set_vertex_buffers;
687bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_elements = nv50_set_vertex_elements;
68847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
68947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
690