1b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin/*
2b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * Copyright 2011-2013 Maarten Lankhorst
3b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin *
4b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * Permission is hereby granted, free of charge, to any person obtaining a
5b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * copy of this software and associated documentation files (the "Software"),
6b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * to deal in the Software without restriction, including without limitation
7b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * and/or sell copies of the Software, and to permit persons to whom the
9b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * Software is furnished to do so, subject to the following conditions:
10b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin *
11b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * The above copyright notice and this permission notice shall be included in
12b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * all copies or substantial portions of the Software.
13b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin *
14b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin * OTHER DEALINGS IN THE SOFTWARE.
21b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin */
22b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin
238044fd6769d51ae35402cd62272ea8582b625445Jonathan Gray#include <nouveau.h>
24d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
25e1cd987bb641eef88a9b856aaccff8bb526f6311Ilia Mirkin#include "pipe/p_defines.h"
26b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin#include "vl/vl_video_buffer.h"
27d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#include "util/u_video.h"
28d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
29b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkinstruct nouveau_vp3_video_buffer {
30b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   struct pipe_video_buffer base;
31b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   unsigned num_planes, valid_ref;
32b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   struct pipe_resource *resources[VL_NUM_COMPONENTS];
33b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS];
34b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS];
35b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin   struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2];
36b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin};
37b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin
38d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define SLICE_SIZE 0x200
39d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define VP_OFFSET 0x200
40d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define COMM_OFFSET 0x500
41d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
42f6afed7076a6ef446dbec7cb10c8f8c60efafccdMaarten Lankhorst#define NOUVEAU_VP3_BSP_RESERVED_SIZE 0x700
43f6afed7076a6ef446dbec7cb10c8f8c60efafccdMaarten Lankhorst
44d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define NOUVEAU_VP3_DEBUG_FENCE 0
45d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
46d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#if NOUVEAU_VP3_DEBUG_FENCE
47d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin# define NOUVEAU_VP3_VIDEO_QDEPTH 1
48d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#else
49d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin# define NOUVEAU_VP3_VIDEO_QDEPTH 2
50d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#endif
51d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
52d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define SUBC_BSP(m) dec->bsp_idx, (m)
53d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define SUBC_VP(m) dec->vp_idx, (m)
54d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#define SUBC_PPP(m) dec->ppp_idx, (m)
55d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
56d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinunion pipe_desc {
57d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct pipe_picture_desc *base;
58d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct pipe_mpeg12_picture_desc *mpeg12;
59d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct pipe_mpeg4_picture_desc *mpeg4;
60d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct pipe_vc1_picture_desc *vc1;
61d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct pipe_h264_picture_desc *h264;
62d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin};
63d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
64d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinstruct nouveau_vp3_decoder {
65f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian König   struct pipe_video_codec base;
66d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_client *client;
67d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_object *channel[3], *bsp, *vp, *ppp;
68d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_pushbuf *pushbuf[3];
69d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
70d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#if NOUVEAU_VP3_DEBUG_FENCE
71d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   /* dump fence and comm, as needed.. */
72d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   unsigned *fence_map;
73d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct comm *comm;
74d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
75d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_bo *fence_bo;
76d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin#endif
77d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
78d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_bo *fw_bo, *bitplane_bo;
79d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
80d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // array size max_references + 2, contains unpostprocessed images
81d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // added at the end of ref_bo is a tmp array
82d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // tmp is an array for h264, with each member being used for a ref frame or current
83d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // target.. size = (((mb(w)*((mb(h)+1)&~1))+3)>>2)<<8 * (max_references+1)
84d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // for other codecs, it simply seems that size = w*h is enough
85d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // unsure what it's supposed to contain..
86d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_bo *ref_bo;
87d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
88d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_bo *inter_bo[2];
89d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
90d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct nouveau_bo *bsp_bo[NOUVEAU_VP3_VIDEO_QDEPTH];
91d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
92d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // bo's used by each cycle:
93d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
94d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // bsp_bo: contains raw bitstream data and parameters for BSP and VP.
95d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // inter_bo: contains data shared between BSP and VP
96d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // ref_bo: reference image data, used by PPP and VP
97d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // bitplane_bo: contain bitplane data (similar to ref_bo), used by BSP only
98d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // fw_bo: used by VP only.
99d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
100d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // Needed amount of copies in optimal case:
101d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // 2 copies of inter_bo, VP would process the last inter_bo, while BSP is
102d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // writing out a new set.
103d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // NOUVEAU_VP3_VIDEO_QDEPTH copies of bsp_bo. We don't want to block the
104d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   // pipeline ever, and give shaders a chance to run as well.
105d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
106d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   struct {
107d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      struct nouveau_vp3_video_buffer *vidbuf;
108d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      unsigned last_used;
109d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      unsigned field_pic_flag : 1;
110d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      unsigned decoded_top : 1;
111d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      unsigned decoded_bottom : 1;
11249d26a277d8653f63b50f07371bf02b3453e8839Maarten Lankhorst      unsigned decoded_first : 1;
113d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   } refs[17];
114d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   unsigned fence_seq, fw_sizes, last_frame_num, tmp_stride, ref_stride;
115d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
116d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   unsigned bsp_idx, vp_idx, ppp_idx;
1177ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce
1187ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce   /* End of the bsp bo where new data should be appended between one begin/end
1197ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce    * frame.
1207ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce    */
1217ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce   char *bsp_ptr;
122d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin};
123d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
124d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinstruct comm {
12567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t bsp_cur_index; // 000
12667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t byte_ofs; // 004
12767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t status[0x10]; // 008
12867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pos[0x10]; // 048
12967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t pad[0x100 - 0x88]; // 0a0 bool comm_encrypted
13067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin
13167635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pvp_cur_index; // 100
13267635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t acked_byte_ofs; // 104
13367635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t status_vp[0x10]; // 108
13467635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t mb_y[0x10]; //148
13567635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t pvp_stage; // 168 0xeeXX
13667635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t parse_endpos_index; // 16c
13767635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint16_t irq_index; // 16e
13867635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint8_t  irq_470[0x10]; // 170
13967635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t irq_pos[0x10]; // 180
14067635a0a713e54939f1f72ba8db2b3099988a925Ilia Mirkin   uint32_t parse_endpos[0x10]; // 1c0
141d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin};
142d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
143a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t nouveau_vp3_video_align(uint32_t h)
144d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
145d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   return ((h+0x3f)&~0x3f);
146d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin};
147d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
148a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t mb(uint32_t coord)
149d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
150d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   return (coord + 0xf)>>4;
151d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin}
152d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
153a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t mb_half(uint32_t coord)
154d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
155d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   return (coord + 0x1f)>>5;
156d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin}
157d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
158a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint64_t
159d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinnouveau_vp3_video_addr(struct nouveau_vp3_decoder *dec, struct nouveau_vp3_video_buffer *target)
160d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
161d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   uint64_t ret;
162d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   if (target)
163d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      ret = dec->ref_stride * target->valid_ref;
164d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   else
165d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      ret = dec->ref_stride * (dec->base.max_references+1);
166d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   return dec->ref_bo->offset + ret;
167d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin}
168d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
169a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
170d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinnouveau_vp3_ycbcr_offsets(struct nouveau_vp3_decoder *dec, uint32_t *y2,
171d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin                          uint32_t *cbcr, uint32_t *cbcr2)
172d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
173d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   uint32_t w = mb(dec->base.width), size;
174d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   *y2 = mb_half(dec->base.height)*w;
175d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   *cbcr = *y2 * 2;
176d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   *cbcr2 = *cbcr + w * (nouveau_vp3_video_align(dec->base.height)>>6);
177d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
178d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   /* The check here should never fail because it means a bug
179d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin    * in the code rather than a bug in hardware..
180d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin    */
181d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   size = (2 * (*cbcr2 - *cbcr) + *cbcr) << 8;
182d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   if (size > dec->ref_stride) {
183d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      debug_printf("Overshot ref_stride (%u) with size %u and ofs (%u,%u,%u)\n",
184d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin                   dec->ref_stride, size, *y2<<8, *cbcr<<8, *cbcr2<<8);
185d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      *y2 = *cbcr = *cbcr2 = 0;
186d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      assert(size <= dec->ref_stride);
187d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   }
188d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin}
189d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
190a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void
191d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkinnouveau_vp3_inter_sizes(struct nouveau_vp3_decoder *dec, uint32_t slice_count,
192d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin                        uint32_t *slice_size, uint32_t *bucket_size,
193d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin                        uint32_t *ring_size)
194d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin{
195d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   *slice_size = (SLICE_SIZE * slice_count)>>8;
1968e423ab98403135140a093be3c66c88b9a36ad5cChristian König   if (u_reduce_video_profile(dec->base.profile) == PIPE_VIDEO_FORMAT_MPEG12)
197d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      *bucket_size = 0;
198d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   else
199d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin      *bucket_size = mb(dec->base.width) * 3;
200d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin   *ring_size = (dec->inter_bo[0]->size >> 8) - *bucket_size - *slice_size;
201d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin}
202d6a82a7747a983cc1bd617e9a6e34fc422d1ec10Ilia Mirkin
203b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkinstruct pipe_video_buffer *
204b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkinnouveau_vp3_video_buffer_create(struct pipe_context *pipe,
205b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin                                const struct pipe_video_buffer *templat,
206b57875bbb3c677eee8930b41b03fbd2544278a6bIlia Mirkin                                int flags);
207e1cd987bb641eef88a9b856aaccff8bb526f6311Ilia Mirkin
2089d8c0768036da31f378a4012f4bd76c06ec6bee6Ilia Mirkinvoid
209f2f7064e560a83fc78d0e5b1d3a7d4aaac119a49Christian Könignouveau_vp3_decoder_init_common(struct pipe_video_codec *decoder);
2109d8c0768036da31f378a4012f4bd76c06ec6bee6Ilia Mirkin
2119255019a53506737210a25995f525986bec7b836Ilia Mirkinint
2129255019a53506737210a25995f525986bec7b836Ilia Mirkinnouveau_vp3_load_firmware(struct nouveau_vp3_decoder *dec,
2139255019a53506737210a25995f525986bec7b836Ilia Mirkin                          enum pipe_video_profile profile,
2149255019a53506737210a25995f525986bec7b836Ilia Mirkin                          unsigned chipset);
2159255019a53506737210a25995f525986bec7b836Ilia Mirkin
2167ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorcevoid
2177ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorcenouveau_vp3_bsp_begin(struct nouveau_vp3_decoder *dec);
2187ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce
2197ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorcevoid
2207ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorcenouveau_vp3_bsp_next(struct nouveau_vp3_decoder *dec, unsigned num_buffers,
2217ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce                     const void *const *data, const unsigned *num_bytes);
2227ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorce
223e1cd987bb641eef88a9b856aaccff8bb526f6311Ilia Mirkinuint32_t
2247ba27f60f71accaf59f267ff20580444e912ab2bJulien Isorcenouveau_vp3_bsp_end(struct nouveau_vp3_decoder *dec, union pipe_desc desc);
22573f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin
22673f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinvoid
22773f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkinnouveau_vp3_vp_caps(struct nouveau_vp3_decoder *dec, union pipe_desc desc,
22873f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                    struct nouveau_vp3_video_buffer *target, unsigned comm_seq,
22973f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                    unsigned *caps, unsigned *is_ref,
23073f4499a02db0cdad31f7881d718daadd712c40fIlia Mirkin                    struct nouveau_vp3_video_buffer *refs[16]);
2314ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkin
2324ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkinint
2334ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkinnouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen,
2344ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkin                                   enum pipe_video_profile profile,
235a15cbabb8b546fa063cfb6f528dd67ee0037079bChristian König                                   enum pipe_video_entrypoint entrypoint,
2364ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkin                                   enum pipe_video_cap param);
2374ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkin
2384ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkinboolean
2394ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkinnouveau_vp3_screen_video_supported(struct pipe_screen *screen,
2404ea191fb2dcd5f1825c3433cf02f14da870b4cb5Ilia Mirkin                                   enum pipe_format format,
2415ddd840f5aacb7cc6e62b712aa737c683bd91f55Christian König                                   enum pipe_video_profile profile,
2425ddd840f5aacb7cc6e62b712aa737c683bd91f55Christian König                                   enum pipe_video_entrypoint entrypoint);
243