X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fnvc0%2Fnvc0_vbo.c;h=50e99ac5df3476b97f10662895a7be9737bf42d4;hb=bb71f9249a66b9a4921a878766c0a2d87624c369;hp=41079104b3992b1e4f05c714092ba4f1da3df0f6;hpb=9c5d15e929f47f517f90977f5420e11dfbd3db67;p=mesa.git diff --git a/src/gallium/drivers/nvc0/nvc0_vbo.c b/src/gallium/drivers/nvc0/nvc0_vbo.c index 41079104b39..50e99ac5df3 100644 --- a/src/gallium/drivers/nvc0/nvc0_vbo.c +++ b/src/gallium/drivers/nvc0/nvc0_vbo.c @@ -327,6 +327,8 @@ nvc0_vertex_arrays_validate(struct nvc0_context *nvc0) for (; i < nvc0->state.num_vtxelts; ++i) { BEGIN_RING(chan, RING_3D(VERTEX_ATTRIB_FORMAT(i)), 1); OUT_RING (chan, NVC0_3D_VERTEX_ATTRIB_INACTIVE); + if (unlikely(nvc0->state.instance_elts & (1 << i))) + IMMED_RING(chan, RING_3D(VERTEX_ARRAY_PER_INSTANCE(i)), 0); BEGIN_RING(chan, RING_3D(VERTEX_ARRAY_FETCH(i)), 1); OUT_RING (chan, 0); } @@ -367,11 +369,11 @@ nvc0_prim_gl(unsigned prim) static void nvc0_draw_vbo_flush_notify(struct nouveau_channel *chan) { - struct nvc0_context *nvc0 = chan->user_private; + struct nvc0_screen *screen = chan->user_private; - nouveau_fence_update(&nvc0->screen->base, TRUE); + nouveau_fence_update(&screen->base, TRUE); - nvc0_bufctx_emit_relocs(nvc0); + nvc0_bufctx_emit_relocs(screen->cur_ctx); } static void @@ -382,6 +384,11 @@ nvc0_draw_arrays(struct nvc0_context *nvc0, struct nouveau_channel *chan = nvc0->screen->base.channel; unsigned prim; + if (nvc0->state.index_bias) { + IMMED_RING(chan, RING_3D(VB_ELEMENT_BASE), 0); + nvc0->state.index_bias = 0; + } + prim = nvc0_prim_gl(mode); while (instance_count--) { @@ -584,10 +591,10 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) if (nvc0->vbo_user && !(nvc0->dirty & (NVC0_NEW_VERTEX | NVC0_NEW_ARRAYS))) nvc0_update_user_vbufs(nvc0); - nvc0_state_validate(nvc0); + /* 8 as minimum to avoid immediate double validation of new buffers */ + nvc0_state_validate(nvc0, ~0, 8); chan->flush_notify = nvc0_draw_vbo_flush_notify; - chan->user_private = nvc0; if (nvc0->vbo_fifo) { nvc0_push_vbo(nvc0, info);