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