From eb60a89bc3ac2b43faf52d06e05670bbbca7292d Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Tue, 10 Jan 2017 22:07:53 -0500 Subject: [PATCH] nouveau: take extra push space into account for pushbuf_space calls Ever since a long time ago when I messed around with fences, I ensure that after a PUSH_SPACE call there is enough space to write a fence out into the pushbuf. However the PUSH_SPACE macro is not all-knowing, and so sometimes we have to invoke nouveau_pushbuf_space manually with the relocs/pushes args set. If we don't take the extra allocation from PUSH_SPACE into account, then we will end up accidentally flushing when the code was not expecting a flush. This can lead to various runtime and rendering failures. The amount of extra allocation isn't that important - it has to be at least 8 based on the current nouveau_winsys.h setting, but even more won't hurt. I just rounded up to powers of 2. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99354 Cc: "12.0 13.0" Signed-off-by: Ilia Mirkin Acked-by: Ben Skeggs --- src/gallium/drivers/nouveau/nouveau_video.c | 2 +- src/gallium/drivers/nouveau/nv30/nv30_clear.c | 2 +- src/gallium/drivers/nouveau/nv30/nv30_transfer.c | 8 ++++---- src/gallium/drivers/nouveau/nv50/nv50_surface.c | 6 +++--- src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 2 +- src/gallium/drivers/nouveau/nv50/nv98_video.c | 6 +++--- src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c | 7 +------ src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c | 7 +------ src/gallium/drivers/nouveau/nv50/nv98_video_vp.c | 9 ++------- src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c | 2 +- src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 2 +- src/gallium/drivers/nouveau/nvc0/nvc0_video.c | 6 +++--- src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c | 7 +------ src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c | 7 +------ src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c | 9 ++------- 15 files changed, 26 insertions(+), 56 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c index bb3aad784c5..95d8866bae8 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.c +++ b/src/gallium/drivers/nouveau/nouveau_video.c @@ -73,7 +73,7 @@ nouveau_vpe_fini(struct nouveau_decoder *dec) { if (!dec->cmds) return; - nouveau_pushbuf_space(push, 8, 2, 0); + nouveau_pushbuf_space(push, 16, 2, 0); nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_CMD); #define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_CMD, NOUVEAU_BO_RD diff --git a/src/gallium/drivers/nouveau/nv30/nv30_clear.c b/src/gallium/drivers/nouveau/nv30/nv30_clear.c index 4217bca6da0..4e6df1eff60 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_clear.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_clear.c @@ -128,7 +128,7 @@ nv30_clear_render_target(struct pipe_context *pipe, struct pipe_surface *ps, refn.bo = mt->base.bo; refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR; - if (nouveau_pushbuf_space(push, 16, 1, 0) || + if (nouveau_pushbuf_space(push, 32, 1, 0) || nouveau_pushbuf_refn (push, &refn, 1)) return; diff --git a/src/gallium/drivers/nouveau/nv30/nv30_transfer.c b/src/gallium/drivers/nouveau/nv30/nv30_transfer.c index e4b9497259f..6f06ee6b1c4 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_transfer.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_transfer.c @@ -431,7 +431,7 @@ nv30_transfer_rect_sifm(XFER_ARGS) si_arg |= NV03_SIFM_FORMAT_FILTER_BILINEAR; } - if (nouveau_pushbuf_space(push, 32, 6, 0) || + if (nouveau_pushbuf_space(push, 64, 6, 0) || nouveau_pushbuf_refn (push, refs, 2)) return; @@ -516,7 +516,7 @@ nv30_transfer_rect_m2mf(XFER_ARGS) while (h) { unsigned lines = (h > 2047) ? 2047 : h; - if (nouveau_pushbuf_space(push, 13, 2, 0) || + if (nouveau_pushbuf_space(push, 32, 2, 0) || nouveau_pushbuf_refn (push, refs, 2)) return; @@ -708,7 +708,7 @@ nv30_transfer_copy_data(struct nouveau_context *nv, lines = (pages > 2047) ? 2047 : pages; pages -= lines; - if (nouveau_pushbuf_space(push, 13, 2, 0) || + if (nouveau_pushbuf_space(push, 32, 2, 0) || nouveau_pushbuf_refn (push, refs, 2)) return; @@ -732,7 +732,7 @@ nv30_transfer_copy_data(struct nouveau_context *nv, } if (size) { - if (nouveau_pushbuf_space(push, 13, 2, 0) || + if (nouveau_pushbuf_space(push, 32, 2, 0) || nouveau_pushbuf_refn (push, refs, 2)) return; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index a6c0bbc2671..f5fa9d6cada 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -295,7 +295,7 @@ nv50_clear_render_target(struct pipe_context *pipe, PUSH_DATAf(push, color->f[2]); PUSH_DATAf(push, color->f[3]); - if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) + if (nouveau_pushbuf_space(push, 64 + sf->depth, 1, 0)) return; PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); @@ -394,7 +394,7 @@ nv50_clear_depth_stencil(struct pipe_context *pipe, mode |= NV50_3D_CLEAR_BUFFERS_S; } - if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) + if (nouveau_pushbuf_space(push, 64 + sf->depth, 1, 0)) return; PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); @@ -752,7 +752,7 @@ nv50_clear_buffer(struct pipe_context *pipe, PUSH_DATAf(push, color.f[2]); PUSH_DATAf(push, color.f[3]); - if (nouveau_pushbuf_space(push, 32, 1, 0)) + if (nouveau_pushbuf_space(push, 64, 1, 0)) return; PUSH_REFN(push, buf->bo, buf->domain | NOUVEAU_BO_WR); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c index d608e7bef9d..4c46ed020a5 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c @@ -636,7 +636,7 @@ nv50_draw_elements(struct nv50_context *nv50, bool shorten, BEGIN_NV04(push, NV50_3D(VERTEX_BEGIN_GL), 1); PUSH_DATA (push, prim); - nouveau_pushbuf_space(push, 8, 0, 1); + nouveau_pushbuf_space(push, 16, 0, 1); PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain); switch (index_size) { diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video.c b/src/gallium/drivers/nouveau/nv50/nv98_video.c index 177a7e0274b..92526d9f643 100644 --- a/src/gallium/drivers/nouveau/nv50/nv98_video.c +++ b/src/gallium/drivers/nouveau/nv50/nv98_video.c @@ -273,7 +273,7 @@ nv98_create_decoder(struct pipe_context *context, dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map))); /* So lets test if the fence is working? */ - nouveau_pushbuf_space(push[0], 6, 1, 0); + nouveau_pushbuf_space(push[0], 16, 1, 0); PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NV04(push[0], SUBC_BSP(0x240), 3); PUSH_DATAh(push[0], dec->fence_bo->offset); @@ -284,7 +284,7 @@ nv98_create_decoder(struct pipe_context *context, PUSH_DATA (push[0], 0); PUSH_KICK (push[0]); - nouveau_pushbuf_space(push[1], 6, 1, 0); + nouveau_pushbuf_space(push[1], 16, 1, 0); PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NV04(push[1], SUBC_VP(0x240), 3); PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10)); @@ -295,7 +295,7 @@ nv98_create_decoder(struct pipe_context *context, PUSH_DATA (push[1], 0); PUSH_KICK (push[1]); - nouveau_pushbuf_space(push[2], 6, 1, 0); + nouveau_pushbuf_space(push[2], 16, 1, 0); PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NV04(push[2], SUBC_PPP(0x240), 3); PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20)); diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c b/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c index 4fe0e05c96b..f77258de850 100644 --- a/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c +++ b/src/gallium/drivers/nouveau/nv50/nv98_video_bsp.c @@ -47,7 +47,6 @@ nv98_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, int ret; struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1]; - unsigned fence_extra = 0; struct nouveau_pushbuf_refn bo_refs[] = { { bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM }, { inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, @@ -61,10 +60,6 @@ nv98_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, if (!dec->bitplane_bo) num_refs--; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - bsp_size = NOUVEAU_VP3_BSP_RESERVED_SIZE; for (i = 0; i < num_buffers; i++) bsp_size += num_bytes[i]; @@ -112,7 +107,7 @@ nv98_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs); - nouveau_pushbuf_space(push, 6 + (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC ? 9 : 8) + fence_extra + 2, num_refs, 0); + nouveau_pushbuf_space(push, 32, num_refs, 0); nouveau_pushbuf_refn(push, bo_refs, num_refs); bsp_addr = bsp_bo->offset >> 8; diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c b/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c index 48f16211afc..3fce65ba55b 100644 --- a/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c +++ b/src/gallium/drivers/nouveau/nv50/nv98_video_ppp.c @@ -93,13 +93,8 @@ nv98_decoder_ppp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, struct n enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile); struct nouveau_pushbuf *push = dec->pushbuf[2]; unsigned ppp_caps = 0x10; - unsigned fence_extra = 0; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - - nouveau_pushbuf_space(push, 11 + (codec == PIPE_VIDEO_FORMAT_VC1 ? 2 : 0) + 3 + fence_extra + 2, 4, 0); + nouveau_pushbuf_space(push, 32, 4, 0); switch (codec) { case PIPE_VIDEO_FORMAT_MPEG12: { diff --git a/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c b/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c index 37d7d443289..f1cdf168ed4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c +++ b/src/gallium/drivers/nouveau/nv50/nv98_video_vp.c @@ -76,7 +76,7 @@ nv98_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile); struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1]; - u32 fence_extra = 0, codec_extra = 0; + u32 codec_extra = 0; struct nouveau_pushbuf_refn bo_refs[] = { { inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, { dec->ref_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, @@ -88,10 +88,6 @@ nv98_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, }; int num_refs = ARRAY_SIZE(bo_refs) - !dec->fw_bo; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - if (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC) { nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size); codec_extra += 2; @@ -115,8 +111,7 @@ nv98_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom)) nv98_decoder_kick_ref(dec, target); - nouveau_pushbuf_space(push, 8 + 3 * (codec != PIPE_VIDEO_FORMAT_MPEG12) + - 6 + codec_extra + fence_extra + 2, num_refs, 0); + nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0); nouveau_pushbuf_refn(push, bo_refs, num_refs); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c index 4c34593ef9c..ff20fe6355b 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c @@ -403,7 +403,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0, if (wait && hq->state != NVC0_HW_QUERY_STATE_READY) nvc0_hw_query_fifo_wait(nvc0, q); - nouveau_pushbuf_space(push, 16, 2, 0); + nouveau_pushbuf_space(push, 32, 2, 0); PUSH_REFN (push, hq->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD); PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR); BEGIN_NVC0(push, NVC0_3D(QUERY_ADDRESS_HIGH), 2); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c index 650c736f5f2..9a3eb06bd4b 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c @@ -799,7 +799,7 @@ nvc0_draw_stream_output(struct nvc0_context *nvc0, } while (num_instances--) { - nouveau_pushbuf_space(push, 9, 0, 1); + nouveau_pushbuf_space(push, 16, 0, 1); BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); PUSH_DATA (push, mode); BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BASE), 1); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_video.c b/src/gallium/drivers/nouveau/nvc0/nvc0_video.c index a9fd1d20942..b5e7bba5f9e 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_video.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_video.c @@ -297,7 +297,7 @@ nvc0_create_decoder(struct pipe_context *context, dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map))); /* So lets test if the fence is working? */ - nouveau_pushbuf_space(push[0], 6, 1, 0); + nouveau_pushbuf_space(push[0], 16, 1, 0); PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NVC0(push[0], SUBC_BSP(0x240), 3); PUSH_DATAh(push[0], dec->fence_bo->offset); @@ -308,7 +308,7 @@ nvc0_create_decoder(struct pipe_context *context, PUSH_DATA (push[0], 0); PUSH_KICK (push[0]); - nouveau_pushbuf_space(push[1], 6, 1, 0); + nouveau_pushbuf_space(push[1], 16, 1, 0); PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NVC0(push[1], SUBC_VP(0x240), 3); PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10)); @@ -319,7 +319,7 @@ nvc0_create_decoder(struct pipe_context *context, PUSH_DATA (push[1], 0); PUSH_KICK (push[1]); - nouveau_pushbuf_space(push[2], 6, 1, 0); + nouveau_pushbuf_space(push[2], 16, 1, 0); PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR); BEGIN_NVC0(push[2], SUBC_PPP(0x240), 3); PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20)); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c b/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c index af072a8acdc..52a031c519a 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_video_bsp.c @@ -143,7 +143,6 @@ nvc0_decoder_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc, uint32_t caps; struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1]; - unsigned fence_extra = 0; struct nouveau_pushbuf_refn bo_refs[] = { { bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM }, { inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, @@ -157,15 +156,11 @@ nvc0_decoder_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc, if (!dec->bitplane_bo) num_refs--; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - caps = nouveau_vp3_bsp_end(dec, desc); nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs); - nouveau_pushbuf_space(push, 6 + (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC ? 9 : 7) + fence_extra + 2, num_refs, 0); + nouveau_pushbuf_space(push, 32, num_refs, 0); nouveau_pushbuf_refn(push, bo_refs, num_refs); bsp_addr = bsp_bo->offset >> 8; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c b/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c index e4504e6c411..4f058628e31 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_video_ppp.c @@ -93,13 +93,8 @@ nvc0_decoder_ppp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, struct n enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile); struct nouveau_pushbuf *push = dec->pushbuf[2]; unsigned ppp_caps = 0x10; - unsigned fence_extra = 0; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - - nouveau_pushbuf_space(push, 11 + (codec == PIPE_VIDEO_FORMAT_VC1 ? 2 : 0) + 3 + fence_extra + 2, 4, 0); + nouveau_pushbuf_space(push, 32, 4, 0); switch (codec) { case PIPE_VIDEO_FORMAT_MPEG12: { diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c b/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c index 73d55148151..3de4ec14867 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_video_vp.c @@ -76,7 +76,7 @@ nvc0_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile); struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH]; struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1]; - u32 fence_extra = 0, codec_extra = 0; + u32 codec_extra = 0; struct nouveau_pushbuf_refn bo_refs[] = { { inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, { dec->ref_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM }, @@ -88,10 +88,6 @@ nvc0_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, }; int num_refs = ARRAY_SIZE(bo_refs) - !dec->fw_bo; -#if NOUVEAU_VP3_DEBUG_FENCE - fence_extra = 4; -#endif - if (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC) { nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size); codec_extra += 2; @@ -115,8 +111,7 @@ nvc0_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom)) nvc0_decoder_kick_ref(dec, target); - nouveau_pushbuf_space(push, 8 + 3 * (codec != PIPE_VIDEO_FORMAT_MPEG12) + - 6 + codec_extra + fence_extra + 2, num_refs, 0); + nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0); nouveau_pushbuf_refn(push, bo_refs, num_refs); -- 2.30.2