1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "translate/translate.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_context.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_resource.h"
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nvc0_3d.xml.h"
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct push_context {
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push;
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate;
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *dest;
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const void *idxbuf;
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t vertex_size;
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t restart_index;
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t instance_id;
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean prim_restart;
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean need_vertex_id;
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean enabled;
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean value;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned stride;
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const uint8_t *data;
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } edgeflag;
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void nvc0_push_upload_vertex_ids(struct push_context *,
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        struct nvc0_context *,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        const struct pipe_draw_info *);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_context_init(struct nvc0_context *nvc0, struct push_context *ctx)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->push = nvc0->base.pushbuf;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->translate = nvc0->vertex->translate;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->vertex_size = nvc0->vertex->size;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->need_vertex_id =
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nvc0->vertprog->vp.need_vertex_id && (nvc0->vertex->num_elements < 32);
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.value = TRUE;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.enabled = nvc0->vertprog->vp.edgeflag < PIPE_MAX_ATTRIBS;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* silence warnings */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.data = NULL;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.stride = 0;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_vertex_configure_translate(struct nvc0_context *nvc0, int32_t index_bias)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate = nvc0->vertex->translate;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nvc0->num_vtxbufs; ++i) {
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const uint8_t *map;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[i];
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (likely(!vb->buffer))
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         map = (const uint8_t *)vb->user_buffer;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         map = nouveau_resource_map_offset(&nvc0->base,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            nv04_resource(vb->buffer), vb->buffer_offset, NOUVEAU_BO_RD);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index_bias && !unlikely(nvc0->vertex->instance_bufs & (1 << i)))
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         map += (intptr_t)index_bias * vb->stride;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      translate->set_buffer(translate, i, map, vb->stride, ~0);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_map_idxbuf(struct push_context *ctx, struct nvc0_context *nvc0)
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nvc0->idxbuf.buffer) {
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct nv04_resource *buf = nv04_resource(nvc0->idxbuf.buffer);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->idxbuf = nouveau_resource_map_offset(&nvc0->base,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buf, nvc0->idxbuf.offset, NOUVEAU_BO_RD);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->idxbuf = nvc0->idxbuf.user_buffer;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_map_edgeflag(struct push_context *ctx, struct nvc0_context *nvc0,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       int32_t index_bias)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned attr = nvc0->vertprog->vp.edgeflag;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element *ve = &nvc0->vertex->element[attr].pipe;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[ve->vertex_buffer_index];
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv04_resource *buf = nv04_resource(vb->buffer);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned offset = vb->buffer_offset + ve->src_offset;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.stride = vb->stride;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.data = nouveau_resource_map_offset(&nvc0->base,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           buf, offset, NOUVEAU_BO_RD);
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index_bias)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->edgeflag.data += (intptr_t)index_bias * vb->stride;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i08(const uint8_t *elts, unsigned push, uint8_t index)
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < push && elts[i] != index; ++i);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i16(const uint16_t *elts, unsigned push, uint16_t index)
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < push && elts[i] != index; ++i);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i32(const uint32_t *elts, unsigned push, uint32_t index)
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < push && elts[i] != index; ++i);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_value(const struct push_context *ctx, uint32_t index)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float *pf = (float *)&ctx->edgeflag.data[index * ctx->edgeflag.stride];
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return *pf ? TRUE : FALSE;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_toggle(struct push_context *ctx)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->edgeflag.value = !ctx->edgeflag.value;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->edgeflag.value;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_toggle_search_i08(struct push_context *ctx, const uint8_t *elts, unsigned n)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n && ef_value(ctx, elts[i]) == ctx->edgeflag.value; ++i);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_toggle_search_i16(struct push_context *ctx, const uint16_t *elts, unsigned n)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n && ef_value(ctx, elts[i]) == ctx->edgeflag.value; ++i);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_toggle_search_i32(struct push_context *ctx, const uint32_t *elts, unsigned n)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n && ef_value(ctx, elts[i]) == ctx->edgeflag.value; ++i);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgef_toggle_search_seq(struct push_context *ctx, unsigned start, unsigned n)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n && ef_value(ctx, start++) == ctx->edgeflag.value; ++i);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void *
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_setup_vertex_array(struct nvc0_context *nvc0, const unsigned count)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_bo *bo;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint64_t va;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned size = count * nvc0->vertex->size;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *const dest = nouveau_scratch_get(&nvc0->base, size, &va, &bo);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_START_HIGH(0)), 2);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATAh(push, va);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, va);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_LIMIT_HIGH(0)), 2);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATAh(push, va + size - 1);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, va + size - 1);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, NOUVEAU_BO_GART | NOUVEAU_BO_RD,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                bo);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nouveau_pushbuf_validate(push);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dest;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdisp_vertices_i08(struct push_context *ctx, unsigned start, unsigned count)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = ctx->push;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate = ctx->translate;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint8_t *restrict elts = (uint8_t *)ctx->idxbuf + start;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pos = 0;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned nR = count;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(ctx->prim_restart))
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR = prim_restart_search_i08(elts, nR, ctx->restart_index);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      translate->run_elts8(translate, elts, nR, ctx->instance_id, ctx->dest);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= nR;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->dest += nR * ctx->vertex_size;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (nR) {
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned nE = nR;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(ctx->edgeflag.enabled))
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            nE = ef_toggle_search_i08(ctx, elts, nR);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_SPACE(push, 4);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (likely(nE >= 2)) {
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            BEGIN_NVC0(push, NVC0_3D(VERTEX_BUFFER_FIRST), 2);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, pos);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, nE);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (nE) {
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (pos <= 0xff) {
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               IMMED_NVC0(push, NVC0_3D(VB_ELEMENT_U32), pos);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PUSH_DATA (push, pos);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(nE != nR))
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            IMMED_NVC0(push, NVC0_3D(EDGEFLAG), ef_toggle(ctx));
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += nE;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         elts += nE;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR -= nE;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (count) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (push, ctx->restart_index);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++elts;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->dest += ctx->vertex_size;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++pos;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         --count;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (count);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdisp_vertices_i16(struct push_context *ctx, unsigned start, unsigned count)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = ctx->push;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate = ctx->translate;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint16_t *restrict elts = (uint16_t *)ctx->idxbuf + start;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pos = 0;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned nR = count;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(ctx->prim_restart))
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR = prim_restart_search_i16(elts, nR, ctx->restart_index);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      translate->run_elts16(translate, elts, nR, ctx->instance_id, ctx->dest);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= nR;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->dest += nR * ctx->vertex_size;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (nR) {
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned nE = nR;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(ctx->edgeflag.enabled))
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            nE = ef_toggle_search_i16(ctx, elts, nR);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_SPACE(push, 4);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (likely(nE >= 2)) {
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            BEGIN_NVC0(push, NVC0_3D(VERTEX_BUFFER_FIRST), 2);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, pos);
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, nE);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (nE) {
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (pos <= 0xff) {
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               IMMED_NVC0(push, NVC0_3D(VB_ELEMENT_U32), pos);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PUSH_DATA (push, pos);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(nE != nR))
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            IMMED_NVC0(push, NVC0_3D(EDGEFLAG), ef_toggle(ctx));
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += nE;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         elts += nE;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR -= nE;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (count) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (push, ctx->restart_index);
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++elts;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->dest += ctx->vertex_size;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++pos;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         --count;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (count);
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdisp_vertices_i32(struct push_context *ctx, unsigned start, unsigned count)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = ctx->push;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate = ctx->translate;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint32_t *restrict elts = (uint32_t *)ctx->idxbuf + start;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pos = 0;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned nR = count;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(ctx->prim_restart))
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR = prim_restart_search_i32(elts, nR, ctx->restart_index);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      translate->run_elts(translate, elts, nR, ctx->instance_id, ctx->dest);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= nR;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->dest += nR * ctx->vertex_size;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (nR) {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned nE = nR;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(ctx->edgeflag.enabled))
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            nE = ef_toggle_search_i32(ctx, elts, nR);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_SPACE(push, 4);
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (likely(nE >= 2)) {
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            BEGIN_NVC0(push, NVC0_3D(VERTEX_BUFFER_FIRST), 2);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, pos);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            PUSH_DATA (push, nE);
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (nE) {
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (pos <= 0xff) {
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               IMMED_NVC0(push, NVC0_3D(VB_ELEMENT_U32), pos);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PUSH_DATA (push, pos);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (unlikely(nE != nR))
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            IMMED_NVC0(push, NVC0_3D(EDGEFLAG), ef_toggle(ctx));
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos += nE;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         elts += nE;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nR -= nE;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (count) {
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (push, ctx->restart_index);
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++elts;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->dest += ctx->vertex_size;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++pos;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         --count;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (count);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdisp_vertices_seq(struct push_context *ctx, unsigned start, unsigned count)
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = ctx->push;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate *translate = ctx->translate;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pos = 0;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   translate->run(translate, start, count, ctx->instance_id, ctx->dest);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned nr = count;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(ctx->edgeflag.enabled))
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nr = ef_toggle_search_seq(ctx, start + pos, nr);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_SPACE(push, 4);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (likely(nr)) {
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BEGIN_NVC0(push, NVC0_3D(VERTEX_BUFFER_FIRST), 2);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (push, pos);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (push, nr);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(nr != count))
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         IMMED_NVC0(push, NVC0_3D(EDGEFLAG), ef_toggle(ctx));
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += nr;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= nr;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (count);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_PRIM_GL_CASE(n) \
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_PRIM_##n: return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_##n
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_prim_gl(unsigned prim)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (prim) {
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(POINTS);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(LINES);
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(LINE_LOOP);
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(LINE_STRIP);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(TRIANGLES);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(TRIANGLE_STRIP);
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(TRIANGLE_FAN);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(QUADS);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(QUAD_STRIP);
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(POLYGON);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(LINES_ADJACENCY);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(LINE_STRIP_ADJACENCY);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(TRIANGLES_ADJACENCY);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(TRIANGLE_STRIP_ADJACENCY);
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NVC0_PRIM_GL_CASE(PATCHES); */
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_POINTS;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info)
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct push_context ctx;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, index_size;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned inst_count = info->instance_count;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned vert_count = info->count;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned prim;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nvc0_push_context_init(nvc0, &ctx);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nvc0_vertex_configure_translate(nvc0, info->index_bias);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(ctx.edgeflag.enabled))
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nvc0_push_map_edgeflag(&ctx, nvc0, info->index_bias);
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.prim_restart = info->primitive_restart;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.restart_index = info->restart_index;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info->indexed) {
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nvc0_push_map_idxbuf(&ctx, nvc0);
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index_size = nvc0->idxbuf.index_size;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info->primitive_restart) {
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BEGIN_NVC0(ctx.push, NVC0_3D(PRIM_RESTART_ENABLE), 2);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (ctx.push, 1);
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PUSH_DATA (ctx.push, info->restart_index);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (nvc0->state.prim_restart) {
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         IMMED_NVC0(ctx.push, NVC0_3D(PRIM_RESTART_ENABLE), 0);
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nvc0->state.prim_restart = info->primitive_restart;
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(info->count_from_stream_output)) {
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct pipe_context *pipe = &nvc0->base.pipe;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct nvc0_so_target *targ;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         targ = nvc0_so_target(info->count_from_stream_output);
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe->get_query_result(pipe, targ->pq, TRUE, (void *)&vert_count);
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vert_count /= targ->stride;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx.idxbuf = NULL; /* shut up warnings */
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index_size = 0;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.instance_id = info->start_instance;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim = nvc0_prim_gl(info->mode);
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_SPACE(ctx.push, 9);
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx.dest = nvc0_push_setup_vertex_array(nvc0, vert_count);
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(!ctx.dest))
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unlikely(ctx.need_vertex_id))
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nvc0_push_upload_vertex_ids(&ctx, nvc0, info);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_ARRAY_FLUSH), 0);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_BEGIN_GL), 1);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (ctx.push, prim);
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (index_size) {
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         disp_vertices_i08(&ctx, info->start, vert_count);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         disp_vertices_i16(&ctx, info->start, vert_count);
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         disp_vertices_i32(&ctx, info->start, vert_count);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(index_size == 0);
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         disp_vertices_seq(&ctx, info->start, vert_count);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_SPACE(ctx.push, 1);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_END_GL), 0);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (--inst_count) {
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         prim |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++ctx.instance_id;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX_TMP);
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_scratch_done(&nvc0->base);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (inst_count);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* reset state and unmap buffers (no-op) */
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(!ctx.edgeflag.value)) {
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_SPACE(ctx.push, 1);
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(ctx.push, NVC0_3D(EDGEFLAG), 1);
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(ctx.need_vertex_id)) {
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_SPACE(ctx.push, 4);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_ID_REPLACE), 0);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_ATTRIB_FORMAT(1)), 1);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (ctx.push,
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 NVC0_3D_VERTEX_ATTRIB_FORMAT_CONST |
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 NVC0_3D_VERTEX_ATTRIB_FORMAT_TYPE_FLOAT |
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_ARRAY_FETCH(1)), 0);
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info->indexed)
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_resource_unmap(nv04_resource(nvc0->idxbuf.buffer));
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nvc0->num_vtxbufs; ++i)
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nouveau_resource_unmap(nv04_resource(nvc0->vtxbuf[i].buffer));
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopy_indices_u8(uint32_t *dst, const uint8_t *elts, uint32_t bias, unsigned n)
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n; ++i)
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i] = elts[i] + bias;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopy_indices_u16(uint32_t *dst, const uint16_t *elts, uint32_t bias, unsigned n)
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n; ++i)
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i] = elts[i] + bias;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopy_indices_u32(uint32_t *dst, const uint32_t *elts, uint32_t bias, unsigned n)
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < n; ++i)
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i] = elts[i] + bias;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_upload_vertex_ids(struct push_context *ctx,
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct nvc0_context *nvc0,
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const struct pipe_draw_info *info)
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = ctx->push;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_bo *bo;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint64_t va;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t *data;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t format;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned index_size = nvc0->idxbuf.index_size;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned a = nvc0->vertex->num_elements;
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!index_size || info->index_bias)
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index_size = 4;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   data = (uint32_t *)nouveau_scratch_get(&nvc0->base,
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          info->count * index_size, &va, &bo);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, NOUVEAU_BO_GART | NOUVEAU_BO_RD,
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                bo);
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nouveau_pushbuf_validate(push);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info->indexed) {
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!info->index_bias) {
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(data, ctx->idxbuf, info->count * index_size);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (nvc0->idxbuf.index_size) {
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 1:
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            copy_indices_u8(data, ctx->idxbuf, info->index_bias, info->count);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 2:
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            copy_indices_u16(data, ctx->idxbuf, info->index_bias, info->count);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            copy_indices_u32(data, ctx->idxbuf, info->index_bias, info->count);
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < info->count; ++i)
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         data[i] = i + (info->start + info->index_bias);
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = (1 << NVC0_3D_VERTEX_ATTRIB_FORMAT_BUFFER__SHIFT) |
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      NVC0_3D_VERTEX_ATTRIB_FORMAT_TYPE_UINT;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (index_size) {
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1:
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format |= NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_8;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2:
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format |= NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_16;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format |= NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_SPACE(push, 12);
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(nvc0->state.instance_elts & 2)) {
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nvc0->state.instance_elts &= ~2;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_PER_INSTANCE(1)), 0);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ATTRIB_FORMAT(a)), 1);
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, format);
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(1)), 3);
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, NVC0_3D_VERTEX_ARRAY_FETCH_ENABLE | index_size);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATAh(push, va);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, va);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ARRAY_LIMIT_HIGH(1)), 2);
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATAh(push, va + info->count * index_size - 1);
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, va + info->count * index_size - 1);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_3D_VERTEX_ID_REPLACE_SOURCE_ATTR_X(a) \
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (((0x80 + (a) * 0x10) / 4) << NVC0_3D_VERTEX_ID_REPLACE_SOURCE__SHIFT)
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NVC0(push, NVC0_3D(VERTEX_ID_REPLACE), 1);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, NVC0_3D_VERTEX_ID_REPLACE_SOURCE_ATTR_X(a) | 1);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
648