1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_transfer.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_stateobj.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_3d.xml.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50/nv50_texture.xml.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau/nouveau_gldefs.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint32_t 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_colormask(unsigned mask) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t ret = 0; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & PIPE_MASK_R) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret |= 0x0001; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & PIPE_MASK_G) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret |= 0x0010; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & PIPE_MASK_B) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret |= 0x0100; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & PIPE_MASK_A) 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret |= 0x1000; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ret; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_BLEND_FACTOR_CASE(a, b) \ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BLENDFACTOR_##a: return NV50_3D_BLEND_FACTOR_##b 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint32_t 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_blend_fac(unsigned factor) 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (factor) { 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(ONE, ONE); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(SRC_COLOR, SRC_COLOR); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(SRC_ALPHA, SRC_ALPHA); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(DST_ALPHA, DST_ALPHA); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(DST_COLOR, DST_COLOR); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(SRC_ALPHA_SATURATE, SRC_ALPHA_SATURATE); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(CONST_COLOR, CONSTANT_COLOR); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(CONST_ALPHA, CONSTANT_ALPHA); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(SRC1_COLOR, SRC1_COLOR); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(SRC1_ALPHA, SRC1_ALPHA); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(ZERO, ZERO); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_SRC_COLOR, ONE_MINUS_SRC_COLOR); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_SRC_ALPHA, ONE_MINUS_SRC_ALPHA); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_DST_ALPHA, ONE_MINUS_DST_ALPHA); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_DST_COLOR, ONE_MINUS_DST_COLOR); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_CONST_COLOR, ONE_MINUS_CONSTANT_COLOR); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_CONST_ALPHA, ONE_MINUS_CONSTANT_ALPHA); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_SRC1_COLOR, ONE_MINUS_SRC1_COLOR); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_BLEND_FACTOR_CASE(INV_SRC1_ALPHA, ONE_MINUS_SRC1_ALPHA); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV50_3D_BLEND_FACTOR_ZERO; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_blend_state_create(struct pipe_context *pipe, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_state *cso) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_blend_stateobj *so = CALLOC_STRUCT(nvc0_blend_stateobj); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r; /* reference */ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t ms; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t blend_en = 0; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean indep_masks = FALSE; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean indep_funcs = FALSE; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->pipe = *cso; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check which states actually have differing values */ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->independent_blend_enable) { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (r = 0; r < 8 && !cso->rt[r].blend_enable; ++r); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_en |= 1 << r; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = r + 1; i < 8; ++i) { 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso->rt[i].blend_enable) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_en |= 1 << i; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->rt[i].rgb_func != cso->rt[r].rgb_func || 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->rt[i].rgb_src_factor != cso->rt[r].rgb_src_factor || 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->rt[i].rgb_dst_factor != cso->rt[r].rgb_dst_factor || 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->rt[i].alpha_func != cso->rt[r].alpha_func || 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->rt[i].alpha_src_factor != cso->rt[r].alpha_src_factor || 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->rt[i].alpha_dst_factor != cso->rt[r].alpha_dst_factor) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indep_funcs = TRUE; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < 8; ++i) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_en |= (cso->rt[i].blend_enable ? 1 : 0) << i; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1; i < 8; ++i) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->rt[i].colormask != cso->rt[0].colormask) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indep_masks = TRUE; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 0; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->rt[0].blend_enable) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_en = 0xff; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->logicop_enable) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, 1); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_logicop_func(cso->logicop_func)); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, MACRO_BLEND_ENABLES, 0); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, LOGIC_OP_ENABLE, 0); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, BLEND_INDEPENDENT, indep_funcs); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, MACRO_BLEND_ENABLES, blend_en); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (indep_funcs) { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; ++i) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->rt[i].blend_enable) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, IBLEND_EQUATION_RGB(i), 6); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_blend_eqn(cso->rt[i].rgb_func)); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_src_factor)); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[i].rgb_dst_factor)); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_blend_eqn(cso->rt[i].alpha_func)); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_src_factor)); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[i].alpha_dst_factor)); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (blend_en) { 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_blend_eqn(cso->rt[r].rgb_func)); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[r].rgb_src_factor)); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[r].rgb_dst_factor)); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_blend_eqn(cso->rt[r].alpha_func)); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[r].alpha_src_factor)); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, BLEND_FUNC_DST_ALPHA, 1); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_blend_fac(cso->rt[r].alpha_dst_factor)); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, COLOR_MASK_COMMON, !indep_masks); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (indep_masks) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, COLOR_MASK(0), 8); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; ++i) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA(so, nvc0_colormask(cso->rt[i].colormask)); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, COLOR_MASK(0), 1); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvc0_colormask(cso->rt[0].colormask)); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms = 0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->alpha_to_coverage) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->alpha_to_one) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, MULTISAMPLE_CTRL, 1); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, ms); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return so; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_blend_state_bind(struct pipe_context *pipe, void *hwcso) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->blend = hwcso; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_BLEND; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_blend_state_delete(struct pipe_context *pipe, void *hwcso) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(hwcso); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* NOTE: ignoring line_last_pixel, using FALSE (set on screen init) */ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_rasterizer_state_create(struct pipe_context *pipe, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *cso) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_rasterizer_stateobj *so; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t reg; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so = CALLOC_STRUCT(nvc0_rasterizer_stateobj); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!so) 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->pipe = *cso; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scissor enables are handled in scissor state, we will not want to 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * always emit 16 commands, one for each scissor rectangle, here. 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, SHADE_MODEL, 1); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->flatshade ? NVC0_3D_SHADE_MODEL_FLAT : 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_SHADE_MODEL_SMOOTH); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, PROVOKING_VERTEX_LAST, !cso->flatshade_first); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, VERTEX_TWO_SIDE_ENABLE, cso->light_twoside); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, VERT_COLOR_CLAMP_EN, cso->clamp_vertex_color); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, FRAG_COLOR_CLAMP_EN, 1); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->clamp_fragment_color ? 0x11111111 : 0x00000000); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, MULTISAMPLE_ENABLE, cso->multisample); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, LINE_SMOOTH_ENABLE, cso->line_smooth); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->line_smooth) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, LINE_WIDTH_SMOOTH, 1); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, LINE_WIDTH_ALIASED, 1); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->line_width)); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, LINE_STIPPLE_ENABLE, cso->line_stipple_enable); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->line_stipple_enable) { 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, LINE_STIPPLE_PATTERN, 1); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, (cso->line_stipple_pattern << 8) | 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cso->line_stipple_factor); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, VP_POINT_SIZE_EN, cso->point_size_per_vertex); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!cso->point_size_per_vertex) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POINT_SIZE, 1); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->point_size)); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg = (cso->sprite_coord_mode == PIPE_SPRITE_COORD_UPPER_LEFT) ? 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_POINT_COORD_REPLACE_COORD_ORIGIN_UPPER_LEFT : 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_POINT_COORD_REPLACE_COORD_ORIGIN_LOWER_LEFT; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POINT_COORD_REPLACE, 1); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, ((cso->sprite_coord_enable & 0xff) << 3) | reg); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, POINT_SPRITE_ENABLE, cso->point_quad_rasterization); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, POINT_SMOOTH_ENABLE, cso->point_smooth); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, MACRO_POLYGON_MODE_FRONT, 1); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_polygon_mode(cso->fill_front)); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, MACRO_POLYGON_MODE_BACK, 1); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_polygon_mode(cso->fill_back)); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, POLYGON_SMOOTH_ENABLE, cso->poly_smooth); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, CULL_FACE_ENABLE, 3); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->cull_face != PIPE_FACE_NONE); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->front_ccw ? NVC0_3D_FRONT_FACE_CCW : 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_FRONT_FACE_CW); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (cso->cull_face) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FACE_FRONT_AND_BACK: 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA(so, NVC0_3D_CULL_FACE_FRONT_AND_BACK); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FACE_FRONT: 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA(so, NVC0_3D_CULL_FACE_FRONT); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FACE_BACK: 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA(so, NVC0_3D_CULL_FACE_BACK); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, POLYGON_STIPPLE_ENABLE, cso->poly_stipple_enable); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POLYGON_OFFSET_POINT_ENABLE, 3); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->offset_point); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->offset_line); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->offset_tri); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->offset_point || cso->offset_line || cso->offset_tri) { 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POLYGON_OFFSET_FACTOR, 1); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->offset_scale)); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POLYGON_OFFSET_UNITS, 1); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->offset_units * 2.0f)); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, POLYGON_OFFSET_CLAMP, 1); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->offset_clamp)); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->depth_clip) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg = NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg = 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1 | 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_NEAR | 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VIEW_VOLUME_CLIP_CTRL_DEPTH_CLAMP_FAR | 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK12_UNK2; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, VIEW_VOLUME_CLIP_CTRL, 1); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, reg); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (void *)so; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_rasterizer_state_bind(struct pipe_context *pipe, void *hwcso) 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->rast = hwcso; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_RASTERIZER; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_rasterizer_state_delete(struct pipe_context *pipe, void *hwcso) 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(hwcso); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_zsa_state_create(struct pipe_context *pipe, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_depth_stencil_alpha_state *cso) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_zsa_stateobj *so = CALLOC_STRUCT(nvc0_zsa_stateobj); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so->pipe = *cso; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, DEPTH_TEST_ENABLE, cso->depth.enabled); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->depth.enabled) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, DEPTH_WRITE_ENABLE, cso->depth.writemask); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, DEPTH_TEST_FUNC, 1); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_comparison_op(cso->depth.func)); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->stencil[0].enabled) { 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, STENCIL_ENABLE, 5); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, 1); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[0].fail_op)); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zfail_op)); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[0].zpass_op)); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_comparison_op(cso->stencil[0].func)); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, STENCIL_FRONT_FUNC_MASK, 2); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->stencil[0].valuemask); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->stencil[0].writemask); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, STENCIL_ENABLE, 0); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->stencil[1].enabled) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(cso->stencil[0].enabled); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, STENCIL_TWO_SIDE_ENABLE, 5); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, 1); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[1].fail_op)); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zfail_op)); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_stencil_op(cso->stencil[1].zpass_op)); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_comparison_op(cso->stencil[1].func)); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, STENCIL_BACK_MASK, 2); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->stencil[1].writemask); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, cso->stencil[1].valuemask); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->stencil[0].enabled) { 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, STENCIL_TWO_SIDE_ENABLE, 0); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_IMMED_3D(so, ALPHA_TEST_ENABLE, cso->alpha.enabled); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->alpha.enabled) { 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_BEGIN_3D(so, ALPHA_TEST_REF, 2); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, fui(cso->alpha.ref_value)); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SB_DATA (so, nvgl_comparison_op(cso->alpha.func)); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(so->size <= (sizeof(so->state) / sizeof(so->state[0]))); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (void *)so; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_zsa_state_bind(struct pipe_context *pipe, void *hwcso) 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->zsa = hwcso; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_ZSA; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_zsa_state_delete(struct pipe_context *pipe, void *hwcso) 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(hwcso); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ====================== SAMPLERS AND TEXTURES ================================ 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_TSC_WRAP_CASE(n) \ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_##n: return NV50_TSC_WRAP_##n 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_tsc_wrap_mode(unsigned wrap) 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (wrap) { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(REPEAT); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(MIRROR_REPEAT); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(CLAMP_TO_EDGE); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(CLAMP_TO_BORDER); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(CLAMP); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_EDGE); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(MIRROR_CLAMP_TO_BORDER); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_TSC_WRAP_CASE(MIRROR_CLAMP); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NOUVEAU_ERR("unknown wrap mode: %d\n", wrap); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NV50_TSC_WRAP_REPEAT; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_sampler_state_delete(struct pipe_context *pipe, void *hwcso) 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s, i; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < 5; ++s) 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nvc0_context(pipe)->num_samplers[s]; ++i) 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0_context(pipe)->samplers[s][i] == hwcso) 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_context(pipe)->samplers[s][i] = NULL; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tsc_free(nvc0_context(pipe)->screen, nv50_tsc_entry(hwcso)); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(hwcso); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_stage_sampler_states_bind(struct nvc0_context *nvc0, int s, 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, void **hwcso) 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; ++i) { 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tsc_entry *old = nvc0->samplers[s][i]; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hwcso[i] == old) 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->samplers_dirty[s] |= 1 << i; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->samplers[s][i] = nv50_tsc_entry(hwcso[i]); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tsc_unlock(nvc0->screen, old); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nvc0->num_samplers[s]; ++i) { 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->samplers[s][i]) { 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tsc_unlock(nvc0->screen, nvc0->samplers[s][i]); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->samplers[s][i] = NULL; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->num_samplers[s] = nr; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_SAMPLERS; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_sampler_states_bind(nvc0_context(pipe), 0, nr, s); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_fp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_sampler_states_bind(nvc0_context(pipe), 4, nr, s); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_gp_sampler_states_bind(struct pipe_context *pipe, unsigned nr, void **s) 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_sampler_states_bind(nvc0_context(pipe), 3, nr, s); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* NOTE: only called when not referenced anywhere, won't be bound */ 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_sampler_view_destroy(struct pipe_context *pipe, 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *view) 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&view->texture, NULL); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tic_free(nvc0_context(pipe)->screen, nv50_tic_entry(view)); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(nv50_tic_entry(view)); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_stage_set_sampler_views(struct nvc0_context *nvc0, int s, 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nr; ++i) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tic_entry *old = nv50_tic_entry(nvc0->textures[s][i]); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (views[i] == nvc0->textures[s][i]) 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->textures_dirty[s] |= 1 << i; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_TEX(s, i)); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tic_unlock(nvc0->screen, old); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&nvc0->textures[s][i], views[i]); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = nr; i < nvc0->num_textures[s]; ++i) { 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_tic_entry *old = nv50_tic_entry(nvc0->textures[s][i]); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (old) { 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_TEX(s, i)); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_screen_tic_unlock(nvc0->screen, old); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view_reference(&nvc0->textures[s][i], NULL); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->num_textures[s] = nr; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_TEXTURES; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vp_set_sampler_views(struct pipe_context *pipe, 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_set_sampler_views(nvc0_context(pipe), 0, nr, views); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_fp_set_sampler_views(struct pipe_context *pipe, 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_set_sampler_views(nvc0_context(pipe), 4, nr, views); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_gp_set_sampler_views(struct pipe_context *pipe, 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr, 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **views) 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_stage_set_sampler_views(nvc0_context(pipe), 3, nr, views); 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================= SHADERS ======================================= 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_sp_state_create(struct pipe_context *pipe, 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *cso, unsigned type) 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_program *prog; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = CALLOC_STRUCT(nvc0_program); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->type = type; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->tokens) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->pipe.tokens = tgsi_dup_tokens(cso->tokens); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cso->stream_output.num_outputs) 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->pipe.stream_output = cso->stream_output; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (void *)prog; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_sp_state_delete(struct pipe_context *pipe, void *hwcso) 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_program *prog = (struct nvc0_program *)hwcso; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_program_destroy(nvc0_context(pipe), prog); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE((void *)prog->pipe.tokens); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(prog); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vp_state_create(struct pipe_context *pipe, 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *cso) 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nvc0_sp_state_create(pipe, cso, PIPE_SHADER_VERTEX); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vp_state_bind(struct pipe_context *pipe, void *hwcso) 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vertprog = hwcso; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_VERTPROG; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_fp_state_create(struct pipe_context *pipe, 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *cso) 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nvc0_sp_state_create(pipe, cso, PIPE_SHADER_FRAGMENT); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_fp_state_bind(struct pipe_context *pipe, void *hwcso) 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->fragprog = hwcso; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_FRAGPROG; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_gp_state_create(struct pipe_context *pipe, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_shader_state *cso) 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nvc0_sp_state_create(pipe, cso, PIPE_SHADER_GEOMETRY); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_gp_state_bind(struct pipe_context *pipe, void *hwcso) 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->gmtyprog = hwcso; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_GMTYPROG; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_constant_buffer *cb) 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res = cb ? cb->buffer : NULL; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned s = nvc0_shader_stage(shader); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned i = index; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader == PIPE_SHADER_COMPUTE) 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->constbuf[s][i].user) 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].u.buf = NULL; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->constbuf[s][i].u.buf) 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_CB(s, i)); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->constbuf[s][i].u.buf, res); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].user = (cb && cb->user_buffer) ? TRUE : FALSE; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->constbuf[s][i].user) { 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].u.data = cb->user_buffer; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].size = cb->buffer_size; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cb) { 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].offset = cb->buffer_offset; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf[s][i].size = align(cb->buffer_size, 0x100); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constbuf_dirty[s] |= 1 << i; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_CONSTBUF; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ============================================================================= 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_blend_color(struct pipe_context *pipe, 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_blend_color *bcol) 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->blend_colour = *bcol; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_BLEND_COLOUR; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_stencil_ref(struct pipe_context *pipe, 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_stencil_ref *sr) 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->stencil_ref = *sr; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_STENCIL_REF; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_clip_state(struct pipe_context *pipe, 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_clip_state *clip) 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(nvc0->clip.ucp, clip->ucp, sizeof(clip->ucp)); 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_CLIP; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask) 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->sample_mask = sample_mask; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_SAMPLE_MASK; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_framebuffer_state(struct pipe_context *pipe, 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_framebuffer_state *fb) 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_FB); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < fb->nr_cbufs; ++i) 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&nvc0->framebuffer.cbufs[i], fb->cbufs[i]); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nvc0->framebuffer.nr_cbufs; ++i) 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&nvc0->framebuffer.cbufs[i], NULL); 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->framebuffer.nr_cbufs = fb->nr_cbufs; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->framebuffer.width = fb->width; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->framebuffer.height = fb->height; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reference(&nvc0->framebuffer.zsbuf, fb->zsbuf); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_FRAMEBUFFER; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_polygon_stipple(struct pipe_context *pipe, 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_poly_stipple *stipple) 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->stipple = *stipple; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_STIPPLE; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_scissor_state(struct pipe_context *pipe, 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_scissor_state *scissor) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->scissor = *scissor; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_SCISSOR; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_viewport_state(struct pipe_context *pipe, 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_viewport_state *vpt) 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->viewport = *vpt; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_VIEWPORT; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_vertex_buffers(struct pipe_context *pipe, 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_buffer *vb) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t constant_vbos = 0; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vbo_user = 0; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count != nvc0->num_vtxbufs) { 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; ++i) { 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->vtxbuf[i].buffer, vb[i].buffer); 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vb[i].user_buffer) { 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vbo_user |= 1 << i; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].user_buffer = vb[i].user_buffer; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vb[i].stride) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_vbos |= 1 << i; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].buffer_offset = vb[i].buffer_offset; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].stride = vb[i].stride; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nvc0->num_vtxbufs; ++i) 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->vtxbuf[i].buffer, NULL); 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->num_vtxbufs = count; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_ARRAYS; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; ++i) { 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vb[i].user_buffer) { 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].user_buffer = vb[i].user_buffer; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vbo_user |= 1 << i; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vb[i].stride) 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_vbos |= 1 << i; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!vb[i].buffer); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->vtxbuf[i].buffer == vb[i].buffer && 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].buffer_offset == vb[i].buffer_offset && 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].stride == vb[i].stride) 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->vtxbuf[i].buffer, vb[i].buffer); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].buffer_offset = vb[i].buffer_offset; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vtxbuf[i].stride = vb[i].stride; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_ARRAYS; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (constant_vbos != nvc0->constant_vbos) { 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->constant_vbos = constant_vbos; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_ARRAYS; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->dirty & NVC0_NEW_ARRAYS) 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_index_buffer(struct pipe_context *pipe, 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_index_buffer *ib) 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->idxbuf.buffer) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_IDX); 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->idxbuf.buffer, ib->buffer); 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->idxbuf.index_size = ib->index_size; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ib->buffer) { 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->idxbuf.offset = ib->offset; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_IDXBUF; 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->idxbuf.user_buffer = ib->user_buffer; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty &= ~NVC0_NEW_IDXBUF; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty &= ~NVC0_NEW_IDXBUF; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&nvc0->idxbuf.buffer, NULL); 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vertex_state_bind(struct pipe_context *pipe, void *hwcso) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->vertex = hwcso; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_VERTEX; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_stream_output_target * 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_so_target_create(struct pipe_context *pipe, 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res, 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, unsigned size) 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_so_target *targ = MALLOC_STRUCT(nvc0_so_target); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!targ) 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->pq = pipe->create_query(pipe, NVC0_QUERY_TFB_BUFFER_OFFSET); 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!targ->pq) { 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(targ); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->clean = TRUE; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->pipe.buffer_size = size; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->pipe.buffer_offset = offset; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->pipe.context = pipe; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ->pipe.buffer = NULL; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&targ->pipe.buffer, res); 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_reference_init(&targ->pipe.reference, 1); 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &targ->pipe; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_so_target_destroy(struct pipe_context *pipe, 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *ptarg) 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_so_target *targ = nvc0_so_target(ptarg); 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->destroy_query(pipe, targ->pq); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&targ->pipe.buffer, NULL); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(targ); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_set_transform_feedback_targets(struct pipe_context *pipe, 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_targets, 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target **targets, 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned append_mask) 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_context *nvc0 = nvc0_context(pipe); 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean serialize = TRUE; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(num_targets <= 4); 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_targets; ++i) { 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->tfbbuf[i] == targets[i] && (append_mask & (1 << i))) 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->tfbbuf_dirty |= 1 << i; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->tfbbuf[i] && nvc0->tfbbuf[i] != targets[i]) 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_so_target_save_offset(pipe, nvc0->tfbbuf[i], i, &serialize); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (targets[i] && !(append_mask & (1 << i))) 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_so_target(targets[i])->clean = TRUE; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&nvc0->tfbbuf[i], targets[i]); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < nvc0->num_tfbbufs; ++i) { 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->tfbbuf_dirty |= 1 << i; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0_so_target_save_offset(pipe, nvc0->tfbbuf[i], i, &serialize); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_so_target_reference(&nvc0->tfbbuf[i], NULL); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->num_tfbbufs = num_targets; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nvc0->tfbbuf_dirty) 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->dirty |= NVC0_NEW_TFB_TARGETS; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_init_state_functions(struct nvc0_context *nvc0) 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = &nvc0->base.pipe; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_blend_state = nvc0_blend_state_create; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_blend_state = nvc0_blend_state_bind; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_blend_state = nvc0_blend_state_delete; 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_rasterizer_state = nvc0_rasterizer_state_create; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_rasterizer_state = nvc0_rasterizer_state_bind; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_rasterizer_state = nvc0_rasterizer_state_delete; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_depth_stencil_alpha_state = nvc0_zsa_state_create; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_depth_stencil_alpha_state = nvc0_zsa_state_bind; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_depth_stencil_alpha_state = nvc0_zsa_state_delete; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_sampler_state = nv50_sampler_state_create; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_sampler_state = nvc0_sampler_state_delete; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_sampler_states = nvc0_vp_sampler_states_bind; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fragment_sampler_states = nvc0_fp_sampler_states_bind; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_geometry_sampler_states = nvc0_gp_sampler_states_bind; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_sampler_view = nvc0_create_sampler_view; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->sampler_view_destroy = nvc0_sampler_view_destroy; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_vertex_sampler_views = nvc0_vp_set_sampler_views; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_fragment_sampler_views = nvc0_fp_set_sampler_views; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_geometry_sampler_views = nvc0_gp_set_sampler_views; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_vs_state = nvc0_vp_state_create; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_fs_state = nvc0_fp_state_create; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_gs_state = nvc0_gp_state_create; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vs_state = nvc0_vp_state_bind; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_fs_state = nvc0_fp_state_bind; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_gs_state = nvc0_gp_state_bind; 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vs_state = nvc0_sp_state_delete; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_fs_state = nvc0_sp_state_delete; 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_gs_state = nvc0_sp_state_delete; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_blend_color = nvc0_set_blend_color; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stencil_ref = nvc0_set_stencil_ref; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_clip_state = nvc0_set_clip_state; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_sample_mask = nvc0_set_sample_mask; 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_constant_buffer = nvc0_set_constant_buffer; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_framebuffer_state = nvc0_set_framebuffer_state; 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_polygon_stipple = nvc0_set_polygon_stipple; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_scissor_state = nvc0_set_scissor_state; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_viewport_state = nvc0_set_viewport_state; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_vertex_elements_state = nvc0_vertex_state_create; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->delete_vertex_elements_state = nvc0_vertex_state_delete; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->bind_vertex_elements_state = nvc0_vertex_state_bind; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_vertex_buffers = nvc0_set_vertex_buffers; 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_index_buffer = nvc0_set_index_buffer; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->create_stream_output_target = nvc0_so_target_create; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->stream_output_target_destroy = nvc0_so_target_destroy; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_stream_output_targets = nvc0_set_transform_feedback_targets; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003