mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 19:50:11 +01:00
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" <mesa-stable@lists.freedesktop.org> Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Acked-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
8945836658
commit
eb60a89bc3
15 changed files with 26 additions and 56 deletions
|
|
@ -73,7 +73,7 @@ nouveau_vpe_fini(struct nouveau_decoder *dec) {
|
||||||
if (!dec->cmds)
|
if (!dec->cmds)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nouveau_pushbuf_space(push, 8, 2, 0);
|
nouveau_pushbuf_space(push, 16, 2, 0);
|
||||||
nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_CMD);
|
nouveau_bufctx_reset(dec->bufctx, NV31_VIDEO_BIND_CMD);
|
||||||
|
|
||||||
#define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_CMD, NOUVEAU_BO_RD
|
#define BCTX_ARGS dec->bufctx, NV31_VIDEO_BIND_CMD, NOUVEAU_BO_RD
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,7 @@ nv30_clear_render_target(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||||
|
|
||||||
refn.bo = mt->base.bo;
|
refn.bo = mt->base.bo;
|
||||||
refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR;
|
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))
|
nouveau_pushbuf_refn (push, &refn, 1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -431,7 +431,7 @@ nv30_transfer_rect_sifm(XFER_ARGS)
|
||||||
si_arg |= NV03_SIFM_FORMAT_FILTER_BILINEAR;
|
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))
|
nouveau_pushbuf_refn (push, refs, 2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -516,7 +516,7 @@ nv30_transfer_rect_m2mf(XFER_ARGS)
|
||||||
while (h) {
|
while (h) {
|
||||||
unsigned lines = (h > 2047) ? 2047 : 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))
|
nouveau_pushbuf_refn (push, refs, 2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -708,7 +708,7 @@ nv30_transfer_copy_data(struct nouveau_context *nv,
|
||||||
lines = (pages > 2047) ? 2047 : pages;
|
lines = (pages > 2047) ? 2047 : pages;
|
||||||
pages -= lines;
|
pages -= lines;
|
||||||
|
|
||||||
if (nouveau_pushbuf_space(push, 13, 2, 0) ||
|
if (nouveau_pushbuf_space(push, 32, 2, 0) ||
|
||||||
nouveau_pushbuf_refn (push, refs, 2))
|
nouveau_pushbuf_refn (push, refs, 2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -732,7 +732,7 @@ nv30_transfer_copy_data(struct nouveau_context *nv,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size) {
|
if (size) {
|
||||||
if (nouveau_pushbuf_space(push, 13, 2, 0) ||
|
if (nouveau_pushbuf_space(push, 32, 2, 0) ||
|
||||||
nouveau_pushbuf_refn (push, refs, 2))
|
nouveau_pushbuf_refn (push, refs, 2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -295,7 +295,7 @@ nv50_clear_render_target(struct pipe_context *pipe,
|
||||||
PUSH_DATAf(push, color->f[2]);
|
PUSH_DATAf(push, color->f[2]);
|
||||||
PUSH_DATAf(push, color->f[3]);
|
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;
|
return;
|
||||||
|
|
||||||
PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR);
|
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;
|
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;
|
return;
|
||||||
|
|
||||||
PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR);
|
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[2]);
|
||||||
PUSH_DATAf(push, color.f[3]);
|
PUSH_DATAf(push, color.f[3]);
|
||||||
|
|
||||||
if (nouveau_pushbuf_space(push, 32, 1, 0))
|
if (nouveau_pushbuf_space(push, 64, 1, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PUSH_REFN(push, buf->bo, buf->domain | NOUVEAU_BO_WR);
|
PUSH_REFN(push, buf->bo, buf->domain | NOUVEAU_BO_WR);
|
||||||
|
|
|
||||||
|
|
@ -636,7 +636,7 @@ nv50_draw_elements(struct nv50_context *nv50, bool shorten,
|
||||||
BEGIN_NV04(push, NV50_3D(VERTEX_BEGIN_GL), 1);
|
BEGIN_NV04(push, NV50_3D(VERTEX_BEGIN_GL), 1);
|
||||||
PUSH_DATA (push, prim);
|
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);
|
PUSH_REFN(push, buf->bo, NOUVEAU_BO_RD | buf->domain);
|
||||||
|
|
||||||
switch (index_size) {
|
switch (index_size) {
|
||||||
|
|
|
||||||
|
|
@ -273,7 +273,7 @@ nv98_create_decoder(struct pipe_context *context,
|
||||||
dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map)));
|
dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map)));
|
||||||
|
|
||||||
/* So lets test if the fence is working? */
|
/* 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);
|
PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NV04(push[0], SUBC_BSP(0x240), 3);
|
BEGIN_NV04(push[0], SUBC_BSP(0x240), 3);
|
||||||
PUSH_DATAh(push[0], dec->fence_bo->offset);
|
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_DATA (push[0], 0);
|
||||||
PUSH_KICK (push[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);
|
PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NV04(push[1], SUBC_VP(0x240), 3);
|
BEGIN_NV04(push[1], SUBC_VP(0x240), 3);
|
||||||
PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10));
|
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_DATA (push[1], 0);
|
||||||
PUSH_KICK (push[1]);
|
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);
|
PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NV04(push[2], SUBC_PPP(0x240), 3);
|
BEGIN_NV04(push[2], SUBC_PPP(0x240), 3);
|
||||||
PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20));
|
PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20));
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,6 @@ nv98_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||||
int ret;
|
int ret;
|
||||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
|
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];
|
struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1];
|
||||||
unsigned fence_extra = 0;
|
|
||||||
struct nouveau_pushbuf_refn bo_refs[] = {
|
struct nouveau_pushbuf_refn bo_refs[] = {
|
||||||
{ bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
{ bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
||||||
{ inter_bo, NOUVEAU_BO_WR | 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)
|
if (!dec->bitplane_bo)
|
||||||
num_refs--;
|
num_refs--;
|
||||||
|
|
||||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
|
||||||
fence_extra = 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bsp_size = NOUVEAU_VP3_BSP_RESERVED_SIZE;
|
bsp_size = NOUVEAU_VP3_BSP_RESERVED_SIZE;
|
||||||
for (i = 0; i < num_buffers; i++)
|
for (i = 0; i < num_buffers; i++)
|
||||||
bsp_size += num_bytes[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_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);
|
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||||
|
|
||||||
bsp_addr = bsp_bo->offset >> 8;
|
bsp_addr = bsp_bo->offset >> 8;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile);
|
||||||
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
||||||
unsigned ppp_caps = 0x10;
|
unsigned ppp_caps = 0x10;
|
||||||
unsigned fence_extra = 0;
|
|
||||||
|
|
||||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
nouveau_pushbuf_space(push, 32, 4, 0);
|
||||||
fence_extra = 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nouveau_pushbuf_space(push, 11 + (codec == PIPE_VIDEO_FORMAT_VC1 ? 2 : 0) + 3 + fence_extra + 2, 4, 0);
|
|
||||||
|
|
||||||
switch (codec) {
|
switch (codec) {
|
||||||
case PIPE_VIDEO_FORMAT_MPEG12: {
|
case PIPE_VIDEO_FORMAT_MPEG12: {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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 *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
|
||||||
struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1];
|
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[] = {
|
struct nouveau_pushbuf_refn bo_refs[] = {
|
||||||
{ inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
{ inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
||||||
{ dec->ref_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;
|
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) {
|
if (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC) {
|
||||||
nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size);
|
nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size);
|
||||||
codec_extra += 2;
|
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))
|
if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom))
|
||||||
nv98_decoder_kick_ref(dec, target);
|
nv98_decoder_kick_ref(dec, target);
|
||||||
|
|
||||||
nouveau_pushbuf_space(push, 8 + 3 * (codec != PIPE_VIDEO_FORMAT_MPEG12) +
|
nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0);
|
||||||
6 + codec_extra + fence_extra + 2, num_refs, 0);
|
|
||||||
|
|
||||||
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -403,7 +403,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
|
||||||
if (wait && hq->state != NVC0_HW_QUERY_STATE_READY)
|
if (wait && hq->state != NVC0_HW_QUERY_STATE_READY)
|
||||||
nvc0_hw_query_fifo_wait(nvc0, q);
|
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, hq->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD);
|
||||||
PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR);
|
PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR);
|
||||||
BEGIN_NVC0(push, NVC0_3D(QUERY_ADDRESS_HIGH), 2);
|
BEGIN_NVC0(push, NVC0_3D(QUERY_ADDRESS_HIGH), 2);
|
||||||
|
|
|
||||||
|
|
@ -799,7 +799,7 @@ nvc0_draw_stream_output(struct nvc0_context *nvc0,
|
||||||
}
|
}
|
||||||
|
|
||||||
while (num_instances--) {
|
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);
|
BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1);
|
||||||
PUSH_DATA (push, mode);
|
PUSH_DATA (push, mode);
|
||||||
BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BASE), 1);
|
BEGIN_NVC0(push, NVC0_3D(DRAW_TFB_BASE), 1);
|
||||||
|
|
|
||||||
|
|
@ -297,7 +297,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
||||||
dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map)));
|
dec->comm = (struct comm *)(dec->fence_map + (COMM_OFFSET/sizeof(*dec->fence_map)));
|
||||||
|
|
||||||
/* So lets test if the fence is working? */
|
/* 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);
|
PUSH_REFN (push[0], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NVC0(push[0], SUBC_BSP(0x240), 3);
|
BEGIN_NVC0(push[0], SUBC_BSP(0x240), 3);
|
||||||
PUSH_DATAh(push[0], dec->fence_bo->offset);
|
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_DATA (push[0], 0);
|
||||||
PUSH_KICK (push[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);
|
PUSH_REFN (push[1], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NVC0(push[1], SUBC_VP(0x240), 3);
|
BEGIN_NVC0(push[1], SUBC_VP(0x240), 3);
|
||||||
PUSH_DATAh(push[1], (dec->fence_bo->offset + 0x10));
|
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_DATA (push[1], 0);
|
||||||
PUSH_KICK (push[1]);
|
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);
|
PUSH_REFN (push[2], dec->fence_bo, NOUVEAU_BO_GART|NOUVEAU_BO_RDWR);
|
||||||
BEGIN_NVC0(push[2], SUBC_PPP(0x240), 3);
|
BEGIN_NVC0(push[2], SUBC_PPP(0x240), 3);
|
||||||
PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20));
|
PUSH_DATAh(push[2], (dec->fence_bo->offset + 0x20));
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,6 @@ nvc0_decoder_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||||
uint32_t caps;
|
uint32_t caps;
|
||||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
|
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];
|
struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1];
|
||||||
unsigned fence_extra = 0;
|
|
||||||
struct nouveau_pushbuf_refn bo_refs[] = {
|
struct nouveau_pushbuf_refn bo_refs[] = {
|
||||||
{ bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
{ bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
||||||
{ inter_bo, NOUVEAU_BO_WR | 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)
|
if (!dec->bitplane_bo)
|
||||||
num_refs--;
|
num_refs--;
|
||||||
|
|
||||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
|
||||||
fence_extra = 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
caps = nouveau_vp3_bsp_end(dec, desc);
|
caps = nouveau_vp3_bsp_end(dec, desc);
|
||||||
|
|
||||||
nouveau_vp3_vp_caps(dec, desc, target, comm_seq, vp_caps, is_ref, refs);
|
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);
|
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||||
|
|
||||||
bsp_addr = bsp_bo->offset >> 8;
|
bsp_addr = bsp_bo->offset >> 8;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
enum pipe_video_format codec = u_reduce_video_profile(dec->base.profile);
|
||||||
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
||||||
unsigned ppp_caps = 0x10;
|
unsigned ppp_caps = 0x10;
|
||||||
unsigned fence_extra = 0;
|
|
||||||
|
|
||||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
nouveau_pushbuf_space(push, 32, 4, 0);
|
||||||
fence_extra = 4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
nouveau_pushbuf_space(push, 11 + (codec == PIPE_VIDEO_FORMAT_VC1 ? 2 : 0) + 3 + fence_extra + 2, 4, 0);
|
|
||||||
|
|
||||||
switch (codec) {
|
switch (codec) {
|
||||||
case PIPE_VIDEO_FORMAT_MPEG12: {
|
case PIPE_VIDEO_FORMAT_MPEG12: {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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 *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
|
||||||
struct nouveau_bo *inter_bo = dec->inter_bo[comm_seq & 1];
|
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[] = {
|
struct nouveau_pushbuf_refn bo_refs[] = {
|
||||||
{ inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
{ inter_bo, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
||||||
{ dec->ref_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;
|
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) {
|
if (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC) {
|
||||||
nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size);
|
nouveau_vp3_inter_sizes(dec, desc.h264->slice_count, &slice_size, &bucket_size, &ring_size);
|
||||||
codec_extra += 2;
|
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))
|
if (!is_ref && (dec->refs[target->valid_ref].decoded_top && dec->refs[target->valid_ref].decoded_bottom))
|
||||||
nvc0_decoder_kick_ref(dec, target);
|
nvc0_decoder_kick_ref(dec, target);
|
||||||
|
|
||||||
nouveau_pushbuf_space(push, 8 + 3 * (codec != PIPE_VIDEO_FORMAT_MPEG12) +
|
nouveau_pushbuf_space(push, 32 + codec_extra, num_refs, 0);
|
||||||
6 + codec_extra + fence_extra + 2, num_refs, 0);
|
|
||||||
|
|
||||||
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue