nv50_state.c revision 588fa884d212eba5ffbc69fda75db37d7c77214c
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"
2528486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
26588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák#include "util/u_transfer.h"
2747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
28fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/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
35a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillerstatic INLINE uint32_t
36a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillernv50_colormask(unsigned mask)
37a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller{
38a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	uint32_t cmask = 0;
39a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller
40a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (mask & PIPE_MASK_R)
41a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		cmask |= 0x0001;
42a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (mask & PIPE_MASK_G)
43a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		cmask |= 0x0010;
44a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (mask & PIPE_MASK_B)
45a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		cmask |= 0x0100;
46a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (mask & PIPE_MASK_A)
47a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		cmask |= 0x1000;
48a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller
49a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	return cmask;
50a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller}
51a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller
52f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumillerstatic INLINE uint32_t
53f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumillernv50_blend_func(unsigned factor)
54f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller{
55f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	switch (factor) {
56f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_ZERO:
57f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ZERO;
58f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_ONE:
59f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE;
60f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_SRC_COLOR:
61f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_SRC_COLOR;
62f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_SRC_COLOR:
63f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_SRC_COLOR;
64f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_SRC_ALPHA:
65f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_SRC_ALPHA;
66f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
67f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_SRC_ALPHA;
68f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_DST_ALPHA:
69f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_DST_ALPHA;
70f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_DST_ALPHA:
71f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_DST_ALPHA;
72f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_DST_COLOR:
73f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_DST_COLOR;
74f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_DST_COLOR:
75f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_DST_COLOR;
76f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
77f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_SRC_ALPHA_SATURATE;
78f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_CONST_COLOR:
79f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_CONSTANT_COLOR;
80f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_CONST_COLOR:
81f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_CONSTANT_COLOR;
82f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_CONST_ALPHA:
83f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_CONSTANT_ALPHA;
84f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
85f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_CONSTANT_ALPHA;
86f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_SRC1_COLOR:
87f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_SRC1_COLOR;
88f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
89f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_SRC1_COLOR;
90f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_SRC1_ALPHA:
91f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_SRC1_ALPHA;
92f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
93f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ONE_MINUS_SRC1_ALPHA;
94f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	default:
95f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		return NV50TCL_BLEND_FUNC_SRC_RGB_ZERO;
96f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller	}
97f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller}
98f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller
9947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
10047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe,
10147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_blend_state *cso)
10247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
103c77ade8fed2be933af3f493932cedee7ca868b04Maarten Maathuis	struct nouveau_stateobj *so = so_new(5, 24, 0);
1043250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
1053250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = CALLOC_STRUCT(nv50_blend_stateobj);
106a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	unsigned i, blend_enabled = 0;
1073250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1083250bacd2411d3f1af50135599380b2140238535Ben Skeggs	/*XXX ignored:
1093250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 * 	- dither
1103250bacd2411d3f1af50135599380b2140238535Ben Skeggs	 */
1113250bacd2411d3f1af50135599380b2140238535Ben Skeggs
112a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	so_method(so, tesla, NV50TCL_BLEND_ENABLE(0), 8);
113a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (cso->independent_blend_enable) {
114a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		for (i = 0; i < 8; ++i) {
115a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			so_data(so, cso->rt[i].blend_enable);
116a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			if (cso->rt[i].blend_enable)
117a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller				blend_enabled = 1;
118a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		}
119a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	} else
120a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (cso->rt[0].blend_enable) {
121a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		blend_enabled = 1;
1223250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
123a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			so_data(so, 1);
1243250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
1253250bacd2411d3f1af50135599380b2140238535Ben Skeggs		for (i = 0; i < 8; i++)
126a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			so_data(so, 0);
127a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	}
128a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (blend_enabled) {
1293250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_EQUATION_RGB, 5);
130e908abf1740dce1a3b391ce5bcfda4f2a0b480deRoland Scheidegger		so_data  (so, nvgl_blend_eqn(cso->rt[0].rgb_func));
131f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		so_data  (so, nv50_blend_func(cso->rt[0].rgb_src_factor));
132f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		so_data  (so, nv50_blend_func(cso->rt[0].rgb_dst_factor));
133e908abf1740dce1a3b391ce5bcfda4f2a0b480deRoland Scheidegger		so_data  (so, nvgl_blend_eqn(cso->rt[0].alpha_func));
134f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		so_data  (so, nv50_blend_func(cso->rt[0].alpha_src_factor));
1353250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_BLEND_FUNC_DST_ALPHA, 1);
136f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller		so_data  (so, nv50_blend_func(cso->rt[0].alpha_dst_factor));
1373250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
1383250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1393250bacd2411d3f1af50135599380b2140238535Ben Skeggs	if (cso->logicop_enable == 0 ) {
1403250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 1);
1413250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 0);
1423250bacd2411d3f1af50135599380b2140238535Ben Skeggs	} else {
1433250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_method(so, tesla, NV50TCL_LOGIC_OP_ENABLE, 2);
1443250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, 1);
1453250bacd2411d3f1af50135599380b2140238535Ben Skeggs		so_data  (so, nvgl_logicop_func(cso->logicop_func));
1463250bacd2411d3f1af50135599380b2140238535Ben Skeggs	}
1473250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1483250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_method(so, tesla, NV50TCL_COLOR_MASK(0), 8);
149a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	if (cso->independent_blend_enable)
150a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		for (i = 0; i < 8; ++i)
151a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			so_data(so, nv50_colormask(cso->rt[i].colormask));
152a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	else {
153a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		uint32_t cmask = nv50_colormask(cso->rt[0].colormask);
154a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller		for (i = 0; i < 8; i++)
155a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller			so_data(so, cmask);
156a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller	}
1573250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1583250bacd2411d3f1af50135599380b2140238535Ben Skeggs	bso->pipe = *cso;
1593250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(so, &bso->so);
160ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &so);
1613250bacd2411d3f1af50135599380b2140238535Ben Skeggs	return (void *)bso;
16247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
16347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
16447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
16547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso)
16647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
1673250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
1683250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1693250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->blend = hwcso;
1703250bacd2411d3f1af50135599380b2140238535Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND;
17147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
17247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
17347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
17447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso)
17547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
1763250bacd2411d3f1af50135599380b2140238535Ben Skeggs	struct nv50_blend_stateobj *bso = hwcso;
1773250bacd2411d3f1af50135599380b2140238535Ben Skeggs
1783250bacd2411d3f1af50135599380b2140238535Ben Skeggs	so_ref(NULL, &bso->so);
1793250bacd2411d3f1af50135599380b2140238535Ben Skeggs	FREE(bso);
18047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
18147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
182866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggsstatic INLINE unsigned
183866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggswrap_mode(unsigned wrap)
184866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs{
185866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (wrap) {
186866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_REPEAT:
187866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_REPEAT;
188866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_REPEAT:
189866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_REPEAT;
190866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
191866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP_TO_EDGE;
192866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
193866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP_TO_BORDER;
194866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_CLAMP:
195866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_CLAMP;
196866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
197866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP_TO_EDGE;
198866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
199866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP_TO_BORDER;
200866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_WRAP_MIRROR_CLAMP:
201866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_MIRROR_CLAMP;
202866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
203866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		NOUVEAU_ERR("unknown wrap mode: %d\n", wrap);
204866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		return NV50TSC_1_0_WRAPS_REPEAT;
205866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
206866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs}
20747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
20847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_create(struct pipe_context *pipe,
20947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			  const struct pipe_sampler_state *cso)
21047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
2116c1627a51c237428a79613fcda1412c4660780deBen Skeggs	struct nv50_sampler_stateobj *sso = CALLOC(1, sizeof(*sso));
2126c1627a51c237428a79613fcda1412c4660780deBen Skeggs	unsigned *tsc = sso->tsc;
213534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	float limit;
214c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
215534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	tsc[0] = (0x00026000 |
216866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_s) << 0) |
217866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_t) << 3) |
218866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		  (wrap_mode(cso->wrap_r) << 6));
219866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
220866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->mag_img_filter) {
221866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
222866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_LINEAR;
223866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
224866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
225866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
226866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MAGF_NEAREST;
227866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
228866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
229866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
230866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_img_filter) {
231866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_LINEAR:
232866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_LINEAR;
233866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
234866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_FILTER_NEAREST:
235866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
236866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MINF_NEAREST;
237866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
238866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
239866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs
240866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	switch (cso->min_mip_filter) {
241866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_LINEAR:
242866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_LINEAR;
243866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
244866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NEAREST:
245866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NEAREST;
246866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
247866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	case PIPE_TEX_MIPFILTER_NONE:
248866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	default:
249866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		tsc[1] |= NV50TSC_1_1_MIPF_NONE;
250866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs		break;
251866a68dbd1ec9c3a6100de6d50890ac5068247dcBen Skeggs	}
252c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
253ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger	if (cso->max_anisotropy >= 16)
254f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (7 << 20);
255f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs	else
256ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger	if (cso->max_anisotropy >= 12)
257f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs		tsc[0] |= (6 << 20);
258198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller	else {
259ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger		tsc[0] |= (cso->max_anisotropy >> 1) << 20;
260198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller
261ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger		if (cso->max_anisotropy >= 4)
262198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller			tsc[1] |= NV50TSC_1_1_UNKN_ANISO_35;
263198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller		else
264ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger		if (cso->max_anisotropy >= 2)
265198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller			tsc[1] |= NV50TSC_1_1_UNKN_ANISO_15;
266198925caa18526e5aa908ab50482aff814207dc2Christoph Bumiller	}
267f7c2010525a3fb37079c2cff51d4c593ef8e807bBen Skeggs
26868bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs	if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) {
269cc0ffaba7d1df234b3c62769ade9dee712117d2fChristoph Bumiller		/* XXX: must be deactivated for non-shadow textures */
270cc0ffaba7d1df234b3c62769ade9dee712117d2fChristoph Bumiller		tsc[0] |= (1 << 9);
271cc0ffaba7d1df234b3c62769ade9dee712117d2fChristoph Bumiller		tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10;
27268bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs	}
27368bb26b62d87ae6737ba51a4bffda49eeb7647cbBen Skeggs
274534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	limit = CLAMP(cso->lod_bias, -16.0, 15.0);
275df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[1] |= ((int)(limit * 256.0) & 0x1fff) << 12;
276534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
277534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs	tsc[2] |= ((int)CLAMP(cso->max_lod, 0.0, 15.0) << 20) |
278534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs		  ((int)CLAMP(cso->min_lod, 0.0, 15.0) << 8);
279534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs
280df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[4] = fui(cso->border_color[0]);
281df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[5] = fui(cso->border_color[1]);
282df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[6] = fui(cso->border_color[2]);
283df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller	tsc[7] = fui(cso->border_color[3]);
284df189c9efc0fbcdce816af483f0147ab635280d1Christoph Bumiller
2856c1627a51c237428a79613fcda1412c4660780deBen Skeggs	sso->normalized = cso->normalized_coords;
2866c1627a51c237428a79613fcda1412c4660780deBen Skeggs	return (void *)sso;
28747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
28847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
28944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller/* type == 0 for VPs, 1 for GPs, 2 for FPs, which is how the
29044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller * relevant tesla methods are indexed (NV50TCL_BIND_TSC etc.)
29144570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller */
2926a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void
2936a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillernv50_sampler_state_bind(struct pipe_context *pipe, unsigned type,
2946a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller			unsigned nr, void **sampler)
29547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
296c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
297c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
2986a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller	memcpy(nv50->sampler[type], sampler, nr * sizeof(void *));
299c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
3006a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller	nv50->sampler_nr[type] = nr;
301c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_SAMPLER;
30247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
30347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
30447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
3056a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillernv50_vp_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **s)
3066a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{
30744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	nv50_sampler_state_bind(pipe, 0, nr, s);
3086a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller}
3096a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller
3106a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void
3116a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillernv50_fp_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **s)
3126a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{
31344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	nv50_sampler_state_bind(pipe, 2, nr, s);
3146a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller}
3156a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller
3166a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void
31747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
31847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
319c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	FREE(hwcso);
32047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
32147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
3226a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void
32344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillernv50_set_sampler_views(struct pipe_context *pipe, unsigned p,
3246a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol		       unsigned nr,
3256a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol		       struct pipe_sampler_view **views)
32679bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
327c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
3286a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller	unsigned i;
329c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
33044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	for (i = 0; i < nr; i++)
33144570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller		pipe_sampler_view_reference(&nv50->sampler_views[p][i],
33244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller					    views[i]);
333c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs
33444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	for (i = nr; i < nv50->sampler_view_nr[p]; i++)
33544570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller		pipe_sampler_view_reference(&nv50->sampler_views[p][i], NULL);
33644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller
33744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	nv50->sampler_view_nr[p] = nr;
338c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs	nv50->dirty |= NV50_NEW_TEXTURE;
33979bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs}
34079bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs
3416a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void
3426a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolnv50_set_vp_sampler_views(struct pipe_context *pipe,
3436a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol			  unsigned nr,
3446a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol			  struct pipe_sampler_view **views)
3456a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{
34644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	nv50_set_sampler_views(pipe, 0, nr, views);
3476a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol}
3486a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol
3496a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic void
3506a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolnv50_set_fp_sampler_views(struct pipe_context *pipe,
3516a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol			  unsigned nr,
3526a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol			  struct pipe_sampler_view **views)
3536a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{
35444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	nv50_set_sampler_views(pipe, 2, nr, views);
35544570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller}
35644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller
35744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic void
35844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillernv50_sampler_view_destroy(struct pipe_context *pipe,
35944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller			  struct pipe_sampler_view *view)
36044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{
361287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	pipe_resource_reference(&view->texture, NULL);
36244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	FREE(nv50_sampler_view(view));
3636a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller}
3646a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller
3656a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic struct pipe_sampler_view *
3666a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolnv50_create_sampler_view(struct pipe_context *pipe,
367287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			 struct pipe_resource *texture,
3686a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol			 const struct pipe_sampler_view *templ)
3696a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{
37044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	struct nv50_sampler_view *view = CALLOC_STRUCT(nv50_sampler_view);
3716a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol
37244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	view->pipe = *templ;
37344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	view->pipe.reference.count = 1;
37444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	view->pipe.texture = NULL;
375287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	pipe_resource_reference(&view->pipe.texture, texture);
37644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	view->pipe.context = pipe;
3776a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol
37844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	if (!nv50_tex_construct(view)) {
37944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller		nv50_sampler_view_destroy(pipe, &view->pipe);
38044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller		return NULL;
38144570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	}
38244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller	return &view->pipe;
3836a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol}
3846a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol
3856a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol
38647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
38747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_create(struct pipe_context *pipe,
38847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			     const struct pipe_rasterizer_state *cso)
38947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
3902b8c0cf16959c07341309484da41b2e9a17e5266Ben Skeggs	struct nouveau_stateobj *so = so_new(16, 22, 0);
391cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
392cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso =
393cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		CALLOC_STRUCT(nv50_rasterizer_stateobj);
394cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
395cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	/*XXX: ignored
3960bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	 * 	- light_twoside
397cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_smooth
398cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- multisample
399cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 * 	- point_sprite / sprite_coord_mode
400cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	 */
401cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
4022b8c0cf16959c07341309484da41b2e9a17e5266Ben Skeggs	so_method(so, tesla, NV50TCL_SCISSOR_ENABLE(0), 1);
4032b8c0cf16959c07341309484da41b2e9a17e5266Ben Skeggs	so_data  (so, cso->scissor);
4042b8c0cf16959c07341309484da41b2e9a17e5266Ben Skeggs
405cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_SHADE_MODEL, 1);
406cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->flatshade ? NV50TCL_SHADE_MODEL_FLAT :
407cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs				       NV50TCL_SHADE_MODEL_SMOOTH);
408c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki	so_method(so, tesla, NV50TCL_PROVOKING_VERTEX_LAST, 1);
4098313801911426a9a7b0bdbf2d6a4b2232428cc5bChristoph Bumiller	so_data  (so, cso->flatshade_first ? 0 : 1);
410cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
4114d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller	so_method(so, tesla, NV50TCL_VERTEX_TWO_SIDE_ENABLE, 1);
4124d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller	so_data  (so, cso->light_twoside);
4134d7b4781c82c60d646ee5e766824a0f894e4c292Christoph Bumiller
414cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
415cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->line_width));
416cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_LINE_SMOOTH_ENABLE, 1);
417cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->line_smooth ? 1 : 0);
418cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	if (cso->line_stipple_enable) {
419cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
420cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 1);
421cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_PATTERN, 1);
422e52d37d56c91e152bc149230410ed700ff1cffe2Ben Skeggs		so_data  (so, (cso->line_stipple_pattern << 8) |
423cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs			       cso->line_stipple_factor);
424cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	} else {
425cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_LINE_STIPPLE_ENABLE, 1);
426cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, 0);
427cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
428cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
429cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POINT_SIZE, 1);
430cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, fui(cso->point_size));
431cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
43201670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller	so_method(so, tesla, NV50TCL_POINT_SPRITE_ENABLE, 1);
43368f93ea3eb83cfad014b8ec93cec3564c1aa9833Roland Scheidegger	so_data  (so, cso->point_quad_rasterization ? 1 : 0);
43401670ca8073b57029625873b5c8374fb8716e1ebChristoph Bumiller
435cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_MODE_FRONT, 3);
4360bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        so_data(so, nvgl_polygon_mode(cso->fill_front));
4370bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        so_data(so, nvgl_polygon_mode(cso->fill_back));
438cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data(so, cso->poly_smooth ? 1 : 0);
439cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
440cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
4419c264642c385557d64b9bc6bbe31d2d15e703affKeith Whitwell	so_data  (so, cso->cull_face != PIPE_FACE_NONE);
4420bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	if (cso->front_ccw) {
443cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CCW);
4440bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        }
4450bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        else {
446cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data(so, NV50TCL_FRONT_FACE_CW);
4470bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        }
4480bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	switch (cso->cull_face) {
4490bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	case PIPE_FACE_FRONT:
4500bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		so_data(so, NV50TCL_CULL_FACE_FRONT);
4510bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		break;
4520bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	case PIPE_FACE_BACK:
4530bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		so_data(so, NV50TCL_CULL_FACE_BACK);
4540bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		break;
4550bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	case PIPE_FACE_FRONT_AND_BACK:
4560bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		so_data(so, NV50TCL_CULL_FACE_FRONT_AND_BACK);
4570bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		break;
4580bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	default:
4590bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		so_data(so, NV50TCL_CULL_FACE_BACK);
4600bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell		break;
461cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
462cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
463cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_STIPPLE_ENABLE, 1);
464cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_data  (so, cso->poly_stipple_enable ? 1 : 0);
465cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
466cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_method(so, tesla, NV50TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
4670bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        so_data(so, cso->offset_point);
4680bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        so_data(so, cso->offset_line);
4690bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell        so_data(so, cso->offset_tri);
470cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
4710bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell	if (cso->offset_point ||
4720bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            cso->offset_line ||
4730bd1cbcd0d28dbadfb0c3e1f8b048a18b56bc72cKeith Whitwell            cso->offset_tri) {
474cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_FACTOR, 1);
475cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_data  (so, fui(cso->offset_scale));
476cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs		so_method(so, tesla, NV50TCL_POLYGON_OFFSET_UNITS, 1);
4770ba518e3274b020deac255061ab23c74aefeb3f1Christoph Bumiller		so_data  (so, fui(cso->offset_units * 2.0f));
478cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	}
479cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
480cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	rso->pipe = *cso;
481cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(so, &rso->so);
482ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &so);
483cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	return (void *)rso;
48447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
48547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
48647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
48747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso)
48847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
489cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
490cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
491cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->rasterizer = hwcso;
492cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	nv50->dirty |= NV50_NEW_RASTERIZER;
49347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
49447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
49547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
49647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso)
49747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
498cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	struct nv50_rasterizer_stateobj *rso = hwcso;
499cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs
500cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	so_ref(NULL, &rso->so);
501cd85dc1e5dfa37cb9bee696e5e18332e3f1d65a1Ben Skeggs	FREE(rso);
50247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
50347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
50447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
5053af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
5063af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs			const struct pipe_depth_stencil_alpha_state *cso)
50747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
50806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
50906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = CALLOC_STRUCT(nv50_zsa_stateobj);
51067479eea365954396679714901c11175253bb13bRoland Scheidegger	struct nouveau_stateobj *so = so_new(9, 21, 0);
51106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
51206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_method(so, tesla, NV50TCL_DEPTH_WRITE_ENABLE, 1);
5135a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs	so_data  (so, cso->depth.writemask ? 1 : 0);
514101305f37f7268354a50b825bcb66894e4a0b777Ben Skeggs	if (cso->depth.enabled) {
51506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
5165a3362521de5e17e4f340fd9136af1d5e3891e23Ben Skeggs		so_data  (so, 1);
51706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_FUNC, 1);
51806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->depth.func));
51906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
52006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
52106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
52206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
52306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
52406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[0].enabled) {
52567479eea365954396679714901c11175253bb13bRoland Scheidegger		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 5);
52606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
52706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].fail_op));
52806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
52906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
53006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[0].func));
53167479eea365954396679714901c11175253bb13bRoland Scheidegger		so_method(so, tesla, NV50TCL_STENCIL_FRONT_MASK, 2);
532a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[0].writemask);
533a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[0].valuemask);
53406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
535c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki		so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
53606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
53706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
53806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
53906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->stencil[1].enabled) {
540c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 5);
54106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
54206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].fail_op));
54306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
54406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
54506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->stencil[1].func));
54667479eea365954396679714901c11175253bb13bRoland Scheidegger		so_method(so, tesla, NV50TCL_STENCIL_BACK_MASK, 2);
547a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[1].writemask);
548a7e72231e3c76a9410d192441da309002ea6422dZack Rusin		so_data  (so, cso->stencil[1].valuemask);
54906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
550c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki		so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
55106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
55206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
55306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
55406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	if (cso->alpha.enabled) {
55506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
55606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 1);
55706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
558d6888e811d24eaa7e8d9093be606394f00435c05Zack Rusin		so_data  (so, fui(cso->alpha.ref_value));
55906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, nvgl_comparison_op(cso->alpha.func));
56006bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	} else {
56106bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
56206bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs		so_data  (so, 0);
56306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	}
56406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
56506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	zsa->pipe = *cso;
56606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(so, &zsa->so);
567ca95d71a4bc63e2ea45abf9096a3da802819ef92Ben Skeggs	so_ref(NULL, &so);
56806bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	return (void *)zsa;
56947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
57047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
57147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
5723af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_bind(struct pipe_context *pipe, void *hwcso)
57347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
57406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
57506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
57606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->zsa = hwcso;
57706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	nv50->dirty |= NV50_NEW_ZSA;
57847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
57947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
58047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
5813af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggsnv50_depth_stencil_alpha_state_delete(struct pipe_context *pipe, void *hwcso)
58247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
58306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	struct nv50_zsa_stateobj *zsa = hwcso;
58406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs
58506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	so_ref(NULL, &zsa->so);
58606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs	FREE(zsa);
58747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
58847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
58947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
59047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe,
59147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
59247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
593f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
594f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
595a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
596b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_VERTEX;
597f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
59847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
59947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
60047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
60147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso)
60247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
603f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
604f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
605f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->vertprog = hwcso;
606f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_VERTPROG;
60747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
60847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
60947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
61047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
61147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
612f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
613a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
614f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
615a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
6164c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	FREE((void *)p->pipe.tokens);
617a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
61847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
61947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
62047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void *
62147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe,
62247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_shader_state *cso)
62347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
624f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
625f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
626a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
627b5bbf09c42a9d563984fad875ced5c4814033a3dBen Skeggs	p->type = PIPE_SHADER_FRAGMENT;
628f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	return (void *)p;
62947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
63047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
63147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
63247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso)
63347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
634f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
635f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
636f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->fragprog = hwcso;
637f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_FRAGPROG;
63847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
63947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
64047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
64147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
64247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
643f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
644a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	struct nv50_program *p = hwcso;
645f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
646a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	nv50_program_destroy(nv50, p);
6474c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	FREE((void *)p->pipe.tokens);
6484c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	FREE(p);
6494c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller}
6504c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
6514c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void *
6524c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_create(struct pipe_context *pipe,
6534c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller		     const struct pipe_shader_state *cso)
6544c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{
6554c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	struct nv50_program *p = CALLOC_STRUCT(nv50_program);
6564c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
6574c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
6584c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	p->type = PIPE_SHADER_GEOMETRY;
6594c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	return (void *)p;
6604c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller}
6614c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
6624c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void
6634c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_bind(struct pipe_context *pipe, void *hwcso)
6644c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{
6654c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	struct nv50_context *nv50 = nv50_context(pipe);
6664c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
667e0b93c5bebab8ebd2e387d6031f97c6bc4328dbfChristoph Bumiller	nv50->geomprog = hwcso;
6684c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	nv50->dirty |= NV50_NEW_GEOMPROG;
6694c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller}
6704c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
6714c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void
6724c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_delete(struct pipe_context *pipe, void *hwcso)
6734c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{
6744c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	struct nv50_context *nv50 = nv50_context(pipe);
6754c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	struct nv50_program *p = hwcso;
6764c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
6774c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	nv50_program_destroy(nv50, p);
6784c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	FREE((void *)p->pipe.tokens);
679a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton	FREE(p);
68047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
68147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
68247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
68347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe,
68447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		     const struct pipe_blend_color *bcol)
68547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
6862fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
6872fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
6882fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->blend_colour = *bcol;
6892fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_BLEND_COLOUR;
69047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
69147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
69267479eea365954396679714901c11175253bb13bRoland Scheidegger static void
69367479eea365954396679714901c11175253bb13bRoland Scheideggernv50_set_stencil_ref(struct pipe_context *pipe,
69467479eea365954396679714901c11175253bb13bRoland Scheidegger		     const struct pipe_stencil_ref *sr)
69567479eea365954396679714901c11175253bb13bRoland Scheidegger{
69667479eea365954396679714901c11175253bb13bRoland Scheidegger	struct nv50_context *nv50 = nv50_context(pipe);
69767479eea365954396679714901c11175253bb13bRoland Scheidegger
69867479eea365954396679714901c11175253bb13bRoland Scheidegger	nv50->stencil_ref = *sr;
69967479eea365954396679714901c11175253bb13bRoland Scheidegger	nv50->dirty |= NV50_NEW_STENCIL_REF;
70067479eea365954396679714901c11175253bb13bRoland Scheidegger}
70167479eea365954396679714901c11175253bb13bRoland Scheidegger
70247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
70347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe,
70447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		    const struct pipe_clip_state *clip)
70547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
7060811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller	struct nv50_context *nv50 = nv50_context(pipe);
7070811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller
7080811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller	nv50->clip.depth_clamp = clip->depth_clamp;
7090811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller	nv50->dirty |= NV50_NEW_CLIP;
71047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
71147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
71247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
71343234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggernv50_set_sample_mask(struct pipe_context *pipe,
71443234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger		     unsigned sample_mask)
71543234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger{
71643234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger}
71743234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger
71843234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void
71947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
720287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			 struct pipe_resource *buf )
72147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
722f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
723f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
724f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_VERTEX) {
725716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_VERTPROG_CB;
726f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	} else
727f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	if (shader == PIPE_SHADER_FRAGMENT) {
728716c1cd2ecbc1e86c0fd747c9fa9e095ded5fd5dBen Skeggs		nv50->dirty |= NV50_NEW_FRAGPROG_CB;
72990e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller	} else {
73090e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller		assert(shader == PIPE_SHADER_GEOMETRY);
7314c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller		nv50->dirty |= NV50_NEW_GEOMPROG_CB;
732f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	}
73390e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller
73490e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller	pipe_resource_reference(&nv50->constbuf[shader], buf);
73547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
73647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
73747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
73847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe,
73947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			   const struct pipe_framebuffer_state *fb)
74047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
741cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
742cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs
743cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->framebuffer = *fb;
744cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs	nv50->dirty |= NV50_NEW_FRAMEBUFFER;
74547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
74647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
74747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
74847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe,
74947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			 const struct pipe_poly_stipple *stipple)
75047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
7512fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
7522fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
7532fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->stipple = *stipple;
7542fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_STIPPLE;
75547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
75647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
75747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
75847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe,
75947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs		       const struct pipe_scissor_state *s)
76047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
7612fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
7622fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
7632fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->scissor = *s;
7642fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_SCISSOR;
76547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
76647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
76747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
76847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe,
76947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs			const struct pipe_viewport_state *vpt)
77047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
7712fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
7722fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs
7732fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->viewport = *vpt;
7742fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs	nv50->dirty |= NV50_NEW_VIEWPORT;
77547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
77647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
77747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
778bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggsnv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
779bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs			const struct pipe_vertex_buffer *vb)
78047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
781f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	struct nv50_context *nv50 = nv50_context(pipe);
782f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
7833c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák        util_copy_vertex_buffers(nv50->vtxbuf,
7843c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                                 &nv50->vtxbuf_nr,
7853c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák                                 vb, count);
786f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
787f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
78847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
78947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
7906d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wustatic void
7916d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wunv50_set_index_buffer(struct pipe_context *pipe,
7926d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		      const struct pipe_index_buffer *ib)
7936d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu{
7946d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	struct nv50_context *nv50 = nv50_context(pipe);
7956d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
7966d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	if (ib)
7976d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		memcpy(&nv50->idxbuf, ib, sizeof(nv50->idxbuf));
7986d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	else
7996d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu		memset(&nv50->idxbuf, 0, sizeof(nv50->idxbuf));
8006d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
8016d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	/* TODO make this more like a state */
8026d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu}
8036d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu
804f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void *
805f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillernv50_vtxelts_state_create(struct pipe_context *pipe,
806f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller			  unsigned num_elements,
807f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller			  const struct pipe_vertex_element *elements)
808f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{
809f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	struct nv50_vtxelt_stateobj *cso = CALLOC_STRUCT(nv50_vtxelt_stateobj);
810f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller
811f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	assert(num_elements < 16); /* not doing fallbacks yet */
812f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	cso->num_elements = num_elements;
813f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	memcpy(cso->pipe, elements, num_elements * sizeof(*elements));
814f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller
815f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	nv50_vtxelt_construct(cso);
816f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller
817f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	return (void *)cso;
818f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller}
819f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller
82047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void
821f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillernv50_vtxelts_state_delete(struct pipe_context *pipe, void *hwcso)
82247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
823f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	FREE(hwcso);
824f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller}
825f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
826f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void
827f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillernv50_vtxelts_state_bind(struct pipe_context *pipe, void *hwcso)
828f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{
829f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	struct nv50_context *nv50 = nv50_context(pipe);
830f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs
831f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	nv50->vtxelt = hwcso;
832f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs	nv50->dirty |= NV50_NEW_ARRAYS;
83347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
83447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
83547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid
83647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50)
83747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
83847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_blend_state = nv50_blend_state_create;
83947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_blend_state = nv50_blend_state_bind;
84047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_blend_state = nv50_blend_state_delete;
84147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
84247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_sampler_state = nv50_sampler_state_create;
84347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
8446a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller	nv50->pipe.bind_fragment_sampler_states = nv50_fp_sampler_state_bind;
8456a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller	nv50->pipe.bind_vertex_sampler_states   = nv50_vp_sampler_state_bind;
8466a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol	nv50->pipe.set_fragment_sampler_views = nv50_set_fp_sampler_views;
8476a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol	nv50->pipe.set_vertex_sampler_views   = nv50_set_vp_sampler_views;
8486a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol	nv50->pipe.create_sampler_view = nv50_create_sampler_view;
8496a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol	nv50->pipe.sampler_view_destroy = nv50_sampler_view_destroy;
85047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
85147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
85247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
85347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_rasterizer_state = nv50_rasterizer_state_delete;
85447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
8553af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.create_depth_stencil_alpha_state =
8563af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_create;
8573af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.bind_depth_stencil_alpha_state =
8583af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_bind;
8593af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs	nv50->pipe.delete_depth_stencil_alpha_state =
8603af35c6dfa4db1cbf830731882e61d57741f2898Ben Skeggs		nv50_depth_stencil_alpha_state_delete;
86147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
86247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_vs_state = nv50_vp_state_create;
86347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_vs_state = nv50_vp_state_bind;
86447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_vs_state = nv50_vp_state_delete;
86547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
86647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.create_fs_state = nv50_fp_state_create;
86747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.bind_fs_state = nv50_fp_state_bind;
86847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.delete_fs_state = nv50_fp_state_delete;
86947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
8704c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	nv50->pipe.create_gs_state = nv50_gp_state_create;
8714c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	nv50->pipe.bind_gs_state = nv50_gp_state_bind;
8724c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller	nv50->pipe.delete_gs_state = nv50_gp_state_delete;
8734c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller
87447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_blend_color = nv50_set_blend_color;
87567479eea365954396679714901c11175253bb13bRoland Scheidegger        nv50->pipe.set_stencil_ref = nv50_set_stencil_ref;
87647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_clip_state = nv50_set_clip_state;
87723808f1b5e88373534c7ff546cdd89030ce1e935Brian Paul	nv50->pipe.set_sample_mask = nv50_set_sample_mask;
87847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
87947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
88047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
88147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_scissor_state = nv50_set_scissor_state;
88247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs	nv50->pipe.set_viewport_state = nv50_set_viewport_state;
88347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
884f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	nv50->pipe.create_vertex_elements_state = nv50_vtxelts_state_create;
885f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	nv50->pipe.delete_vertex_elements_state = nv50_vtxelts_state_delete;
886f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller	nv50->pipe.bind_vertex_elements_state = nv50_vtxelts_state_bind;
887f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller
888bbefb541ad94382debb0f7a8daa636729799a31aBen Skeggs	nv50->pipe.set_vertex_buffers = nv50_set_vertex_buffers;
8896d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu	nv50->pipe.set_index_buffer = nv50_set_index_buffer;
890588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák	nv50->pipe.redefine_user_buffer = u_default_redefine_user_buffer;
89147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
89247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
893