mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 00:30:11 +01:00
nvc0: move nvc0_decoder into nouveau, rename to nouveau_vp3_decoder
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
86e5c3c97b
commit
d6a82a7747
6 changed files with 227 additions and 224 deletions
|
|
@ -21,8 +21,11 @@
|
|||
*/
|
||||
|
||||
#include "pipe/p_defines.h"
|
||||
|
||||
#include "vl/vl_video_buffer.h"
|
||||
|
||||
#include "util/u_video.h"
|
||||
|
||||
struct nouveau_vp3_video_buffer {
|
||||
struct pipe_video_buffer base;
|
||||
unsigned num_planes, valid_ref;
|
||||
|
|
@ -32,6 +35,163 @@ struct nouveau_vp3_video_buffer {
|
|||
struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2];
|
||||
};
|
||||
|
||||
#define SLICE_SIZE 0x200
|
||||
#define VP_OFFSET 0x200
|
||||
#define COMM_OFFSET 0x500
|
||||
|
||||
#define NOUVEAU_VP3_DEBUG_FENCE 0
|
||||
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
# define NOUVEAU_VP3_VIDEO_QDEPTH 1
|
||||
#else
|
||||
# define NOUVEAU_VP3_VIDEO_QDEPTH 2
|
||||
#endif
|
||||
|
||||
#define SUBC_BSP(m) dec->bsp_idx, (m)
|
||||
#define SUBC_VP(m) dec->vp_idx, (m)
|
||||
#define SUBC_PPP(m) dec->ppp_idx, (m)
|
||||
|
||||
union pipe_desc {
|
||||
struct pipe_picture_desc *base;
|
||||
struct pipe_mpeg12_picture_desc *mpeg12;
|
||||
struct pipe_mpeg4_picture_desc *mpeg4;
|
||||
struct pipe_vc1_picture_desc *vc1;
|
||||
struct pipe_h264_picture_desc *h264;
|
||||
};
|
||||
|
||||
struct nouveau_vp3_decoder {
|
||||
struct pipe_video_decoder base;
|
||||
struct nouveau_client *client;
|
||||
struct nouveau_object *channel[3], *bsp, *vp, *ppp;
|
||||
struct nouveau_pushbuf *pushbuf[3];
|
||||
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
/* dump fence and comm, as needed.. */
|
||||
unsigned *fence_map;
|
||||
struct comm *comm;
|
||||
|
||||
struct nouveau_bo *fence_bo;
|
||||
#endif
|
||||
|
||||
struct nouveau_bo *fw_bo, *bitplane_bo;
|
||||
|
||||
// array size max_references + 2, contains unpostprocessed images
|
||||
// added at the end of ref_bo is a tmp array
|
||||
// tmp is an array for h264, with each member being used for a ref frame or current
|
||||
// target.. size = (((mb(w)*((mb(h)+1)&~1))+3)>>2)<<8 * (max_references+1)
|
||||
// for other codecs, it simply seems that size = w*h is enough
|
||||
// unsure what it's supposed to contain..
|
||||
struct nouveau_bo *ref_bo;
|
||||
|
||||
struct nouveau_bo *inter_bo[2];
|
||||
|
||||
struct nouveau_bo *bsp_bo[NOUVEAU_VP3_VIDEO_QDEPTH];
|
||||
|
||||
// bo's used by each cycle:
|
||||
|
||||
// bsp_bo: contains raw bitstream data and parameters for BSP and VP.
|
||||
// inter_bo: contains data shared between BSP and VP
|
||||
// ref_bo: reference image data, used by PPP and VP
|
||||
// bitplane_bo: contain bitplane data (similar to ref_bo), used by BSP only
|
||||
// fw_bo: used by VP only.
|
||||
|
||||
// Needed amount of copies in optimal case:
|
||||
// 2 copies of inter_bo, VP would process the last inter_bo, while BSP is
|
||||
// writing out a new set.
|
||||
// NOUVEAU_VP3_VIDEO_QDEPTH copies of bsp_bo. We don't want to block the
|
||||
// pipeline ever, and give shaders a chance to run as well.
|
||||
|
||||
struct {
|
||||
struct nouveau_vp3_video_buffer *vidbuf;
|
||||
unsigned last_used;
|
||||
unsigned field_pic_flag : 1;
|
||||
unsigned decoded_top : 1;
|
||||
unsigned decoded_bottom : 1;
|
||||
} refs[17];
|
||||
unsigned fence_seq, fw_sizes, last_frame_num, tmp_stride, ref_stride;
|
||||
|
||||
unsigned bsp_idx, vp_idx, ppp_idx;
|
||||
};
|
||||
|
||||
struct comm {
|
||||
uint32_t bsp_cur_index; // 000
|
||||
uint32_t byte_ofs; // 004
|
||||
uint32_t status[0x10]; // 008
|
||||
uint32_t pos[0x10]; // 048
|
||||
uint8_t pad[0x100 - 0x88]; // 0a0 bool comm_encrypted
|
||||
|
||||
uint32_t pvp_cur_index; // 100
|
||||
uint32_t acked_byte_ofs; // 104
|
||||
uint32_t status_vp[0x10]; // 108
|
||||
uint16_t mb_y[0x10]; //148
|
||||
uint32_t pvp_stage; // 168 0xeeXX
|
||||
uint16_t parse_endpos_index; // 16c
|
||||
uint16_t irq_index; // 16e
|
||||
uint8_t irq_470[0x10]; // 170
|
||||
uint32_t irq_pos[0x10]; // 180
|
||||
uint32_t parse_endpos[0x10]; // 1c0
|
||||
};
|
||||
|
||||
static INLINE uint32_t nouveau_vp3_video_align(uint32_t h)
|
||||
{
|
||||
return ((h+0x3f)&~0x3f);
|
||||
};
|
||||
|
||||
static INLINE uint32_t mb(uint32_t coord)
|
||||
{
|
||||
return (coord + 0xf)>>4;
|
||||
}
|
||||
|
||||
static INLINE uint32_t mb_half(uint32_t coord)
|
||||
{
|
||||
return (coord + 0x1f)>>5;
|
||||
}
|
||||
|
||||
static INLINE uint64_t
|
||||
nouveau_vp3_video_addr(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *target)
|
||||
{
|
||||
uint64_t ret;
|
||||
if (target)
|
||||
ret = dec->ref_stride * target->valid_ref;
|
||||
else
|
||||
ret = dec->ref_stride * (dec->base.max_references+1);
|
||||
return dec->ref_bo->offset + ret;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nouveau_vp3_ycbcr_offsets(struct nouveau_vp3_decoder *dec, uint32_t *y2,
|
||||
uint32_t *cbcr, uint32_t *cbcr2)
|
||||
{
|
||||
uint32_t w = mb(dec->base.width), size;
|
||||
*y2 = mb_half(dec->base.height)*w;
|
||||
*cbcr = *y2 * 2;
|
||||
*cbcr2 = *cbcr + w * (nouveau_vp3_video_align(dec->base.height)>>6);
|
||||
|
||||
/* The check here should never fail because it means a bug
|
||||
* in the code rather than a bug in hardware..
|
||||
*/
|
||||
size = (2 * (*cbcr2 - *cbcr) + *cbcr) << 8;
|
||||
if (size > dec->ref_stride) {
|
||||
debug_printf("Overshot ref_stride (%u) with size %u and ofs (%u,%u,%u)\n",
|
||||
dec->ref_stride, size, *y2<<8, *cbcr<<8, *cbcr2<<8);
|
||||
*y2 = *cbcr = *cbcr2 = 0;
|
||||
assert(size <= dec->ref_stride);
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nouveau_vp3_inter_sizes(struct nouveau_vp3_decoder *dec, uint32_t slice_count,
|
||||
uint32_t *slice_size, uint32_t *bucket_size,
|
||||
uint32_t *ring_size)
|
||||
{
|
||||
*slice_size = (SLICE_SIZE * slice_count)>>8;
|
||||
if (u_reduce_video_profile(dec->base.profile) == PIPE_VIDEO_CODEC_MPEG12)
|
||||
*bucket_size = 0;
|
||||
else
|
||||
*bucket_size = mb(dec->base.width) * 3;
|
||||
*ring_size = (dec->inter_bo[0]->size >> 8) - *bucket_size - *slice_size;
|
||||
}
|
||||
|
||||
struct pipe_video_buffer *
|
||||
nouveau_vp3_video_buffer_create(struct pipe_context *pipe,
|
||||
const struct pipe_video_buffer *templat,
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ nvc0_decoder_decode_bitstream(struct pipe_video_decoder *decoder,
|
|||
const void *const *data,
|
||||
const unsigned *num_bytes)
|
||||
{
|
||||
struct nvc0_decoder *dec = (struct nvc0_decoder *)decoder;
|
||||
struct nouveau_vp3_decoder *dec = (struct nouveau_vp3_decoder *)decoder;
|
||||
struct nouveau_vp3_video_buffer *target = (struct nouveau_vp3_video_buffer *)video_target;
|
||||
uint32_t comm_seq = ++dec->fence_seq;
|
||||
union pipe_desc desc;
|
||||
|
|
@ -113,7 +113,7 @@ nvc0_decoder_decode_bitstream(struct pipe_video_decoder *decoder,
|
|||
static void
|
||||
nvc0_decoder_flush(struct pipe_video_decoder *decoder)
|
||||
{
|
||||
struct nvc0_decoder *dec = (struct nvc0_decoder *)decoder;
|
||||
struct nouveau_vp3_decoder *dec = (struct nouveau_vp3_decoder *)decoder;
|
||||
(void)dec;
|
||||
}
|
||||
|
||||
|
|
@ -134,19 +134,19 @@ nvc0_decoder_end_frame(struct pipe_video_decoder *decoder,
|
|||
static void
|
||||
nvc0_decoder_destroy(struct pipe_video_decoder *decoder)
|
||||
{
|
||||
struct nvc0_decoder *dec = (struct nvc0_decoder *)decoder;
|
||||
struct nouveau_vp3_decoder *dec = (struct nouveau_vp3_decoder *)decoder;
|
||||
int i;
|
||||
|
||||
nouveau_bo_ref(NULL, &dec->ref_bo);
|
||||
nouveau_bo_ref(NULL, &dec->bitplane_bo);
|
||||
nouveau_bo_ref(NULL, &dec->inter_bo[0]);
|
||||
nouveau_bo_ref(NULL, &dec->inter_bo[1]);
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
nouveau_bo_ref(NULL, &dec->fence_bo);
|
||||
#endif
|
||||
nouveau_bo_ref(NULL, &dec->fw_bo);
|
||||
|
||||
for (i = 0; i < NVC0_VIDEO_QDEPTH; ++i)
|
||||
for (i = 0; i < NOUVEAU_VP3_VIDEO_QDEPTH; ++i)
|
||||
nouveau_bo_ref(NULL, &dec->bsp_bo[i]);
|
||||
|
||||
nouveau_object_del(&dec->bsp);
|
||||
|
|
@ -198,7 +198,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
bool chunked_decode)
|
||||
{
|
||||
struct nouveau_screen *screen = &((struct nvc0_context *)context)->screen->base;
|
||||
struct nvc0_decoder *dec;
|
||||
struct nouveau_vp3_decoder *dec;
|
||||
struct nouveau_pushbuf **push;
|
||||
union nouveau_bo_config cfg;
|
||||
bool kepler = screen->device->chipset >= 0xe0;
|
||||
|
|
@ -221,7 +221,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
dec = CALLOC_STRUCT(nvc0_decoder);
|
||||
dec = CALLOC_STRUCT(nouveau_vp3_decoder);
|
||||
if (!dec)
|
||||
return NULL;
|
||||
dec->client = screen->client;
|
||||
|
|
@ -313,7 +313,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
dec->base.begin_frame = nvc0_decoder_begin_frame;
|
||||
dec->base.end_frame = nvc0_decoder_end_frame;
|
||||
|
||||
for (i = 0; i < NVC0_VIDEO_QDEPTH && !ret; ++i)
|
||||
for (i = 0; i < NOUVEAU_VP3_VIDEO_QDEPTH && !ret; ++i)
|
||||
ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM,
|
||||
0, 1 << 20, &cfg, &dec->bsp_bo[i]);
|
||||
if (!ret)
|
||||
|
|
@ -350,7 +350,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
}
|
||||
case PIPE_VIDEO_CODEC_MPEG4_AVC: {
|
||||
codec = 3;
|
||||
dec->tmp_stride = 16 * mb_half(width) * nvc0_video_align(height) * 3 / 2;
|
||||
dec->tmp_stride = 16 * mb_half(width) * nouveau_vp3_video_align(height) * 3 / 2;
|
||||
tmp_size = dec->tmp_stride * (max_references + 1);
|
||||
assert(max_references <= 16);
|
||||
break;
|
||||
|
|
@ -440,7 +440,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
dec->ref_stride = mb(width)*16 * (mb_half(height)*32 + nvc0_video_align(height)/2);
|
||||
dec->ref_stride = mb(width)*16 * (mb_half(height)*32 + nouveau_vp3_video_align(height)/2);
|
||||
ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM, 0,
|
||||
dec->ref_stride * (max_references+2) + tmp_size,
|
||||
&cfg, &dec->ref_bo);
|
||||
|
|
@ -463,7 +463,7 @@ nvc0_create_decoder(struct pipe_context *context,
|
|||
|
||||
++dec->fence_seq;
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
ret = nouveau_bo_new(screen->device, NOUVEAU_BO_GART|NOUVEAU_BO_MAP,
|
||||
0, 0x1000, NULL, &dec->fence_bo);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -29,172 +29,15 @@
|
|||
|
||||
#include "util/u_video.h"
|
||||
|
||||
#define SLICE_SIZE 0x200
|
||||
#define VP_OFFSET 0x200
|
||||
#define COMM_OFFSET 0x500
|
||||
|
||||
#define NVC0_DEBUG_FENCE 0
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
# define NVC0_VIDEO_QDEPTH 1
|
||||
#else
|
||||
# define NVC0_VIDEO_QDEPTH 2
|
||||
#endif
|
||||
|
||||
#define SUBC_BSP(m) dec->bsp_idx, (m)
|
||||
#define SUBC_VP(m) dec->vp_idx, (m)
|
||||
#define SUBC_PPP(m) dec->ppp_idx, (m)
|
||||
|
||||
union pipe_desc {
|
||||
struct pipe_picture_desc *base;
|
||||
struct pipe_mpeg12_picture_desc *mpeg12;
|
||||
struct pipe_mpeg4_picture_desc *mpeg4;
|
||||
struct pipe_vc1_picture_desc *vc1;
|
||||
struct pipe_h264_picture_desc *h264;
|
||||
};
|
||||
|
||||
struct nvc0_decoder {
|
||||
struct pipe_video_decoder base;
|
||||
struct nouveau_client *client;
|
||||
struct nouveau_object *channel[3], *bsp, *vp, *ppp;
|
||||
struct nouveau_pushbuf *pushbuf[3];
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
/* dump fence and comm, as needed.. */
|
||||
unsigned *fence_map;
|
||||
struct comm *comm;
|
||||
|
||||
struct nouveau_bo *fence_bo;
|
||||
#endif
|
||||
|
||||
struct nouveau_bo *fw_bo, *bitplane_bo;
|
||||
|
||||
// array size max_references + 2, contains unpostprocessed images
|
||||
// added at the end of ref_bo is a tmp array
|
||||
// tmp is an array for h264, with each member being used for a ref frame or current
|
||||
// target.. size = (((mb(w)*((mb(h)+1)&~1))+3)>>2)<<8 * (max_references+1)
|
||||
// for other codecs, it simply seems that size = w*h is enough
|
||||
// unsure what it's supposed to contain..
|
||||
struct nouveau_bo *ref_bo;
|
||||
|
||||
struct nouveau_bo *inter_bo[2];
|
||||
|
||||
struct nouveau_bo *bsp_bo[NVC0_VIDEO_QDEPTH];
|
||||
|
||||
// bo's used by each cycle:
|
||||
|
||||
// bsp_bo: contains raw bitstream data and parameters for BSP and VP.
|
||||
// inter_bo: contains data shared between BSP and VP
|
||||
// ref_bo: reference image data, used by PPP and VP
|
||||
// bitplane_bo: contain bitplane data (similar to ref_bo), used by BSP only
|
||||
// fw_bo: used by VP only.
|
||||
|
||||
// Needed amount of copies in optimal case:
|
||||
// 2 copies of inter_bo, VP would process the last inter_bo, while BSP is
|
||||
// writing out a new set.
|
||||
// NVC0_VIDEO_QDEPTH copies of bsp_bo. We don't want to block the pipeline ever,
|
||||
// and give shaders a chance to run as well.
|
||||
|
||||
struct {
|
||||
struct nouveau_vp3_video_buffer *vidbuf;
|
||||
unsigned last_used;
|
||||
unsigned field_pic_flag : 1;
|
||||
unsigned decoded_top : 1;
|
||||
unsigned decoded_bottom : 1;
|
||||
} refs[17];
|
||||
unsigned fence_seq, fw_sizes, last_frame_num, tmp_stride, ref_stride;
|
||||
|
||||
unsigned bsp_idx, vp_idx, ppp_idx;
|
||||
};
|
||||
|
||||
struct comm {
|
||||
uint32_t bsp_cur_index; // 000
|
||||
uint32_t byte_ofs; // 004
|
||||
uint32_t status[0x10]; // 008
|
||||
uint32_t pos[0x10]; // 048
|
||||
uint8_t pad[0x100 - 0x88]; // 0a0 bool comm_encrypted
|
||||
|
||||
uint32_t pvp_cur_index; // 100
|
||||
uint32_t acked_byte_ofs; // 104
|
||||
uint32_t status_vp[0x10]; // 108
|
||||
uint16_t mb_y[0x10]; //148
|
||||
uint32_t pvp_stage; // 168 0xeeXX
|
||||
uint16_t parse_endpos_index; // 16c
|
||||
uint16_t irq_index; // 16e
|
||||
uint8_t irq_470[0x10]; // 170
|
||||
uint32_t irq_pos[0x10]; // 180
|
||||
uint32_t parse_endpos[0x10]; // 1c0
|
||||
};
|
||||
|
||||
static INLINE uint32_t nvc0_video_align(uint32_t h)
|
||||
{
|
||||
return ((h+0x3f)&~0x3f);
|
||||
};
|
||||
|
||||
static INLINE uint32_t mb(uint32_t coord)
|
||||
{
|
||||
return (coord + 0xf)>>4;
|
||||
}
|
||||
|
||||
static INLINE uint32_t mb_half(uint32_t coord)
|
||||
{
|
||||
return (coord + 0x1f)>>5;
|
||||
}
|
||||
|
||||
static INLINE uint64_t
|
||||
nvc0_video_addr(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target)
|
||||
{
|
||||
uint64_t ret;
|
||||
if (target)
|
||||
ret = dec->ref_stride * target->valid_ref;
|
||||
else
|
||||
ret = dec->ref_stride * (dec->base.max_references+1);
|
||||
return dec->ref_bo->offset + ret;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nvc0_decoder_ycbcr_offsets(struct nvc0_decoder *dec, uint32_t *y2,
|
||||
uint32_t *cbcr, uint32_t *cbcr2)
|
||||
{
|
||||
uint32_t w = mb(dec->base.width), size;
|
||||
*y2 = mb_half(dec->base.height)*w;
|
||||
*cbcr = *y2 * 2;
|
||||
*cbcr2 = *cbcr + w * (nvc0_video_align(dec->base.height)>>6);
|
||||
|
||||
/* The check here should never fail because it means a bug
|
||||
* in the code rather than a bug in hardware..
|
||||
*/
|
||||
size = (2 * (*cbcr2 - *cbcr) + *cbcr) << 8;
|
||||
if (size > dec->ref_stride) {
|
||||
debug_printf("Overshot ref_stride (%u) with size %u and ofs (%u,%u,%u)\n",
|
||||
dec->ref_stride, size, *y2<<8, *cbcr<<8, *cbcr2<<8);
|
||||
*y2 = *cbcr = *cbcr2 = 0;
|
||||
assert(size <= dec->ref_stride);
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
nvc0_decoder_inter_sizes(struct nvc0_decoder *dec, uint32_t slice_count,
|
||||
uint32_t *slice_size, uint32_t *bucket_size,
|
||||
uint32_t *ring_size)
|
||||
{
|
||||
*slice_size = (SLICE_SIZE * slice_count)>>8;
|
||||
if (u_reduce_video_profile(dec->base.profile) == PIPE_VIDEO_CODEC_MPEG12)
|
||||
*bucket_size = 0;
|
||||
else
|
||||
*bucket_size = mb(dec->base.width) * 3;
|
||||
*ring_size = (dec->inter_bo[0]->size >> 8) - *bucket_size - *slice_size;
|
||||
}
|
||||
|
||||
extern unsigned
|
||||
nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
nvc0_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target,
|
||||
unsigned comm_seq, unsigned num_buffers,
|
||||
const void *const *data, const unsigned *num_bytes,
|
||||
unsigned *vp_caps, unsigned *is_ref,
|
||||
struct nouveau_vp3_video_buffer *refs[16]);
|
||||
|
||||
extern void nvc0_decoder_vp_caps(struct nvc0_decoder *dec,
|
||||
extern void nvc0_decoder_vp_caps(struct nouveau_vp3_decoder *dec,
|
||||
union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target,
|
||||
unsigned comm_seq,
|
||||
|
|
@ -202,11 +45,11 @@ extern void nvc0_decoder_vp_caps(struct nvc0_decoder *dec,
|
|||
struct nouveau_vp3_video_buffer *refs[16]);
|
||||
|
||||
extern void
|
||||
nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
nvc0_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
|
||||
unsigned caps, unsigned is_ref,
|
||||
struct nouveau_vp3_video_buffer *refs[16]);
|
||||
|
||||
extern void
|
||||
nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
nvc0_decoder_ppp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target, unsigned comm_seq);
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ struct h264_picparm_bsp {
|
|||
};
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_mpeg12_bsp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_mpeg12_bsp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_mpeg12_picture_desc *desc,
|
||||
char *map)
|
||||
{
|
||||
|
|
@ -132,7 +132,7 @@ nvc0_decoder_fill_picparm_mpeg12_bsp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_mpeg4_bsp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_mpeg4_bsp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_mpeg4_picture_desc *desc,
|
||||
char *map)
|
||||
{
|
||||
|
|
@ -157,7 +157,7 @@ nvc0_decoder_fill_picparm_mpeg4_bsp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_vc1_bsp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_vc1_bsp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_vc1_picture_desc *d,
|
||||
char *map)
|
||||
{
|
||||
|
|
@ -189,7 +189,7 @@ nvc0_decoder_fill_picparm_vc1_bsp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_h264_bsp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_h264_bsp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_h264_picture_desc *d,
|
||||
char *map)
|
||||
{
|
||||
|
|
@ -230,7 +230,7 @@ nvc0_decoder_fill_picparm_h264_bsp(struct nvc0_decoder *dec,
|
|||
return caps | 3;
|
||||
}
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
static void dump_comm_bsp(struct comm *comm)
|
||||
{
|
||||
unsigned idx = comm->bsp_cur_index & 0xf;
|
||||
|
|
@ -240,7 +240,7 @@ static void dump_comm_bsp(struct comm *comm)
|
|||
#endif
|
||||
|
||||
unsigned
|
||||
nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
nvc0_decoder_bsp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target,
|
||||
unsigned comm_seq, unsigned num_buffers,
|
||||
const void *const *data, const unsigned *num_bytes,
|
||||
|
|
@ -255,13 +255,13 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
uint32_t endmarker, caps;
|
||||
struct strparm_bsp *str_bsp;
|
||||
int ret, i;
|
||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NVC0_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];
|
||||
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 },
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
{ dec->fence_bo, NOUVEAU_BO_WR | NOUVEAU_BO_GART },
|
||||
#endif
|
||||
{ dec->bitplane_bo, NOUVEAU_BO_RDWR | NOUVEAU_BO_VRAM },
|
||||
|
|
@ -271,7 +271,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
if (!dec->bitplane_bo)
|
||||
num_refs--;
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
fence_extra = 4;
|
||||
#endif
|
||||
|
||||
|
|
@ -329,7 +329,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
/* Reserved for picparm_vp */
|
||||
bsp += 0x300;
|
||||
/* Reserved for comm */
|
||||
#if !NVC0_DEBUG_FENCE
|
||||
#if !NOUVEAU_VP3_DEBUG_FENCE
|
||||
memset(bsp, 0, 0x200);
|
||||
#endif
|
||||
bsp += 0x200;
|
||||
|
|
@ -351,7 +351,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
bsp_addr = bsp_bo->offset >> 8;
|
||||
inter_addr = inter_bo->offset >> 8;
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
memset(dec->comm, 0, 0x200);
|
||||
comm_addr = (dec->fence_bo->offset + COMM_OFFSET) >> 8;
|
||||
#else
|
||||
|
|
@ -370,7 +370,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
|
||||
bitplane_addr = dec->bitplane_bo->offset >> 8;
|
||||
|
||||
nvc0_decoder_inter_sizes(dec, 1, &slice_size, &bucket_size, &ring_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &slice_size, &bucket_size, &ring_size);
|
||||
BEGIN_NVC0(push, SUBC_BSP(0x400), 6);
|
||||
PUSH_DATA (push, bsp_addr); // 400 picparm addr
|
||||
PUSH_DATA (push, inter_addr); // 404 interparm addr
|
||||
|
|
@ -379,7 +379,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
PUSH_DATA (push, bitplane_addr); // 410 BITPLANE_DATA
|
||||
PUSH_DATA (push, 0x400); // 414 BITPLANE_DATA_SIZE
|
||||
} else {
|
||||
nvc0_decoder_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);
|
||||
BEGIN_NVC0(push, SUBC_BSP(0x400), 8);
|
||||
PUSH_DATA (push, bsp_addr); // 400 picparm addr
|
||||
PUSH_DATA (push, inter_addr); // 404 interparm addr
|
||||
|
|
@ -392,7 +392,7 @@ nvc0_decoder_bsp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
// TODO: Double check 414 / 418 with nvidia trace
|
||||
}
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
BEGIN_NVC0(push, SUBC_BSP(0x240), 3);
|
||||
PUSH_DATAh(push, dec->fence_bo->offset);
|
||||
PUSH_DATA (push, dec->fence_bo->offset);
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
#include "nvc0_video.h"
|
||||
|
||||
static void
|
||||
nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target, uint32_t low700) {
|
||||
nvc0_decoder_setup_ppp(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *target, uint32_t low700) {
|
||||
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
||||
|
||||
uint32_t stride_in = mb(dec->base.width);
|
||||
|
|
@ -36,7 +36,7 @@ nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer
|
|||
{ NULL, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
||||
{ NULL, NOUVEAU_BO_WR | NOUVEAU_BO_VRAM },
|
||||
{ dec->ref_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
{ dec->fence_bo, NOUVEAU_BO_WR | NOUVEAU_BO_GART },
|
||||
#endif
|
||||
};
|
||||
|
|
@ -48,10 +48,10 @@ nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer
|
|||
}
|
||||
|
||||
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||
nvc0_decoder_ycbcr_offsets(dec, &y2, &cbcr, &cbcr2);
|
||||
nouveau_vp3_ycbcr_offsets(dec, &y2, &cbcr, &cbcr2);
|
||||
|
||||
BEGIN_NVC0(push, SUBC_PPP(0x700), 10);
|
||||
in_addr = nvc0_video_addr(dec, target) >> 8;
|
||||
in_addr = nouveau_vp3_video_addr(dec, target) >> 8;
|
||||
|
||||
PUSH_DATA (push, (stride_out << 24) | (stride_out << 16) | low700); // 700
|
||||
PUSH_DATA (push, (stride_in << 24) | (stride_in << 16) | (dec_h << 8) | dec_w); // 704
|
||||
|
|
@ -73,7 +73,7 @@ nvc0_decoder_setup_ppp(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_vc1_ppp(struct nvc0_decoder *dec, struct pipe_vc1_picture_desc *desc, struct nouveau_vp3_video_buffer *target) {
|
||||
nvc0_decoder_vc1_ppp(struct nouveau_vp3_decoder *dec, struct pipe_vc1_picture_desc *desc, struct nouveau_vp3_video_buffer *target) {
|
||||
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
||||
|
||||
nvc0_decoder_setup_ppp(dec, target, 0x1412);
|
||||
|
|
@ -89,13 +89,13 @@ nvc0_decoder_vc1_ppp(struct nvc0_decoder *dec, struct pipe_vc1_picture_desc *des
|
|||
}
|
||||
|
||||
void
|
||||
nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc, struct nouveau_vp3_video_buffer *target, unsigned comm_seq) {
|
||||
nvc0_decoder_ppp(struct nouveau_vp3_decoder *dec, union pipe_desc desc, struct nouveau_vp3_video_buffer *target, unsigned comm_seq) {
|
||||
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
|
||||
struct nouveau_pushbuf *push = dec->pushbuf[2];
|
||||
unsigned ppp_caps = 0x10;
|
||||
unsigned fence_extra = 0;
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
fence_extra = 4;
|
||||
#endif
|
||||
|
||||
|
|
@ -116,7 +116,7 @@ nvc0_decoder_ppp(struct nvc0_decoder *dec, union pipe_desc desc, struct nouveau_
|
|||
PUSH_DATA (push, comm_seq);
|
||||
PUSH_DATA (push, ppp_caps);
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
BEGIN_NVC0(push, SUBC_PPP(0x240), 3);
|
||||
PUSH_DATAh(push, (dec->fence_bo->offset + 0x20));
|
||||
PUSH_DATA (push, (dec->fence_bo->offset + 0x20));
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ struct h264_picparm_vp { // 700..a00
|
|||
};
|
||||
|
||||
static void
|
||||
nvc0_decoder_handle_references(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *refs[16], unsigned seq, struct nouveau_vp3_video_buffer *target)
|
||||
nvc0_decoder_handle_references(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *refs[16], unsigned seq, struct nouveau_vp3_video_buffer *target)
|
||||
{
|
||||
unsigned h264 = u_reduce_video_profile(dec->base.profile) == PIPE_VIDEO_CODEC_MPEG4_AVC;
|
||||
unsigned i, idx, empty_spot = dec->base.max_references + 1;
|
||||
|
|
@ -221,7 +221,7 @@ nvc0_decoder_handle_references(struct nvc0_decoder *dec, struct nouveau_vp3_vide
|
|||
}
|
||||
|
||||
static void
|
||||
nvc0_decoder_kick_ref(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer *target)
|
||||
nvc0_decoder_kick_ref(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *target)
|
||||
{
|
||||
dec->refs[target->valid_ref].vidbuf = NULL;
|
||||
dec->refs[target->valid_ref].last_used = 0;
|
||||
|
|
@ -229,7 +229,7 @@ nvc0_decoder_kick_ref(struct nvc0_decoder *dec, struct nouveau_vp3_video_buffer
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_mpeg12_vp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_mpeg12_vp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_mpeg12_picture_desc *desc,
|
||||
struct nouveau_vp3_video_buffer *refs[16],
|
||||
unsigned *is_ref,
|
||||
|
|
@ -252,10 +252,10 @@ nvc0_decoder_fill_picparm_mpeg12_vp(struct nvc0_decoder *dec,
|
|||
pic_vp->height = mb(dec->base.height);
|
||||
pic_vp->unk08 = pic_vp->unk04 = (dec->base.width+0xf)&~0xf; // Stride
|
||||
|
||||
nvc0_decoder_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
|
||||
nouveau_vp3_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
|
||||
pic_vp->ofs[5] = pic_vp->ofs[3];
|
||||
pic_vp->ofs[0] = pic_vp->ofs[2] = 0;
|
||||
nvc0_decoder_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
|
||||
|
||||
pic_vp->alternate_scan = desc->alternate_scan;
|
||||
pic_vp->pad2[0] = pic_vp->pad2[1] = pic_vp->pad2[2] = 0;
|
||||
|
|
@ -278,7 +278,7 @@ nvc0_decoder_fill_picparm_mpeg12_vp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_mpeg4_vp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_mpeg4_vp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_mpeg4_picture_desc *desc,
|
||||
struct nouveau_vp3_video_buffer *refs[16],
|
||||
unsigned *is_ref,
|
||||
|
|
@ -293,11 +293,11 @@ nvc0_decoder_fill_picparm_mpeg4_vp(struct nvc0_decoder *dec,
|
|||
pic_vp->height = mb(dec->base.height)<<4;
|
||||
pic_vp->unk0c = pic_vp->unk08 = mb(dec->base.width)<<4; // Stride
|
||||
|
||||
nvc0_decoder_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
|
||||
nouveau_vp3_ycbcr_offsets(dec, &pic_vp->ofs[1], &pic_vp->ofs[3], &pic_vp->ofs[4]);
|
||||
pic_vp->ofs[5] = pic_vp->ofs[3];
|
||||
pic_vp->ofs[0] = pic_vp->ofs[2] = 0;
|
||||
pic_vp->pad1 = pic_vp->pad2 = 0;
|
||||
nvc0_decoder_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &ring, &pic_vp->bucket_size, &pic_vp->inter_ring_data_size);
|
||||
|
||||
pic_vp->trd[0] = desc->trd[0];
|
||||
pic_vp->trd[1] = desc->trd[1];
|
||||
|
|
@ -326,7 +326,7 @@ nvc0_decoder_fill_picparm_mpeg4_vp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_h264_vp(struct nouveau_vp3_decoder *dec,
|
||||
const struct pipe_h264_picture_desc *d,
|
||||
struct nouveau_vp3_video_buffer *refs[16],
|
||||
unsigned *is_ref,
|
||||
|
|
@ -341,12 +341,12 @@ nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
|
|||
h->width = mb(dec->base.width);
|
||||
h->height = mb(dec->base.height);
|
||||
h->stride1 = h->stride2 = mb(dec->base.width)*16;
|
||||
nvc0_decoder_ycbcr_offsets(dec, &h->ofs[1], &h->ofs[3], &h->ofs[4]);
|
||||
nouveau_vp3_ycbcr_offsets(dec, &h->ofs[1], &h->ofs[3], &h->ofs[4]);
|
||||
h->ofs[5] = h->ofs[3];
|
||||
h->ofs[0] = h->ofs[2] = 0;
|
||||
h->u24 = dec->tmp_stride >> 8;
|
||||
assert(h->u24);
|
||||
nvc0_decoder_inter_sizes(dec, 1, &ring, &h->bucket_size, &h->inter_ring_data_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &ring, &h->bucket_size, &h->inter_ring_data_size);
|
||||
|
||||
h->u220 = 0;
|
||||
h->f0 = d->mb_adaptive_frame_field_flag;
|
||||
|
|
@ -410,7 +410,7 @@ nvc0_decoder_fill_picparm_h264_vp(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static void
|
||||
nvc0_decoder_fill_picparm_h264_vp_refs(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_h264_vp_refs(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_h264_picture_desc *d,
|
||||
struct nouveau_vp3_video_buffer *refs[16],
|
||||
struct nouveau_vp3_video_buffer *target,
|
||||
|
|
@ -429,7 +429,7 @@ nvc0_decoder_fill_picparm_h264_vp_refs(struct nvc0_decoder *dec,
|
|||
}
|
||||
|
||||
static uint32_t
|
||||
nvc0_decoder_fill_picparm_vc1_vp(struct nvc0_decoder *dec,
|
||||
nvc0_decoder_fill_picparm_vc1_vp(struct nouveau_vp3_decoder *dec,
|
||||
struct pipe_vc1_picture_desc *d,
|
||||
struct nouveau_vp3_video_buffer *refs[16],
|
||||
unsigned *is_ref,
|
||||
|
|
@ -440,14 +440,14 @@ nvc0_decoder_fill_picparm_vc1_vp(struct nvc0_decoder *dec,
|
|||
assert(dec->base.profile != PIPE_VIDEO_PROFILE_VC1_SIMPLE);
|
||||
*is_ref = d->picture_type <= 1;
|
||||
|
||||
nvc0_decoder_ycbcr_offsets(dec, &vc->ofs[1], &vc->ofs[3], &vc->ofs[4]);
|
||||
nouveau_vp3_ycbcr_offsets(dec, &vc->ofs[1], &vc->ofs[3], &vc->ofs[4]);
|
||||
vc->ofs[5] = vc->ofs[3];
|
||||
vc->ofs[0] = vc->ofs[2] = 0;
|
||||
vc->width = dec->base.width;
|
||||
vc->height = mb(dec->base.height)<<4;
|
||||
vc->unk0c = vc->unk10 = mb(dec->base.width)<<4; // Stride
|
||||
vc->pad = vc->pad2 = 0;
|
||||
nvc0_decoder_inter_sizes(dec, 1, &ring, &vc->bucket_size, &vc->inter_ring_data_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &ring, &vc->bucket_size, &vc->inter_ring_data_size);
|
||||
vc->profile = dec->base.profile - PIPE_VIDEO_PROFILE_VC1_SIMPLE;
|
||||
vc->loopfilter = d->loopfilter;
|
||||
vc->fastuvmc = d->fastuvmc;
|
||||
|
|
@ -460,8 +460,8 @@ nvc0_decoder_fill_picparm_vc1_vp(struct nvc0_decoder *dec,
|
|||
return 0x12;
|
||||
}
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
static void dump_comm_vp(struct nvc0_decoder *dec, struct comm *comm, u32 comm_seq,
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
static void dump_comm_vp(struct nouveau_vp3_decoder *dec, struct comm *comm, u32 comm_seq,
|
||||
struct nouveau_bo *inter_bo, unsigned slice_size)
|
||||
{
|
||||
unsigned i, idx = comm->pvp_cur_index & 0xf;
|
||||
|
|
@ -493,12 +493,12 @@ static void dump_comm_vp(struct nvc0_decoder *dec, struct comm *comm, u32 comm_s
|
|||
}
|
||||
#endif
|
||||
|
||||
void nvc0_decoder_vp_caps(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
void nvc0_decoder_vp_caps(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
|
||||
unsigned *caps, unsigned *is_ref,
|
||||
struct nouveau_vp3_video_buffer *refs[16])
|
||||
{
|
||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NVC0_VIDEO_QDEPTH];
|
||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NOUVEAU_VP3_VIDEO_QDEPTH];
|
||||
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
|
||||
char *vp = bsp_bo->map + VP_OFFSET;
|
||||
|
||||
|
|
@ -527,7 +527,7 @@ void nvc0_decoder_vp_caps(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
}
|
||||
|
||||
void
|
||||
nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
|
||||
nvc0_decoder_vp(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
|
||||
struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
|
||||
unsigned caps, unsigned is_ref,
|
||||
struct nouveau_vp3_video_buffer *refs[16])
|
||||
|
|
@ -536,41 +536,41 @@ nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
uint32_t bsp_addr, comm_addr, inter_addr, ucode_addr, pic_addr[17], last_addr, null_addr;
|
||||
uint32_t slice_size, bucket_size, ring_size, i;
|
||||
enum pipe_video_codec codec = u_reduce_video_profile(dec->base.profile);
|
||||
struct nouveau_bo *bsp_bo = dec->bsp_bo[comm_seq % NVC0_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];
|
||||
u32 fence_extra = 0, 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 },
|
||||
{ bsp_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
{ dec->fence_bo, NOUVEAU_BO_WR | NOUVEAU_BO_GART },
|
||||
#endif
|
||||
{ dec->fw_bo, NOUVEAU_BO_RD | NOUVEAU_BO_VRAM },
|
||||
};
|
||||
int num_refs = sizeof(bo_refs)/sizeof(*bo_refs) - !dec->fw_bo;
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
fence_extra = 4;
|
||||
#endif
|
||||
|
||||
if (codec == PIPE_VIDEO_CODEC_MPEG4_AVC) {
|
||||
nvc0_decoder_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;
|
||||
} else
|
||||
nvc0_decoder_inter_sizes(dec, 1, &slice_size, &bucket_size, &ring_size);
|
||||
nouveau_vp3_inter_sizes(dec, 1, &slice_size, &bucket_size, &ring_size);
|
||||
|
||||
if (dec->base.max_references > 2)
|
||||
codec_extra += 1 + (dec->base.max_references - 2);
|
||||
|
||||
pic_addr[16] = nvc0_video_addr(dec, target) >> 8;
|
||||
last_addr = null_addr = nvc0_video_addr(dec, NULL) >> 8;
|
||||
pic_addr[16] = nouveau_vp3_video_addr(dec, target) >> 8;
|
||||
last_addr = null_addr = nouveau_vp3_video_addr(dec, NULL) >> 8;
|
||||
|
||||
for (i = 0; i < dec->base.max_references; ++i) {
|
||||
if (!refs[i])
|
||||
pic_addr[i] = last_addr;
|
||||
else if (dec->refs[refs[i]->valid_ref].vidbuf == refs[i])
|
||||
last_addr = pic_addr[i] = nvc0_video_addr(dec, refs[i]) >> 8;
|
||||
last_addr = pic_addr[i] = nouveau_vp3_video_addr(dec, refs[i]) >> 8;
|
||||
else
|
||||
pic_addr[i] = null_addr;
|
||||
}
|
||||
|
|
@ -583,7 +583,7 @@ nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
nouveau_pushbuf_refn(push, bo_refs, num_refs);
|
||||
|
||||
bsp_addr = bsp_bo->offset >> 8;
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
comm_addr = (dec->fence_bo->offset + COMM_OFFSET)>>8;
|
||||
#else
|
||||
comm_addr = bsp_addr + (COMM_OFFSET>>8);
|
||||
|
|
@ -635,7 +635,7 @@ nvc0_decoder_vp(struct nvc0_decoder *dec, union pipe_desc desc,
|
|||
|
||||
//debug_printf("Decoding %08lx with %08lx and %08lx\n", pic_addr[16], pic_addr[0], pic_addr[1]);
|
||||
|
||||
#if NVC0_DEBUG_FENCE
|
||||
#if NOUVEAU_VP3_DEBUG_FENCE
|
||||
BEGIN_NVC0(push, SUBC_VP(0x240), 3);
|
||||
PUSH_DATAh(push, (dec->fence_bo->offset + 0x10));
|
||||
PUSH_DATA (push, (dec->fence_bo->offset + 0x10));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue