*/
#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;
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,
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;
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;
}
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);
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;
return NULL;
}
- dec = CALLOC_STRUCT(nvc0_decoder);
+ dec = CALLOC_STRUCT(nouveau_vp3_decoder);
if (!dec)
return NULL;
dec->client = screen->client;
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)
}
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;
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);
++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)
#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,
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);
};
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)
{
}
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)
{
}
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)
{
}
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)
{
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;
#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,
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 },
if (!dec->bitplane_bo)
num_refs--;
-#if NVC0_DEBUG_FENCE
+#if NOUVEAU_VP3_DEBUG_FENCE
fence_extra = 4;
#endif
/* 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;
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
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
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
// 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);
#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);
{ 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
};
}
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
}
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);
}
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
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));
};
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;
}
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;
}
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,
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;
}
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,
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];
}
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,
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;
}
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,
}
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,
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;
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;
}
#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;
}
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])
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;
}
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);
//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));