diff options
author | Ilia Mirkin <[email protected]> | 2015-02-14 01:43:31 -0500 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-02-24 12:16:45 +0000 |
commit | c38068f5c14ab45df49b4711376ddd80ac8a6f99 (patch) | |
tree | fe5dce82cccabb4e14661f6a28b8d1d2de14db20 | |
parent | 88d47387b89995519e9010c42939b5ee7b5bcc8d (diff) |
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 <[email protected]>
Cc: "10.4 10.5" <[email protected]>
(cherry picked from commit 854eb06bee7d266fc739f984c1b4ebb54dac3b87)
-rw-r--r-- | src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c | 9 | ||||
-rw-r--r-- | 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; |