From 854eb06bee7d266fc739f984c1b4ebb54dac3b87 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sat, 14 Feb 2015 01:43:31 -0500 Subject: [PATCH] nvc0: allow holes in xfb target lists Tested with a modified xfb-streams test which outputs to streams 0, 2, and 3. Signed-off-by: Ilia Mirkin Cc: "10.4 10.5" --- src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c | 9 ++++++++- src/gallium/drivers/nouveau/nvc0/nvc0_state.c | 8 +++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c index 1000d8286d7..516b33b76d5 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c @@ -252,7 +252,12 @@ nvc0_tfb_validate(struct nvc0_context *nvc0) for (b = 0; b < nvc0->num_tfbbufs; ++b) { struct nvc0_so_target *targ = nvc0_so_target(nvc0->tfbbuf[b]); - struct nv04_resource *buf = nv04_resource(targ->pipe.buffer); + struct nv04_resource *buf; + + if (!targ) { + IMMED_NVC0(push, NVC0_3D(TFB_BUFFER_ENABLE(b)), 0); + continue; + } if (tfb) targ->stride = tfb->stride[b]; @@ -260,6 +265,8 @@ nvc0_tfb_validate(struct nvc0_context *nvc0) if (!(nvc0->tfbbuf_dirty & (1 << b))) continue; + buf = nv04_resource(targ->pipe.buffer); + if (!targ->clean) nvc0_query_fifo_wait(push, targ->pq); BEGIN_NVC0(push, NVC0_3D(TFB_BUFFER_ENABLE(b)), 5); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c index b6666ca58e8..dca06f4cddb 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c @@ -1089,9 +1089,11 @@ nvc0_set_transform_feedback_targets(struct pipe_context *pipe, pipe_so_target_reference(&nvc0->tfbbuf[i], targets[i]); } for (; i < nvc0->num_tfbbufs; ++i) { - nvc0->tfbbuf_dirty |= 1 << i; - nvc0_so_target_save_offset(pipe, nvc0->tfbbuf[i], i, &serialize); - pipe_so_target_reference(&nvc0->tfbbuf[i], NULL); + if (nvc0->tfbbuf[i]) { + nvc0->tfbbuf_dirty |= 1 << i; + nvc0_so_target_save_offset(pipe, nvc0->tfbbuf[i], i, &serialize); + pipe_so_target_reference(&nvc0->tfbbuf[i], NULL); + } } nvc0->num_tfbbufs = num_targets; -- 2.30.2