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