~ubuntu-branches/ubuntu/precise/mesa/precise-updates

« back to all changes in this revision

Viewing changes to src/gallium/drivers/nvc0/nvc0_vbo.c

  • Committer: Package Import Robot
  • Author(s): Robert Hooker
  • Date: 2012-02-02 12:05:48 UTC
  • mfrom: (1.7.1) (3.3.27 sid)
  • Revision ID: package-import@ubuntu.com-20120202120548-nvkma85jq0h4coix
Tags: 8.0~rc2-0ubuntu4
Drop drisearchdir handling, it is no longer needed with multiarch
and dri-alternates being removed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
263
263
   struct nvc0_vertex_element *ve;
264
264
   unsigned i;
265
265
 
266
 
   if (unlikely(vertex->need_conversion || NVC0_USING_EDGEFLAG(nvc0))) {
 
266
   if (unlikely(vertex->need_conversion) ||
 
267
       unlikely(nvc0->vertprog->vp.edgeflag < PIPE_MAX_ATTRIBS)) {
267
268
      nvc0->vbo_fifo = ~0;
268
269
      nvc0->vbo_user = 0;
269
270
   } else {
327
328
   for (; i < nvc0->state.num_vtxelts; ++i) {
328
329
      BEGIN_RING(chan, RING_3D(VERTEX_ATTRIB_FORMAT(i)), 1);
329
330
      OUT_RING  (chan, NVC0_3D_VERTEX_ATTRIB_INACTIVE);
 
331
      if (unlikely(nvc0->state.instance_elts & (1 << i)))
 
332
         IMMED_RING(chan, RING_3D(VERTEX_ARRAY_PER_INSTANCE(i)), 0);
330
333
      BEGIN_RING(chan, RING_3D(VERTEX_ARRAY_FETCH(i)), 1);
331
334
      OUT_RING  (chan, 0);
332
335
   }
367
370
static void
368
371
nvc0_draw_vbo_flush_notify(struct nouveau_channel *chan)
369
372
{
370
 
   struct nvc0_context *nvc0 = chan->user_private;
371
 
 
372
 
   nouveau_fence_update(&nvc0->screen->base, TRUE);
373
 
 
374
 
   nvc0_bufctx_emit_relocs(nvc0);
 
373
   struct nvc0_screen *screen = chan->user_private;
 
374
 
 
375
   nouveau_fence_update(&screen->base, TRUE);
 
376
 
 
377
   nvc0_bufctx_emit_relocs(screen->cur_ctx);
375
378
}
376
379
 
377
380
static void
382
385
   struct nouveau_channel *chan = nvc0->screen->base.channel;
383
386
   unsigned prim;
384
387
 
 
388
   if (nvc0->state.index_bias) {
 
389
      IMMED_RING(chan, RING_3D(VB_ELEMENT_BASE), 0);
 
390
      nvc0->state.index_bias = 0;
 
391
   }
 
392
 
385
393
   prim = nvc0_prim_gl(mode);
386
394
 
387
395
   while (instance_count--) {
562
570
   }
563
571
}
564
572
 
 
573
static void
 
574
nvc0_draw_stream_output(struct nvc0_context *nvc0,
 
575
                        const struct pipe_draw_info *info)
 
576
{
 
577
   struct nouveau_channel *chan = nvc0->screen->base.channel;
 
578
   struct nvc0_so_target *so = nvc0_so_target(info->count_from_stream_output);
 
579
   struct nv04_resource *res = nv04_resource(so->pipe.buffer);
 
580
   unsigned mode = nvc0_prim_gl(info->mode);
 
581
   unsigned num_instances = info->instance_count;
 
582
 
 
583
   if (res->status & NOUVEAU_BUFFER_STATUS_GPU_WRITING) {
 
584
      res->status &= ~NOUVEAU_BUFFER_STATUS_GPU_WRITING;
 
585
      IMMED_RING(chan, RING_3D(SERIALIZE), 0);
 
586
      nvc0_query_fifo_wait(chan, so->pq);
 
587
      IMMED_RING(chan, RING_3D(VERTEX_ARRAY_FLUSH), 0);
 
588
   }
 
589
 
 
590
   while (num_instances--) {
 
591
      BEGIN_RING(chan, RING_3D(VERTEX_BEGIN_GL), 1);
 
592
      OUT_RING  (chan, mode);
 
593
      BEGIN_RING(chan, RING_3D(DRAW_TFB_BASE), 1);
 
594
      OUT_RING  (chan, 0);
 
595
      BEGIN_RING(chan, RING_3D(DRAW_TFB_STRIDE), 1);
 
596
      OUT_RING  (chan, so->stride);
 
597
      BEGIN_RING(chan, RING_3D(DRAW_TFB_BYTES), 1);
 
598
      nvc0_query_pushbuf_submit(chan, so->pq, 0x4);
 
599
      IMMED_RING(chan, RING_3D(VERTEX_END_GL), 0);
 
600
 
 
601
      mode |= NVC0_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT;
 
602
   }
 
603
}
 
604
 
565
605
void
566
606
nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
567
607
{
584
624
   if (nvc0->vbo_user && !(nvc0->dirty & (NVC0_NEW_VERTEX | NVC0_NEW_ARRAYS)))
585
625
      nvc0_update_user_vbufs(nvc0);
586
626
 
587
 
   nvc0_state_validate(nvc0);
 
627
   /* 8 as minimum to avoid immediate double validation of new buffers */
 
628
   nvc0_state_validate(nvc0, ~0, 8);
588
629
 
589
630
   chan->flush_notify = nvc0_draw_vbo_flush_notify;
590
 
   chan->user_private = nvc0;
591
631
 
592
632
   if (nvc0->vbo_fifo) {
593
633
      nvc0_push_vbo(nvc0, info);
608
648
      nvc0->base.vbo_dirty = FALSE;
609
649
   }
610
650
 
 
651
   if (unlikely(info->count_from_stream_output)) {
 
652
      nvc0_draw_stream_output(nvc0, info);
 
653
   } else
611
654
   if (!info->indexed) {
612
655
      nvc0_draw_arrays(nvc0,
613
656
                       info->mode, info->start, info->count,