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