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 37531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller/* Caveats: 38531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_sampler_state.normalized_coords is ignored - rectangle textures will 39531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * use non-normalized coordinates, everything else won't 40531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (The relevant bit is in the TIC entry and not the TSC entry.) 41531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 42531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_sampler_state.seamless_cube_map is ignored - seamless filtering is 43531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * always activated on NVA0 + 44531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (Give me the global bit, otherwise it's not worth the CPU work.) 45531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 46531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_sampler_state.border_color is not swizzled according to the texture 47531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * swizzle in pipe_sampler_view 48531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (This will be ugly with indirect independent texture/sampler access, 49531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * we'd have to emulate the logic in the shader. GL doesn't have that, 50531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * D3D doesn't have swizzle, if we knew what we were implementing we'd be 51531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * good.) 52531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 53531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_rasterizer_state.line_last_pixel is ignored - it is never drawn 54531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 55531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_rasterizer_state.flatshade_first also applies to QUADS 56531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (There's a GL query for that, forcing an exception is just ridiculous.) 57531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 58531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_rasterizer_state.gl_rasterization_rules is ignored - pixel centers 59531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * are always at half integer coordinates and the top-left rule applies 60531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (There does not seem to be a hardware switch for this.) 61531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * 62531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * ! pipe_rasterizer_state.sprite_coord_enable is masked with 0xff on NVC0 63531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * (The hardware only has 8 slots meant for TexCoord and we have to assign 64531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller * in advance to maintain elegant separate shader objects.) 65531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller */ 66531b12af35a832bcd8928a4919d76f8e9405cde0Christoph Bumiller 67a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillerstatic INLINE uint32_t 68a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumillernv50_colormask(unsigned mask) 69a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller{ 70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t ret = 0; 71a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_R) 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0001; 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_G) 75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0010; 76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_B) 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x0100; 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mask & PIPE_MASK_A) 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret |= 0x1000; 80a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 82a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller} 83a5d67dc0119035c518d9778854948d13f0ce2d69Christoph Bumiller 84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_BLEND_FACTOR_CASE(a, b) \ 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_BLENDFACTOR_##a: return NV50_3D_BLEND_FACTOR_##b 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 87f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumillerstatic INLINE uint32_t 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_blend_fac(unsigned factor) 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (factor) { 91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(ONE, ONE); 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_COLOR, SRC_COLOR); 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_ALPHA, SRC_ALPHA); 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(DST_ALPHA, DST_ALPHA); 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(DST_COLOR, DST_COLOR); 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC_ALPHA_SATURATE, SRC_ALPHA_SATURATE); 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(CONST_COLOR, CONSTANT_COLOR); 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(CONST_ALPHA, CONSTANT_ALPHA); 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC1_COLOR, SRC1_COLOR); 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(SRC1_ALPHA, SRC1_ALPHA); 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(ZERO, ZERO); 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC_COLOR, ONE_MINUS_SRC_COLOR); 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC_ALPHA, ONE_MINUS_SRC_ALPHA); 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_DST_ALPHA, ONE_MINUS_DST_ALPHA); 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_DST_COLOR, ONE_MINUS_DST_COLOR); 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_CONST_COLOR, ONE_MINUS_CONSTANT_COLOR); 107f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_CONST_ALPHA, ONE_MINUS_CONSTANT_ALPHA); 108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC1_COLOR, ONE_MINUS_SRC1_COLOR); 109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_BLEND_FACTOR_CASE(INV_SRC1_ALPHA, ONE_MINUS_SRC1_ALPHA); 110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_3D_BLEND_FACTOR_ZERO; 112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 113f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller} 114f3af1201c578443dd0f72e73470dd1763888a41dChristoph Bumiller 11547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 11647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_create(struct pipe_context *pipe, 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_state *cso) 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_blend_stateobj *so = CALLOC_STRUCT(nv50_blend_stateobj); 120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int i; 121ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller boolean emit_common_func = cso->rt[0].blend_enable; 122b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller uint32_t ms; 123ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 1246d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { 125ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); 126ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, cso->independent_blend_enable); 127ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1317b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK_COMMON, 1); 1327b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, !cso->independent_blend_enable); 1337b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller 1347b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE_COMMON, 1); 1357b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, !cso->independent_blend_enable); 1367b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 1387b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) { 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cso->rt[i].blend_enable); 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->rt[i].blend_enable) 142ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = TRUE; 143ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 144ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 1456d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nv50_context(pipe)->screen->tesla->oclass >= NVA3_3D_CLASS) { 146ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = FALSE; 147ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 148ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller for (i = 0; i < 8; ++i) { 149ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (!cso->rt[i].blend_enable) 150ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller continue; 151ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); 152ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); 153ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); 154ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); 155ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); 156ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); 157ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); 158ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 1617b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 1); 1627b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, cso->rt[0].blend_enable); 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 165ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (emit_common_func) { 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 175f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->logicop_enable) { 177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 1867b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 8); 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 1907b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 1); 1917b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, nv50_colormask(cso->rt[0].colormask)); 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 194b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller ms = 0; 195b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (cso->alpha_to_coverage) 196b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE; 197b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (cso->alpha_to_one) 198b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller ms |= NV50_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE; 199b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 200b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller SB_BEGIN_3D(so, MULTISAMPLE_CTRL, 1); 201b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller SB_DATA (so, ms); 202b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 203d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 204f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return so; 20547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 20647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 20747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 20847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso) 20947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 2113250bacd2411d3f1af50135599380b2140238535Ben Skeggs 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend = hwcso; 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND; 21447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 21547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 21647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 21747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso) 21847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 22047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 22147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 222843d5391c3b7b80ff2087ce7e6440417aab623ccChristoph Bumiller/* NOTE: ignoring line_last_pixel, using FALSE (set on screen init) */ 22347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_create(struct pipe_context *pipe, 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_rasterizer_state *cso) 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_rasterizer_stateobj *so; 228dc4c821f0817a3db716f965692fb701079f66340Marek Olšák uint32_t reg; 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so = CALLOC_STRUCT(nv50_rasterizer_stateobj); 231f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!so) 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#ifndef NV50_SCISSORS_CLIPPING 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SCISSOR_ENABLE(0), 1); 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->scissor); 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#endif 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SHADE_MODEL, 1); 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->flatshade ? NV50_3D_SHADE_MODEL_FLAT : 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_SHADE_MODEL_SMOOTH); 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, PROVOKING_VERTEX_LAST, 1); 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, !cso->flatshade_first); 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, VERTEX_TWO_SIDE_ENABLE, 1); 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->light_twoside); 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2488f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller SB_BEGIN_3D(so, FRAG_COLOR_CLAMP_EN, 1); 2498f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller SB_DATA (so, cso->clamp_fragment_color ? 0x11111111 : 0x00000000); 2508f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller 251b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller SB_BEGIN_3D(so, MULTISAMPLE_ENABLE, 1); 252b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller SB_DATA (so, cso->multisample); 253b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_WIDTH, 1); 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->line_width)); 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_SMOOTH_ENABLE, 1); 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->line_smooth); 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE_ENABLE, 1); 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->line_stipple_enable) { 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE, 1); 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, (cso->line_stipple_pattern << 8) | 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller cso->line_stipple_factor); 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!cso->point_size_per_vertex) { 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SIZE, 1); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->point_size)); 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SPRITE_ENABLE, 1); 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_quad_rasterization); 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SMOOTH_ENABLE, 1); 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_smooth); 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_MODE_FRONT, 3); 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_front)); 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_back)); 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_smooth); 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, CULL_FACE_ENABLE, 3); 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->cull_face != PIPE_FACE_NONE); 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->front_ccw ? NV50_3D_FRONT_FACE_CCW : 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_FRONT_FACE_CW); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->cull_face) { 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT_AND_BACK: 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT_AND_BACK); 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT: 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT); 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_BACK: 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_BACK); 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_STIPPLE_ENABLE, 1); 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_stipple_enable); 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_POINT_ENABLE, 3); 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_point); 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_line); 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_tri); 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->offset_point || cso->offset_line || cso->offset_tri) { 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_FACTOR, 1); 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->offset_scale)); 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_UNITS, 1); 31140d7a87a8ee774655e77d45cb1a8070dbae62537Ben Skeggs SB_DATA (so, fui(cso->offset_units * 2.0f)); 312b3fa0d311e553ec815d58e58a30aa8b3927e4afdChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_CLAMP, 1); 313b3fa0d311e553ec815d58e58a30aa8b3927e4afdChristoph Bumiller SB_DATA (so, fui(cso->offset_clamp)); 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 316dc4c821f0817a3db716f965692fb701079f66340Marek Olšák if (cso->depth_clip) { 317dc4c821f0817a3db716f965692fb701079f66340Marek Olšák reg = 0; 318dc4c821f0817a3db716f965692fb701079f66340Marek Olšák } else { 319dc4c821f0817a3db716f965692fb701079f66340Marek Olšák reg = 320dc4c821f0817a3db716f965692fb701079f66340Marek Olšák NV50_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_NEAR | 321dc4c821f0817a3db716f965692fb701079f66340Marek Olšák NV50_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_FAR | 322dc4c821f0817a3db716f965692fb701079f66340Marek Olšák NV50_3D_VIEW_VOLUME_CLIP_CTRL_UNK12_UNK1; 323dc4c821f0817a3db716f965692fb701079f66340Marek Olšák } 324dc4c821f0817a3db716f965692fb701079f66340Marek Olšák#ifndef NV50_SCISSORS_CLIPPING 325dc4c821f0817a3db716f965692fb701079f66340Marek Olšák reg |= 326dc4c821f0817a3db716f965692fb701079f66340Marek Olšák NV50_3D_VIEW_VOLUME_CLIP_CTRL_UNK7 | 327dc4c821f0817a3db716f965692fb701079f66340Marek Olšák NV50_3D_VIEW_VOLUME_CLIP_CTRL_UNK12_UNK1; 328dc4c821f0817a3db716f965692fb701079f66340Marek Olšák#endif 329dc4c821f0817a3db716f965692fb701079f66340Marek Olšák SB_BEGIN_3D(so, VIEW_VOLUME_CLIP_CTRL, 1); 330dc4c821f0817a3db716f965692fb701079f66340Marek Olšák SB_DATA (so, reg); 331dc4c821f0817a3db716f965692fb701079f66340Marek Olšák 332d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso) 33847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 340c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->rast = hwcso; 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_RASTERIZER; 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 344c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 346f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso) 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 351f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 352f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_create(struct pipe_context *pipe, 353f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_depth_stencil_alpha_state *cso) 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 355f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_zsa_stateobj *so = CALLOC_STRUCT(nv50_zsa_stateobj); 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 357f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_WRITE_ENABLE, 1); 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->depth.writemask); 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_ENABLE, 1); 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->depth.enabled) { 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1); 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->depth.func)); 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[0].enabled) { 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 5); 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].fail_op)); 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zfail_op)); 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zpass_op)); 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[0].func)); 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_FRONT_MASK, 2); 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].writemask); 379f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].valuemask); 380f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 381f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 1); 382f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 383f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 384f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 385f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[1].enabled) { 386f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(cso->stencil[0].enabled); 387f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 5); 388f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 389f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].fail_op)); 390f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zfail_op)); 391f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zpass_op)); 392f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[1].func)); 393f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_BACK_MASK, 2); 394f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].writemask); 395f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].valuemask); 396f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 397f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 1); 398f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 399f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 400f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 401f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_ENABLE, 1); 402f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->alpha.enabled) { 403f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 404f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_REF, 2); 405f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->alpha.ref_value)); 406f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->alpha.func)); 407f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 408f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 409f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 410f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 411d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 412f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 41347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 41447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 41547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 416f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_bind(struct pipe_context *pipe, void *hwcso) 4176a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 418f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 419f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 420f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->zsa = hwcso; 421f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ZSA; 4226a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 4236a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 4246a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 425f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_delete(struct pipe_context *pipe, void *hwcso) 4266a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 427f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 428f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 429f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 430f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ====================== SAMPLERS AND TEXTURES ================================ 431f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 432f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 433f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TSC_WRAP_CASE(n) \ 434f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_WRAP_##n: return NV50_TSC_WRAP_##n 435f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 436f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE unsigned 437f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_tsc_wrap_mode(unsigned wrap) 438f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 439f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (wrap) { 440f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(REPEAT); 441f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_REPEAT); 442f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_EDGE); 443f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_BORDER); 444f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP); 445f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_EDGE); 446f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_BORDER); 447f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP); 448f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 449f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("unknown wrap mode: %d\n", wrap); 450f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TSC_WRAP_REPEAT; 451f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 452f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 453f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 4541f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumillervoid * 455f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_state_create(struct pipe_context *pipe, 456f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_state *cso) 457f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 458f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *so = CALLOC_STRUCT(nv50_tsc_entry); 459f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller float f[2]; 460f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 461f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->id = -1; 462f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 463f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] = (0x00026000 | 464f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_s) << 0) | 465f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_t) << 3) | 466f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_r) << 6)); 467f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 468e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (nouveau_screen(pipe->screen)->class_3d >= NVE4_3D_CLASS) { 469e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (cso->seamless_cube_map) 470e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller so->tsc[1] |= NVE4_TSC_1_CUBE_SEAMLESS; 471e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller if (!cso->normalized_coords) 472e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller so->tsc[1] |= NVE4_TSC_1_FORCE_NONNORMALIZED_COORDS; 473e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller } 474e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller 475f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->mag_img_filter) { 476f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 477f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_LINEAR; 478f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 479f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 480f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 481f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_NEAREST; 482f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 483f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 484f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 485f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_img_filter) { 486f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 487f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_LINEAR; 488f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 489f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 490f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 491f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_NEAREST; 492f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 493f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 494f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 495f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_mip_filter) { 496f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_LINEAR: 497f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_LINEAR; 498f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 499f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NEAREST: 500f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NEAREST; 501f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 502f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NONE: 503f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 504f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NONE; 505f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 506f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 507f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 508f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 16) 509f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (7 << 20); 510f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 511f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 12) 512f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (6 << 20); 513f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else { 514f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (cso->max_anisotropy >> 1) << 20; 515f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 516f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 4) 517f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_35; 518f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 519f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 2) 520f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_15; 521f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 522f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 523f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) { 524f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: must be deactivated for non-shadow textures */ 525f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (1 << 9); 526f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10; 527f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 528f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 529f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->lod_bias, -16.0f, 15.0f); 530f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= ((int)(f[0] * 256.0f) & 0x1fff) << 12; 531f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 532f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->min_lod, 0.0f, 15.0f); 533f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[1] = CLAMP(cso->max_lod, 0.0f, 15.0f); 534f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[2] |= 535f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (((int)(f[1] * 256.0f) & 0xfff) << 12) | ((int)(f[0] * 256.0f) & 0xfff); 536f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 5379f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie so->tsc[4] = fui(cso->border_color.f[0]); 5389f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie so->tsc[5] = fui(cso->border_color.f[1]); 5399f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie so->tsc[6] = fui(cso->border_color.f[2]); 5409f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie so->tsc[7] = fui(cso->border_color.f[3]); 541f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 542f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 5436a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5446a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 5456a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 54647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso) 54747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 548f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned s, i; 549f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 550fb40f1f532b5ea9fb9069f81af9e80835c18b3deMarcin Slusarz for (s = 0; s < 3; ++s) 551f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50_context(pipe)->num_samplers[s]; ++i) 552f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50_context(pipe)->samplers[s][i] == hwcso) 553f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_context(pipe)->samplers[s][i] = NULL; 554f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 555f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_free(nv50_context(pipe)->screen, nv50_tsc_entry(hwcso)); 556f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 557f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 55847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 55947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 5606a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void 561f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_sampler_states_bind(struct nv50_context *nv50, int s, 562f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, void **hwcso) 56379bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{ 564f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 565f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 566f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 567f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *old = nv50->samplers[s][i]; 568c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 569f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->samplers[s][i] = nv50_tsc_entry(hwcso[i]); 570f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 571f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, old); 572f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 573f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_samplers[s]; ++i) 574f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->samplers[s][i]) 575f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, nv50->samplers[s][i]); 576c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 577f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_samplers[s] = nr; 57844570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 579f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLERS; 58079bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs} 58179bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs 5826a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 583f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5846a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 585f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 0, nr, s); 5866a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5876a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 5886a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic void 589f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5906a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 591f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 2, nr, s); 59244570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 59344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 59444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic void 595f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 59644570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 597f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 1, nr, s); 5986a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5996a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 600f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* NOTE: only called when not referenced anywhere, won't be bound */ 601f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 602f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_view_destroy(struct pipe_context *pipe, 603f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view *view) 6046a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 605f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->texture, NULL); 6066a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 607f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_free(nv50_context(pipe)->screen, nv50_tic_entry(view)); 6086a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 609f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(nv50_tic_entry(view)); 6106a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 6116a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 612f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void 613f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_set_sampler_views(struct nv50_context *nv50, int s, 614f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 615f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 616f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 617f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 618f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 619f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 620f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 621f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 622f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 6236a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 624f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], views[i]); 625f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 626f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 627f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = nr; i < nv50->num_textures[s]; ++i) { 628f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 629f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!old) 630f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 631f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 632f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 633f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], NULL); 634f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 635f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 636f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_textures[s] = nr; 637f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 6386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_TEXTURES); 639f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 640f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_TEXTURES; 64147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 64247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 64347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 644f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_set_sampler_views(struct pipe_context *pipe, 645f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 646f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 64747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 648f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views); 64947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 65047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 65147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 652f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_set_sampler_views(struct pipe_context *pipe, 653f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 654f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 65547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 656f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views); 65747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 65847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 659f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 660f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_set_sampler_views(struct pipe_context *pipe, 661f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 662f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 663f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 664f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views); 66547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 66647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 667f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================= SHADERS ======================================= 668f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 669f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 670f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 671f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_create(struct pipe_context *pipe, 672f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso, unsigned type) 67347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 674f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog; 67506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 676f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog = CALLOC_STRUCT(nv50_program); 677f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!prog) 678f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 679f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 680f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->type = type; 681f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->pipe.tokens = tgsi_dup_tokens(cso->tokens); 682f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 68302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (cso->stream_output.num_outputs) 68402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller prog->pipe.stream_output = cso->stream_output; 68502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 686f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)prog; 68747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 68847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 68947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 690f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_delete(struct pipe_context *pipe, void *hwcso) 69147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 692f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog = (struct nv50_program *)hwcso; 693f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 694f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_program_destroy(nv50_context(pipe), prog); 69506bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 696f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE((void *)prog->pipe.tokens); 697f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(prog); 69847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 69947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 70047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 70147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe, 702f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 70347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 704f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_VERTEX); 70547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 70647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 70747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 70847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso) 70947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 710f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 711f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 712f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertprog = hwcso; 713f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTPROG; 71447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 71547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 71647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 71747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe, 718f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 71947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 720f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_FRAGMENT); 72147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 72247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 72347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 72447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso) 72547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 726f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 727f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 728f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->fragprog = hwcso; 729f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAGPROG; 7304c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 7314c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 7324c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void * 7334c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_create(struct pipe_context *pipe, 734f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 7354c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 736f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_GEOMETRY); 7374c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 7384c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 7394c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 7404c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_bind(struct pipe_context *pipe, void *hwcso) 7414c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 742f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7434c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 744f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->gmtyprog = hwcso; 745f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_GMTYPROG; 7464c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 7474c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 7484c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 749f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 750507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák struct pipe_constant_buffer *cb) 7514c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 752f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 753507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák struct pipe_resource *res = cb ? cb->buffer : NULL; 754fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller const unsigned s = nv50_context_shader_stage(shader); 755fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller const unsigned i = index; 756f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 757fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller if (shader == PIPE_SHADER_COMPUTE) 758fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller return; 7594c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 760fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller if (nv50->constbuf[s][i].user) 761fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].u.buf = NULL; 7626d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller else 763fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller if (nv50->constbuf[s][i].u.buf) 764fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_CB(s, i)); 765fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller 766fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller pipe_resource_reference(&nv50->constbuf[s][i].u.buf, res); 767fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller 768fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].user = (cb && cb->user_buffer) ? TRUE : FALSE; 769fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller if (nv50->constbuf[s][i].user) { 770fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].u.data = cb->user_buffer; 771fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].size = cb->buffer_size; 772fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf_valid[s] |= 1 << i; 773fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller } else 774fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller if (res) { 775fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].offset = cb->buffer_offset; 776fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf[s][i].size = align(cb->buffer_size, 0x100); 777fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf_valid[s] |= 1 << i; 778fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller } else { 779fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf_valid[s] &= ~(1 << i); 780fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller } 781fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller nv50->constbuf_dirty[s] |= 1 << i; 782f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 783f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CONSTBUF; 78447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 78547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 786f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================================================================= 787f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 788f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 78947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 79047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe, 791f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_color *bcol) 79247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 793f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7942fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 795f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend_colour = *bcol; 796f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND_COLOUR; 79747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 79847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 799f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 80067479eea365954396679714901c11175253bb13bRoland Scheideggernv50_set_stencil_ref(struct pipe_context *pipe, 801f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_stencil_ref *sr) 80267479eea365954396679714901c11175253bb13bRoland Scheidegger{ 803f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 80467479eea365954396679714901c11175253bb13bRoland Scheidegger 805f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stencil_ref = *sr; 806f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STENCIL_REF; 80767479eea365954396679714901c11175253bb13bRoland Scheidegger} 80867479eea365954396679714901c11175253bb13bRoland Scheidegger 80947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 81047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe, 811f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_clip_state *clip) 81247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 813f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 81447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 815dc4c821f0817a3db716f965692fb701079f66340Marek Olšák memcpy(nv50->clip.ucp, clip->ucp, sizeof(clip->ucp)); 816f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 817f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CLIP; 81843234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger} 81943234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger 82043234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void 821f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 82247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 823f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 82490e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller 825f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->sample_mask = sample_mask; 826f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLE_MASK; 82747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 82847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 829f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 83047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 83147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe, 832f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_framebuffer_state *fb) 83347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 834f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 8352d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller unsigned i; 836cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs 8376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_FB); 8386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 8392d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller for (i = 0; i < fb->nr_cbufs; ++i) 8402d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller pipe_surface_reference(&nv50->framebuffer.cbufs[i], fb->cbufs[i]); 8412d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller for (; i < nv50->framebuffer.nr_cbufs; ++i) 8422d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller pipe_surface_reference(&nv50->framebuffer.cbufs[i], NULL); 8432d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller 8442d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller nv50->framebuffer.nr_cbufs = fb->nr_cbufs; 8452d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller 8462d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller nv50->framebuffer.width = fb->width; 8472d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller nv50->framebuffer.height = fb->height; 8482d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller 8492d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller pipe_surface_reference(&nv50->framebuffer.zsbuf, fb->zsbuf); 8502d06ee8bf784d98a822617db5366f56b9bb5d3a2Christoph Bumiller 851f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 85247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 85347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 85447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 85547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe, 856f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_poly_stipple *stipple) 85747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 858f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 8592fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 860f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stipple = *stipple; 861f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STIPPLE; 86247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 86347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 86447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 86547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe, 866f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_scissor_state *scissor) 86747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 868f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 8692fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 870f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->scissor = *scissor; 871f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SCISSOR; 87247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 87347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 87447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 87547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe, 876f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_viewport_state *vpt) 87747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 878f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 8792fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 880f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->viewport = *vpt; 881f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VIEWPORT; 88247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 88347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 88447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 885f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_vertex_buffers(struct pipe_context *pipe, 886f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned count, 887f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_vertex_buffer *vb) 88847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 889f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 890f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 891f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 892e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vbo_user = nv50->vbo_constant = 0; 893e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller 894e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller for (i = 0; i < count; ++i) { 895e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vtxbuf[i].stride = vb[i].stride; 896f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, vb[i].buffer); 897e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller if (!vb[i].buffer && vb[i].user_buffer) { 898e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vtxbuf[i].user_buffer = vb[i].user_buffer; 899e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vbo_user |= 1 << i; 900e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller if (!vb[i].stride) 901e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vbo_constant |= 1 << i; 902e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller } else { 903e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller nv50->vtxbuf[i].buffer_offset = vb[i].buffer_offset; 904e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller } 905e6caafd9d7fbfcb5906d22be9d6a3c1714e078acChristoph Bumiller } 906f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_vtxbufs; ++i) 907f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL); 908f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 909f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_vtxbufs = count; 91047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 9116d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_VERTEX); 912f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 913f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ARRAYS; 914f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 915f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 91647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 917f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_index_buffer(struct pipe_context *pipe, 918f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_index_buffer *ib) 91947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 920f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 921f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 9226d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nv50->idxbuf.buffer) 9236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_INDEX); 92426a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller 925ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller if (ib) { 9266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller pipe_resource_reference(&nv50->idxbuf.buffer, ib->buffer); 9276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nv50->idxbuf.index_size = ib->index_size; 928ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller if (ib->buffer) { 929ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller nv50->idxbuf.offset = ib->offset; 9306d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BCTX_REFN(nv50->bufctx_3d, INDEX, nv04_resource(ib->buffer), RD); 931ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller } else { 932ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller nv50->idxbuf.user_buffer = ib->user_buffer; 933ef7bb281292c17b762b57779306e874704c87328Christoph Bumiller } 93426a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller } else { 93526a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller pipe_resource_reference(&nv50->idxbuf.buffer, NULL); 93626a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller } 937f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 938f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 939f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void 940f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vertex_state_bind(struct pipe_context *pipe, void *hwcso) 941f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{ 942f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 943f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 944f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertex = hwcso; 945f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTEX; 94647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 94747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 94802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillerstatic struct pipe_stream_output_target * 94902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernv50_so_target_create(struct pipe_context *pipe, 95002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct pipe_resource *res, 95102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller unsigned offset, unsigned size) 95202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{ 95302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct nv50_so_target *targ = MALLOC_STRUCT(nv50_so_target); 95402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (!targ) 95502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller return NULL; 95602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 95702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (nouveau_context(pipe)->screen->class_3d >= NVA0_3D_CLASS) { 95802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pq = pipe->create_query(pipe, 95902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET); 96002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (!targ->pq) { 96102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller FREE(targ); 96202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller return NULL; 96302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 96402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } else { 96502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pq = NULL; 96602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 96702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->clean = TRUE; 96802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 96902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pipe.buffer_size = size; 97002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pipe.buffer_offset = offset; 97102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pipe.context = pipe; 97202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller targ->pipe.buffer = NULL; 97302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe_resource_reference(&targ->pipe.buffer, res); 97402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe_reference_init(&targ->pipe.reference, 1); 97502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 97602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller return &targ->pipe; 97702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller} 97802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 97902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillerstatic void 98002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernv50_so_target_destroy(struct pipe_context *pipe, 98102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct pipe_stream_output_target *ptarg) 98202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{ 98302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct nv50_so_target *targ = nv50_so_target(ptarg); 98402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (targ->pq) 98502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe->destroy_query(pipe, targ->pq); 986fc782bcbf04f036990f69b14e01304e1e6dc8fd1Marcin Slusarz pipe_resource_reference(&targ->pipe.buffer, NULL); 98702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller FREE(targ); 98802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller} 98902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 99002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillerstatic void 99102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernv50_set_stream_output_targets(struct pipe_context *pipe, 99202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller unsigned num_targets, 99302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct pipe_stream_output_target **targets, 99402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller unsigned append_mask) 99502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{ 99602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 99702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller unsigned i; 99802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller boolean serialize = TRUE; 99902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller const boolean can_resume = nv50->screen->base.class_3d >= NVA0_3D_CLASS; 100002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 100102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller assert(num_targets <= 4); 100202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 100302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller for (i = 0; i < num_targets; ++i) { 100402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller const boolean changed = nv50->so_target[i] != targets[i]; 100502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (!changed && (append_mask & (1 << i))) 100602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller continue; 100702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nv50->so_targets_dirty |= 1 << i; 100802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 100902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (can_resume && changed && nv50->so_target[i]) { 101002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nva0_so_target_save_offset(pipe, nv50->so_target[i], i, serialize); 101102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller serialize = FALSE; 101202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 101302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 101402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (targets[i] && !(append_mask & (1 << i))) 101502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nv50_so_target(targets[i])->clean = TRUE; 101602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 101702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe_so_target_reference(&nv50->so_target[i], targets[i]); 101802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 101902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller for (; i < nv50->num_so_targets; ++i) { 102002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (can_resume && nv50->so_target[i]) { 102102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nva0_so_target_save_offset(pipe, nv50->so_target[i], i, serialize); 102202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller serialize = FALSE; 102302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 102402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe_so_target_reference(&nv50->so_target[i], NULL); 102502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nv50->so_targets_dirty |= 1 << i; 102602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller } 102702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nv50->num_so_targets = num_targets; 102802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 102902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller if (nv50->so_targets_dirty) 103002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller nv50->dirty |= NV50_NEW_STRMOUT; 103102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller} 103202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller 103347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 103447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50) 103547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 10361ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 10371ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10381ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_blend_state = nv50_blend_state_create; 10391ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_blend_state = nv50_blend_state_bind; 10401ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_blend_state = nv50_blend_state_delete; 10411ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10421ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_rasterizer_state = nv50_rasterizer_state_create; 10431ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_rasterizer_state = nv50_rasterizer_state_bind; 10441ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_rasterizer_state = nv50_rasterizer_state_delete; 10451ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10461ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_depth_stencil_alpha_state = nv50_zsa_state_create; 10471ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_depth_stencil_alpha_state = nv50_zsa_state_bind; 10481ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_depth_stencil_alpha_state = nv50_zsa_state_delete; 10491ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10501ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_state = nv50_sampler_state_create; 10511ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_sampler_state = nv50_sampler_state_delete; 10521ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_sampler_states = nv50_vp_sampler_states_bind; 10531ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fragment_sampler_states = nv50_fp_sampler_states_bind; 10541ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_geometry_sampler_states = nv50_gp_sampler_states_bind; 10551ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10561ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_view = nv50_create_sampler_view; 10571ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->sampler_view_destroy = nv50_sampler_view_destroy; 10581ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_sampler_views = nv50_vp_set_sampler_views; 10591ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_fragment_sampler_views = nv50_fp_set_sampler_views; 10601ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_geometry_sampler_views = nv50_gp_set_sampler_views; 1061f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 10621ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vs_state = nv50_vp_state_create; 10631ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_fs_state = nv50_fp_state_create; 10641ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_gs_state = nv50_gp_state_create; 10651ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vs_state = nv50_vp_state_bind; 10661ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fs_state = nv50_fp_state_bind; 10671ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_gs_state = nv50_gp_state_bind; 10681ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vs_state = nv50_sp_state_delete; 10691ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_fs_state = nv50_sp_state_delete; 10701ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_gs_state = nv50_sp_state_delete; 10711ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10721ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_blend_color = nv50_set_blend_color; 10731ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_stencil_ref = nv50_set_stencil_ref; 10741ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_clip_state = nv50_set_clip_state; 10751ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_sample_mask = nv50_set_sample_mask; 10761ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_constant_buffer = nv50_set_constant_buffer; 10771ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_framebuffer_state = nv50_set_framebuffer_state; 10781ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_polygon_stipple = nv50_set_polygon_stipple; 10791ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_scissor_state = nv50_set_scissor_state; 10801ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_viewport_state = nv50_set_viewport_state; 10811ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10821ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vertex_elements_state = nv50_vertex_state_create; 10831ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vertex_elements_state = nv50_vertex_state_delete; 10841ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_elements_state = nv50_vertex_state_bind; 10851ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 10861ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_buffers = nv50_set_vertex_buffers; 10871ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_index_buffer = nv50_set_index_buffer; 1088caaa7fdd6f8bb6f38bf555de79bd3cfd7ac9c715Christoph Bumiller 108902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe->create_stream_output_target = nv50_so_target_create; 109002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe->stream_output_target_destroy = nv50_so_target_destroy; 109102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller pipe->set_stream_output_targets = nv50_set_stream_output_targets; 109247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 1093