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