nv50_state.c revision ddcb90248fb491a3a9e2ada8c595f94b0bd95515
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 93ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller const uint32_t chipset = nv50_context(pipe)->screen->base.device->chipset; 94ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 95ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (chipset >= 0xa3) { 96ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); 97ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, cso->independent_blend_enable); 98ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) { 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cso->rt[i].blend_enable); 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->rt[i].blend_enable) 107ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = TRUE; 108ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 109ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 110ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (chipset >= 0xa3) { 111ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = FALSE; 112ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 113ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller for (i = 0; i < 8; ++i) { 114ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (!cso->rt[i].blend_enable) 115ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller continue; 116ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); 117ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); 118ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); 119ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); 120ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); 121ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); 122ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); 123ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 126f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 127ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA(so, cso->rt[0].blend_enable); 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 130ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (emit_common_func) { 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->logicop_enable) { 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); 143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); 145f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); 147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 8); 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t cmask = nv50_colormask(cso->rt[0].colormask); 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cmask); 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return so; 16247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 16347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 16447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 16547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso) 16647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 1683250bacd2411d3f1af50135599380b2140238535Ben Skeggs 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend = hwcso; 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 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{ 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 17747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 17847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 17947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_create(struct pipe_context *pipe, 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_rasterizer_state *cso) 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_rasterizer_stateobj *so; 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so = CALLOC_STRUCT(nv50_rasterizer_stateobj); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!so) 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#ifndef NV50_SCISSORS_CLIPPING 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SCISSOR_ENABLE(0), 1); 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->scissor); 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#endif 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SHADE_MODEL, 1); 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->flatshade ? NV50_3D_SHADE_MODEL_FLAT : 197f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_SHADE_MODEL_SMOOTH); 198f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, PROVOKING_VERTEX_LAST, 1); 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, !cso->flatshade_first); 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, VERTEX_TWO_SIDE_ENABLE, 1); 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->light_twoside); 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_WIDTH, 1); 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->line_width)); 205f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_SMOOTH_ENABLE, 1); 206f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->line_smooth); 207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 208f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE_ENABLE, 1); 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->line_stipple_enable) { 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE, 1); 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, (cso->line_stipple_pattern << 8) | 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller cso->line_stipple_factor); 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!cso->point_size_per_vertex) { 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SIZE, 1); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->point_size)); 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SPRITE_ENABLE, 1); 223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_quad_rasterization); 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SMOOTH_ENABLE, 1); 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_smooth); 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_MODE_FRONT, 3); 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_front)); 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_back)); 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_smooth); 231f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, CULL_FACE_ENABLE, 3); 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->cull_face != PIPE_FACE_NONE); 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->front_ccw ? NV50_3D_FRONT_FACE_CCW : 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_FRONT_FACE_CW); 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->cull_face) { 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT_AND_BACK: 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT_AND_BACK); 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT: 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT); 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_BACK: 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_BACK); 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_STIPPLE_ENABLE, 1); 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_stipple_enable); 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_POINT_ENABLE, 3); 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_point); 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_line); 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_tri); 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->offset_point || cso->offset_line || cso->offset_tri) { 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_FACTOR, 1); 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->offset_scale)); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_UNITS, 1); 26040d7a87a8ee774655e77d45cb1a8070dbae62537Ben Skeggs SB_DATA (so, fui(cso->offset_units * 2.0f)); 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso) 26947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 271c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->rast = hwcso; 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_RASTERIZER; 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 275c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso) 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_create(struct pipe_context *pipe, 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_depth_stencil_alpha_state *cso) 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_zsa_stateobj *so = CALLOC_STRUCT(nv50_zsa_stateobj); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_WRITE_ENABLE, 1); 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->depth.writemask); 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_ENABLE, 1); 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->depth.enabled) { 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1); 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->depth.func)); 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[0].enabled) { 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 5); 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].fail_op)); 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zfail_op)); 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zpass_op)); 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[0].func)); 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_FRONT_MASK, 2); 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].writemask); 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].valuemask); 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 1); 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[1].enabled) { 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(cso->stencil[0].enabled); 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 5); 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].fail_op)); 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zfail_op)); 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zpass_op)); 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[1].func)); 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_BACK_MASK, 2); 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].writemask); 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].valuemask); 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 1); 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_ENABLE, 1); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->alpha.enabled) { 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_REF, 2); 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->alpha.ref_value)); 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->alpha.func)); 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(so->size < (sizeof(so->state) / sizeof(so->state[0]))); 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 34447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 34547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 34647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_bind(struct pipe_context *pipe, void *hwcso) 3486a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 351f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->zsa = hwcso; 352f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ZSA; 3536a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 3546a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 3556a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_delete(struct pipe_context *pipe, void *hwcso) 3576a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ====================== SAMPLERS AND TEXTURES ================================ 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TSC_WRAP_CASE(n) \ 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_WRAP_##n: return NV50_TSC_WRAP_##n 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE unsigned 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_tsc_wrap_mode(unsigned wrap) 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (wrap) { 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(REPEAT); 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_REPEAT); 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_EDGE); 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_BORDER); 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP); 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_EDGE); 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_BORDER); 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP); 379f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 380f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("unknown wrap mode: %d\n", wrap); 381f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TSC_WRAP_REPEAT; 382f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 383f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 384f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 385f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 386f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_state_create(struct pipe_context *pipe, 387f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_state *cso) 388f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 389f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *so = CALLOC_STRUCT(nv50_tsc_entry); 390f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller float f[2]; 391f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 392f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->id = -1; 393f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 394f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] = (0x00026000 | 395f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_s) << 0) | 396f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_t) << 3) | 397f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_r) << 6)); 398f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 399f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->mag_img_filter) { 400f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 401f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_LINEAR; 402f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 403f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 404f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 405f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_NEAREST; 406f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 407f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 408f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 409f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_img_filter) { 410f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 411f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_LINEAR; 412f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 413f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 414f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 415f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_NEAREST; 416f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 417f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 418f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 419f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_mip_filter) { 420f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_LINEAR: 421f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_LINEAR; 422f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 423f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NEAREST: 424f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NEAREST; 425f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 426f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NONE: 427f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 428f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NONE; 429f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 430f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 431f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 432f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 16) 433f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (7 << 20); 434f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 435f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 12) 436f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (6 << 20); 437f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else { 438f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (cso->max_anisotropy >> 1) << 20; 439f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 440f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 4) 441f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_35; 442f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 443f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 2) 444f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_15; 445f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 446f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 447f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) { 448f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: must be deactivated for non-shadow textures */ 449f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (1 << 9); 450f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10; 451f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 452f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 453f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->lod_bias, -16.0f, 15.0f); 454f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= ((int)(f[0] * 256.0f) & 0x1fff) << 12; 455f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 456f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->min_lod, 0.0f, 15.0f); 457f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[1] = CLAMP(cso->max_lod, 0.0f, 15.0f); 458f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[2] |= 459f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (((int)(f[1] * 256.0f) & 0xfff) << 12) | ((int)(f[0] * 256.0f) & 0xfff); 460f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 461f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[4] = fui(cso->border_color[0]); 462f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[5] = fui(cso->border_color[1]); 463f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[6] = fui(cso->border_color[2]); 464f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[7] = fui(cso->border_color[3]); 465f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 466f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 4676a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 4686a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 4696a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 47047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso) 47147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 472f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned s, i; 473f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 474f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (s = 0; s < 5; ++s) 475f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50_context(pipe)->num_samplers[s]; ++i) 476f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50_context(pipe)->samplers[s][i] == hwcso) 477f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_context(pipe)->samplers[s][i] = NULL; 478f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 479f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_free(nv50_context(pipe)->screen, nv50_tsc_entry(hwcso)); 480f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 481f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 48247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 48347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 4846a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void 485f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_sampler_states_bind(struct nv50_context *nv50, int s, 486f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, void **hwcso) 48779bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{ 488f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 489f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 490f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 491f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *old = nv50->samplers[s][i]; 492c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 493f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->samplers[s][i] = nv50_tsc_entry(hwcso[i]); 494f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 495f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, old); 496f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 497f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_samplers[s]; ++i) 498f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->samplers[s][i]) 499f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, nv50->samplers[s][i]); 500c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 501f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_samplers[s] = nr; 50244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 503f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLERS; 50479bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs} 50579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs 5066a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 507f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5086a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 509f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 0, nr, s); 5106a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5116a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 5126a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic void 513f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5146a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 515f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 2, nr, s); 51644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 51744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 51844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic void 519f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 52044570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 521f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 1, nr, s); 5226a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5236a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 524f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* NOTE: only called when not referenced anywhere, won't be bound */ 525f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 526f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_view_destroy(struct pipe_context *pipe, 527f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view *view) 5286a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 529f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->texture, NULL); 5306a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 531f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_free(nv50_context(pipe)->screen, nv50_tic_entry(view)); 5326a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 533f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(nv50_tic_entry(view)); 5346a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5356a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 536f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void 537f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_set_sampler_views(struct nv50_context *nv50, int s, 538f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 539f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 540f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 541f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 542f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 543f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 544f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 545f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 546f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 5476a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 548f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], views[i]); 549f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 550f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 551f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = nr; i < nv50->num_textures[s]; ++i) { 552f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 553f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!old) 554f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 555f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 556f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 557f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], NULL); 558f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 559f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 560f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_textures[s] = nr; 561f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 562f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_TEXTURES); 563f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 564f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_TEXTURES; 56547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 56647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 56747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 568f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_set_sampler_views(struct pipe_context *pipe, 569f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 570f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 57147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 572f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views); 57347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 57447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 57547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 576f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_set_sampler_views(struct pipe_context *pipe, 577f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 578f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 57947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 580f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views); 58147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 58247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 583f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 584f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_set_sampler_views(struct pipe_context *pipe, 585f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 586f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 587f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 588f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views); 58947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 59047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 591f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================= SHADERS ======================================= 592f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 593f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 594f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 595f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_create(struct pipe_context *pipe, 596f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso, unsigned type) 59747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 598f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog; 59906bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 600f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog = CALLOC_STRUCT(nv50_program); 601f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!prog) 602f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 603f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 604f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->type = type; 605f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->pipe.tokens = tgsi_dup_tokens(cso->tokens); 606f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 607f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)prog; 60847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 60947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 61047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 611f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_delete(struct pipe_context *pipe, void *hwcso) 61247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 613f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog = (struct nv50_program *)hwcso; 614f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 615f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_program_destroy(nv50_context(pipe), prog); 61606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 617f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE((void *)prog->pipe.tokens); 618f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(prog); 61947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 62047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 62147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 62247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe, 623f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 62447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 625f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_VERTEX); 62647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 62747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 62847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 62947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso) 63047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 631f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 632f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 633f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertprog = hwcso; 634f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTPROG; 63547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 63647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 63747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 63847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe, 639f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 64047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 641f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_FRAGMENT); 64247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 64347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 64447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 64547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso) 64647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 647f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 648f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 649f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->fragprog = hwcso; 650f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAGPROG; 6514c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6524c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6534c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void * 6544c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_create(struct pipe_context *pipe, 655f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 6564c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 657f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_GEOMETRY); 6584c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6594c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6604c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 6614c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_bind(struct pipe_context *pipe, void *hwcso) 6624c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 663f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 6644c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 665f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->gmtyprog = hwcso; 666f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_GMTYPROG; 6674c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6684c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6694c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 670f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 671f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *res) 6724c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 673f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 674f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 675f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->constbuf[shader][index]) 676f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_del_resident(nv50, NV50_BUFCTX_CONSTANT, 67779079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs nv04_resource(nv50->constbuf[shader][index])); 678f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 679f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->constbuf[shader][index], res); 6804c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 681f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->constbuf_dirty[shader] |= 1 << index; 682f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 683f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CONSTBUF; 68447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 68547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 686f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================================================================= 687f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 688f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 68947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 69047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe, 691f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_color *bcol) 69247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 693f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 6942fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 695f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend_colour = *bcol; 696f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND_COLOUR; 69747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 69847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 699f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 70067479eea365954396679714901c11175253bb13bRoland Scheideggernv50_set_stencil_ref(struct pipe_context *pipe, 701f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_stencil_ref *sr) 70267479eea365954396679714901c11175253bb13bRoland Scheidegger{ 703f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 70467479eea365954396679714901c11175253bb13bRoland Scheidegger 705f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stencil_ref = *sr; 706f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STENCIL_REF; 70767479eea365954396679714901c11175253bb13bRoland Scheidegger} 70867479eea365954396679714901c11175253bb13bRoland Scheidegger 70947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 71047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe, 711f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_clip_state *clip) 71247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 713f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 714f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const unsigned size = clip->nr * sizeof(clip->ucp[0]); 7150811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller 716f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->clip.ucp[0][0], &clip->ucp[0][0], size); 717f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.nr = clip->nr; 71847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 719f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.depth_clamp = clip->depth_clamp; 720f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 721f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CLIP; 72243234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger} 72343234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger 72443234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void 725f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 72647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 727f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 72890e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller 729f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->sample_mask = sample_mask; 730f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLE_MASK; 73147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 73247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 733f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 73447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 73547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe, 736f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_framebuffer_state *fb) 73747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 738f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 739cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs 740f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->framebuffer = *fb; 741f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 74247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 74347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 74447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 74547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe, 746f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_poly_stipple *stipple) 74747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 748f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7492fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 750f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stipple = *stipple; 751f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STIPPLE; 75247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 75347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 75447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 75547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe, 756f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_scissor_state *scissor) 75747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 758f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7592fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 760f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->scissor = *scissor; 761f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SCISSOR; 76247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 76347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 76447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 76547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe, 766f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_viewport_state *vpt) 76747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 768f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7692fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 770f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->viewport = *vpt; 771f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VIEWPORT; 77247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 77347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 77447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 775f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_vertex_buffers(struct pipe_context *pipe, 776f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned count, 777f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_vertex_buffer *vb) 77847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 779f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 780f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 781f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 782f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < count; ++i) 783f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, vb[i].buffer); 784f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_vtxbufs; ++i) 785f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL); 786f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 787f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count); 788f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_vtxbufs = count; 78947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 790f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_VERTEX); 791f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 792f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ARRAYS; 793f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 794f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 79547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 796f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_index_buffer(struct pipe_context *pipe, 797f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_index_buffer *ib) 79847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 799f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 800f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 801f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ib) 802f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->idxbuf, ib, sizeof(nv50->idxbuf)); 803f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 804f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->idxbuf.buffer = NULL; 805f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 806f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 807f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void 808f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vertex_state_bind(struct pipe_context *pipe, void *hwcso) 809f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{ 810f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 811f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 812f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertex = hwcso; 813f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTEX; 81447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 81547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 81647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 81747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50) 81847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 8191ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 8201ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8211ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_blend_state = nv50_blend_state_create; 8221ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_blend_state = nv50_blend_state_bind; 8231ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_blend_state = nv50_blend_state_delete; 8241ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8251ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_rasterizer_state = nv50_rasterizer_state_create; 8261ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_rasterizer_state = nv50_rasterizer_state_bind; 8271ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_rasterizer_state = nv50_rasterizer_state_delete; 8281ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8291ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_depth_stencil_alpha_state = nv50_zsa_state_create; 8301ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_depth_stencil_alpha_state = nv50_zsa_state_bind; 8311ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_depth_stencil_alpha_state = nv50_zsa_state_delete; 8321ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8331ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_state = nv50_sampler_state_create; 8341ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_sampler_state = nv50_sampler_state_delete; 8351ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_sampler_states = nv50_vp_sampler_states_bind; 8361ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fragment_sampler_states = nv50_fp_sampler_states_bind; 8371ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_geometry_sampler_states = nv50_gp_sampler_states_bind; 8381ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8391ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_view = nv50_create_sampler_view; 8401ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->sampler_view_destroy = nv50_sampler_view_destroy; 8411ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_sampler_views = nv50_vp_set_sampler_views; 8421ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_fragment_sampler_views = nv50_fp_set_sampler_views; 8431ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_geometry_sampler_views = nv50_gp_set_sampler_views; 844f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 8451ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vs_state = nv50_vp_state_create; 8461ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_fs_state = nv50_fp_state_create; 8471ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_gs_state = nv50_gp_state_create; 8481ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vs_state = nv50_vp_state_bind; 8491ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fs_state = nv50_fp_state_bind; 8501ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_gs_state = nv50_gp_state_bind; 8511ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vs_state = nv50_sp_state_delete; 8521ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_fs_state = nv50_sp_state_delete; 8531ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_gs_state = nv50_sp_state_delete; 8541ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8551ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_blend_color = nv50_set_blend_color; 8561ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_stencil_ref = nv50_set_stencil_ref; 8571ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_clip_state = nv50_set_clip_state; 8581ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_sample_mask = nv50_set_sample_mask; 8591ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_constant_buffer = nv50_set_constant_buffer; 8601ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_framebuffer_state = nv50_set_framebuffer_state; 8611ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_polygon_stipple = nv50_set_polygon_stipple; 8621ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_scissor_state = nv50_set_scissor_state; 8631ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_viewport_state = nv50_set_viewport_state; 8641ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8651ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vertex_elements_state = nv50_vertex_state_create; 8661ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vertex_elements_state = nv50_vertex_state_delete; 8671ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_elements_state = nv50_vertex_state_bind; 8681ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8691ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_buffers = nv50_set_vertex_buffers; 8701ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_index_buffer = nv50_set_index_buffer; 87147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 87247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 873