nv50_state.c revision fb40f1f532b5ea9fb9069f81af9e80835c18b3de
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; 122ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 1233bf92a281bdc6ebf2ec5975729d02bd9062e11f5Christoph Bumiller if (nv50_context(pipe)->screen->tesla->grclass >= NVA3_3D) { 124ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D(so, BLEND_INDEPENDENT, 1); 125ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, cso->independent_blend_enable); 126ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1307b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK_COMMON, 1); 1317b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, !cso->independent_blend_enable); 1327b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller 1337b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE_COMMON, 1); 1347b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, !cso->independent_blend_enable); 1357b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 1377b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 8); 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) { 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, cso->rt[i].blend_enable); 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->rt[i].blend_enable) 141ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = TRUE; 142ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 143ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 1443bf92a281bdc6ebf2ec5975729d02bd9062e11f5Christoph Bumiller if (nv50_context(pipe)->screen->tesla->grclass >= NVA3_3D) { 145ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller emit_common_func = FALSE; 146ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller 147ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller for (i = 0; i < 8; ++i) { 148ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (!cso->rt[i].blend_enable) 149ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller continue; 150ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_BEGIN_3D_(so, NVA3_3D_IBLEND_EQUATION_RGB(i), 6); 151ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); 152ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_src_factor)); 153ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].rgb_dst_factor)); 154ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); 155ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_src_factor)); 156ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[i].alpha_dst_factor)); 157ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller } 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 1607b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, BLEND_ENABLE(0), 1); 1617b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, cso->rt[0].blend_enable); 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 164ddcb90248fb491a3a9e2ada8c595f94b0bd95515Christoph Bumiller if (emit_common_func) { 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].rgb_func)); 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_src_factor)); 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].rgb_dst_factor)); 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_blend_eqn(cso->rt[0].alpha_func)); 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_src_factor)); 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nv50_blend_fac(cso->rt[0].alpha_dst_factor)); 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 175f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->logicop_enable) { 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); 177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 1); 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->independent_blend_enable) { 1857b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 8); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < 8; ++i) 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, nv50_colormask(cso->rt[i].colormask)); 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 1897b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_BEGIN_3D(so, COLOR_MASK(0), 1); 1907b4e478496cf45f527f72c39d72efe2e94fe2386Christoph Bumiller SB_DATA (so, nv50_colormask(cso->rt[0].colormask)); 191f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 193d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return so; 19547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 19647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 19747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 19847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_bind(struct pipe_context *pipe, void *hwcso) 19947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 2013250bacd2411d3f1af50135599380b2140238535Ben Skeggs 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend = hwcso; 203f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND; 20447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 20547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 20647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 20747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_blend_state_delete(struct pipe_context *pipe, void *hwcso) 20847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 21047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 21147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 212843d5391c3b7b80ff2087ce7e6440417aab623ccChristoph Bumiller/* NOTE: ignoring line_last_pixel, using FALSE (set on screen init) */ 21347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_create(struct pipe_context *pipe, 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_rasterizer_state *cso) 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_rasterizer_stateobj *so; 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so = CALLOC_STRUCT(nv50_rasterizer_stateobj); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!so) 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 224f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#ifndef NV50_SCISSORS_CLIPPING 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SCISSOR_ENABLE(0), 1); 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->scissor); 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#endif 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, SHADE_MODEL, 1); 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->flatshade ? NV50_3D_SHADE_MODEL_FLAT : 231f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_SHADE_MODEL_SMOOTH); 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, PROVOKING_VERTEX_LAST, 1); 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, !cso->flatshade_first); 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, VERTEX_TWO_SIDE_ENABLE, 1); 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->light_twoside); 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2378f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller SB_BEGIN_3D(so, FRAG_COLOR_CLAMP_EN, 1); 2388f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller SB_DATA (so, cso->clamp_fragment_color ? 0x11111111 : 0x00000000); 2398f060df60d1f5ad63a341e39f2ec5a0c3c452cf5Christoph Bumiller 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_WIDTH, 1); 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->line_width)); 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_SMOOTH_ENABLE, 1); 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->line_smooth); 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE_ENABLE, 1); 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->line_stipple_enable) { 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, LINE_STIPPLE, 1); 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, (cso->line_stipple_pattern << 8) | 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller cso->line_stipple_factor); 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!cso->point_size_per_vertex) { 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SIZE, 1); 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->point_size)); 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SPRITE_ENABLE, 1); 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_quad_rasterization); 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POINT_SMOOTH_ENABLE, 1); 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->point_smooth); 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_MODE_FRONT, 3); 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_front)); 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_polygon_mode(cso->fill_back)); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_smooth); 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, CULL_FACE_ENABLE, 3); 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->cull_face != PIPE_FACE_NONE); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->front_ccw ? NV50_3D_FRONT_FACE_CCW : 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_FRONT_FACE_CW); 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->cull_face) { 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT_AND_BACK: 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT_AND_BACK); 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_FRONT: 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_FRONT); 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FACE_BACK: 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA(so, NV50_3D_CULL_FACE_BACK); 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_STIPPLE_ENABLE, 1); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->poly_stipple_enable); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_POINT_ENABLE, 3); 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_point); 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_line); 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->offset_tri); 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->offset_point || cso->offset_line || cso->offset_tri) { 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_FACTOR, 1); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->offset_scale)); 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, POLYGON_OFFSET_UNITS, 1); 29740d7a87a8ee774655e77d45cb1a8070dbae62537Ben Skeggs SB_DATA (so, fui(cso->offset_units * 2.0f)); 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 300d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso) 30647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 308c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->rast = hwcso; 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_RASTERIZER; 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 312c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso) 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_create(struct pipe_context *pipe, 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_depth_stencil_alpha_state *cso) 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_zsa_stateobj *so = CALLOC_STRUCT(nv50_zsa_stateobj); 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->pipe = *cso; 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_WRITE_ENABLE, 1); 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->depth.writemask); 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_ENABLE, 1); 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->depth.enabled) { 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->depth.func)); 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[0].enabled) { 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 5); 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].fail_op)); 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zfail_op)); 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zpass_op)); 344f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[0].func)); 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_FRONT_MASK, 2); 346f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].writemask); 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[0].valuemask); 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_ENABLE, 1); 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 351f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 352f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 353f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->stencil[1].enabled) { 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(cso->stencil[0].enabled); 355f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 5); 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 357f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].fail_op)); 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zfail_op)); 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zpass_op)); 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->stencil[1].func)); 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_BACK_MASK, 2); 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].writemask); 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, cso->stencil[1].valuemask); 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 1); 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_ENABLE, 1); 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->alpha.enabled) { 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 1); 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_BEGIN_3D(so, ALPHA_TEST_REF, 2); 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, fui(cso->alpha.ref_value)); 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, nvgl_comparison_op(cso->alpha.func)); 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller SB_DATA (so, 0); 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 379d9ef97696770c8a6b04e4adf9a813614f9b3c741Christoph Bumiller assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 380f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 38147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 38247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 38347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 384f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_bind(struct pipe_context *pipe, void *hwcso) 3856a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 386f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 387f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 388f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->zsa = hwcso; 389f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ZSA; 3906a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 3916a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 3926a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 393f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_zsa_state_delete(struct pipe_context *pipe, void *hwcso) 3946a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 395f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 396f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 397f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 398f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ====================== SAMPLERS AND TEXTURES ================================ 399f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 400f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 401f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TSC_WRAP_CASE(n) \ 402f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_WRAP_##n: return NV50_TSC_WRAP_##n 403f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 404f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE unsigned 405f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_tsc_wrap_mode(unsigned wrap) 406f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 407f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (wrap) { 408f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(REPEAT); 409f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_REPEAT); 410f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_EDGE); 411f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP_TO_BORDER); 412f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(CLAMP); 413f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_EDGE); 414f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_BORDER); 415f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_TSC_WRAP_CASE(MIRROR_CLAMP); 416f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 417f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("unknown wrap mode: %d\n", wrap); 418f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_TSC_WRAP_REPEAT; 419f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 420f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 421f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 4221f5d6fc59bd899e211c70026eb74cd2219858008Christoph Bumillervoid * 423f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_state_create(struct pipe_context *pipe, 424f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_sampler_state *cso) 425f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 426f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *so = CALLOC_STRUCT(nv50_tsc_entry); 427f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller float f[2]; 428f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 429f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->id = -1; 430f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 431f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] = (0x00026000 | 432f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_s) << 0) | 433f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_t) << 3) | 434f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_tsc_wrap_mode(cso->wrap_r) << 6)); 435f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 436f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->mag_img_filter) { 437f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 438f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_LINEAR; 439f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 440f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 441f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 442f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MAGF_NEAREST; 443f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 444f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 445f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 446f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_img_filter) { 447f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_LINEAR: 448f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_LINEAR; 449f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 450f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_FILTER_NEAREST: 451f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 452f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MINF_NEAREST; 453f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 454f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 455f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 456f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (cso->min_mip_filter) { 457f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_LINEAR: 458f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_LINEAR; 459f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 460f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NEAREST: 461f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NEAREST; 462f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 463f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_TEX_MIPFILTER_NONE: 464f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 465f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_MIPF_NONE; 466f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller break; 467f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 468f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 469f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 16) 470f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (7 << 20); 471f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 472f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 12) 473f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (6 << 20); 474f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else { 475f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (cso->max_anisotropy >> 1) << 20; 476f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 477f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 4) 478f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_35; 479f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 480f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->max_anisotropy >= 2) 481f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= NV50_TSC_1_UNKN_ANISO_15; 482f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 483f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 484f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (cso->compare_mode == PIPE_TEX_COMPARE_R_TO_TEXTURE) { 485f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: must be deactivated for non-shadow textures */ 486f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (1 << 9); 487f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[0] |= (nvgl_comparison_op(cso->compare_func) & 0x7) << 10; 488f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 489f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 490f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->lod_bias, -16.0f, 15.0f); 491f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[1] |= ((int)(f[0] * 256.0f) & 0x1fff) << 12; 492f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 493f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[0] = CLAMP(cso->min_lod, 0.0f, 15.0f); 494f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller f[1] = CLAMP(cso->max_lod, 0.0f, 15.0f); 495f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[2] |= 496f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (((int)(f[1] * 256.0f) & 0xfff) << 12) | ((int)(f[0] * 256.0f) & 0xfff); 497f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 498f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[4] = fui(cso->border_color[0]); 499f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[5] = fui(cso->border_color[1]); 500f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[6] = fui(cso->border_color[2]); 501f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller so->tsc[7] = fui(cso->border_color[3]); 502f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 503f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)so; 5046a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5056a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 5066a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 50747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso) 50847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 509f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned s, i; 510f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 511fb40f1f532b5ea9fb9069f81af9e80835c18b3deMarcin Slusarz for (s = 0; s < 3; ++s) 512f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nv50_context(pipe)->num_samplers[s]; ++i) 513f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50_context(pipe)->samplers[s][i] == hwcso) 514f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_context(pipe)->samplers[s][i] = NULL; 515f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 516f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_free(nv50_context(pipe)->screen, nv50_tsc_entry(hwcso)); 517f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 518f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(hwcso); 51947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 52047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 5216a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic INLINE void 522f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_sampler_states_bind(struct nv50_context *nv50, int s, 523f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, void **hwcso) 52479bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{ 525f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 526f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 527f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 528f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tsc_entry *old = nv50->samplers[s][i]; 529c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 530f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->samplers[s][i] = nv50_tsc_entry(hwcso[i]); 531f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 532f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, old); 533f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 534f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_samplers[s]; ++i) 535f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->samplers[s][i]) 536f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tsc_unlock(nv50->screen, nv50->samplers[s][i]); 537c0ed6a871cd3513e17a1fab960f5626485ffed13Ben Skeggs 538f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_samplers[s] = nr; 53944570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 540f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLERS; 54179bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs} 54279bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs 5436a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumillerstatic void 544f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5456a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 546f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 0, nr, s); 5476a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5486a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 5496a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krolstatic void 550f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 5516a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller{ 552f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 2, nr, s); 55344570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller} 55444570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller 55544570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumillerstatic void 556f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 55744570063bf8a4f45807bc1598c8de291cdc64506Christoph Bumiller{ 558f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_sampler_states_bind(nv50_context(pipe), 1, nr, s); 5596a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller} 5606a15ec9141b070b088d03d87673d0d2741b7db6bChristoph Bumiller 561f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* NOTE: only called when not referenced anywhere, won't be bound */ 562f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 563f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sampler_view_destroy(struct pipe_context *pipe, 564f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view *view) 5656a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol{ 566f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&view->texture, NULL); 5676a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 568f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_free(nv50_context(pipe)->screen, nv50_tic_entry(view)); 5696a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 570f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(nv50_tic_entry(view)); 5716a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol} 5726a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 573f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void 574f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_stage_set_sampler_views(struct nv50_context *nv50, int s, 575f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 576f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 577f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 578f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 579f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 580f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < nr; ++i) { 581f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 582f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (old) 583f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 5846a8961a2479288df4ec736f94b8bf990c1fe0d72Michal Krol 585f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], views[i]); 586f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 587f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 588f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = nr; i < nv50->num_textures[s]; ++i) { 589f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_tic_entry *old = nv50_tic_entry(nv50->textures[s][i]); 590f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!old) 591f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller continue; 592f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_screen_tic_unlock(nv50->screen, old); 593f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 594f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_sampler_view_reference(&nv50->textures[s][i], NULL); 595f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 596f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 597f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_textures[s] = nr; 598f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 599f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_TEXTURES); 600f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 601f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_TEXTURES; 60247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 60347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 60447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 605f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vp_set_sampler_views(struct pipe_context *pipe, 606f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 607f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 60847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 609f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 0, nr, views); 61047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 61147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 61247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 613f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_fp_set_sampler_views(struct pipe_context *pipe, 614f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 615f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 61647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 617f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 2, nr, views); 61847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 61947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 620f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 621f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_gp_set_sampler_views(struct pipe_context *pipe, 622f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned nr, 623f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_sampler_view **views) 624f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 625f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_stage_set_sampler_views(nv50_context(pipe), 1, nr, views); 62647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 62747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 628f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================= SHADERS ======================================= 629f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 630f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 631f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void * 632f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_create(struct pipe_context *pipe, 633f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso, unsigned type) 63447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 635f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog; 63606bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 637f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog = CALLOC_STRUCT(nv50_program); 638f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!prog) 639f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 640f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 641f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->type = type; 642f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller prog->pipe.tokens = tgsi_dup_tokens(cso->tokens); 643f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 644f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return (void *)prog; 64547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 64647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 64747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 648f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_sp_state_delete(struct pipe_context *pipe, void *hwcso) 64947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 650f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_program *prog = (struct nv50_program *)hwcso; 651f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 652f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_program_destroy(nv50_context(pipe), prog); 65306bd7d78b979df66915b161157f2b6b1c09ad285Ben Skeggs 654f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE((void *)prog->pipe.tokens); 655f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(prog); 65647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 65747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 65847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 65947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_create(struct pipe_context *pipe, 660f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 66147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 662f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_VERTEX); 66347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 66447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 66547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 66647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_vp_state_bind(struct pipe_context *pipe, void *hwcso) 66747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 668f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 669f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 670f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertprog = hwcso; 671f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTPROG; 67247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 67347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 67447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void * 67547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_create(struct pipe_context *pipe, 676f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 67747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 678f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_FRAGMENT); 67947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 68047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 68147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 68247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_fp_state_bind(struct pipe_context *pipe, void *hwcso) 68347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 684f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 685f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 686f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->fragprog = hwcso; 687f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAGPROG; 6884c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6894c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6904c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void * 6914c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_create(struct pipe_context *pipe, 692f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_shader_state *cso) 6934c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 694f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return nv50_sp_state_create(pipe, cso, PIPE_SHADER_GEOMETRY); 6954c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 6964c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 6974c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 6984c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillernv50_gp_state_bind(struct pipe_context *pipe, void *hwcso) 6994c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 700f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7014c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 702f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->gmtyprog = hwcso; 703f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_GMTYPROG; 7044c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller} 7054c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 7064c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumillerstatic void 707f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 708f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *res) 7094c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller{ 710f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 711f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 712f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (nv50->constbuf[shader][index]) 713f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_del_resident(nv50, NV50_BUFCTX_CONSTANT, 71479079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs nv04_resource(nv50->constbuf[shader][index])); 715f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 716f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->constbuf[shader][index], res); 7174c223aaa3b1209006454d600cabc7547fa259a13Christoph Bumiller 718f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->constbuf_dirty[shader] |= 1 << index; 719f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 720f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CONSTBUF; 72147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 72247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 723f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* ============================================================================= 724f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 725f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 72647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 72747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_blend_color(struct pipe_context *pipe, 728f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_blend_color *bcol) 72947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 730f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7312fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 732f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->blend_colour = *bcol; 733f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_BLEND_COLOUR; 73447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 73547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 736f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void 73767479eea365954396679714901c11175253bb13bRoland Scheideggernv50_set_stencil_ref(struct pipe_context *pipe, 738f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_stencil_ref *sr) 73967479eea365954396679714901c11175253bb13bRoland Scheidegger{ 740f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 74167479eea365954396679714901c11175253bb13bRoland Scheidegger 742f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stencil_ref = *sr; 743f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STENCIL_REF; 74467479eea365954396679714901c11175253bb13bRoland Scheidegger} 74567479eea365954396679714901c11175253bb13bRoland Scheidegger 74647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 74747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_clip_state(struct pipe_context *pipe, 748f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_clip_state *clip) 74947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 750f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 751f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const unsigned size = clip->nr * sizeof(clip->ucp[0]); 7520811b096690090dbd86b1433c0214cca619e0519Christoph Bumiller 753f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->clip.ucp[0][0], &clip->ucp[0][0], size); 754f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.nr = clip->nr; 75547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 756f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->clip.depth_clamp = clip->depth_clamp; 757f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 758f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_CLIP; 75943234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger} 76043234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheidegger 76143234cee40c48e14a3eab4268181d9b0b2b7cf79Roland Scheideggerstatic void 762f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 76347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 764f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 76590e29afcb62411b69d57dac76fe89c69c9936ed6Christoph Bumiller 766f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->sample_mask = sample_mask; 767f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SAMPLE_MASK; 76847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 76947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 770f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 77147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 77247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_framebuffer_state(struct pipe_context *pipe, 773f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_framebuffer_state *fb) 77447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 775f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 776cd9ed05aec9d1d9614973165fd13647ba2e1b8c7Ben Skeggs 777f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->framebuffer = *fb; 778f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 77947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 78047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 78147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 78247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_polygon_stipple(struct pipe_context *pipe, 783f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_poly_stipple *stipple) 78447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 785f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7862fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 787f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->stipple = *stipple; 788f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_STIPPLE; 78947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 79047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 79147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 79247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_scissor_state(struct pipe_context *pipe, 793f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_scissor_state *scissor) 79447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 795f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 7962fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 797f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->scissor = *scissor; 798f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_SCISSOR; 79947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 80047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 80147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 80247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_set_viewport_state(struct pipe_context *pipe, 803f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_viewport_state *vpt) 80447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 805f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 8062fee5f76483feb301546b24c26eea699732ffb57Ben Skeggs 807f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->viewport = *vpt; 808f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VIEWPORT; 80947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 81047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 81147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 812f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_vertex_buffers(struct pipe_context *pipe, 813f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned count, 814f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_vertex_buffer *vb) 81547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 816f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 817f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 818f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 819f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < count; ++i) 820f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, vb[i].buffer); 821f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; i < nv50->num_vtxbufs; ++i) 822f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL); 823f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 824f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count); 825f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->num_vtxbufs = count; 82647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 827f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_bufctx_reset(nv50, NV50_BUFCTX_VERTEX); 828f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 829f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_ARRAYS; 830f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 831f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller 83247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsstatic void 833f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_set_index_buffer(struct pipe_context *pipe, 834f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_index_buffer *ib) 83547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 836f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 837f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 83826a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller if (ib) { 83926a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller pipe_resource_reference(&nv50->idxbuf.buffer, ib->buffer); 84026a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller 841f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller memcpy(&nv50->idxbuf, ib, sizeof(nv50->idxbuf)); 84226a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller } else { 84326a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller pipe_resource_reference(&nv50->idxbuf.buffer, NULL); 84426a199efac43cc0509f174ca47ad0d2b0044eee0Christoph Bumiller } 845f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller} 846f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 847f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumillerstatic void 848f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_vertex_state_bind(struct pipe_context *pipe, void *hwcso) 849f2656c3e3cc91edcbf572d175efe9346a30b1da2Christoph Bumiller{ 850f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 851f722fd937db2f3cacf1947d538c66528fd16eb89Ben Skeggs 852f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->vertex = hwcso; 853f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_VERTEX; 85447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 85547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 85647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 85747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_state_functions(struct nv50_context *nv50) 85847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 8591ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 8601ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8611ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_blend_state = nv50_blend_state_create; 8621ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_blend_state = nv50_blend_state_bind; 8631ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_blend_state = nv50_blend_state_delete; 8641ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8651ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_rasterizer_state = nv50_rasterizer_state_create; 8661ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_rasterizer_state = nv50_rasterizer_state_bind; 8671ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_rasterizer_state = nv50_rasterizer_state_delete; 8681ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8691ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_depth_stencil_alpha_state = nv50_zsa_state_create; 8701ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_depth_stencil_alpha_state = nv50_zsa_state_bind; 8711ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_depth_stencil_alpha_state = nv50_zsa_state_delete; 8721ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8731ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_state = nv50_sampler_state_create; 8741ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_sampler_state = nv50_sampler_state_delete; 8751ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_sampler_states = nv50_vp_sampler_states_bind; 8761ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fragment_sampler_states = nv50_fp_sampler_states_bind; 8771ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_geometry_sampler_states = nv50_gp_sampler_states_bind; 8781ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8791ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_sampler_view = nv50_create_sampler_view; 8801ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->sampler_view_destroy = nv50_sampler_view_destroy; 8811ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_sampler_views = nv50_vp_set_sampler_views; 8821ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_fragment_sampler_views = nv50_fp_set_sampler_views; 8831ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_geometry_sampler_views = nv50_gp_set_sampler_views; 884f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 8851ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vs_state = nv50_vp_state_create; 8861ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_fs_state = nv50_fp_state_create; 8871ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_gs_state = nv50_gp_state_create; 8881ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vs_state = nv50_vp_state_bind; 8891ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_fs_state = nv50_fp_state_bind; 8901ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_gs_state = nv50_gp_state_bind; 8911ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vs_state = nv50_sp_state_delete; 8921ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_fs_state = nv50_sp_state_delete; 8931ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_gs_state = nv50_sp_state_delete; 8941ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 8951ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_blend_color = nv50_set_blend_color; 8961ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_stencil_ref = nv50_set_stencil_ref; 8971ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_clip_state = nv50_set_clip_state; 8981ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_sample_mask = nv50_set_sample_mask; 8991ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_constant_buffer = nv50_set_constant_buffer; 9001ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_framebuffer_state = nv50_set_framebuffer_state; 9011ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_polygon_stipple = nv50_set_polygon_stipple; 9021ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_scissor_state = nv50_set_scissor_state; 9031ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_viewport_state = nv50_set_viewport_state; 9041ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 9051ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->create_vertex_elements_state = nv50_vertex_state_create; 9061ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->delete_vertex_elements_state = nv50_vertex_state_delete; 9071ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->bind_vertex_elements_state = nv50_vertex_state_bind; 9081ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 9091ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_vertex_buffers = nv50_set_vertex_buffers; 9101ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->set_index_buffer = nv50_set_index_buffer; 911caaa7fdd6f8bb6f38bf555de79bd3cfd7ac9c715Christoph Bumiller 912caaa7fdd6f8bb6f38bf555de79bd3cfd7ac9c715Christoph Bumiller pipe->redefine_user_buffer = u_default_redefine_user_buffer; 91347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 91447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 915