nv50_state.c revision 1f5d6fc59bd899e211c70026eb74cd2219858008
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/* 2f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * Copyright 2010 Christoph Bumiller 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_defines.h" 2428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 25588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák#include "util/u_transfer.h" 2647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 27fda01b584715c05696a0e6768fda669ef1eb5f3bBen Skeggs#include "tgsi/tgsi_parse.h" 28a8da04cb861b8f9caf3acd33f52f64621f0c15e2Younes Manton 29f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_stateobj.h" 3047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h" 3147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 32f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_3d.xml.h" 33f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_texture.xml.h" 34f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 35f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nouveau/nouveau_gldefs.h" 363250bacd2411d3f1af50135599380b2140238535Ben Skeggs 37a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillerstatic INLINE uint32_t 38a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillernv50_colormask(unsigned mask) 39a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller{ 40f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t ret = 0; 41a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 42f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_R) 43f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0001; 44f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_G) 45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0010; 46f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_B) 47f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0100; 48f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_A) 49f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x1000; 50a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 52a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller} 53a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 54f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_BLEND_FACTOR_CASE(a, b) \ 55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_BLENDFACTOR_##a: return NV50_3D_BLEND_FACTOR_##b 56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 57f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumillerstatic INLINE uint32_t 58f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_blend_fac(unsigned factor) 59f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (factor) { 61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(ONE, ONE); 62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_COLOR, SRC_COLOR); 63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_ALPHA, SRC_ALPHA); 64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(DST_ALPHA, DST_ALPHA); 65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(DST_COLOR, DST_COLOR); 66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_ALPHA_SATURATE, SRC_ALPHA_SATURATE); 67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(CONST_COLOR, CONSTANT_COLOR); 68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(CONST_ALPHA, CONSTANT_ALPHA); 69f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC1_COLOR, SRC1_COLOR); 70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC1_ALPHA, SRC1_ALPHA); 71f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(ZERO, ZERO); 72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC_COLOR, ONE_MINUS_SRC_COLOR); 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC_ALPHA, ONE_MINUS_SRC_ALPHA); 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_DST_ALPHA, ONE_MINUS_DST_ALPHA); 75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_DST_COLOR, ONE_MINUS_DST_COLOR); 76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_CONST_COLOR, ONE_MINUS_CONSTANT_COLOR); 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_CONST_ALPHA, ONE_MINUS_CONSTANT_ALPHA); 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC1_COLOR, ONE_MINUS_SRC1_COLOR); 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC1_ALPHA, ONE_MINUS_SRC1_ALPHA); 80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_3D_BLEND_FACTOR_ZERO; 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 83f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller} 84f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller 8547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 8647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe, 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_state *cso) 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_blend_stateobj *so = CALLOC_STRUCT(nv50_blend_stateobj); 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int i; 91ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller boolean emit_common_func = cso->rt[0].blend_enable; 92ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 933bf92a281bdc6ebf2ec5975729d02bd9062e11f5Christoph Bumiller if (nv50_context(pipe)->screen->tesla->grclass >= NVA3_3D) { 94ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); 95ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, cso->independent_blend_enable); 96ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) { 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cso->rt[i].blend_enable); 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->rt[i].blend_enable) 105ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = TRUE; 106ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 107ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 1083bf92a281bdc6ebf2ec5975729d02bd9062e11f5Christoph Bumiller if (nv50_context(pipe)->screen->tesla->grclass >= NVA3_3D) { 109ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = FALSE; 110ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 111ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller for (i = 0; i < 8; ++i) { 112ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (!cso->rt[i].blend_enable) 113ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller continue; 114ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); 115ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); 116ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); 117ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); 118ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); 119ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); 120ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); 121ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 125ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA(so, cso->rt[0].blend_enable); 126f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 128ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (emit_common_func) { 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->logicop_enable) { 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); 143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); 145f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 8); 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t cmask = nv50_colormask(cso->rt[0].colormask); 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cmask); 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return so; 16047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 16147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 16247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 16347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso) 16447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 1663250bacd2411d3f1af50135599380b2140238535Ben Skeggs 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend = hwcso; 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND; 16947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 17047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 17147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 17247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso) 17347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 17547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 17647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 17747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_create(struct pipe_context *pipe, 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_rasterizer_state *cso) 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_rasterizer_stateobj *so; 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so = CALLOC_STRUCT(nv50_rasterizer_stateobj); 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!so) 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#ifndef NV50_SCISSORS_CLIPPING 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SCISSOR_ENABLE(0), 1); 190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->scissor); 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#endif 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SHADE_MODEL, 1); 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->flatshade ? NV50_3D_SHADE_MODEL_FLAT : 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_SHADE_MODEL_SMOOTH); 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, PROVOKING_VERTEX_LAST, 1); 197f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, !cso->flatshade_first); 198f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, VERTEX_TWO_SIDE_ENABLE, 1); 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->light_twoside); 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_WIDTH, 1); 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->line_width)); 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_SMOOTH_ENABLE, 1); 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->line_smooth); 205f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 206f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE_ENABLE, 1); 207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->line_stipple_enable) { 208f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE, 1); 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, (cso->line_stipple_pattern << 8) | 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller cso->line_stipple_factor); 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!cso->point_size_per_vertex) { 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SIZE, 1); 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->point_size)); 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SPRITE_ENABLE, 1); 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_quad_rasterization); 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SMOOTH_ENABLE, 1); 223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_smooth); 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_MODE_FRONT, 3); 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_front)); 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_back)); 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_smooth); 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, CULL_FACE_ENABLE, 3); 231f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->cull_face != PIPE_FACE_NONE); 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->front_ccw ? NV50_3D_FRONT_FACE_CCW : 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_FRONT_FACE_CW); 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->cull_face) { 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT_AND_BACK: 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT_AND_BACK); 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT: 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT); 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_BACK: 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_BACK); 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_STIPPLE_ENABLE, 1); 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_stipple_enable); 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_POINT_ENABLE, 3); 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_point); 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_line); 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_tri); 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->offset_point || cso->offset_line || cso->offset_tri) { 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_FACTOR, 1); 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->offset_scale)); 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_UNITS, 1); 25840d7a87a8ee774655e77d45cb1a8070dbae62537Ben Skeggs SB_DATA (so, fui(cso->offset_units * 2.0f)); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso) 26747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 269c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->rast = hwcso; 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_RASTERIZER; 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 273c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso) 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_create(struct pipe_context *pipe, 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_depth_stencil_alpha_state *cso) 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_zsa_stateobj *so = CALLOC_STRUCT(nv50_zsa_stateobj); 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_WRITE_ENABLE, 1); 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->depth.writemask); 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_ENABLE, 1); 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->depth.enabled) { 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1); 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->depth.func)); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[0].enabled) { 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 5); 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].fail_op)); 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zfail_op)); 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zpass_op)); 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[0].func)); 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_FRONT_MASK, 2); 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].writemask); 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].valuemask); 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 1); 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[1].enabled) { 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(cso->stencil[0].enabled); 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 5); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].fail_op)); 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zfail_op)); 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zpass_op)); 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[1].func)); 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_BACK_MASK, 2); 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].writemask); 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].valuemask); 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 1); 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_ENABLE, 1); 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->alpha.enabled) { 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_REF, 2); 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->alpha.ref_value)); 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->alpha.func)); 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 34247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 34347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 34447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_bind(struct pipe_context *pipe, void *hwcso) 3466a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->zsa = hwcso; 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ZSA; 3516a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 3526a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 3536a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_delete(struct pipe_context *pipe, void *hwcso) 3556a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 357f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ====================== SAMPLERS AND TEXTURES ================================ 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TSC_WRAP_CASE(n) \ 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_WRAP_##n: return NV50_TSC_WRAP_##n 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE unsigned 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_tsc_wrap_mode(unsigned wrap) 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (wrap) { 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(REPEAT); 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_REPEAT); 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_EDGE); 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_BORDER); 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP); 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_EDGE); 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_BORDER); 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP); 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("unknown wrap mode: %d\n", wrap); 379f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TSC_WRAP_REPEAT; 380f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 381f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 382f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3831f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumillervoid * 384f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_state_create(struct pipe_context *pipe, 385f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_state *cso) 386f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 387f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *so = CALLOC_STRUCT(nv50_tsc_entry); 388f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller float f[2]; 389f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 390f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->id = -1; 391f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 392f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] = (0x00026000 | 393f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_s) << 0) | 394f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_t) << 3) | 395f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_r) << 6)); 396f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 397f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->mag_img_filter) { 398f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 399f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_LINEAR; 400f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 401f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 402f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 403f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_NEAREST; 404f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 405f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 406f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 407f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_img_filter) { 408f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 409f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_LINEAR; 410f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 411f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 412f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 413f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_NEAREST; 414f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 415f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 416f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 417f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_mip_filter) { 418f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_LINEAR: 419f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_LINEAR; 420f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 421f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NEAREST: 422f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NEAREST; 423f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 424f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NONE: 425f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 426f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NONE; 427f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 428f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 429f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 430f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 16) 431f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (7 << 20); 432f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 433f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 12) 434f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (6 << 20); 435f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else { 436f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (cso->max_anisotropy >> 1) << 20; 437f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 438f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 4) 439f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_35; 440f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 441f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 2) 442f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_15; 443f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 444f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 445f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) { 446f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: must be deactivated for non-shadow textures */ 447f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (1 << 9); 448f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10; 449f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 450f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 451f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->lod_bias, -16.0f, 15.0f); 452f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= ((int)(f[0] * 256.0f) & 0x1fff) << 12; 453f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 454f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->min_lod, 0.0f, 15.0f); 455f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[1] = CLAMP(cso->max_lod, 0.0f, 15.0f); 456f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[2] |= 457f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (((int)(f[1] * 256.0f) & 0xfff) << 12) | ((int)(f[0] * 256.0f) & 0xfff); 458f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 459f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[4] = fui(cso->border_color[0]); 460f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[5] = fui(cso->border_color[1]); 461f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[6] = fui(cso->border_color[2]); 462f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[7] = fui(cso->border_color[3]); 463f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 464f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 4656a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 4666a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 4676a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 46847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso) 46947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 470f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned s, i; 471f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 472f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (s = 0; s < 5; ++s) 473f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50_context(pipe)->num_samplers[s]; ++i) 474f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50_context(pipe)->samplers[s][i] == hwcso) 475f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_context(pipe)->samplers[s][i] = NULL; 476f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 477f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_free(nv50_context(pipe)->screen, nv50_tsc_entry(hwcso)); 478f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 479f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 48047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 48147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 4826a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void 483f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_sampler_states_bind(struct nv50_context *nv50, int s, 484f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, void **hwcso) 48579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{ 486f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 487f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 488f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 489f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *old = nv50->samplers[s][i]; 490c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 491f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->samplers[s][i] = nv50_tsc_entry(hwcso[i]); 492f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 493f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, old); 494f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 495f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_samplers[s]; ++i) 496f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->samplers[s][i]) 497f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, nv50->samplers[s][i]); 498c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 499f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_samplers[s] = nr; 50044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 501f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLERS; 50279bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs} 50379bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs 5046a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 505f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5066a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 507f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 0, nr, s); 5086a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5096a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 5106a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic void 511f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5126a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 513f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 2, nr, s); 51444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 51544570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 51644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic void 517f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 51844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 519f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 1, nr, s); 5206a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5216a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 522f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* NOTE: only called when not referenced anywhere, won't be bound */ 523f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 524f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_view_destroy(struct pipe_context *pipe, 525f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view *view) 5266a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 527f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->texture, NULL); 5286a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 529f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_free(nv50_context(pipe)->screen, nv50_tic_entry(view)); 5306a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 531f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(nv50_tic_entry(view)); 5326a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5336a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 534f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void 535f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_set_sampler_views(struct nv50_context *nv50, int s, 536f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 537f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 538f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 539f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 540f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 541f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 542f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 543f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 544f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 5456a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 546f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], views[i]); 547f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 548f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 549f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = nr; i < nv50->num_textures[s]; ++i) { 550f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 551f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!old) 552f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 553f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 554f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 555f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], NULL); 556f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 557f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 558f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_textures[s] = nr; 559f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 560f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_TEXTURES); 561f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 562f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_TEXTURES; 56347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 56447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 56547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 566f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_set_sampler_views(struct pipe_context *pipe, 567f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 568f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 56947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 570f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views); 57147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 57247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 57347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 574f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_set_sampler_views(struct pipe_context *pipe, 575f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 576f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 57747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 578f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views); 57947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 58047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 581f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 582f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_set_sampler_views(struct pipe_context *pipe, 583f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 584f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 585f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 586f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views); 58747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 58847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 589f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================= SHADERS ======================================= 590f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 591f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 592f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 593f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_create(struct pipe_context *pipe, 594f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso, unsigned type) 59547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 596f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog; 59706bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 598f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog = CALLOC_STRUCT(nv50_program); 599f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!prog) 600f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 601f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 602f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->type = type; 603f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->pipe.tokens = tgsi_dup_tokens(cso->tokens); 604f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 605f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)prog; 60647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 60747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 60847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 609f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_delete(struct pipe_context *pipe, void *hwcso) 61047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 611f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog = (struct nv50_program *)hwcso; 612f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 613f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_program_destroy(nv50_context(pipe), prog); 61406bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 615f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE((void *)prog->pipe.tokens); 616f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(prog); 61747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 61847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 61947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 62047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe, 621f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 62247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 623f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_VERTEX); 62447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 62547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 62647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 62747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso) 62847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 629f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 630f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 631f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertprog = hwcso; 632f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTPROG; 63347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 63447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 63547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 63647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe, 637f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 63847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 639f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_FRAGMENT); 64047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 64147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 64247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 64347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso) 64447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 645f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 646f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 647f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->fragprog = hwcso; 648f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAGPROG; 6494c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6504c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6514c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void * 6524c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_create(struct pipe_context *pipe, 653f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 6544c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 655f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_GEOMETRY); 6564c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6574c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6584c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 6594c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_bind(struct pipe_context *pipe, void *hwcso) 6604c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 661f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 6624c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 663f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->gmtyprog = hwcso; 664f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_GMTYPROG; 6654c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6664c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6674c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 668f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 669f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *res) 6704c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 671f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 672f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 673f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->constbuf[shader][index]) 674f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_del_resident(nv50, NV50_BUFCTX_CONSTANT, 67579079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs nv04_resource(nv50->constbuf[shader][index])); 676f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 677f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->constbuf[shader][index], res); 6784c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 679f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->constbuf_dirty[shader] |= 1 << index; 680f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 681f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CONSTBUF; 68247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 68347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 684f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================================================================= 685f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 686f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 68747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 68847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe, 689f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_color *bcol) 69047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 691f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 6922fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 693f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend_colour = *bcol; 694f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND_COLOUR; 69547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 69647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 697f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 69867479eea365954396679714901c11175253bb13bRoland Scheideggernv50_set_stencil_ref(struct pipe_context *pipe, 699f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_stencil_ref *sr) 70067479eea365954396679714901c11175253bb13bRoland Scheidegger{ 701f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 70267479eea365954396679714901c11175253bb13bRoland Scheidegger 703f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stencil_ref = *sr; 704f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STENCIL_REF; 70567479eea365954396679714901c11175253bb13bRoland Scheidegger} 70667479eea365954396679714901c11175253bb13bRoland Scheidegger 70747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 70847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe, 709f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_clip_state *clip) 71047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 711f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 712f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const unsigned size = clip->nr * sizeof(clip->ucp[0]); 7130811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller 714f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->clip.ucp[0][0], &clip->ucp[0][0], size); 715f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.nr = clip->nr; 71647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 717f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.depth_clamp = clip->depth_clamp; 718f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 719f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CLIP; 72043234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger} 72143234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger 72243234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void 723f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 72447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 725f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 72690e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller 727f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->sample_mask = sample_mask; 728f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLE_MASK; 72947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 73047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 731f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 73247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 73347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe, 734f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_framebuffer_state *fb) 73547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 736f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 737cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs 738f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->framebuffer = *fb; 739f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 74047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 74147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 74247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 74347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe, 744f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_poly_stipple *stipple) 74547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 746f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7472fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 748f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stipple = *stipple; 749f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STIPPLE; 75047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 75147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 75247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 75347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe, 754f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_scissor_state *scissor) 75547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 756f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7572fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 758f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->scissor = *scissor; 759f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SCISSOR; 76047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 76147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 76247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 76347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe, 764f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_viewport_state *vpt) 76547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 766f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7672fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 768f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->viewport = *vpt; 769f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VIEWPORT; 77047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 77147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 77247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 773f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_vertex_buffers(struct pipe_context *pipe, 774f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned count, 775f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_vertex_buffer *vb) 77647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 777f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 778f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 779f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 780f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < count; ++i) 781f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, vb[i].buffer); 782f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_vtxbufs; ++i) 783f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL); 784f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 785f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count); 786f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_vtxbufs = count; 78747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 788f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_VERTEX); 789f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 790f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ARRAYS; 791f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 792f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 79347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 794f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_index_buffer(struct pipe_context *pipe, 795f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_index_buffer *ib) 79647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 797f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 798f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 799f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ib) 800f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->idxbuf, ib, sizeof(nv50->idxbuf)); 801f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 802f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->idxbuf.buffer = NULL; 803f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 804f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 805f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void 806f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vertex_state_bind(struct pipe_context *pipe, void *hwcso) 807f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{ 808f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 809f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 810f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertex = hwcso; 811f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTEX; 81247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 81347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 81447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 81547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50) 81647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 8171ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 8181ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8191ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_blend_state = nv50_blend_state_create; 8201ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_blend_state = nv50_blend_state_bind; 8211ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_blend_state = nv50_blend_state_delete; 8221ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8231ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_rasterizer_state = nv50_rasterizer_state_create; 8241ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_rasterizer_state = nv50_rasterizer_state_bind; 8251ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_rasterizer_state = nv50_rasterizer_state_delete; 8261ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8271ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_depth_stencil_alpha_state = nv50_zsa_state_create; 8281ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_depth_stencil_alpha_state = nv50_zsa_state_bind; 8291ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_depth_stencil_alpha_state = nv50_zsa_state_delete; 8301ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8311ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_state = nv50_sampler_state_create; 8321ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_sampler_state = nv50_sampler_state_delete; 8331ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_sampler_states = nv50_vp_sampler_states_bind; 8341ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fragment_sampler_states = nv50_fp_sampler_states_bind; 8351ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_geometry_sampler_states = nv50_gp_sampler_states_bind; 8361ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8371ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_view = nv50_create_sampler_view; 8381ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->sampler_view_destroy = nv50_sampler_view_destroy; 8391ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_sampler_views = nv50_vp_set_sampler_views; 8401ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_fragment_sampler_views = nv50_fp_set_sampler_views; 8411ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_geometry_sampler_views = nv50_gp_set_sampler_views; 842f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 8431ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vs_state = nv50_vp_state_create; 8441ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_fs_state = nv50_fp_state_create; 8451ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_gs_state = nv50_gp_state_create; 8461ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vs_state = nv50_vp_state_bind; 8471ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fs_state = nv50_fp_state_bind; 8481ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_gs_state = nv50_gp_state_bind; 8491ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vs_state = nv50_sp_state_delete; 8501ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_fs_state = nv50_sp_state_delete; 8511ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_gs_state = nv50_sp_state_delete; 8521ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8531ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_blend_color = nv50_set_blend_color; 8541ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_stencil_ref = nv50_set_stencil_ref; 8551ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_clip_state = nv50_set_clip_state; 8561ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_sample_mask = nv50_set_sample_mask; 8571ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_constant_buffer = nv50_set_constant_buffer; 8581ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_framebuffer_state = nv50_set_framebuffer_state; 8591ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_polygon_stipple = nv50_set_polygon_stipple; 8601ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_scissor_state = nv50_set_scissor_state; 8611ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_viewport_state = nv50_set_viewport_state; 8621ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8631ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vertex_elements_state = nv50_vertex_state_create; 8641ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vertex_elements_state = nv50_vertex_state_delete; 8651ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_elements_state = nv50_vertex_state_bind; 8661ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8671ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_buffers = nv50_set_vertex_buffers; 8681ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_index_buffer = nv50_set_index_buffer; 86947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 87047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 871