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 void *idxbuf; 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t vertex_words; 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t packet_vertex_limit; 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct translate *translate; 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean primitive_restart; 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean need_vertex_id; 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t prim; 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t restart_index; 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t instance_id; 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int buffer; 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float value; 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *data; 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset; 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned stride; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } edgeflag; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_push_context(struct nvc0_context *nvc0, struct push_context *ctx) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element *ve; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push = nvc0->base.pushbuf; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->translate = nvc0->vertex->translate; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (likely(nvc0->vertex->num_elements < 32)) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->need_vertex_id = nvc0->vertprog->vp.need_vertex_id; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->need_vertex_id = FALSE; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->edgeflag.buffer = -1; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->edgeflag.value = 0.5f; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(nvc0->vertprog->vp.edgeflag < PIPE_MAX_ATTRIBS)) { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ve = &nvc0->vertex->element[nvc0->vertprog->vp.edgeflag].pipe; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->edgeflag.buffer = ve->vertex_buffer_index; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->edgeflag.offset = ve->src_offset; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->packet_vertex_limit = 1; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->packet_vertex_limit = nvc0->vertex->vtx_per_packet_max; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->need_vertex_id)) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->packet_vertex_limit = 1; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->vertex_words = nvc0->vertex->vtx_size; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_edgeflag(struct push_context *ctx, unsigned vtx_id) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f = *(float *)(ctx->edgeflag.data + vtx_id * ctx->edgeflag.stride); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->edgeflag.value != f) { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->edgeflag.value = f; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(ctx->push, NVC0_3D(EDGEFLAG), f ? 1 : 0); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_vertexid(struct push_context *ctx, uint32_t vtx_id) 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx->push, NVC0_3D(VERTEX_ID), 1); /* broken on nvc0 */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx->push, NVC0_3D(VERTEX_DATA), 1); /* as last attribute */ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, vtx_id); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i08(uint8_t *elts, unsigned push, uint8_t index) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < push; ++i) 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elts[i] == index) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i16(uint16_t *elts, unsigned push, uint16_t index) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < push; ++i) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elts[i] == index) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprim_restart_search_i32(uint32_t *elts, unsigned push, uint32_t index) 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < push; ++i) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elts[i] == index) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_vertices_i08(struct push_context *ctx, unsigned start, unsigned count) 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *restrict elts = (uint8_t *)ctx->idxbuf + start; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned push = MIN2(count, ctx->packet_vertex_limit); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, nr; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = push; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->primitive_restart) 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = prim_restart_search_i08(elts, push, ctx->restart_index); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->edgeflag.buffer >= 0) && likely(nr)) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_edgeflag(ctx, elts[0]); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = ctx->vertex_words * nr; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->translate->run_elts8(ctx->translate, elts, nr, ctx->instance_id, 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur += size; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->need_vertex_id) && likely(size)) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_vertexid(ctx, elts[0]); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts += nr; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr != push) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count--; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts++; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx->push, NVC0_3D(VERTEX_END_GL), 2); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, 0); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT | 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->prim & ~NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT)); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_vertices_i16(struct push_context *ctx, unsigned start, unsigned count) 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint16_t *restrict elts = (uint16_t *)ctx->idxbuf + start; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned push = MIN2(count, ctx->packet_vertex_limit); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, nr; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = push; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->primitive_restart) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = prim_restart_search_i16(elts, push, ctx->restart_index); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->edgeflag.buffer >= 0) && likely(nr)) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_edgeflag(ctx, elts[0]); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = ctx->vertex_words * nr; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->translate->run_elts16(ctx->translate, elts, nr, ctx->instance_id, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur += size; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->need_vertex_id)) 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_vertexid(ctx, elts[0]); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts += nr; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr != push) { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count--; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts++; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx->push, NVC0_3D(VERTEX_END_GL), 2); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, 0); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT | 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->prim & ~NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT)); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_vertices_i32(struct push_context *ctx, unsigned start, unsigned count) 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *restrict elts = (uint32_t *)ctx->idxbuf + start; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned push = MIN2(count, ctx->packet_vertex_limit); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, nr; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = push; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->primitive_restart) 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr = prim_restart_search_i32(elts, push, ctx->restart_index); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->edgeflag.buffer >= 0) && likely(nr)) 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_edgeflag(ctx, elts[0]); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = ctx->vertex_words * nr; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->translate->run_elts(ctx->translate, elts, nr, ctx->instance_id, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur); 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur += size; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->need_vertex_id)) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_vertexid(ctx, elts[0]); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= nr; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts += nr; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nr != push) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count--; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elts++; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx->push, NVC0_3D(VERTEX_END_GL), 2); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, 0); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx->push, NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT | 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->prim & ~NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT)); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_vertices_seq(struct push_context *ctx, unsigned start, unsigned count) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (count) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned push = MIN2(count, ctx->packet_vertex_limit); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size = ctx->vertex_words * push; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->edgeflag.buffer >= 0)) 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_edgeflag(ctx, start); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NIC0(ctx->push, NVC0_3D(VERTEX_DATA), size); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->translate->run(ctx->translate, start, push, ctx->instance_id, 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->push->cur += size; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx->need_vertex_id)) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_vertexid(ctx, start); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count -= push; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start += push; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVC0_PRIM_GL_CASE(n) \ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_PRIM_##n: return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_##n 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_prim_gl(unsigned prim) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (prim) { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(POINTS); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINES); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_LOOP); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_STRIP); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLES); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_STRIP); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_FAN); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(QUADS); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(QUAD_STRIP); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(POLYGON); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINES_ADJACENCY); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(LINE_STRIP_ADJACENCY); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLES_ADJACENCY); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(TRIANGLE_STRIP_ADJACENCY); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_PRIM_GL_CASE(PATCHES); */ 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_POINTS; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnvc0_push_vbo(struct nvc0_context *nvc0, const struct pipe_draw_info *info) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct push_context ctx; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, index_size; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned inst_count = info->instance_count; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vert_count = info->count; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean apply_bias = info->indexed && info->index_bias; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_push_context(nvc0, &ctx); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nvc0->num_vtxbufs; ++i) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *data; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[i]; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv04_resource *res = nv04_resource(vb->buffer); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = nouveau_resource_map_offset(&nvc0->base, res, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vb->buffer_offset, NOUVEAU_BO_RD); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (apply_bias && likely(!(nvc0->vertex->instance_bufs & (1 << i)))) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data += info->index_bias * vb->stride; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.translate->set_buffer(ctx.translate, i, data, vb->stride, ~0); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(i == ctx.edgeflag.buffer)) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.edgeflag.data = data + ctx.edgeflag.offset; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.edgeflag.stride = vb->stride; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->indexed) { 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.idxbuf = 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_resource_map_offset(&nvc0->base, 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv04_resource(nvc0->idxbuf.buffer), 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nvc0->idxbuf.offset, NOUVEAU_BO_RD); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx.idxbuf) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_size = nvc0->idxbuf.index_size; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.primitive_restart = info->primitive_restart; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.restart_index = info->restart_index; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.idxbuf = NULL; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_size = 0; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.primitive_restart = FALSE; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.restart_index = 0; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->count_from_stream_output) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *pipe = &nvc0->base.pipe; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nvc0_so_target *targ; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ = nvc0_so_target(info->count_from_stream_output); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->get_query_result(pipe, targ->pq, TRUE, (void*)&vert_count); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vert_count /= targ->stride; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.instance_id = info->start_instance; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.prim = nvc0_prim_gl(info->mode); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx.need_vertex_id)) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned a = nvc0->vertex->num_elements; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_ATTRIB_FORMAT(a)), 1); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx.push, (a << NVC0_3D_VERTEX_ATTRIB_FORMAT_BUFFER__SHIFT) | 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_TYPE_FLOAT | 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_ID_REPLACE), 1); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx.push, (((0x80 + a * 0x10) / 4) << 4) | 1); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (inst_count--) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_BEGIN_GL), 1); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx.push, ctx.prim); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (index_size) { 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_vertices_seq(&ctx, info->start, vert_count); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_vertices_i08(&ctx, info->start, vert_count); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_vertices_i16(&ctx, info->start, vert_count); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_vertices_i32(&ctx, info->start, vert_count); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_END_GL), 0); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.instance_id++; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx.prim |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx.edgeflag.value == 0.0f)) 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(ctx.push, NVC0_3D(EDGEFLAG), 1); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unlikely(ctx.need_vertex_id)) { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned a = nvc0->vertex->num_elements; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMMED_NVC0(ctx.push, NVC0_3D(VERTEX_ID_REPLACE), 0); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_NVC0(ctx.push, NVC0_3D(VERTEX_ATTRIB_FORMAT(a)), 1); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PUSH_DATA (ctx.push, 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_CONST | 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_TYPE_FLOAT | 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NVC0_3D_VERTEX_ATTRIB_FORMAT_SIZE_32); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->indexed) 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_resource_unmap(nv04_resource(nvc0->idxbuf.buffer)); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < nvc0->num_vtxbufs; ++i) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_resource_unmap(nv04_resource(nvc0->vtxbuf[i].buffer)); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 410