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