1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2017 Advanced Micro Devices, Inc.
3*61046927SAndroid Build Coastguard Worker * Copyright 2021 Red Hat Inc.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
7*61046927SAndroid Build Coastguard Worker */
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #ifndef _WIN32
10*61046927SAndroid Build Coastguard Worker #include "drm-uapi/amdgpu_drm.h"
11*61046927SAndroid Build Coastguard Worker #endif
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "util/vl_zscan_data.h"
14*61046927SAndroid Build Coastguard Worker #include "vk_video/vulkan_video_codecs_common.h"
15*61046927SAndroid Build Coastguard Worker #include "ac_uvd_dec.h"
16*61046927SAndroid Build Coastguard Worker #include "ac_vcn_av1_default.h"
17*61046927SAndroid Build Coastguard Worker #include "ac_vcn_dec.h"
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker #include "radv_buffer.h"
20*61046927SAndroid Build Coastguard Worker #include "radv_cs.h"
21*61046927SAndroid Build Coastguard Worker #include "radv_debug.h"
22*61046927SAndroid Build Coastguard Worker #include "radv_device_memory.h"
23*61046927SAndroid Build Coastguard Worker #include "radv_entrypoints.h"
24*61046927SAndroid Build Coastguard Worker #include "radv_image.h"
25*61046927SAndroid Build Coastguard Worker #include "radv_image_view.h"
26*61046927SAndroid Build Coastguard Worker #include "radv_video.h"
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #define NUM_H2645_REFS 16
29*61046927SAndroid Build Coastguard Worker #define FB_BUFFER_OFFSET 0x1000
30*61046927SAndroid Build Coastguard Worker #define FB_BUFFER_SIZE 2048
31*61046927SAndroid Build Coastguard Worker #define FB_BUFFER_SIZE_TONGA (2048 * 64)
32*61046927SAndroid Build Coastguard Worker #define IT_SCALING_TABLE_SIZE 992
33*61046927SAndroid Build Coastguard Worker #define RDECODE_SESSION_CONTEXT_SIZE (128 * 1024)
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker /* Not 100% sure this isn't too much but works */
36*61046927SAndroid Build Coastguard Worker #define VID_DEFAULT_ALIGNMENT 256
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker static bool
radv_enable_tier2(struct radv_physical_device * pdev)39*61046927SAndroid Build Coastguard Worker radv_enable_tier2(struct radv_physical_device *pdev)
40*61046927SAndroid Build Coastguard Worker {
41*61046927SAndroid Build Coastguard Worker const struct radv_instance *instance = radv_physical_device_instance(pdev);
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_ip_version >= VCN_3_0_0 && !(instance->debug_flags & RADV_DEBUG_VIDEO_ARRAY_PATH))
44*61046927SAndroid Build Coastguard Worker return true;
45*61046927SAndroid Build Coastguard Worker return false;
46*61046927SAndroid Build Coastguard Worker }
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker static uint32_t
radv_video_get_db_alignment(struct radv_physical_device * pdev,int width,bool is_h265_main_10_or_av1)49*61046927SAndroid Build Coastguard Worker radv_video_get_db_alignment(struct radv_physical_device *pdev, int width, bool is_h265_main_10_or_av1)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_ip_version >= VCN_2_0_0 && width > 32 && is_h265_main_10_or_av1)
52*61046927SAndroid Build Coastguard Worker return 64;
53*61046927SAndroid Build Coastguard Worker return 32;
54*61046927SAndroid Build Coastguard Worker }
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker static bool
radv_vid_buffer_upload_alloc(struct radv_cmd_buffer * cmd_buffer,unsigned size,unsigned * out_offset,void ** ptr)57*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(struct radv_cmd_buffer *cmd_buffer, unsigned size, unsigned *out_offset, void **ptr)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker return radv_cmd_buffer_upload_alloc_aligned(cmd_buffer, size, VID_DEFAULT_ALIGNMENT, out_offset, ptr);
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker /* vcn unified queue (sq) ib header */
63*61046927SAndroid Build Coastguard Worker void
radv_vcn_sq_header(struct radeon_cmdbuf * cs,struct rvcn_sq_var * sq,unsigned type)64*61046927SAndroid Build Coastguard Worker radv_vcn_sq_header(struct radeon_cmdbuf *cs, struct rvcn_sq_var *sq, unsigned type)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker /* vcn ib signature */
67*61046927SAndroid Build Coastguard Worker radeon_emit(cs, RADEON_VCN_SIGNATURE_SIZE);
68*61046927SAndroid Build Coastguard Worker radeon_emit(cs, RADEON_VCN_SIGNATURE);
69*61046927SAndroid Build Coastguard Worker sq->ib_checksum = &cs->buf[cs->cdw];
70*61046927SAndroid Build Coastguard Worker radeon_emit(cs, 0);
71*61046927SAndroid Build Coastguard Worker sq->ib_total_size_in_dw = &cs->buf[cs->cdw];
72*61046927SAndroid Build Coastguard Worker radeon_emit(cs, 0);
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker /* vcn ib engine info */
75*61046927SAndroid Build Coastguard Worker radeon_emit(cs, RADEON_VCN_ENGINE_INFO_SIZE);
76*61046927SAndroid Build Coastguard Worker radeon_emit(cs, RADEON_VCN_ENGINE_INFO);
77*61046927SAndroid Build Coastguard Worker radeon_emit(cs, type);
78*61046927SAndroid Build Coastguard Worker radeon_emit(cs, 0);
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker void
radv_vcn_sq_tail(struct radeon_cmdbuf * cs,struct rvcn_sq_var * sq)82*61046927SAndroid Build Coastguard Worker radv_vcn_sq_tail(struct radeon_cmdbuf *cs, struct rvcn_sq_var *sq)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker uint32_t *end;
85*61046927SAndroid Build Coastguard Worker uint32_t size_in_dw;
86*61046927SAndroid Build Coastguard Worker uint32_t checksum = 0;
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker if (sq->ib_checksum == NULL || sq->ib_total_size_in_dw == NULL)
89*61046927SAndroid Build Coastguard Worker return;
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker end = &cs->buf[cs->cdw];
92*61046927SAndroid Build Coastguard Worker size_in_dw = end - sq->ib_total_size_in_dw - 1;
93*61046927SAndroid Build Coastguard Worker *sq->ib_total_size_in_dw = size_in_dw;
94*61046927SAndroid Build Coastguard Worker *(sq->ib_total_size_in_dw + 4) = size_in_dw * sizeof(uint32_t);
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker for (int i = 0; i < size_in_dw; i++)
97*61046927SAndroid Build Coastguard Worker checksum += *(sq->ib_checksum + 2 + i);
98*61046927SAndroid Build Coastguard Worker
99*61046927SAndroid Build Coastguard Worker *sq->ib_checksum = checksum;
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker void
radv_vcn_write_event(struct radv_cmd_buffer * cmd_buffer,struct radv_event * event,unsigned value)103*61046927SAndroid Build Coastguard Worker radv_vcn_write_event(struct radv_cmd_buffer *cmd_buffer, struct radv_event *event, unsigned value)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
106*61046927SAndroid Build Coastguard Worker struct radv_physical_device *pdev = radv_device_physical(device);
107*61046927SAndroid Build Coastguard Worker struct rvcn_sq_var sq;
108*61046927SAndroid Build Coastguard Worker struct radeon_cmdbuf *cs = cmd_buffer->cs;
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip != AMD_IP_VCN_UNIFIED)
111*61046927SAndroid Build Coastguard Worker return;
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker radv_cs_add_buffer(device->ws, cs, event->bo);
114*61046927SAndroid Build Coastguard Worker uint64_t va = radv_buffer_get_va(event->bo);
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cs, 256);
117*61046927SAndroid Build Coastguard Worker radv_vcn_sq_header(cs, &sq, RADEON_VCN_ENGINE_TYPE_COMMON);
118*61046927SAndroid Build Coastguard Worker struct rvcn_cmn_engine_ib_package *ib_header = (struct rvcn_cmn_engine_ib_package *)&(cs->buf[cs->cdw]);
119*61046927SAndroid Build Coastguard Worker ib_header->package_size = sizeof(struct rvcn_cmn_engine_ib_package) + sizeof(struct rvcn_cmn_engine_op_writememory);
120*61046927SAndroid Build Coastguard Worker cs->cdw++;
121*61046927SAndroid Build Coastguard Worker ib_header->package_type = RADEON_VCN_IB_COMMON_OP_WRITEMEMORY;
122*61046927SAndroid Build Coastguard Worker cs->cdw++;
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker struct rvcn_cmn_engine_op_writememory *write_memory = (struct rvcn_cmn_engine_op_writememory *)&(cs->buf[cs->cdw]);
125*61046927SAndroid Build Coastguard Worker write_memory->dest_addr_lo = va & 0xffffffff;
126*61046927SAndroid Build Coastguard Worker write_memory->dest_addr_hi = va >> 32;
127*61046927SAndroid Build Coastguard Worker write_memory->data = value;
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker cs->cdw += sizeof(*write_memory) / 4;
130*61046927SAndroid Build Coastguard Worker radv_vcn_sq_tail(cs, &sq);
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker static void
radv_vcn_sq_start(struct radv_cmd_buffer * cmd_buffer)134*61046927SAndroid Build Coastguard Worker radv_vcn_sq_start(struct radv_cmd_buffer *cmd_buffer)
135*61046927SAndroid Build Coastguard Worker {
136*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, 256);
139*61046927SAndroid Build Coastguard Worker radv_vcn_sq_header(cmd_buffer->cs, &cmd_buffer->video.sq, RADEON_VCN_ENGINE_TYPE_DECODE);
140*61046927SAndroid Build Coastguard Worker rvcn_decode_ib_package_t *ib_header = (rvcn_decode_ib_package_t *)&(cmd_buffer->cs->buf[cmd_buffer->cs->cdw]);
141*61046927SAndroid Build Coastguard Worker ib_header->package_size = sizeof(struct rvcn_decode_buffer_s) + sizeof(struct rvcn_decode_ib_package_s);
142*61046927SAndroid Build Coastguard Worker cmd_buffer->cs->cdw++;
143*61046927SAndroid Build Coastguard Worker ib_header->package_type = (RDECODE_IB_PARAM_DECODE_BUFFER);
144*61046927SAndroid Build Coastguard Worker cmd_buffer->cs->cdw++;
145*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer = (rvcn_decode_buffer_t *)&(cmd_buffer->cs->buf[cmd_buffer->cs->cdw]);
146*61046927SAndroid Build Coastguard Worker cmd_buffer->cs->cdw += sizeof(struct rvcn_decode_buffer_s) / 4;
147*61046927SAndroid Build Coastguard Worker memset(cmd_buffer->video.decode_buffer, 0, sizeof(struct rvcn_decode_buffer_s));
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker /* generate an stream handle */
151*61046927SAndroid Build Coastguard Worker static unsigned
radv_vid_alloc_stream_handle(struct radv_physical_device * pdev)152*61046927SAndroid Build Coastguard Worker radv_vid_alloc_stream_handle(struct radv_physical_device *pdev)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker unsigned stream_handle = pdev->stream_handle_base;
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker stream_handle ^= ++pdev->stream_handle_counter;
157*61046927SAndroid Build Coastguard Worker return stream_handle;
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker static void
init_uvd_decoder(struct radv_physical_device * pdev)161*61046927SAndroid Build Coastguard Worker init_uvd_decoder(struct radv_physical_device *pdev)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker if (pdev->info.family >= CHIP_VEGA10) {
164*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data0 = RUVD_GPCOM_VCPU_DATA0_SOC15;
165*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data1 = RUVD_GPCOM_VCPU_DATA1_SOC15;
166*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cmd = RUVD_GPCOM_VCPU_CMD_SOC15;
167*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cntl = RUVD_ENGINE_CNTL_SOC15;
168*61046927SAndroid Build Coastguard Worker } else {
169*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data0 = RUVD_GPCOM_VCPU_DATA0;
170*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data1 = RUVD_GPCOM_VCPU_DATA1;
171*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cmd = RUVD_GPCOM_VCPU_CMD;
172*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cntl = RUVD_ENGINE_CNTL;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker static void
init_vcn_decoder(struct radv_physical_device * pdev)177*61046927SAndroid Build Coastguard Worker init_vcn_decoder(struct radv_physical_device *pdev)
178*61046927SAndroid Build Coastguard Worker {
179*61046927SAndroid Build Coastguard Worker switch (pdev->info.vcn_ip_version) {
180*61046927SAndroid Build Coastguard Worker case VCN_1_0_0:
181*61046927SAndroid Build Coastguard Worker case VCN_1_0_1:
182*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data0 = RDECODE_VCN1_GPCOM_VCPU_DATA0;
183*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data1 = RDECODE_VCN1_GPCOM_VCPU_DATA1;
184*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cmd = RDECODE_VCN1_GPCOM_VCPU_CMD;
185*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cntl = RDECODE_VCN1_ENGINE_CNTL;
186*61046927SAndroid Build Coastguard Worker break;
187*61046927SAndroid Build Coastguard Worker case VCN_2_0_0:
188*61046927SAndroid Build Coastguard Worker case VCN_2_0_2:
189*61046927SAndroid Build Coastguard Worker case VCN_2_0_3:
190*61046927SAndroid Build Coastguard Worker case VCN_2_2_0:
191*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data0 = RDECODE_VCN2_GPCOM_VCPU_DATA0;
192*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data1 = RDECODE_VCN2_GPCOM_VCPU_DATA1;
193*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cmd = RDECODE_VCN2_GPCOM_VCPU_CMD;
194*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cntl = RDECODE_VCN2_ENGINE_CNTL;
195*61046927SAndroid Build Coastguard Worker break;
196*61046927SAndroid Build Coastguard Worker case VCN_2_5_0:
197*61046927SAndroid Build Coastguard Worker case VCN_2_6_0:
198*61046927SAndroid Build Coastguard Worker case VCN_3_0_0:
199*61046927SAndroid Build Coastguard Worker case VCN_3_0_2:
200*61046927SAndroid Build Coastguard Worker case VCN_3_0_16:
201*61046927SAndroid Build Coastguard Worker case VCN_3_0_33:
202*61046927SAndroid Build Coastguard Worker case VCN_3_1_1:
203*61046927SAndroid Build Coastguard Worker case VCN_3_1_2:
204*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data0 = RDECODE_VCN2_5_GPCOM_VCPU_DATA0;
205*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.data1 = RDECODE_VCN2_5_GPCOM_VCPU_DATA1;
206*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cmd = RDECODE_VCN2_5_GPCOM_VCPU_CMD;
207*61046927SAndroid Build Coastguard Worker pdev->vid_dec_reg.cntl = RDECODE_VCN2_5_ENGINE_CNTL;
208*61046927SAndroid Build Coastguard Worker break;
209*61046927SAndroid Build Coastguard Worker case VCN_4_0_3:
210*61046927SAndroid Build Coastguard Worker pdev->vid_addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX9;
211*61046927SAndroid Build Coastguard Worker pdev->av1_version = RDECODE_AV1_VER_1;
212*61046927SAndroid Build Coastguard Worker break;
213*61046927SAndroid Build Coastguard Worker case VCN_4_0_0:
214*61046927SAndroid Build Coastguard Worker case VCN_4_0_2:
215*61046927SAndroid Build Coastguard Worker case VCN_4_0_4:
216*61046927SAndroid Build Coastguard Worker case VCN_4_0_5:
217*61046927SAndroid Build Coastguard Worker case VCN_4_0_6:
218*61046927SAndroid Build Coastguard Worker pdev->vid_addr_gfx_mode = RDECODE_ARRAY_MODE_ADDRLIB_SEL_GFX11;
219*61046927SAndroid Build Coastguard Worker pdev->av1_version = RDECODE_AV1_VER_1;
220*61046927SAndroid Build Coastguard Worker break;
221*61046927SAndroid Build Coastguard Worker default:
222*61046927SAndroid Build Coastguard Worker break;
223*61046927SAndroid Build Coastguard Worker }
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker void
radv_init_physical_device_decoder(struct radv_physical_device * pdev)227*61046927SAndroid Build Coastguard Worker radv_init_physical_device_decoder(struct radv_physical_device *pdev)
228*61046927SAndroid Build Coastguard Worker {
229*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_ip_version >= VCN_4_0_0)
230*61046927SAndroid Build Coastguard Worker pdev->vid_decode_ip = AMD_IP_VCN_UNIFIED;
231*61046927SAndroid Build Coastguard Worker else if (radv_has_uvd(pdev))
232*61046927SAndroid Build Coastguard Worker pdev->vid_decode_ip = AMD_IP_UVD;
233*61046927SAndroid Build Coastguard Worker else
234*61046927SAndroid Build Coastguard Worker pdev->vid_decode_ip = AMD_IP_VCN_DEC;
235*61046927SAndroid Build Coastguard Worker pdev->av1_version = RDECODE_AV1_VER_0;
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker pdev->stream_handle_counter = 0;
238*61046927SAndroid Build Coastguard Worker pdev->stream_handle_base = 0;
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker pdev->stream_handle_base = util_bitreverse(getpid());
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker pdev->vid_addr_gfx_mode = RDECODE_ARRAY_MODE_LINEAR;
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker if (radv_has_uvd(pdev))
245*61046927SAndroid Build Coastguard Worker init_uvd_decoder(pdev);
246*61046927SAndroid Build Coastguard Worker else
247*61046927SAndroid Build Coastguard Worker init_vcn_decoder(pdev);
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker void
radv_probe_video_decode(struct radv_physical_device * pdev)251*61046927SAndroid Build Coastguard Worker radv_probe_video_decode(struct radv_physical_device *pdev)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker const struct radv_instance *instance = radv_physical_device_instance(pdev);
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker pdev->video_decode_enabled = false;
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_ip_version >= VCN_4_0_0) {
258*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_enc_major_version > 1)
259*61046927SAndroid Build Coastguard Worker pdev->video_decode_enabled = true;
260*61046927SAndroid Build Coastguard Worker /* VCN 4 FW 1.22 has all the necessary pieces to pass CTS */
261*61046927SAndroid Build Coastguard Worker /* VCN 4 has unified fw so use the enc versions */
262*61046927SAndroid Build Coastguard Worker if (pdev->info.vcn_enc_major_version == 1 && pdev->info.vcn_enc_minor_version >= 22)
263*61046927SAndroid Build Coastguard Worker pdev->video_decode_enabled = true;
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker if (instance->perftest_flags & RADV_PERFTEST_VIDEO_DECODE) {
266*61046927SAndroid Build Coastguard Worker pdev->video_decode_enabled = true;
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker static bool
have_it(struct radv_video_session * vid)271*61046927SAndroid Build Coastguard Worker have_it(struct radv_video_session *vid)
272*61046927SAndroid Build Coastguard Worker {
273*61046927SAndroid Build Coastguard Worker return vid->stream_type == RDECODE_CODEC_H264_PERF || vid->stream_type == RDECODE_CODEC_H265;
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker static bool
have_probs(struct radv_video_session * vid)277*61046927SAndroid Build Coastguard Worker have_probs(struct radv_video_session *vid)
278*61046927SAndroid Build Coastguard Worker {
279*61046927SAndroid Build Coastguard Worker return vid->stream_type == RDECODE_CODEC_AV1;
280*61046927SAndroid Build Coastguard Worker }
281*61046927SAndroid Build Coastguard Worker
282*61046927SAndroid Build Coastguard Worker static unsigned
calc_ctx_size_h264_perf(struct radv_video_session * vid)283*61046927SAndroid Build Coastguard Worker calc_ctx_size_h264_perf(struct radv_video_session *vid)
284*61046927SAndroid Build Coastguard Worker {
285*61046927SAndroid Build Coastguard Worker unsigned width_in_mb, height_in_mb, ctx_size;
286*61046927SAndroid Build Coastguard Worker unsigned width = align(vid->vk.max_coded.width, VL_MACROBLOCK_WIDTH);
287*61046927SAndroid Build Coastguard Worker unsigned height = align(vid->vk.max_coded.height, VL_MACROBLOCK_HEIGHT);
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker unsigned max_references = vid->vk.max_dpb_slots + 1;
290*61046927SAndroid Build Coastguard Worker
291*61046927SAndroid Build Coastguard Worker /* picture width & height in 16 pixel units */
292*61046927SAndroid Build Coastguard Worker width_in_mb = width / VL_MACROBLOCK_WIDTH;
293*61046927SAndroid Build Coastguard Worker height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker return ctx_size;
298*61046927SAndroid Build Coastguard Worker }
299*61046927SAndroid Build Coastguard Worker
300*61046927SAndroid Build Coastguard Worker static unsigned
calc_ctx_size_h265_main(struct radv_video_session * vid)301*61046927SAndroid Build Coastguard Worker calc_ctx_size_h265_main(struct radv_video_session *vid)
302*61046927SAndroid Build Coastguard Worker {
303*61046927SAndroid Build Coastguard Worker unsigned width = align(vid->vk.max_coded.width, VL_MACROBLOCK_WIDTH);
304*61046927SAndroid Build Coastguard Worker unsigned height = align(vid->vk.max_coded.height, VL_MACROBLOCK_HEIGHT);
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker unsigned max_references = vid->vk.max_dpb_slots + 1;
307*61046927SAndroid Build Coastguard Worker
308*61046927SAndroid Build Coastguard Worker if (vid->vk.max_coded.width * vid->vk.max_coded.height >= 4096 * 2000)
309*61046927SAndroid Build Coastguard Worker max_references = MAX2(max_references, 8);
310*61046927SAndroid Build Coastguard Worker else
311*61046927SAndroid Build Coastguard Worker max_references = MAX2(max_references, 17);
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker width = align(width, 16);
314*61046927SAndroid Build Coastguard Worker height = align(height, 16);
315*61046927SAndroid Build Coastguard Worker return ((width + 255) / 16) * ((height + 255) / 16) * 16 * max_references + 52 * 1024;
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker static unsigned
calc_ctx_size_h265_main10(struct radv_video_session * vid)319*61046927SAndroid Build Coastguard Worker calc_ctx_size_h265_main10(struct radv_video_session *vid)
320*61046927SAndroid Build Coastguard Worker {
321*61046927SAndroid Build Coastguard Worker unsigned log2_ctb_size, width_in_ctb, height_in_ctb, num_16x16_block_per_ctb;
322*61046927SAndroid Build Coastguard Worker unsigned context_buffer_size_per_ctb_row, cm_buffer_size, max_mb_address, db_left_tile_pxl_size;
323*61046927SAndroid Build Coastguard Worker unsigned db_left_tile_ctx_size = 4096 / 16 * (32 + 16 * 4);
324*61046927SAndroid Build Coastguard Worker
325*61046927SAndroid Build Coastguard Worker unsigned width = align(vid->vk.max_coded.width, VL_MACROBLOCK_WIDTH);
326*61046927SAndroid Build Coastguard Worker unsigned height = align(vid->vk.max_coded.height, VL_MACROBLOCK_HEIGHT);
327*61046927SAndroid Build Coastguard Worker unsigned coeff_10bit = 2;
328*61046927SAndroid Build Coastguard Worker
329*61046927SAndroid Build Coastguard Worker unsigned max_references = vid->vk.max_dpb_slots + 1;
330*61046927SAndroid Build Coastguard Worker
331*61046927SAndroid Build Coastguard Worker if (vid->vk.max_coded.width * vid->vk.max_coded.height >= 4096 * 2000)
332*61046927SAndroid Build Coastguard Worker max_references = MAX2(max_references, 8);
333*61046927SAndroid Build Coastguard Worker else
334*61046927SAndroid Build Coastguard Worker max_references = MAX2(max_references, 17);
335*61046927SAndroid Build Coastguard Worker
336*61046927SAndroid Build Coastguard Worker /* 64x64 is the maximum ctb size. */
337*61046927SAndroid Build Coastguard Worker log2_ctb_size = 6;
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker width_in_ctb = (width + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;
340*61046927SAndroid Build Coastguard Worker height_in_ctb = (height + ((1 << log2_ctb_size) - 1)) >> log2_ctb_size;
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker num_16x16_block_per_ctb = ((1 << log2_ctb_size) >> 4) * ((1 << log2_ctb_size) >> 4);
343*61046927SAndroid Build Coastguard Worker context_buffer_size_per_ctb_row = align(width_in_ctb * num_16x16_block_per_ctb * 16, 256);
344*61046927SAndroid Build Coastguard Worker max_mb_address = (unsigned)ceil(height * 8 / 2048.0);
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker cm_buffer_size = max_references * context_buffer_size_per_ctb_row * height_in_ctb;
347*61046927SAndroid Build Coastguard Worker db_left_tile_pxl_size = coeff_10bit * (max_mb_address * 2 * 2048 + 1024);
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker return cm_buffer_size + db_left_tile_ctx_size + db_left_tile_pxl_size;
350*61046927SAndroid Build Coastguard Worker }
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker static unsigned
calc_ctx_size_av1(struct radv_device * device,struct radv_video_session * vid)353*61046927SAndroid Build Coastguard Worker calc_ctx_size_av1(struct radv_device *device, struct radv_video_session *vid)
354*61046927SAndroid Build Coastguard Worker {
355*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
356*61046927SAndroid Build Coastguard Worker return ac_vcn_dec_calc_ctx_size_av1(pdev->av1_version);
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker static void
radv_video_patch_session_parameters(struct vk_video_session_parameters * params)360*61046927SAndroid Build Coastguard Worker radv_video_patch_session_parameters(struct vk_video_session_parameters *params)
361*61046927SAndroid Build Coastguard Worker {
362*61046927SAndroid Build Coastguard Worker switch (params->op) {
363*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
364*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
365*61046927SAndroid Build Coastguard Worker default:
366*61046927SAndroid Build Coastguard Worker return;
367*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
368*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
369*61046927SAndroid Build Coastguard Worker radv_video_patch_encode_session_parameters(params);
370*61046927SAndroid Build Coastguard Worker break;
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker }
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_CreateVideoSessionKHR(VkDevice _device,const VkVideoSessionCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkVideoSessionKHR * pVideoSession)375*61046927SAndroid Build Coastguard Worker radv_CreateVideoSessionKHR(VkDevice _device, const VkVideoSessionCreateInfoKHR *pCreateInfo,
376*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator, VkVideoSessionKHR *pVideoSession)
377*61046927SAndroid Build Coastguard Worker {
378*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_device, device, _device);
379*61046927SAndroid Build Coastguard Worker struct radv_physical_device *pdev = radv_device_physical(device);
380*61046927SAndroid Build Coastguard Worker const struct radv_instance *instance = radv_physical_device_instance(pdev);
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker struct radv_video_session *vid =
383*61046927SAndroid Build Coastguard Worker vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*vid), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
384*61046927SAndroid Build Coastguard Worker if (!vid)
385*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
386*61046927SAndroid Build Coastguard Worker
387*61046927SAndroid Build Coastguard Worker memset(vid, 0, sizeof(struct radv_video_session));
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker VkResult result = vk_video_session_init(&device->vk, &vid->vk, pCreateInfo);
390*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
391*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, vid);
392*61046927SAndroid Build Coastguard Worker return result;
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker vid->interlaced = false;
396*61046927SAndroid Build Coastguard Worker vid->dpb_type = DPB_MAX_RES;
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker switch (vid->vk.op) {
399*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
400*61046927SAndroid Build Coastguard Worker vid->stream_type = RDECODE_CODEC_H264_PERF;
401*61046927SAndroid Build Coastguard Worker if (radv_enable_tier2(pdev))
402*61046927SAndroid Build Coastguard Worker vid->dpb_type = DPB_DYNAMIC_TIER_2;
403*61046927SAndroid Build Coastguard Worker break;
404*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
405*61046927SAndroid Build Coastguard Worker vid->stream_type = RDECODE_CODEC_H265;
406*61046927SAndroid Build Coastguard Worker if (radv_enable_tier2(pdev))
407*61046927SAndroid Build Coastguard Worker vid->dpb_type = DPB_DYNAMIC_TIER_2;
408*61046927SAndroid Build Coastguard Worker break;
409*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
410*61046927SAndroid Build Coastguard Worker vid->stream_type = RDECODE_CODEC_AV1;
411*61046927SAndroid Build Coastguard Worker vid->dpb_type = DPB_DYNAMIC_TIER_2;
412*61046927SAndroid Build Coastguard Worker break;
413*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
414*61046927SAndroid Build Coastguard Worker vid->encode = true;
415*61046927SAndroid Build Coastguard Worker vid->enc_session.encode_standard = RENCODE_ENCODE_STANDARD_H264;
416*61046927SAndroid Build Coastguard Worker vid->enc_session.aligned_picture_width = align(vid->vk.max_coded.width, 16);
417*61046927SAndroid Build Coastguard Worker vid->enc_session.aligned_picture_height = align(vid->vk.max_coded.height, 16);
418*61046927SAndroid Build Coastguard Worker vid->enc_session.padding_width = vid->enc_session.aligned_picture_width - vid->vk.max_coded.width;
419*61046927SAndroid Build Coastguard Worker vid->enc_session.padding_height = vid->enc_session.aligned_picture_height - vid->vk.max_coded.height;
420*61046927SAndroid Build Coastguard Worker vid->enc_session.display_remote = 0;
421*61046927SAndroid Build Coastguard Worker vid->enc_session.pre_encode_mode = 0;
422*61046927SAndroid Build Coastguard Worker vid->enc_session.pre_encode_chroma_enabled = 0;
423*61046927SAndroid Build Coastguard Worker switch (vid->vk.enc_usage.tuning_mode) {
424*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR:
425*61046927SAndroid Build Coastguard Worker default:
426*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_BALANCE;
427*61046927SAndroid Build Coastguard Worker break;
428*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR:
429*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR:
430*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_SPEED;
431*61046927SAndroid Build Coastguard Worker break;
432*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR:
433*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR:
434*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_QUALITY;
435*61046927SAndroid Build Coastguard Worker break;
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker break;
438*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
439*61046927SAndroid Build Coastguard Worker vid->encode = true;
440*61046927SAndroid Build Coastguard Worker vid->enc_session.encode_standard = RENCODE_ENCODE_STANDARD_HEVC;
441*61046927SAndroid Build Coastguard Worker vid->enc_session.aligned_picture_width = align(vid->vk.max_coded.width, 64);
442*61046927SAndroid Build Coastguard Worker vid->enc_session.aligned_picture_height = align(vid->vk.max_coded.height, 64);
443*61046927SAndroid Build Coastguard Worker vid->enc_session.padding_width = vid->enc_session.aligned_picture_width - vid->vk.max_coded.width;
444*61046927SAndroid Build Coastguard Worker vid->enc_session.padding_height = vid->enc_session.aligned_picture_height - vid->vk.max_coded.height;
445*61046927SAndroid Build Coastguard Worker vid->enc_session.display_remote = 0;
446*61046927SAndroid Build Coastguard Worker vid->enc_session.pre_encode_mode = 0;
447*61046927SAndroid Build Coastguard Worker vid->enc_session.pre_encode_chroma_enabled = 0;
448*61046927SAndroid Build Coastguard Worker switch (vid->vk.enc_usage.tuning_mode) {
449*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_DEFAULT_KHR:
450*61046927SAndroid Build Coastguard Worker default:
451*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_BALANCE;
452*61046927SAndroid Build Coastguard Worker break;
453*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_LOW_LATENCY_KHR:
454*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_ULTRA_LOW_LATENCY_KHR:
455*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_SPEED;
456*61046927SAndroid Build Coastguard Worker break;
457*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_HIGH_QUALITY_KHR:
458*61046927SAndroid Build Coastguard Worker case VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR:
459*61046927SAndroid Build Coastguard Worker vid->enc_preset_mode = RENCODE_PRESET_MODE_QUALITY;
460*61046927SAndroid Build Coastguard Worker break;
461*61046927SAndroid Build Coastguard Worker }
462*61046927SAndroid Build Coastguard Worker break;
463*61046927SAndroid Build Coastguard Worker default:
464*61046927SAndroid Build Coastguard Worker return VK_ERROR_FEATURE_NOT_PRESENT;
465*61046927SAndroid Build Coastguard Worker }
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker vid->stream_handle = radv_vid_alloc_stream_handle(pdev);
468*61046927SAndroid Build Coastguard Worker vid->dbg_frame_cnt = 0;
469*61046927SAndroid Build Coastguard Worker vid->db_alignment = radv_video_get_db_alignment(
470*61046927SAndroid Build Coastguard Worker pdev, vid->vk.max_coded.width,
471*61046927SAndroid Build Coastguard Worker (vid->stream_type == RDECODE_CODEC_AV1 ||
472*61046927SAndroid Build Coastguard Worker (vid->stream_type == RDECODE_CODEC_H265 && vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10)));
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker *pVideoSession = radv_video_session_to_handle(vid);
475*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
476*61046927SAndroid Build Coastguard Worker }
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_DestroyVideoSessionKHR(VkDevice _device,VkVideoSessionKHR _session,const VkAllocationCallbacks * pAllocator)479*61046927SAndroid Build Coastguard Worker radv_DestroyVideoSessionKHR(VkDevice _device, VkVideoSessionKHR _session, const VkAllocationCallbacks *pAllocator)
480*61046927SAndroid Build Coastguard Worker {
481*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_device, device, _device);
482*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session, vid, _session);
483*61046927SAndroid Build Coastguard Worker if (!_session)
484*61046927SAndroid Build Coastguard Worker return;
485*61046927SAndroid Build Coastguard Worker
486*61046927SAndroid Build Coastguard Worker vk_object_base_finish(&vid->vk.base);
487*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, vid);
488*61046927SAndroid Build Coastguard Worker }
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_CreateVideoSessionParametersKHR(VkDevice _device,const VkVideoSessionParametersCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkVideoSessionParametersKHR * pVideoSessionParameters)491*61046927SAndroid Build Coastguard Worker radv_CreateVideoSessionParametersKHR(VkDevice _device, const VkVideoSessionParametersCreateInfoKHR *pCreateInfo,
492*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
493*61046927SAndroid Build Coastguard Worker VkVideoSessionParametersKHR *pVideoSessionParameters)
494*61046927SAndroid Build Coastguard Worker {
495*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_device, device, _device);
496*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session, vid, pCreateInfo->videoSession);
497*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session_params, templ, pCreateInfo->videoSessionParametersTemplate);
498*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
499*61046927SAndroid Build Coastguard Worker const struct radv_instance *instance = radv_physical_device_instance(pdev);
500*61046927SAndroid Build Coastguard Worker struct radv_video_session_params *params =
501*61046927SAndroid Build Coastguard Worker vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*params), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
502*61046927SAndroid Build Coastguard Worker if (!params)
503*61046927SAndroid Build Coastguard Worker return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
504*61046927SAndroid Build Coastguard Worker
505*61046927SAndroid Build Coastguard Worker VkResult result =
506*61046927SAndroid Build Coastguard Worker vk_video_session_parameters_init(&device->vk, ¶ms->vk, &vid->vk, templ ? &templ->vk : NULL, pCreateInfo);
507*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
508*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, params);
509*61046927SAndroid Build Coastguard Worker return result;
510*61046927SAndroid Build Coastguard Worker }
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker radv_video_patch_session_parameters(¶ms->vk);
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker *pVideoSessionParameters = radv_video_session_params_to_handle(params);
515*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
516*61046927SAndroid Build Coastguard Worker }
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_DestroyVideoSessionParametersKHR(VkDevice _device,VkVideoSessionParametersKHR _params,const VkAllocationCallbacks * pAllocator)519*61046927SAndroid Build Coastguard Worker radv_DestroyVideoSessionParametersKHR(VkDevice _device, VkVideoSessionParametersKHR _params,
520*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator)
521*61046927SAndroid Build Coastguard Worker {
522*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_device, device, _device);
523*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session_params, params, _params);
524*61046927SAndroid Build Coastguard Worker
525*61046927SAndroid Build Coastguard Worker vk_video_session_parameters_finish(&device->vk, ¶ms->vk);
526*61046927SAndroid Build Coastguard Worker vk_free2(&device->vk.alloc, pAllocator, params);
527*61046927SAndroid Build Coastguard Worker }
528*61046927SAndroid Build Coastguard Worker
529*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice,const VkVideoProfileInfoKHR * pVideoProfile,VkVideoCapabilitiesKHR * pCapabilities)530*61046927SAndroid Build Coastguard Worker radv_GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR *pVideoProfile,
531*61046927SAndroid Build Coastguard Worker VkVideoCapabilitiesKHR *pCapabilities)
532*61046927SAndroid Build Coastguard Worker {
533*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_physical_device, pdev, physicalDevice);
534*61046927SAndroid Build Coastguard Worker const struct video_codec_cap *cap = NULL;
535*61046927SAndroid Build Coastguard Worker bool is_encode = false;
536*61046927SAndroid Build Coastguard Worker
537*61046927SAndroid Build Coastguard Worker switch (pVideoProfile->videoCodecOperation) {
538*61046927SAndroid Build Coastguard Worker #ifndef _WIN32
539*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
540*61046927SAndroid Build Coastguard Worker cap = &pdev->info.dec_caps.codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC];
541*61046927SAndroid Build Coastguard Worker break;
542*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
543*61046927SAndroid Build Coastguard Worker cap = &pdev->info.dec_caps.codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC];
544*61046927SAndroid Build Coastguard Worker break;
545*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
546*61046927SAndroid Build Coastguard Worker cap = &pdev->info.dec_caps.codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1];
547*61046927SAndroid Build Coastguard Worker break;
548*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
549*61046927SAndroid Build Coastguard Worker cap = &pdev->info.enc_caps.codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC];
550*61046927SAndroid Build Coastguard Worker is_encode = true;
551*61046927SAndroid Build Coastguard Worker break;
552*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
553*61046927SAndroid Build Coastguard Worker cap = &pdev->info.enc_caps.codec_info[AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC];
554*61046927SAndroid Build Coastguard Worker is_encode = true;
555*61046927SAndroid Build Coastguard Worker break;
556*61046927SAndroid Build Coastguard Worker #endif
557*61046927SAndroid Build Coastguard Worker default:
558*61046927SAndroid Build Coastguard Worker unreachable("unsupported operation");
559*61046927SAndroid Build Coastguard Worker }
560*61046927SAndroid Build Coastguard Worker
561*61046927SAndroid Build Coastguard Worker if (cap && !cap->valid)
562*61046927SAndroid Build Coastguard Worker cap = NULL;
563*61046927SAndroid Build Coastguard Worker
564*61046927SAndroid Build Coastguard Worker pCapabilities->flags = 0;
565*61046927SAndroid Build Coastguard Worker pCapabilities->pictureAccessGranularity.width = VL_MACROBLOCK_WIDTH;
566*61046927SAndroid Build Coastguard Worker pCapabilities->pictureAccessGranularity.height = VL_MACROBLOCK_HEIGHT;
567*61046927SAndroid Build Coastguard Worker pCapabilities->minCodedExtent.width = VL_MACROBLOCK_WIDTH;
568*61046927SAndroid Build Coastguard Worker pCapabilities->minCodedExtent.height = VL_MACROBLOCK_HEIGHT;
569*61046927SAndroid Build Coastguard Worker
570*61046927SAndroid Build Coastguard Worker struct VkVideoDecodeCapabilitiesKHR *dec_caps = NULL;
571*61046927SAndroid Build Coastguard Worker struct VkVideoEncodeCapabilitiesKHR *enc_caps = NULL;
572*61046927SAndroid Build Coastguard Worker if (!is_encode) {
573*61046927SAndroid Build Coastguard Worker dec_caps =
574*61046927SAndroid Build Coastguard Worker (struct VkVideoDecodeCapabilitiesKHR *)vk_find_struct(pCapabilities->pNext, VIDEO_DECODE_CAPABILITIES_KHR);
575*61046927SAndroid Build Coastguard Worker if (dec_caps)
576*61046927SAndroid Build Coastguard Worker dec_caps->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
577*61046927SAndroid Build Coastguard Worker pCapabilities->minBitstreamBufferOffsetAlignment = 128;
578*61046927SAndroid Build Coastguard Worker pCapabilities->minBitstreamBufferSizeAlignment = 128;
579*61046927SAndroid Build Coastguard Worker } else {
580*61046927SAndroid Build Coastguard Worker enc_caps =
581*61046927SAndroid Build Coastguard Worker (struct VkVideoEncodeCapabilitiesKHR *)vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_CAPABILITIES_KHR);
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Worker if (enc_caps) {
584*61046927SAndroid Build Coastguard Worker enc_caps->flags = 0;
585*61046927SAndroid Build Coastguard Worker enc_caps->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR |
586*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR |
587*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
588*61046927SAndroid Build Coastguard Worker enc_caps->maxRateControlLayers = RADV_ENC_MAX_RATE_LAYER;
589*61046927SAndroid Build Coastguard Worker enc_caps->maxBitrate = 1000000000;
590*61046927SAndroid Build Coastguard Worker enc_caps->maxQualityLevels = 2;
591*61046927SAndroid Build Coastguard Worker enc_caps->encodeInputPictureGranularity.width = 1;
592*61046927SAndroid Build Coastguard Worker enc_caps->encodeInputPictureGranularity.height = 1;
593*61046927SAndroid Build Coastguard Worker enc_caps->supportedEncodeFeedbackFlags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR |
594*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
595*61046927SAndroid Build Coastguard Worker }
596*61046927SAndroid Build Coastguard Worker pCapabilities->minBitstreamBufferOffsetAlignment = 16;
597*61046927SAndroid Build Coastguard Worker pCapabilities->minBitstreamBufferSizeAlignment = 16;
598*61046927SAndroid Build Coastguard Worker }
599*61046927SAndroid Build Coastguard Worker
600*61046927SAndroid Build Coastguard Worker switch (pVideoProfile->videoCodecOperation) {
601*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
602*61046927SAndroid Build Coastguard Worker /* H264 allows different luma and chroma bit depths */
603*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != pVideoProfile->chromaBitDepth)
604*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker struct VkVideoDecodeH264CapabilitiesKHR *ext = (struct VkVideoDecodeH264CapabilitiesKHR *)vk_find_struct(
607*61046927SAndroid Build Coastguard Worker pCapabilities->pNext, VIDEO_DECODE_H264_CAPABILITIES_KHR);
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264ProfileInfoKHR *h264_profile =
610*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pVideoProfile->pNext, VIDEO_DECODE_H264_PROFILE_INFO_KHR);
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker if (h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_BASELINE &&
613*61046927SAndroid Build Coastguard Worker h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_MAIN &&
614*61046927SAndroid Build Coastguard Worker h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_HIGH)
615*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR)
618*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
619*61046927SAndroid Build Coastguard Worker
620*61046927SAndroid Build Coastguard Worker pCapabilities->maxDpbSlots = NUM_H2645_REFS + 1;
621*61046927SAndroid Build Coastguard Worker pCapabilities->maxActiveReferencePictures = NUM_H2645_REFS;
622*61046927SAndroid Build Coastguard Worker
623*61046927SAndroid Build Coastguard Worker /* for h264 on navi21+ separate dpb images should work */
624*61046927SAndroid Build Coastguard Worker if (radv_enable_tier2(pdev))
625*61046927SAndroid Build Coastguard Worker pCapabilities->flags |= VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
626*61046927SAndroid Build Coastguard Worker ext->fieldOffsetGranularity.x = 0;
627*61046927SAndroid Build Coastguard Worker ext->fieldOffsetGranularity.y = 0;
628*61046927SAndroid Build Coastguard Worker ext->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_1;
629*61046927SAndroid Build Coastguard Worker strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME);
630*61046927SAndroid Build Coastguard Worker pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION;
631*61046927SAndroid Build Coastguard Worker break;
632*61046927SAndroid Build Coastguard Worker }
633*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
634*61046927SAndroid Build Coastguard Worker /* H265 allows different luma and chroma bit depths */
635*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != pVideoProfile->chromaBitDepth)
636*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker struct VkVideoDecodeH265CapabilitiesKHR *ext = (struct VkVideoDecodeH265CapabilitiesKHR *)vk_find_struct(
639*61046927SAndroid Build Coastguard Worker pCapabilities->pNext, VIDEO_DECODE_H265_CAPABILITIES_KHR);
640*61046927SAndroid Build Coastguard Worker
641*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265ProfileInfoKHR *h265_profile =
642*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pVideoProfile->pNext, VIDEO_DECODE_H265_PROFILE_INFO_KHR);
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker if (h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN &&
645*61046927SAndroid Build Coastguard Worker h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_10 &&
646*61046927SAndroid Build Coastguard Worker h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE)
647*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR &&
650*61046927SAndroid Build Coastguard Worker pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR)
651*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker pCapabilities->maxDpbSlots = NUM_H2645_REFS + 1;
654*61046927SAndroid Build Coastguard Worker pCapabilities->maxActiveReferencePictures = NUM_H2645_REFS;
655*61046927SAndroid Build Coastguard Worker /* for h265 on navi21+ separate dpb images should work */
656*61046927SAndroid Build Coastguard Worker if (radv_enable_tier2(pdev))
657*61046927SAndroid Build Coastguard Worker pCapabilities->flags |= VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
658*61046927SAndroid Build Coastguard Worker ext->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_5_1;
659*61046927SAndroid Build Coastguard Worker strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME);
660*61046927SAndroid Build Coastguard Worker pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION;
661*61046927SAndroid Build Coastguard Worker break;
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR: {
664*61046927SAndroid Build Coastguard Worker const bool have_12bit = pdev->info.vcn_ip_version >= VCN_5_0_0 ||
665*61046927SAndroid Build Coastguard Worker pdev->info.vcn_ip_version == VCN_4_0_0;
666*61046927SAndroid Build Coastguard Worker /* Monochrome sampling implies an undefined chroma bit depth, and is supported in profile MAIN for AV1. */
667*61046927SAndroid Build Coastguard Worker if (pVideoProfile->chromaSubsampling != VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR &&
668*61046927SAndroid Build Coastguard Worker pVideoProfile->lumaBitDepth != pVideoProfile->chromaBitDepth)
669*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
670*61046927SAndroid Build Coastguard Worker struct VkVideoDecodeAV1CapabilitiesKHR *ext =
671*61046927SAndroid Build Coastguard Worker vk_find_struct(pCapabilities->pNext, VIDEO_DECODE_AV1_CAPABILITIES_KHR);
672*61046927SAndroid Build Coastguard Worker
673*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1ProfileInfoKHR *av1_profile =
674*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pVideoProfile->pNext, VIDEO_DECODE_AV1_PROFILE_INFO_KHR);
675*61046927SAndroid Build Coastguard Worker
676*61046927SAndroid Build Coastguard Worker if (av1_profile->stdProfile != STD_VIDEO_AV1_PROFILE_MAIN &&
677*61046927SAndroid Build Coastguard Worker (!have_12bit || av1_profile->stdProfile != STD_VIDEO_AV1_PROFILE_PROFESSIONAL))
678*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR &&
681*61046927SAndroid Build Coastguard Worker pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR &&
682*61046927SAndroid Build Coastguard Worker (!have_12bit || pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR))
683*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
684*61046927SAndroid Build Coastguard Worker
685*61046927SAndroid Build Coastguard Worker pCapabilities->maxDpbSlots = 9;
686*61046927SAndroid Build Coastguard Worker pCapabilities->maxActiveReferencePictures = STD_VIDEO_AV1_NUM_REF_FRAMES;
687*61046927SAndroid Build Coastguard Worker pCapabilities->flags |= VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
688*61046927SAndroid Build Coastguard Worker ext->maxLevel = STD_VIDEO_AV1_LEVEL_6_1; /* For VCN3/4, the only h/w currently with AV1 decode support */
689*61046927SAndroid Build Coastguard Worker strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME);
690*61046927SAndroid Build Coastguard Worker pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION;
691*61046927SAndroid Build Coastguard Worker break;
692*61046927SAndroid Build Coastguard Worker }
693*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
694*61046927SAndroid Build Coastguard Worker struct VkVideoEncodeH264CapabilitiesKHR *ext = (struct VkVideoEncodeH264CapabilitiesKHR *)vk_find_struct(
695*61046927SAndroid Build Coastguard Worker pCapabilities->pNext, VIDEO_ENCODE_H264_CAPABILITIES_KHR);
696*61046927SAndroid Build Coastguard Worker
697*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH264ProfileInfoKHR *h264_profile =
698*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pVideoProfile->pNext, VIDEO_ENCODE_H264_PROFILE_INFO_KHR);
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker if (h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_BASELINE &&
701*61046927SAndroid Build Coastguard Worker h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_MAIN &&
702*61046927SAndroid Build Coastguard Worker h264_profile->stdProfileIdc != STD_VIDEO_H264_PROFILE_IDC_HIGH)
703*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR)
706*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
707*61046927SAndroid Build Coastguard Worker
708*61046927SAndroid Build Coastguard Worker pCapabilities->maxDpbSlots = NUM_H2645_REFS;
709*61046927SAndroid Build Coastguard Worker pCapabilities->maxActiveReferencePictures = NUM_H2645_REFS;
710*61046927SAndroid Build Coastguard Worker ext->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR |
711*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR;
712*61046927SAndroid Build Coastguard Worker ext->maxLevelIdc = cap ? cap->max_level : 0;
713*61046927SAndroid Build Coastguard Worker ext->maxSliceCount = 128;
714*61046927SAndroid Build Coastguard Worker ext->maxPPictureL0ReferenceCount = 1;
715*61046927SAndroid Build Coastguard Worker ext->maxBPictureL0ReferenceCount = 0;
716*61046927SAndroid Build Coastguard Worker ext->maxL1ReferenceCount = 0;
717*61046927SAndroid Build Coastguard Worker ext->maxTemporalLayerCount = 4;
718*61046927SAndroid Build Coastguard Worker ext->expectDyadicTemporalLayerPattern = false;
719*61046927SAndroid Build Coastguard Worker ext->minQp = 0;
720*61046927SAndroid Build Coastguard Worker ext->maxQp = 51;
721*61046927SAndroid Build Coastguard Worker ext->prefersGopRemainingFrames = false;
722*61046927SAndroid Build Coastguard Worker ext->requiresGopRemainingFrames = false;
723*61046927SAndroid Build Coastguard Worker ext->stdSyntaxFlags = VK_VIDEO_ENCODE_H264_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR |
724*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_UNSET_BIT_KHR |
725*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H264_STD_ENTROPY_CODING_MODE_FLAG_SET_BIT_KHR;
726*61046927SAndroid Build Coastguard Worker if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3)
727*61046927SAndroid Build Coastguard Worker ext->stdSyntaxFlags |= VK_VIDEO_ENCODE_H264_STD_WEIGHTED_BIPRED_IDC_EXPLICIT_BIT_KHR;
728*61046927SAndroid Build Coastguard Worker
729*61046927SAndroid Build Coastguard Worker strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME);
730*61046927SAndroid Build Coastguard Worker pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION;
731*61046927SAndroid Build Coastguard Worker break;
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
734*61046927SAndroid Build Coastguard Worker struct VkVideoEncodeH265CapabilitiesKHR *ext = (struct VkVideoEncodeH265CapabilitiesKHR *)vk_find_struct(
735*61046927SAndroid Build Coastguard Worker pCapabilities->pNext, VIDEO_ENCODE_H265_CAPABILITIES_KHR);
736*61046927SAndroid Build Coastguard Worker
737*61046927SAndroid Build Coastguard Worker const struct VkVideoEncodeH265ProfileInfoKHR *h265_profile =
738*61046927SAndroid Build Coastguard Worker vk_find_struct_const(pVideoProfile->pNext, VIDEO_ENCODE_H265_PROFILE_INFO_KHR);
739*61046927SAndroid Build Coastguard Worker
740*61046927SAndroid Build Coastguard Worker if (h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN &&
741*61046927SAndroid Build Coastguard Worker (pdev->enc_hw_ver < RADV_VIDEO_ENC_HW_2 ||
742*61046927SAndroid Build Coastguard Worker h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_10))
743*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
744*61046927SAndroid Build Coastguard Worker
745*61046927SAndroid Build Coastguard Worker if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR &&
746*61046927SAndroid Build Coastguard Worker (pdev->enc_hw_ver < RADV_VIDEO_ENC_HW_2 ||
747*61046927SAndroid Build Coastguard Worker pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR))
748*61046927SAndroid Build Coastguard Worker return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
749*61046927SAndroid Build Coastguard Worker
750*61046927SAndroid Build Coastguard Worker pCapabilities->maxDpbSlots = NUM_H2645_REFS;
751*61046927SAndroid Build Coastguard Worker pCapabilities->maxActiveReferencePictures = NUM_H2645_REFS;
752*61046927SAndroid Build Coastguard Worker ext->flags = VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR;
753*61046927SAndroid Build Coastguard Worker ext->maxLevelIdc = cap ? cap->max_level : 0;
754*61046927SAndroid Build Coastguard Worker ext->maxSliceSegmentCount = 128;
755*61046927SAndroid Build Coastguard Worker ext->maxTiles.width = 1;
756*61046927SAndroid Build Coastguard Worker ext->maxTiles.height = 1;
757*61046927SAndroid Build Coastguard Worker ext->ctbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
758*61046927SAndroid Build Coastguard Worker ext->transformBlockSizes =
759*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR |
760*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR | VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR;
761*61046927SAndroid Build Coastguard Worker ext->maxPPictureL0ReferenceCount = 1;
762*61046927SAndroid Build Coastguard Worker ext->maxBPictureL0ReferenceCount = 0;
763*61046927SAndroid Build Coastguard Worker ext->maxL1ReferenceCount = 0;
764*61046927SAndroid Build Coastguard Worker ext->maxSubLayerCount = 4;
765*61046927SAndroid Build Coastguard Worker ext->expectDyadicTemporalSubLayerPattern = false;
766*61046927SAndroid Build Coastguard Worker ext->minQp = 0;
767*61046927SAndroid Build Coastguard Worker ext->maxQp = 51;
768*61046927SAndroid Build Coastguard Worker ext->prefersGopRemainingFrames = false;
769*61046927SAndroid Build Coastguard Worker ext->requiresGopRemainingFrames = false;
770*61046927SAndroid Build Coastguard Worker ext->stdSyntaxFlags = VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR |
771*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H265_STD_DEBLOCKING_FILTER_OVERRIDE_ENABLED_FLAG_SET_BIT_KHR |
772*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR |
773*61046927SAndroid Build Coastguard Worker VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR;
774*61046927SAndroid Build Coastguard Worker
775*61046927SAndroid Build Coastguard Worker if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_2)
776*61046927SAndroid Build Coastguard Worker ext->stdSyntaxFlags |= VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR;
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker if (pdev->enc_hw_ver >= RADV_VIDEO_ENC_HW_3)
779*61046927SAndroid Build Coastguard Worker ext->stdSyntaxFlags |= VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR;
780*61046927SAndroid Build Coastguard Worker strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME);
781*61046927SAndroid Build Coastguard Worker pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION;
782*61046927SAndroid Build Coastguard Worker break;
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker default:
785*61046927SAndroid Build Coastguard Worker break;
786*61046927SAndroid Build Coastguard Worker }
787*61046927SAndroid Build Coastguard Worker
788*61046927SAndroid Build Coastguard Worker if (cap) {
789*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.width = cap->max_width;
790*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.height = cap->max_height;
791*61046927SAndroid Build Coastguard Worker } else {
792*61046927SAndroid Build Coastguard Worker switch (pVideoProfile->videoCodecOperation) {
793*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
794*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.width = (pdev->info.family < CHIP_TONGA) ? 2048 : 4096;
795*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.height = (pdev->info.family < CHIP_TONGA) ? 1152 : 4096;
796*61046927SAndroid Build Coastguard Worker break;
797*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
798*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.width =
799*61046927SAndroid Build Coastguard Worker (pdev->info.family < CHIP_RENOIR) ? ((pdev->info.family < CHIP_TONGA) ? 2048 : 4096) : 8192;
800*61046927SAndroid Build Coastguard Worker pCapabilities->maxCodedExtent.height =
801*61046927SAndroid Build Coastguard Worker (pdev->info.family < CHIP_RENOIR) ? ((pdev->info.family < CHIP_TONGA) ? 1152 : 4096) : 4352;
802*61046927SAndroid Build Coastguard Worker break;
803*61046927SAndroid Build Coastguard Worker default:
804*61046927SAndroid Build Coastguard Worker break;
805*61046927SAndroid Build Coastguard Worker }
806*61046927SAndroid Build Coastguard Worker }
807*61046927SAndroid Build Coastguard Worker
808*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
809*61046927SAndroid Build Coastguard Worker }
810*61046927SAndroid Build Coastguard Worker
811*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceVideoFormatInfoKHR * pVideoFormatInfo,uint32_t * pVideoFormatPropertyCount,VkVideoFormatPropertiesKHR * pVideoFormatProperties)812*61046927SAndroid Build Coastguard Worker radv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice,
813*61046927SAndroid Build Coastguard Worker const VkPhysicalDeviceVideoFormatInfoKHR *pVideoFormatInfo,
814*61046927SAndroid Build Coastguard Worker uint32_t *pVideoFormatPropertyCount,
815*61046927SAndroid Build Coastguard Worker VkVideoFormatPropertiesKHR *pVideoFormatProperties)
816*61046927SAndroid Build Coastguard Worker {
817*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_physical_device, pdev, physicalDevice);
818*61046927SAndroid Build Coastguard Worker
819*61046927SAndroid Build Coastguard Worker if ((pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
820*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)) &&
821*61046927SAndroid Build Coastguard Worker !pdev->video_encode_enabled)
822*61046927SAndroid Build Coastguard Worker return VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR;
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker /* radv requires separate allocates for DPB and decode video. */
825*61046927SAndroid Build Coastguard Worker if ((pVideoFormatInfo->imageUsage &
826*61046927SAndroid Build Coastguard Worker (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)) ==
827*61046927SAndroid Build Coastguard Worker (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR | VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR))
828*61046927SAndroid Build Coastguard Worker return VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR;
829*61046927SAndroid Build Coastguard Worker
830*61046927SAndroid Build Coastguard Worker VK_OUTARRAY_MAKE_TYPED(VkVideoFormatPropertiesKHR, out, pVideoFormatProperties, pVideoFormatPropertyCount);
831*61046927SAndroid Build Coastguard Worker
832*61046927SAndroid Build Coastguard Worker bool need_8bit = true;
833*61046927SAndroid Build Coastguard Worker bool need_10bit = false;
834*61046927SAndroid Build Coastguard Worker bool need_12bit = false;
835*61046927SAndroid Build Coastguard Worker const struct VkVideoProfileListInfoKHR *prof_list =
836*61046927SAndroid Build Coastguard Worker (struct VkVideoProfileListInfoKHR *)vk_find_struct_const(pVideoFormatInfo->pNext, VIDEO_PROFILE_LIST_INFO_KHR);
837*61046927SAndroid Build Coastguard Worker if (prof_list) {
838*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < prof_list->profileCount; i++) {
839*61046927SAndroid Build Coastguard Worker const VkVideoProfileInfoKHR *profile = &prof_list->pProfiles[i];
840*61046927SAndroid Build Coastguard Worker if (profile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR)
841*61046927SAndroid Build Coastguard Worker need_10bit = true;
842*61046927SAndroid Build Coastguard Worker else if (profile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR)
843*61046927SAndroid Build Coastguard Worker need_12bit = true;
844*61046927SAndroid Build Coastguard Worker }
845*61046927SAndroid Build Coastguard Worker }
846*61046927SAndroid Build Coastguard Worker
847*61046927SAndroid Build Coastguard Worker if (need_12bit) {
848*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p)
849*61046927SAndroid Build Coastguard Worker {
850*61046927SAndroid Build Coastguard Worker p->format = VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16;
851*61046927SAndroid Build Coastguard Worker p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY;
852*61046927SAndroid Build Coastguard Worker p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY;
853*61046927SAndroid Build Coastguard Worker p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY;
854*61046927SAndroid Build Coastguard Worker p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY;
855*61046927SAndroid Build Coastguard Worker p->imageCreateFlags = 0;
856*61046927SAndroid Build Coastguard Worker if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR))
857*61046927SAndroid Build Coastguard Worker p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
858*61046927SAndroid Build Coastguard Worker p->imageType = VK_IMAGE_TYPE_2D;
859*61046927SAndroid Build Coastguard Worker p->imageTiling = VK_IMAGE_TILING_OPTIMAL;
860*61046927SAndroid Build Coastguard Worker p->imageUsageFlags = pVideoFormatInfo->imageUsage;
861*61046927SAndroid Build Coastguard Worker }
862*61046927SAndroid Build Coastguard Worker
863*61046927SAndroid Build Coastguard Worker if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR)) {
864*61046927SAndroid Build Coastguard Worker need_8bit = false;
865*61046927SAndroid Build Coastguard Worker need_10bit = false;
866*61046927SAndroid Build Coastguard Worker }
867*61046927SAndroid Build Coastguard Worker }
868*61046927SAndroid Build Coastguard Worker
869*61046927SAndroid Build Coastguard Worker if (need_10bit) {
870*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p)
871*61046927SAndroid Build Coastguard Worker {
872*61046927SAndroid Build Coastguard Worker p->format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16;
873*61046927SAndroid Build Coastguard Worker p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY;
874*61046927SAndroid Build Coastguard Worker p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY;
875*61046927SAndroid Build Coastguard Worker p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY;
876*61046927SAndroid Build Coastguard Worker p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY;
877*61046927SAndroid Build Coastguard Worker p->imageCreateFlags = 0;
878*61046927SAndroid Build Coastguard Worker if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR))
879*61046927SAndroid Build Coastguard Worker p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
880*61046927SAndroid Build Coastguard Worker p->imageType = VK_IMAGE_TYPE_2D;
881*61046927SAndroid Build Coastguard Worker p->imageTiling = VK_IMAGE_TILING_OPTIMAL;
882*61046927SAndroid Build Coastguard Worker p->imageUsageFlags = pVideoFormatInfo->imageUsage;
883*61046927SAndroid Build Coastguard Worker }
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR))
886*61046927SAndroid Build Coastguard Worker need_8bit = false;
887*61046927SAndroid Build Coastguard Worker }
888*61046927SAndroid Build Coastguard Worker
889*61046927SAndroid Build Coastguard Worker if (need_8bit) {
890*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p)
891*61046927SAndroid Build Coastguard Worker {
892*61046927SAndroid Build Coastguard Worker p->format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
893*61046927SAndroid Build Coastguard Worker p->componentMapping.r = VK_COMPONENT_SWIZZLE_IDENTITY;
894*61046927SAndroid Build Coastguard Worker p->componentMapping.g = VK_COMPONENT_SWIZZLE_IDENTITY;
895*61046927SAndroid Build Coastguard Worker p->componentMapping.b = VK_COMPONENT_SWIZZLE_IDENTITY;
896*61046927SAndroid Build Coastguard Worker p->componentMapping.a = VK_COMPONENT_SWIZZLE_IDENTITY;
897*61046927SAndroid Build Coastguard Worker p->imageCreateFlags = 0;
898*61046927SAndroid Build Coastguard Worker if (pVideoFormatInfo->imageUsage & (VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR))
899*61046927SAndroid Build Coastguard Worker p->imageCreateFlags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
900*61046927SAndroid Build Coastguard Worker p->imageType = VK_IMAGE_TYPE_2D;
901*61046927SAndroid Build Coastguard Worker p->imageTiling = VK_IMAGE_TILING_OPTIMAL;
902*61046927SAndroid Build Coastguard Worker p->imageUsageFlags = pVideoFormatInfo->imageUsage;
903*61046927SAndroid Build Coastguard Worker }
904*61046927SAndroid Build Coastguard Worker }
905*61046927SAndroid Build Coastguard Worker
906*61046927SAndroid Build Coastguard Worker return vk_outarray_status(&out);
907*61046927SAndroid Build Coastguard Worker }
908*61046927SAndroid Build Coastguard Worker
909*61046927SAndroid Build Coastguard Worker #define RADV_BIND_SESSION_CTX 0
910*61046927SAndroid Build Coastguard Worker #define RADV_BIND_DECODER_CTX 1
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_GetVideoSessionMemoryRequirementsKHR(VkDevice _device,VkVideoSessionKHR videoSession,uint32_t * pMemoryRequirementsCount,VkVideoSessionMemoryRequirementsKHR * pMemoryRequirements)913*61046927SAndroid Build Coastguard Worker radv_GetVideoSessionMemoryRequirementsKHR(VkDevice _device, VkVideoSessionKHR videoSession,
914*61046927SAndroid Build Coastguard Worker uint32_t *pMemoryRequirementsCount,
915*61046927SAndroid Build Coastguard Worker VkVideoSessionMemoryRequirementsKHR *pMemoryRequirements)
916*61046927SAndroid Build Coastguard Worker {
917*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_device, device, _device);
918*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session, vid, videoSession);
919*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
920*61046927SAndroid Build Coastguard Worker
921*61046927SAndroid Build Coastguard Worker uint32_t memory_type_bits = (1u << pdev->memory_properties.memoryTypeCount) - 1;
922*61046927SAndroid Build Coastguard Worker
923*61046927SAndroid Build Coastguard Worker if (vid->encode) {
924*61046927SAndroid Build Coastguard Worker return radv_video_get_encode_session_memory_requirements(device, vid, pMemoryRequirementsCount,
925*61046927SAndroid Build Coastguard Worker pMemoryRequirements);
926*61046927SAndroid Build Coastguard Worker }
927*61046927SAndroid Build Coastguard Worker VK_OUTARRAY_MAKE_TYPED(VkVideoSessionMemoryRequirementsKHR, out, pMemoryRequirements, pMemoryRequirementsCount);
928*61046927SAndroid Build Coastguard Worker /* 1 buffer for session context */
929*61046927SAndroid Build Coastguard Worker if (pdev->info.family >= CHIP_POLARIS10) {
930*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, m)
931*61046927SAndroid Build Coastguard Worker {
932*61046927SAndroid Build Coastguard Worker m->memoryBindIndex = RADV_BIND_SESSION_CTX;
933*61046927SAndroid Build Coastguard Worker m->memoryRequirements.size = RDECODE_SESSION_CONTEXT_SIZE;
934*61046927SAndroid Build Coastguard Worker m->memoryRequirements.alignment = 0;
935*61046927SAndroid Build Coastguard Worker m->memoryRequirements.memoryTypeBits = memory_type_bits;
936*61046927SAndroid Build Coastguard Worker }
937*61046927SAndroid Build Coastguard Worker }
938*61046927SAndroid Build Coastguard Worker
939*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RDECODE_CODEC_H264_PERF && pdev->info.family >= CHIP_POLARIS10) {
940*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, m)
941*61046927SAndroid Build Coastguard Worker {
942*61046927SAndroid Build Coastguard Worker m->memoryBindIndex = RADV_BIND_DECODER_CTX;
943*61046927SAndroid Build Coastguard Worker m->memoryRequirements.size = align(calc_ctx_size_h264_perf(vid), 4096);
944*61046927SAndroid Build Coastguard Worker m->memoryRequirements.alignment = 0;
945*61046927SAndroid Build Coastguard Worker m->memoryRequirements.memoryTypeBits = memory_type_bits;
946*61046927SAndroid Build Coastguard Worker }
947*61046927SAndroid Build Coastguard Worker }
948*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RDECODE_CODEC_H265) {
949*61046927SAndroid Build Coastguard Worker uint32_t ctx_size;
950*61046927SAndroid Build Coastguard Worker
951*61046927SAndroid Build Coastguard Worker if (vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10)
952*61046927SAndroid Build Coastguard Worker ctx_size = calc_ctx_size_h265_main10(vid);
953*61046927SAndroid Build Coastguard Worker else
954*61046927SAndroid Build Coastguard Worker ctx_size = calc_ctx_size_h265_main(vid);
955*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, m)
956*61046927SAndroid Build Coastguard Worker {
957*61046927SAndroid Build Coastguard Worker m->memoryBindIndex = RADV_BIND_DECODER_CTX;
958*61046927SAndroid Build Coastguard Worker m->memoryRequirements.size = align(ctx_size, 4096);
959*61046927SAndroid Build Coastguard Worker m->memoryRequirements.alignment = 0;
960*61046927SAndroid Build Coastguard Worker m->memoryRequirements.memoryTypeBits = memory_type_bits;
961*61046927SAndroid Build Coastguard Worker }
962*61046927SAndroid Build Coastguard Worker }
963*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RDECODE_CODEC_AV1) {
964*61046927SAndroid Build Coastguard Worker vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, m)
965*61046927SAndroid Build Coastguard Worker {
966*61046927SAndroid Build Coastguard Worker m->memoryBindIndex = RADV_BIND_DECODER_CTX;
967*61046927SAndroid Build Coastguard Worker m->memoryRequirements.size = align(calc_ctx_size_av1(device, vid), 4096);
968*61046927SAndroid Build Coastguard Worker m->memoryRequirements.alignment = 0;
969*61046927SAndroid Build Coastguard Worker m->memoryRequirements.memoryTypeBits = 0;
970*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < pdev->memory_properties.memoryTypeCount; i++)
971*61046927SAndroid Build Coastguard Worker if (pdev->memory_properties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
972*61046927SAndroid Build Coastguard Worker m->memoryRequirements.memoryTypeBits |= (1 << i);
973*61046927SAndroid Build Coastguard Worker }
974*61046927SAndroid Build Coastguard Worker }
975*61046927SAndroid Build Coastguard Worker return vk_outarray_status(&out);
976*61046927SAndroid Build Coastguard Worker }
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_UpdateVideoSessionParametersKHR(VkDevice _device,VkVideoSessionParametersKHR videoSessionParameters,const VkVideoSessionParametersUpdateInfoKHR * pUpdateInfo)979*61046927SAndroid Build Coastguard Worker radv_UpdateVideoSessionParametersKHR(VkDevice _device, VkVideoSessionParametersKHR videoSessionParameters,
980*61046927SAndroid Build Coastguard Worker const VkVideoSessionParametersUpdateInfoKHR *pUpdateInfo)
981*61046927SAndroid Build Coastguard Worker {
982*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session_params, params, videoSessionParameters);
983*61046927SAndroid Build Coastguard Worker
984*61046927SAndroid Build Coastguard Worker VkResult result = vk_video_session_parameters_update(¶ms->vk, pUpdateInfo);
985*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
986*61046927SAndroid Build Coastguard Worker return result;
987*61046927SAndroid Build Coastguard Worker radv_video_patch_session_parameters(¶ms->vk);
988*61046927SAndroid Build Coastguard Worker return result;
989*61046927SAndroid Build Coastguard Worker }
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker static void
copy_bind(struct radv_vid_mem * dst,const VkBindVideoSessionMemoryInfoKHR * src)992*61046927SAndroid Build Coastguard Worker copy_bind(struct radv_vid_mem *dst, const VkBindVideoSessionMemoryInfoKHR *src)
993*61046927SAndroid Build Coastguard Worker {
994*61046927SAndroid Build Coastguard Worker dst->mem = radv_device_memory_from_handle(src->memory);
995*61046927SAndroid Build Coastguard Worker dst->offset = src->memoryOffset;
996*61046927SAndroid Build Coastguard Worker dst->size = src->memorySize;
997*61046927SAndroid Build Coastguard Worker }
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
radv_BindVideoSessionMemoryKHR(VkDevice _device,VkVideoSessionKHR videoSession,uint32_t videoSessionBindMemoryCount,const VkBindVideoSessionMemoryInfoKHR * pBindSessionMemoryInfos)1000*61046927SAndroid Build Coastguard Worker radv_BindVideoSessionMemoryKHR(VkDevice _device, VkVideoSessionKHR videoSession, uint32_t videoSessionBindMemoryCount,
1001*61046927SAndroid Build Coastguard Worker const VkBindVideoSessionMemoryInfoKHR *pBindSessionMemoryInfos)
1002*61046927SAndroid Build Coastguard Worker {
1003*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session, vid, videoSession);
1004*61046927SAndroid Build Coastguard Worker
1005*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < videoSessionBindMemoryCount; i++) {
1006*61046927SAndroid Build Coastguard Worker switch (pBindSessionMemoryInfos[i].memoryBindIndex) {
1007*61046927SAndroid Build Coastguard Worker case RADV_BIND_SESSION_CTX:
1008*61046927SAndroid Build Coastguard Worker copy_bind(&vid->sessionctx, &pBindSessionMemoryInfos[i]);
1009*61046927SAndroid Build Coastguard Worker break;
1010*61046927SAndroid Build Coastguard Worker case RADV_BIND_DECODER_CTX:
1011*61046927SAndroid Build Coastguard Worker copy_bind(&vid->ctx, &pBindSessionMemoryInfos[i]);
1012*61046927SAndroid Build Coastguard Worker break;
1013*61046927SAndroid Build Coastguard Worker default:
1014*61046927SAndroid Build Coastguard Worker assert(0);
1015*61046927SAndroid Build Coastguard Worker break;
1016*61046927SAndroid Build Coastguard Worker }
1017*61046927SAndroid Build Coastguard Worker }
1018*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
1019*61046927SAndroid Build Coastguard Worker }
1020*61046927SAndroid Build Coastguard Worker
1021*61046927SAndroid Build Coastguard Worker /* add a new set register command to the IB */
1022*61046927SAndroid Build Coastguard Worker static void
set_reg(struct radv_cmd_buffer * cmd_buffer,unsigned reg,uint32_t val)1023*61046927SAndroid Build Coastguard Worker set_reg(struct radv_cmd_buffer *cmd_buffer, unsigned reg, uint32_t val)
1024*61046927SAndroid Build Coastguard Worker {
1025*61046927SAndroid Build Coastguard Worker struct radeon_cmdbuf *cs = cmd_buffer->cs;
1026*61046927SAndroid Build Coastguard Worker radeon_emit(cs, RDECODE_PKT0(reg >> 2, 0));
1027*61046927SAndroid Build Coastguard Worker radeon_emit(cs, val);
1028*61046927SAndroid Build Coastguard Worker }
1029*61046927SAndroid Build Coastguard Worker
1030*61046927SAndroid Build Coastguard Worker static void
send_cmd(struct radv_cmd_buffer * cmd_buffer,unsigned cmd,struct radeon_winsys_bo * bo,uint32_t offset)1031*61046927SAndroid Build Coastguard Worker send_cmd(struct radv_cmd_buffer *cmd_buffer, unsigned cmd, struct radeon_winsys_bo *bo, uint32_t offset)
1032*61046927SAndroid Build Coastguard Worker {
1033*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
1034*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
1035*61046927SAndroid Build Coastguard Worker uint64_t addr;
1036*61046927SAndroid Build Coastguard Worker
1037*61046927SAndroid Build Coastguard Worker radv_cs_add_buffer(device->ws, cmd_buffer->cs, bo);
1038*61046927SAndroid Build Coastguard Worker addr = radv_buffer_get_va(bo);
1039*61046927SAndroid Build Coastguard Worker addr += offset;
1040*61046927SAndroid Build Coastguard Worker
1041*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip != AMD_IP_VCN_UNIFIED) {
1042*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, 6);
1043*61046927SAndroid Build Coastguard Worker set_reg(cmd_buffer, pdev->vid_dec_reg.data0, addr);
1044*61046927SAndroid Build Coastguard Worker set_reg(cmd_buffer, pdev->vid_dec_reg.data1, addr >> 32);
1045*61046927SAndroid Build Coastguard Worker set_reg(cmd_buffer, pdev->vid_dec_reg.cmd, cmd << 1);
1046*61046927SAndroid Build Coastguard Worker return;
1047*61046927SAndroid Build Coastguard Worker }
1048*61046927SAndroid Build Coastguard Worker switch (cmd) {
1049*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_MSG_BUFFER:
1050*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= RDECODE_CMDBUF_FLAGS_MSG_BUFFER;
1051*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->msg_buffer_address_hi = (addr >> 32);
1052*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->msg_buffer_address_lo = (addr);
1053*61046927SAndroid Build Coastguard Worker break;
1054*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_DPB_BUFFER:
1055*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_DPB_BUFFER);
1056*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->dpb_buffer_address_hi = (addr >> 32);
1057*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->dpb_buffer_address_lo = (addr);
1058*61046927SAndroid Build Coastguard Worker break;
1059*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_DECODING_TARGET_BUFFER:
1060*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_DECODING_TARGET_BUFFER);
1061*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->target_buffer_address_hi = (addr >> 32);
1062*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->target_buffer_address_lo = (addr);
1063*61046927SAndroid Build Coastguard Worker break;
1064*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_FEEDBACK_BUFFER:
1065*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_FEEDBACK_BUFFER);
1066*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->feedback_buffer_address_hi = (addr >> 32);
1067*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->feedback_buffer_address_lo = (addr);
1068*61046927SAndroid Build Coastguard Worker break;
1069*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_PROB_TBL_BUFFER:
1070*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_PROB_TBL_BUFFER);
1071*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->prob_tbl_buffer_address_hi = (addr >> 32);
1072*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->prob_tbl_buffer_address_lo = (addr);
1073*61046927SAndroid Build Coastguard Worker break;
1074*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_SESSION_CONTEXT_BUFFER:
1075*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_SESSION_CONTEXT_BUFFER);
1076*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->session_contex_buffer_address_hi = (addr >> 32);
1077*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->session_contex_buffer_address_lo = (addr);
1078*61046927SAndroid Build Coastguard Worker break;
1079*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_BITSTREAM_BUFFER:
1080*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_BITSTREAM_BUFFER);
1081*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->bitstream_buffer_address_hi = (addr >> 32);
1082*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->bitstream_buffer_address_lo = (addr);
1083*61046927SAndroid Build Coastguard Worker break;
1084*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_IT_SCALING_TABLE_BUFFER:
1085*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_IT_SCALING_BUFFER);
1086*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->it_sclr_table_buffer_address_hi = (addr >> 32);
1087*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->it_sclr_table_buffer_address_lo = (addr);
1088*61046927SAndroid Build Coastguard Worker break;
1089*61046927SAndroid Build Coastguard Worker case RDECODE_CMD_CONTEXT_BUFFER:
1090*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->valid_buf_flag |= (RDECODE_CMDBUF_FLAGS_CONTEXT_BUFFER);
1091*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->context_buffer_address_hi = (addr >> 32);
1092*61046927SAndroid Build Coastguard Worker cmd_buffer->video.decode_buffer->context_buffer_address_lo = (addr);
1093*61046927SAndroid Build Coastguard Worker break;
1094*61046927SAndroid Build Coastguard Worker default:
1095*61046927SAndroid Build Coastguard Worker assert(0);
1096*61046927SAndroid Build Coastguard Worker }
1097*61046927SAndroid Build Coastguard Worker }
1098*61046927SAndroid Build Coastguard Worker
1099*61046927SAndroid Build Coastguard Worker static void
rvcn_dec_message_create(struct radv_video_session * vid,void * ptr,uint32_t size)1100*61046927SAndroid Build Coastguard Worker rvcn_dec_message_create(struct radv_video_session *vid, void *ptr, uint32_t size)
1101*61046927SAndroid Build Coastguard Worker {
1102*61046927SAndroid Build Coastguard Worker rvcn_dec_message_header_t *header = ptr;
1103*61046927SAndroid Build Coastguard Worker rvcn_dec_message_create_t *create = (void *)((char *)ptr + sizeof(rvcn_dec_message_header_t));
1104*61046927SAndroid Build Coastguard Worker
1105*61046927SAndroid Build Coastguard Worker memset(ptr, 0, size);
1106*61046927SAndroid Build Coastguard Worker header->header_size = sizeof(rvcn_dec_message_header_t);
1107*61046927SAndroid Build Coastguard Worker header->total_size = size;
1108*61046927SAndroid Build Coastguard Worker header->num_buffers = 1;
1109*61046927SAndroid Build Coastguard Worker header->msg_type = RDECODE_MSG_CREATE;
1110*61046927SAndroid Build Coastguard Worker header->stream_handle = vid->stream_handle;
1111*61046927SAndroid Build Coastguard Worker header->status_report_feedback_number = 0;
1112*61046927SAndroid Build Coastguard Worker
1113*61046927SAndroid Build Coastguard Worker header->index[0].message_id = RDECODE_MESSAGE_CREATE;
1114*61046927SAndroid Build Coastguard Worker header->index[0].offset = sizeof(rvcn_dec_message_header_t);
1115*61046927SAndroid Build Coastguard Worker header->index[0].size = sizeof(rvcn_dec_message_create_t);
1116*61046927SAndroid Build Coastguard Worker header->index[0].filled = 0;
1117*61046927SAndroid Build Coastguard Worker
1118*61046927SAndroid Build Coastguard Worker create->stream_type = vid->stream_type;
1119*61046927SAndroid Build Coastguard Worker create->session_flags = 0;
1120*61046927SAndroid Build Coastguard Worker create->width_in_samples = vid->vk.max_coded.width;
1121*61046927SAndroid Build Coastguard Worker create->height_in_samples = vid->vk.max_coded.height;
1122*61046927SAndroid Build Coastguard Worker }
1123*61046927SAndroid Build Coastguard Worker
1124*61046927SAndroid Build Coastguard Worker static void
rvcn_dec_message_feedback(void * ptr)1125*61046927SAndroid Build Coastguard Worker rvcn_dec_message_feedback(void *ptr)
1126*61046927SAndroid Build Coastguard Worker {
1127*61046927SAndroid Build Coastguard Worker rvcn_dec_feedback_header_t *header = (void *)ptr;
1128*61046927SAndroid Build Coastguard Worker
1129*61046927SAndroid Build Coastguard Worker header->header_size = sizeof(rvcn_dec_feedback_header_t);
1130*61046927SAndroid Build Coastguard Worker header->total_size = sizeof(rvcn_dec_feedback_header_t);
1131*61046927SAndroid Build Coastguard Worker header->num_buffers = 0;
1132*61046927SAndroid Build Coastguard Worker }
1133*61046927SAndroid Build Coastguard Worker
1134*61046927SAndroid Build Coastguard Worker static const uint8_t h264_levels[] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51, 52, 60, 61, 62};
1135*61046927SAndroid Build Coastguard Worker static uint8_t
get_h264_level(StdVideoH264LevelIdc level)1136*61046927SAndroid Build Coastguard Worker get_h264_level(StdVideoH264LevelIdc level)
1137*61046927SAndroid Build Coastguard Worker {
1138*61046927SAndroid Build Coastguard Worker assert(level <= STD_VIDEO_H264_LEVEL_IDC_6_2);
1139*61046927SAndroid Build Coastguard Worker return h264_levels[level];
1140*61046927SAndroid Build Coastguard Worker }
1141*61046927SAndroid Build Coastguard Worker
1142*61046927SAndroid Build Coastguard Worker static void
update_h264_scaling(unsigned char scaling_list_4x4[6][16],unsigned char scaling_list_8x8[2][64],const StdVideoH264ScalingLists * scaling_lists)1143*61046927SAndroid Build Coastguard Worker update_h264_scaling(unsigned char scaling_list_4x4[6][16], unsigned char scaling_list_8x8[2][64],
1144*61046927SAndroid Build Coastguard Worker const StdVideoH264ScalingLists *scaling_lists)
1145*61046927SAndroid Build Coastguard Worker {
1146*61046927SAndroid Build Coastguard Worker for (int i = 0; i < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS; i++) {
1147*61046927SAndroid Build Coastguard Worker for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS; j++)
1148*61046927SAndroid Build Coastguard Worker scaling_list_4x4[i][vl_zscan_normal_16[j]] = scaling_lists->ScalingList4x4[i][j];
1149*61046927SAndroid Build Coastguard Worker }
1150*61046927SAndroid Build Coastguard Worker
1151*61046927SAndroid Build Coastguard Worker for (int i = 0; i < 2; i++) {
1152*61046927SAndroid Build Coastguard Worker for (int j = 0; j < STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS; j++)
1153*61046927SAndroid Build Coastguard Worker scaling_list_8x8[i][vl_zscan_normal[j]] = scaling_lists->ScalingList8x8[i][j];
1154*61046927SAndroid Build Coastguard Worker }
1155*61046927SAndroid Build Coastguard Worker }
1156*61046927SAndroid Build Coastguard Worker
1157*61046927SAndroid Build Coastguard Worker static rvcn_dec_message_avc_t
get_h264_msg(struct radv_video_session * vid,struct radv_video_session_params * params,const struct VkVideoDecodeInfoKHR * frame_info,uint32_t * slice_offset,uint32_t * width_in_samples,uint32_t * height_in_samples,void * it_ptr)1158*61046927SAndroid Build Coastguard Worker get_h264_msg(struct radv_video_session *vid, struct radv_video_session_params *params,
1159*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info, uint32_t *slice_offset, uint32_t *width_in_samples,
1160*61046927SAndroid Build Coastguard Worker uint32_t *height_in_samples, void *it_ptr)
1161*61046927SAndroid Build Coastguard Worker {
1162*61046927SAndroid Build Coastguard Worker rvcn_dec_message_avc_t result;
1163*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264PictureInfoKHR *h264_pic_info =
1164*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H264_PICTURE_INFO_KHR);
1165*61046927SAndroid Build Coastguard Worker
1166*61046927SAndroid Build Coastguard Worker *slice_offset = h264_pic_info->pSliceOffsets[0];
1167*61046927SAndroid Build Coastguard Worker
1168*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof(result));
1169*61046927SAndroid Build Coastguard Worker
1170*61046927SAndroid Build Coastguard Worker assert(params->vk.h264_dec.h264_sps_count > 0);
1171*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *sps =
1172*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_sps(¶ms->vk, h264_pic_info->pStdPictureInfo->seq_parameter_set_id);
1173*61046927SAndroid Build Coastguard Worker switch (sps->profile_idc) {
1174*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_BASELINE:
1175*61046927SAndroid Build Coastguard Worker result.profile = RDECODE_H264_PROFILE_BASELINE;
1176*61046927SAndroid Build Coastguard Worker break;
1177*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_MAIN:
1178*61046927SAndroid Build Coastguard Worker result.profile = RDECODE_H264_PROFILE_MAIN;
1179*61046927SAndroid Build Coastguard Worker break;
1180*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_HIGH:
1181*61046927SAndroid Build Coastguard Worker result.profile = RDECODE_H264_PROFILE_HIGH;
1182*61046927SAndroid Build Coastguard Worker break;
1183*61046927SAndroid Build Coastguard Worker default:
1184*61046927SAndroid Build Coastguard Worker fprintf(stderr, "UNSUPPORTED CODEC %d\n", sps->profile_idc);
1185*61046927SAndroid Build Coastguard Worker result.profile = RDECODE_H264_PROFILE_MAIN;
1186*61046927SAndroid Build Coastguard Worker break;
1187*61046927SAndroid Build Coastguard Worker }
1188*61046927SAndroid Build Coastguard Worker
1189*61046927SAndroid Build Coastguard Worker *width_in_samples = (sps->pic_width_in_mbs_minus1 + 1) * 16;
1190*61046927SAndroid Build Coastguard Worker *height_in_samples = (sps->pic_height_in_map_units_minus1 + 1) * 16;
1191*61046927SAndroid Build Coastguard Worker if (!sps->flags.frame_mbs_only_flag)
1192*61046927SAndroid Build Coastguard Worker *height_in_samples *= 2;
1193*61046927SAndroid Build Coastguard Worker result.level = get_h264_level(sps->level_idc);
1194*61046927SAndroid Build Coastguard Worker
1195*61046927SAndroid Build Coastguard Worker result.sps_info_flags = 0;
1196*61046927SAndroid Build Coastguard Worker
1197*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.direct_8x8_inference_flag << 0;
1198*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.mb_adaptive_frame_field_flag << 1;
1199*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.frame_mbs_only_flag << 2;
1200*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.delta_pic_order_always_zero_flag << 3;
1201*61046927SAndroid Build Coastguard Worker if (vid->dpb_type != DPB_DYNAMIC_TIER_2)
1202*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= 1 << RDECODE_SPS_INFO_H264_EXTENSION_SUPPORT_FLAG_SHIFT;
1203*61046927SAndroid Build Coastguard Worker
1204*61046927SAndroid Build Coastguard Worker result.bit_depth_luma_minus8 = sps->bit_depth_luma_minus8;
1205*61046927SAndroid Build Coastguard Worker result.bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8;
1206*61046927SAndroid Build Coastguard Worker result.log2_max_frame_num_minus4 = sps->log2_max_frame_num_minus4;
1207*61046927SAndroid Build Coastguard Worker result.pic_order_cnt_type = sps->pic_order_cnt_type;
1208*61046927SAndroid Build Coastguard Worker result.log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4;
1209*61046927SAndroid Build Coastguard Worker
1210*61046927SAndroid Build Coastguard Worker result.chroma_format = sps->chroma_format_idc;
1211*61046927SAndroid Build Coastguard Worker
1212*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *pps =
1213*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_pps(¶ms->vk, h264_pic_info->pStdPictureInfo->pic_parameter_set_id);
1214*61046927SAndroid Build Coastguard Worker result.pps_info_flags = 0;
1215*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transform_8x8_mode_flag << 0;
1216*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.redundant_pic_cnt_present_flag << 1;
1217*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.constrained_intra_pred_flag << 2;
1218*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.deblocking_filter_control_present_flag << 3;
1219*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->weighted_bipred_idc << 4;
1220*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_pred_flag << 6;
1221*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.bottom_field_pic_order_in_frame_present_flag << 7;
1222*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.entropy_coding_mode_flag << 8;
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker result.pic_init_qp_minus26 = pps->pic_init_qp_minus26;
1225*61046927SAndroid Build Coastguard Worker result.chroma_qp_index_offset = pps->chroma_qp_index_offset;
1226*61046927SAndroid Build Coastguard Worker result.second_chroma_qp_index_offset = pps->second_chroma_qp_index_offset;
1227*61046927SAndroid Build Coastguard Worker
1228*61046927SAndroid Build Coastguard Worker StdVideoH264ScalingLists scaling_lists;
1229*61046927SAndroid Build Coastguard Worker vk_video_derive_h264_scaling_list(sps, pps, &scaling_lists);
1230*61046927SAndroid Build Coastguard Worker update_h264_scaling(result.scaling_list_4x4, result.scaling_list_8x8, &scaling_lists);
1231*61046927SAndroid Build Coastguard Worker
1232*61046927SAndroid Build Coastguard Worker memset(it_ptr, 0, IT_SCALING_TABLE_SIZE);
1233*61046927SAndroid Build Coastguard Worker memcpy(it_ptr, result.scaling_list_4x4, 6 * 16);
1234*61046927SAndroid Build Coastguard Worker memcpy((char *)it_ptr + 96, result.scaling_list_8x8, 2 * 64);
1235*61046927SAndroid Build Coastguard Worker
1236*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l0_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
1237*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l1_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
1238*61046927SAndroid Build Coastguard Worker
1239*61046927SAndroid Build Coastguard Worker result.curr_field_order_cnt_list[0] = h264_pic_info->pStdPictureInfo->PicOrderCnt[0];
1240*61046927SAndroid Build Coastguard Worker result.curr_field_order_cnt_list[1] = h264_pic_info->pStdPictureInfo->PicOrderCnt[1];
1241*61046927SAndroid Build Coastguard Worker
1242*61046927SAndroid Build Coastguard Worker result.frame_num = h264_pic_info->pStdPictureInfo->frame_num;
1243*61046927SAndroid Build Coastguard Worker
1244*61046927SAndroid Build Coastguard Worker result.num_ref_frames = sps->max_num_ref_frames;
1245*61046927SAndroid Build Coastguard Worker result.non_existing_frame_flags = 0;
1246*61046927SAndroid Build Coastguard Worker result.used_for_reference_flags = 0;
1247*61046927SAndroid Build Coastguard Worker
1248*61046927SAndroid Build Coastguard Worker memset(result.ref_frame_list, 0xff, sizeof(unsigned char) * 16);
1249*61046927SAndroid Build Coastguard Worker memset(result.frame_num_list, 0, sizeof(unsigned int) * 16);
1250*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
1251*61046927SAndroid Build Coastguard Worker int idx = frame_info->pReferenceSlots[i].slotIndex;
1252*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
1253*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR);
1254*61046927SAndroid Build Coastguard Worker
1255*61046927SAndroid Build Coastguard Worker result.frame_num_list[i] = dpb_slot->pStdReferenceInfo->FrameNum;
1256*61046927SAndroid Build Coastguard Worker result.field_order_cnt_list[i][0] = dpb_slot->pStdReferenceInfo->PicOrderCnt[0];
1257*61046927SAndroid Build Coastguard Worker result.field_order_cnt_list[i][1] = dpb_slot->pStdReferenceInfo->PicOrderCnt[1];
1258*61046927SAndroid Build Coastguard Worker
1259*61046927SAndroid Build Coastguard Worker result.ref_frame_list[i] = idx;
1260*61046927SAndroid Build Coastguard Worker
1261*61046927SAndroid Build Coastguard Worker if (dpb_slot->pStdReferenceInfo->flags.top_field_flag)
1262*61046927SAndroid Build Coastguard Worker result.used_for_reference_flags |= (1 << (2 * i));
1263*61046927SAndroid Build Coastguard Worker if (dpb_slot->pStdReferenceInfo->flags.bottom_field_flag)
1264*61046927SAndroid Build Coastguard Worker result.used_for_reference_flags |= (1 << (2 * i + 1));
1265*61046927SAndroid Build Coastguard Worker
1266*61046927SAndroid Build Coastguard Worker if (!dpb_slot->pStdReferenceInfo->flags.top_field_flag && !dpb_slot->pStdReferenceInfo->flags.bottom_field_flag)
1267*61046927SAndroid Build Coastguard Worker result.used_for_reference_flags |= (3 << (2 * i));
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker if (dpb_slot->pStdReferenceInfo->flags.used_for_long_term_reference)
1270*61046927SAndroid Build Coastguard Worker result.ref_frame_list[i] |= 0x80;
1271*61046927SAndroid Build Coastguard Worker if (dpb_slot->pStdReferenceInfo->flags.is_non_existing)
1272*61046927SAndroid Build Coastguard Worker result.non_existing_frame_flags |= 1 << i;
1273*61046927SAndroid Build Coastguard Worker }
1274*61046927SAndroid Build Coastguard Worker result.curr_pic_ref_frame_num = frame_info->referenceSlotCount;
1275*61046927SAndroid Build Coastguard Worker result.decoded_pic_idx = frame_info->pSetupReferenceSlot->slotIndex;
1276*61046927SAndroid Build Coastguard Worker
1277*61046927SAndroid Build Coastguard Worker return result;
1278*61046927SAndroid Build Coastguard Worker }
1279*61046927SAndroid Build Coastguard Worker
1280*61046927SAndroid Build Coastguard Worker static void
update_h265_scaling(void * it_ptr,const StdVideoH265ScalingLists * scaling_lists)1281*61046927SAndroid Build Coastguard Worker update_h265_scaling(void *it_ptr, const StdVideoH265ScalingLists *scaling_lists)
1282*61046927SAndroid Build Coastguard Worker {
1283*61046927SAndroid Build Coastguard Worker if (scaling_lists) {
1284*61046927SAndroid Build Coastguard Worker memcpy(it_ptr, scaling_lists->ScalingList4x4,
1285*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS);
1286*61046927SAndroid Build Coastguard Worker memcpy((char *)it_ptr + 96, scaling_lists->ScalingList8x8,
1287*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS);
1288*61046927SAndroid Build Coastguard Worker memcpy((char *)it_ptr + 480, scaling_lists->ScalingList16x16,
1289*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS);
1290*61046927SAndroid Build Coastguard Worker memcpy((char *)it_ptr + 864, scaling_lists->ScalingList32x32,
1291*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS);
1292*61046927SAndroid Build Coastguard Worker } else {
1293*61046927SAndroid Build Coastguard Worker memset(it_ptr, 0, STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS);
1294*61046927SAndroid Build Coastguard Worker memset((char *)it_ptr + 96, 0,
1295*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS);
1296*61046927SAndroid Build Coastguard Worker memset((char *)it_ptr + 480, 0,
1297*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS);
1298*61046927SAndroid Build Coastguard Worker memset((char *)it_ptr + 864, 0,
1299*61046927SAndroid Build Coastguard Worker STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS * STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS);
1300*61046927SAndroid Build Coastguard Worker }
1301*61046927SAndroid Build Coastguard Worker }
1302*61046927SAndroid Build Coastguard Worker
1303*61046927SAndroid Build Coastguard Worker static rvcn_dec_message_hevc_t
get_h265_msg(struct radv_device * device,struct radv_video_session * vid,struct radv_video_session_params * params,const struct VkVideoDecodeInfoKHR * frame_info,uint32_t * width_in_samples,uint32_t * height_in_samples,void * it_ptr)1304*61046927SAndroid Build Coastguard Worker get_h265_msg(struct radv_device *device, struct radv_video_session *vid, struct radv_video_session_params *params,
1305*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info,
1306*61046927SAndroid Build Coastguard Worker uint32_t *width_in_samples,
1307*61046927SAndroid Build Coastguard Worker uint32_t *height_in_samples,
1308*61046927SAndroid Build Coastguard Worker void *it_ptr)
1309*61046927SAndroid Build Coastguard Worker {
1310*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
1311*61046927SAndroid Build Coastguard Worker rvcn_dec_message_hevc_t result;
1312*61046927SAndroid Build Coastguard Worker int i, j;
1313*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265PictureInfoKHR *h265_pic_info =
1314*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H265_PICTURE_INFO_KHR);
1315*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof(result));
1316*61046927SAndroid Build Coastguard Worker
1317*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps =
1318*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_sps(¶ms->vk, h265_pic_info->pStdPictureInfo->pps_seq_parameter_set_id);
1319*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *pps =
1320*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_pps(¶ms->vk, h265_pic_info->pStdPictureInfo->pps_pic_parameter_set_id);
1321*61046927SAndroid Build Coastguard Worker
1322*61046927SAndroid Build Coastguard Worker result.sps_info_flags = 0;
1323*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.scaling_list_enabled_flag << 0;
1324*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.amp_enabled_flag << 1;
1325*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.sample_adaptive_offset_enabled_flag << 2;
1326*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.pcm_enabled_flag << 3;
1327*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.pcm_loop_filter_disabled_flag << 4;
1328*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.long_term_ref_pics_present_flag << 5;
1329*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.sps_temporal_mvp_enabled_flag << 6;
1330*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.strong_intra_smoothing_enabled_flag << 7;
1331*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.separate_colour_plane_flag << 8;
1332*61046927SAndroid Build Coastguard Worker
1333*61046927SAndroid Build Coastguard Worker if (pdev->info.family == CHIP_CARRIZO)
1334*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= 1 << 9;
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker if (!h265_pic_info->pStdPictureInfo->flags.short_term_ref_pic_set_sps_flag) {
1337*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= 1 << 11;
1338*61046927SAndroid Build Coastguard Worker }
1339*61046927SAndroid Build Coastguard Worker result.st_rps_bits = h265_pic_info->pStdPictureInfo->NumBitsForSTRefPicSetInSlice;
1340*61046927SAndroid Build Coastguard Worker
1341*61046927SAndroid Build Coastguard Worker *width_in_samples = sps->pic_width_in_luma_samples;
1342*61046927SAndroid Build Coastguard Worker *height_in_samples = sps->pic_height_in_luma_samples;
1343*61046927SAndroid Build Coastguard Worker result.chroma_format = sps->chroma_format_idc;
1344*61046927SAndroid Build Coastguard Worker result.bit_depth_luma_minus8 = sps->bit_depth_luma_minus8;
1345*61046927SAndroid Build Coastguard Worker result.bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8;
1346*61046927SAndroid Build Coastguard Worker result.log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4;
1347*61046927SAndroid Build Coastguard Worker result.sps_max_dec_pic_buffering_minus1 =
1348*61046927SAndroid Build Coastguard Worker sps->pDecPicBufMgr->max_dec_pic_buffering_minus1[sps->sps_max_sub_layers_minus1];
1349*61046927SAndroid Build Coastguard Worker result.log2_min_luma_coding_block_size_minus3 = sps->log2_min_luma_coding_block_size_minus3;
1350*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_luma_coding_block_size;
1351*61046927SAndroid Build Coastguard Worker result.log2_min_transform_block_size_minus2 = sps->log2_min_luma_transform_block_size_minus2;
1352*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_transform_block_size = sps->log2_diff_max_min_luma_transform_block_size;
1353*61046927SAndroid Build Coastguard Worker result.max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter;
1354*61046927SAndroid Build Coastguard Worker result.max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra;
1355*61046927SAndroid Build Coastguard Worker if (sps->flags.pcm_enabled_flag) {
1356*61046927SAndroid Build Coastguard Worker result.pcm_sample_bit_depth_luma_minus1 = sps->pcm_sample_bit_depth_luma_minus1;
1357*61046927SAndroid Build Coastguard Worker result.pcm_sample_bit_depth_chroma_minus1 = sps->pcm_sample_bit_depth_chroma_minus1;
1358*61046927SAndroid Build Coastguard Worker result.log2_min_pcm_luma_coding_block_size_minus3 = sps->log2_min_pcm_luma_coding_block_size_minus3;
1359*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_pcm_luma_coding_block_size = sps->log2_diff_max_min_pcm_luma_coding_block_size;
1360*61046927SAndroid Build Coastguard Worker }
1361*61046927SAndroid Build Coastguard Worker result.num_short_term_ref_pic_sets = sps->num_short_term_ref_pic_sets;
1362*61046927SAndroid Build Coastguard Worker
1363*61046927SAndroid Build Coastguard Worker result.pps_info_flags = 0;
1364*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.dependent_slice_segments_enabled_flag << 0;
1365*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.output_flag_present_flag << 1;
1366*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.sign_data_hiding_enabled_flag << 2;
1367*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.cabac_init_present_flag << 3;
1368*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.constrained_intra_pred_flag << 4;
1369*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transform_skip_enabled_flag << 5;
1370*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.cu_qp_delta_enabled_flag << 6;
1371*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_slice_chroma_qp_offsets_present_flag << 7;
1372*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_pred_flag << 8;
1373*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_bipred_flag << 9;
1374*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transquant_bypass_enabled_flag << 10;
1375*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.tiles_enabled_flag << 11;
1376*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.entropy_coding_sync_enabled_flag << 12;
1377*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.uniform_spacing_flag << 13;
1378*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.loop_filter_across_tiles_enabled_flag << 14;
1379*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_loop_filter_across_slices_enabled_flag << 15;
1380*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.deblocking_filter_override_enabled_flag << 16;
1381*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_deblocking_filter_disabled_flag << 17;
1382*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.lists_modification_present_flag << 18;
1383*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.slice_segment_header_extension_present_flag << 19;
1384*61046927SAndroid Build Coastguard Worker
1385*61046927SAndroid Build Coastguard Worker result.num_extra_slice_header_bits = pps->num_extra_slice_header_bits;
1386*61046927SAndroid Build Coastguard Worker result.num_long_term_ref_pic_sps = sps->num_long_term_ref_pics_sps;
1387*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
1388*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
1389*61046927SAndroid Build Coastguard Worker result.pps_cb_qp_offset = pps->pps_cb_qp_offset;
1390*61046927SAndroid Build Coastguard Worker result.pps_cr_qp_offset = pps->pps_cr_qp_offset;
1391*61046927SAndroid Build Coastguard Worker result.pps_beta_offset_div2 = pps->pps_beta_offset_div2;
1392*61046927SAndroid Build Coastguard Worker result.pps_tc_offset_div2 = pps->pps_tc_offset_div2;
1393*61046927SAndroid Build Coastguard Worker result.diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth;
1394*61046927SAndroid Build Coastguard Worker result.num_tile_columns_minus1 = pps->num_tile_columns_minus1;
1395*61046927SAndroid Build Coastguard Worker result.num_tile_rows_minus1 = pps->num_tile_rows_minus1;
1396*61046927SAndroid Build Coastguard Worker result.log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level_minus2;
1397*61046927SAndroid Build Coastguard Worker result.init_qp_minus26 = pps->init_qp_minus26;
1398*61046927SAndroid Build Coastguard Worker
1399*61046927SAndroid Build Coastguard Worker for (i = 0; i < 19; ++i)
1400*61046927SAndroid Build Coastguard Worker result.column_width_minus1[i] = pps->column_width_minus1[i];
1401*61046927SAndroid Build Coastguard Worker
1402*61046927SAndroid Build Coastguard Worker for (i = 0; i < 21; ++i)
1403*61046927SAndroid Build Coastguard Worker result.row_height_minus1[i] = pps->row_height_minus1[i];
1404*61046927SAndroid Build Coastguard Worker
1405*61046927SAndroid Build Coastguard Worker result.num_delta_pocs_ref_rps_idx = h265_pic_info->pStdPictureInfo->NumDeltaPocsOfRefRpsIdx;
1406*61046927SAndroid Build Coastguard Worker result.curr_poc = h265_pic_info->pStdPictureInfo->PicOrderCntVal;
1407*61046927SAndroid Build Coastguard Worker
1408*61046927SAndroid Build Coastguard Worker uint8_t idxs[16];
1409*61046927SAndroid Build Coastguard Worker memset(result.poc_list, 0, 16 * sizeof(int));
1410*61046927SAndroid Build Coastguard Worker memset(result.ref_pic_list, 0x7f, 16);
1411*61046927SAndroid Build Coastguard Worker memset(idxs, 0xff, 16);
1412*61046927SAndroid Build Coastguard Worker for (i = 0; i < frame_info->referenceSlotCount; i++) {
1413*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265DpbSlotInfoKHR *dpb_slot =
1414*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR);
1415*61046927SAndroid Build Coastguard Worker int idx = frame_info->pReferenceSlots[i].slotIndex;
1416*61046927SAndroid Build Coastguard Worker result.poc_list[i] = dpb_slot->pStdReferenceInfo->PicOrderCntVal;
1417*61046927SAndroid Build Coastguard Worker result.ref_pic_list[i] = idx;
1418*61046927SAndroid Build Coastguard Worker idxs[idx] = i;
1419*61046927SAndroid Build Coastguard Worker }
1420*61046927SAndroid Build Coastguard Worker result.curr_idx = frame_info->pSetupReferenceSlot->slotIndex;
1421*61046927SAndroid Build Coastguard Worker
1422*61046927SAndroid Build Coastguard Worker #define IDXS(x) ((x) == 0xff ? 0xff : idxs[(x)])
1423*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
1424*61046927SAndroid Build Coastguard Worker result.ref_pic_set_st_curr_before[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetStCurrBefore[i]);
1425*61046927SAndroid Build Coastguard Worker
1426*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
1427*61046927SAndroid Build Coastguard Worker result.ref_pic_set_st_curr_after[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetStCurrAfter[i]);
1428*61046927SAndroid Build Coastguard Worker
1429*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
1430*61046927SAndroid Build Coastguard Worker result.ref_pic_set_lt_curr[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetLtCurr[i]);
1431*61046927SAndroid Build Coastguard Worker
1432*61046927SAndroid Build Coastguard Worker const StdVideoH265ScalingLists *scaling_lists = NULL;
1433*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_scaling_list_data_present_flag)
1434*61046927SAndroid Build Coastguard Worker scaling_lists = pps->pScalingLists;
1435*61046927SAndroid Build Coastguard Worker else if (sps->flags.sps_scaling_list_data_present_flag)
1436*61046927SAndroid Build Coastguard Worker scaling_lists = sps->pScalingLists;
1437*61046927SAndroid Build Coastguard Worker
1438*61046927SAndroid Build Coastguard Worker update_h265_scaling(it_ptr, scaling_lists);
1439*61046927SAndroid Build Coastguard Worker
1440*61046927SAndroid Build Coastguard Worker if (scaling_lists) {
1441*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; ++i)
1442*61046927SAndroid Build Coastguard Worker result.ucScalingListDCCoefSizeID2[i] = scaling_lists->ScalingListDCCoef16x16[i];
1443*61046927SAndroid Build Coastguard Worker
1444*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; ++i)
1445*61046927SAndroid Build Coastguard Worker result.ucScalingListDCCoefSizeID3[i] = scaling_lists->ScalingListDCCoef32x32[i];
1446*61046927SAndroid Build Coastguard Worker }
1447*61046927SAndroid Build Coastguard Worker
1448*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
1449*61046927SAndroid Build Coastguard Worker for (j = 0; j < 15; j++)
1450*61046927SAndroid Build Coastguard Worker result.direct_reflist[i][j] = 0xff;
1451*61046927SAndroid Build Coastguard Worker }
1452*61046927SAndroid Build Coastguard Worker
1453*61046927SAndroid Build Coastguard Worker if (vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10) {
1454*61046927SAndroid Build Coastguard Worker if (vid->vk.picture_format == VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16) {
1455*61046927SAndroid Build Coastguard Worker result.p010_mode = 1;
1456*61046927SAndroid Build Coastguard Worker result.msb_mode = 1;
1457*61046927SAndroid Build Coastguard Worker } else {
1458*61046927SAndroid Build Coastguard Worker result.p010_mode = 0;
1459*61046927SAndroid Build Coastguard Worker result.luma_10to8 = 5;
1460*61046927SAndroid Build Coastguard Worker result.chroma_10to8 = 5;
1461*61046927SAndroid Build Coastguard Worker result.hevc_reserved[0] = 4; /* sclr_luma10to8 */
1462*61046927SAndroid Build Coastguard Worker result.hevc_reserved[1] = 4; /* sclr_chroma10to8 */
1463*61046927SAndroid Build Coastguard Worker }
1464*61046927SAndroid Build Coastguard Worker }
1465*61046927SAndroid Build Coastguard Worker
1466*61046927SAndroid Build Coastguard Worker return result;
1467*61046927SAndroid Build Coastguard Worker }
1468*61046927SAndroid Build Coastguard Worker
1469*61046927SAndroid Build Coastguard Worker enum {
1470*61046927SAndroid Build Coastguard Worker AV1_RESTORE_NONE = 0,
1471*61046927SAndroid Build Coastguard Worker AV1_RESTORE_WIENER = 1,
1472*61046927SAndroid Build Coastguard Worker AV1_RESTORE_SGRPROJ = 2,
1473*61046927SAndroid Build Coastguard Worker AV1_RESTORE_SWITCHABLE = 3,
1474*61046927SAndroid Build Coastguard Worker };
1475*61046927SAndroid Build Coastguard Worker
1476*61046927SAndroid Build Coastguard Worker #define AV1_SUPERRES_NUM 8
1477*61046927SAndroid Build Coastguard Worker #define AV1_SUPERRES_DENOM_MIN 9
1478*61046927SAndroid Build Coastguard Worker
1479*61046927SAndroid Build Coastguard Worker static rvcn_dec_message_av1_t
get_av1_msg(struct radv_device * device,struct radv_video_session * vid,struct radv_video_session_params * params,const struct VkVideoDecodeInfoKHR * frame_info,void * probs_ptr,int * update_reference_slot)1480*61046927SAndroid Build Coastguard Worker get_av1_msg(struct radv_device *device, struct radv_video_session *vid, struct radv_video_session_params *params,
1481*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info, void *probs_ptr, int *update_reference_slot)
1482*61046927SAndroid Build Coastguard Worker {
1483*61046927SAndroid Build Coastguard Worker rvcn_dec_message_av1_t result;
1484*61046927SAndroid Build Coastguard Worker unsigned i, j;
1485*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1PictureInfoKHR *av1_pic_info =
1486*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_AV1_PICTURE_INFO_KHR);
1487*61046927SAndroid Build Coastguard Worker const StdVideoDecodeAV1PictureInfo *pi = av1_pic_info->pStdPictureInfo;
1488*61046927SAndroid Build Coastguard Worker const StdVideoAV1SequenceHeader *seq_hdr = ¶ms->vk.av1_dec.seq_hdr.base;
1489*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof(result));
1490*61046927SAndroid Build Coastguard Worker
1491*61046927SAndroid Build Coastguard Worker const int intra_only_decoding = vid->vk.max_dpb_slots == 0;
1492*61046927SAndroid Build Coastguard Worker if (intra_only_decoding)
1493*61046927SAndroid Build Coastguard Worker assert(frame_info->pSetupReferenceSlot == NULL);
1494*61046927SAndroid Build Coastguard Worker
1495*61046927SAndroid Build Coastguard Worker *update_reference_slot = !(intra_only_decoding || pi->refresh_frame_flags == 0);
1496*61046927SAndroid Build Coastguard Worker
1497*61046927SAndroid Build Coastguard Worker result.frame_header_flags = (1 /*av1_pic_info->frame_header->flags.show_frame*/
1498*61046927SAndroid Build Coastguard Worker << RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_SHIFT) &
1499*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SHOW_FRAME_MASK;
1500*61046927SAndroid Build Coastguard Worker
1501*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.disable_cdf_update << RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_SHIFT) &
1502*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_DISABLE_CDF_UPDATE_MASK;
1503*61046927SAndroid Build Coastguard Worker
1504*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1505*61046927SAndroid Build Coastguard Worker ((!pi->flags.disable_frame_end_update_cdf) << RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_SHIFT) &
1506*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_REFRESH_FRAME_CONTEXT_MASK;
1507*61046927SAndroid Build Coastguard Worker
1508*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1509*61046927SAndroid Build Coastguard Worker ((pi->frame_type == STD_VIDEO_AV1_FRAME_TYPE_INTRA_ONLY) << RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_SHIFT) &
1510*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_INTRA_ONLY_MASK;
1511*61046927SAndroid Build Coastguard Worker
1512*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.allow_intrabc << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_SHIFT) &
1513*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ALLOW_INTRABC_MASK;
1514*61046927SAndroid Build Coastguard Worker
1515*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1516*61046927SAndroid Build Coastguard Worker (pi->flags.allow_high_precision_mv << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_SHIFT) &
1517*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ALLOW_HIGH_PRECISION_MV_MASK;
1518*61046927SAndroid Build Coastguard Worker
1519*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1520*61046927SAndroid Build Coastguard Worker (seq_hdr->pColorConfig->flags.mono_chrome << RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_SHIFT) &
1521*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_MONOCHROME_MASK;
1522*61046927SAndroid Build Coastguard Worker
1523*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.skip_mode_present << RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_SHIFT) &
1524*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SKIP_MODE_FLAG_MASK;
1525*61046927SAndroid Build Coastguard Worker
1526*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1527*61046927SAndroid Build Coastguard Worker (pi->pQuantization->flags.using_qmatrix << RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_SHIFT) &
1528*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_USING_QMATRIX_MASK;
1529*61046927SAndroid Build Coastguard Worker
1530*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1531*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_filter_intra << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_SHIFT) &
1532*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_FILTER_INTRA_MASK;
1533*61046927SAndroid Build Coastguard Worker
1534*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1535*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_intra_edge_filter << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_SHIFT) &
1536*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTRA_EDGE_FILTER_MASK;
1537*61046927SAndroid Build Coastguard Worker
1538*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1539*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_interintra_compound << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_SHIFT) &
1540*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_INTERINTRA_COMPOUND_MASK;
1541*61046927SAndroid Build Coastguard Worker
1542*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1543*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_masked_compound << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_SHIFT) &
1544*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_MASKED_COMPOUND_MASK;
1545*61046927SAndroid Build Coastguard Worker
1546*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1547*61046927SAndroid Build Coastguard Worker (pi->flags.allow_warped_motion << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_SHIFT) &
1548*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ALLOW_WARPED_MOTION_MASK;
1549*61046927SAndroid Build Coastguard Worker
1550*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1551*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_dual_filter << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_SHIFT) &
1552*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_DUAL_FILTER_MASK;
1553*61046927SAndroid Build Coastguard Worker
1554*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1555*61046927SAndroid Build Coastguard Worker (seq_hdr->flags.enable_order_hint << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_SHIFT) &
1556*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_ORDER_HINT_MASK;
1557*61046927SAndroid Build Coastguard Worker
1558*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (seq_hdr->flags.enable_jnt_comp << RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_SHIFT) &
1559*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ENABLE_JNT_COMP_MASK;
1560*61046927SAndroid Build Coastguard Worker
1561*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.use_ref_frame_mvs << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_SHIFT) &
1562*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ALLOW_REF_FRAME_MVS_MASK;
1563*61046927SAndroid Build Coastguard Worker
1564*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1565*61046927SAndroid Build Coastguard Worker (pi->flags.allow_screen_content_tools << RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_SHIFT) &
1566*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_ALLOW_SCREEN_CONTENT_TOOLS_MASK;
1567*61046927SAndroid Build Coastguard Worker
1568*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1569*61046927SAndroid Build Coastguard Worker (pi->flags.force_integer_mv << RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_SHIFT) &
1570*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_CUR_FRAME_FORCE_INTEGER_MV_MASK;
1571*61046927SAndroid Build Coastguard Worker
1572*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1573*61046927SAndroid Build Coastguard Worker (pi->pLoopFilter->flags.loop_filter_delta_enabled << RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_SHIFT) &
1574*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_ENABLED_MASK;
1575*61046927SAndroid Build Coastguard Worker
1576*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1577*61046927SAndroid Build Coastguard Worker (pi->pLoopFilter->flags.loop_filter_delta_update << RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_SHIFT) &
1578*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_MODE_REF_DELTA_UPDATE_MASK;
1579*61046927SAndroid Build Coastguard Worker
1580*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.delta_q_present << RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_SHIFT) &
1581*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_DELTA_Q_PRESENT_FLAG_MASK;
1582*61046927SAndroid Build Coastguard Worker
1583*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.delta_lf_present << RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_SHIFT) &
1584*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_PRESENT_FLAG_MASK;
1585*61046927SAndroid Build Coastguard Worker
1586*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.reduced_tx_set << RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_SHIFT) &
1587*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_REDUCED_TX_SET_USED_MASK;
1588*61046927SAndroid Build Coastguard Worker
1589*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1590*61046927SAndroid Build Coastguard Worker (pi->flags.segmentation_enabled << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_SHIFT) &
1591*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_ENABLED_MASK;
1592*61046927SAndroid Build Coastguard Worker
1593*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1594*61046927SAndroid Build Coastguard Worker (pi->flags.segmentation_update_map << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_SHIFT) &
1595*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_UPDATE_MAP_MASK;
1596*61046927SAndroid Build Coastguard Worker
1597*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1598*61046927SAndroid Build Coastguard Worker (pi->flags.segmentation_temporal_update << RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_SHIFT) &
1599*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SEGMENTATION_TEMPORAL_UPDATE_MASK;
1600*61046927SAndroid Build Coastguard Worker
1601*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= (pi->flags.delta_lf_multi << RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_SHIFT) &
1602*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_DELTA_LF_MULTI_MASK;
1603*61046927SAndroid Build Coastguard Worker
1604*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1605*61046927SAndroid Build Coastguard Worker (pi->flags.is_motion_mode_switchable << RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_SHIFT) &
1606*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SWITCHABLE_SKIP_MODE_MASK;
1607*61046927SAndroid Build Coastguard Worker
1608*61046927SAndroid Build Coastguard Worker result.frame_header_flags |= ((!intra_only_decoding ? !(pi->refresh_frame_flags) : 1)
1609*61046927SAndroid Build Coastguard Worker << RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_SHIFT) &
1610*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_SKIP_REFERENCE_UPDATE_MASK;
1611*61046927SAndroid Build Coastguard Worker
1612*61046927SAndroid Build Coastguard Worker result.frame_header_flags |=
1613*61046927SAndroid Build Coastguard Worker ((!seq_hdr->flags.enable_ref_frame_mvs) << RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_SHIFT) &
1614*61046927SAndroid Build Coastguard Worker RDECODE_FRAME_HDR_INFO_AV1_DISABLE_REF_FRAME_MVS_MASK;
1615*61046927SAndroid Build Coastguard Worker
1616*61046927SAndroid Build Coastguard Worker result.current_frame_id = pi->current_frame_id;
1617*61046927SAndroid Build Coastguard Worker result.frame_offset = pi->OrderHint;
1618*61046927SAndroid Build Coastguard Worker result.profile = seq_hdr->seq_profile;
1619*61046927SAndroid Build Coastguard Worker result.is_annexb = 0;
1620*61046927SAndroid Build Coastguard Worker
1621*61046927SAndroid Build Coastguard Worker result.frame_type = pi->frame_type;
1622*61046927SAndroid Build Coastguard Worker result.primary_ref_frame = pi->primary_ref_frame;
1623*61046927SAndroid Build Coastguard Worker
1624*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1DpbSlotInfoKHR *setup_dpb_slot =
1625*61046927SAndroid Build Coastguard Worker intra_only_decoding
1626*61046927SAndroid Build Coastguard Worker ? NULL
1627*61046927SAndroid Build Coastguard Worker : vk_find_struct_const(frame_info->pSetupReferenceSlot->pNext, VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR);
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker /* The AMD FW interface does not need this information, since it's
1630*61046927SAndroid Build Coastguard Worker * redundant with the information derivable from the current frame header,
1631*61046927SAndroid Build Coastguard Worker * which the FW is parsing and tracking.
1632*61046927SAndroid Build Coastguard Worker */
1633*61046927SAndroid Build Coastguard Worker (void)setup_dpb_slot;
1634*61046927SAndroid Build Coastguard Worker result.curr_pic_idx = intra_only_decoding ? 0 : frame_info->pSetupReferenceSlot->slotIndex;
1635*61046927SAndroid Build Coastguard Worker
1636*61046927SAndroid Build Coastguard Worker result.sb_size = seq_hdr->flags.use_128x128_superblock;
1637*61046927SAndroid Build Coastguard Worker result.interp_filter = pi->interpolation_filter;
1638*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; ++i)
1639*61046927SAndroid Build Coastguard Worker result.filter_level[i] = pi->pLoopFilter->loop_filter_level[i];
1640*61046927SAndroid Build Coastguard Worker result.filter_level_u = pi->pLoopFilter->loop_filter_level[2];
1641*61046927SAndroid Build Coastguard Worker result.filter_level_v = pi->pLoopFilter->loop_filter_level[3];
1642*61046927SAndroid Build Coastguard Worker result.sharpness_level = pi->pLoopFilter->loop_filter_sharpness;
1643*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
1644*61046927SAndroid Build Coastguard Worker result.ref_deltas[i] = pi->pLoopFilter->loop_filter_ref_deltas[i];
1645*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; ++i)
1646*61046927SAndroid Build Coastguard Worker result.mode_deltas[i] = pi->pLoopFilter->loop_filter_mode_deltas[i];
1647*61046927SAndroid Build Coastguard Worker result.base_qindex = pi->pQuantization->base_q_idx;
1648*61046927SAndroid Build Coastguard Worker result.y_dc_delta_q = pi->pQuantization->DeltaQYDc;
1649*61046927SAndroid Build Coastguard Worker result.u_dc_delta_q = pi->pQuantization->DeltaQUDc;
1650*61046927SAndroid Build Coastguard Worker result.v_dc_delta_q = pi->pQuantization->DeltaQVDc;
1651*61046927SAndroid Build Coastguard Worker result.u_ac_delta_q = pi->pQuantization->DeltaQUAc;
1652*61046927SAndroid Build Coastguard Worker result.v_ac_delta_q = pi->pQuantization->DeltaQVAc;
1653*61046927SAndroid Build Coastguard Worker
1654*61046927SAndroid Build Coastguard Worker if (pi->pQuantization->flags.using_qmatrix) {
1655*61046927SAndroid Build Coastguard Worker result.qm_y = pi->pQuantization->qm_y | 0xf0;
1656*61046927SAndroid Build Coastguard Worker result.qm_u = pi->pQuantization->qm_u | 0xf0;
1657*61046927SAndroid Build Coastguard Worker result.qm_v = pi->pQuantization->qm_v | 0xf0;
1658*61046927SAndroid Build Coastguard Worker } else {
1659*61046927SAndroid Build Coastguard Worker result.qm_y = 0xff;
1660*61046927SAndroid Build Coastguard Worker result.qm_u = 0xff;
1661*61046927SAndroid Build Coastguard Worker result.qm_v = 0xff;
1662*61046927SAndroid Build Coastguard Worker }
1663*61046927SAndroid Build Coastguard Worker result.delta_q_res = (1 << pi->delta_q_res);
1664*61046927SAndroid Build Coastguard Worker result.delta_lf_res = (1 << pi->delta_lf_res);
1665*61046927SAndroid Build Coastguard Worker result.tile_cols = pi->pTileInfo->TileCols;
1666*61046927SAndroid Build Coastguard Worker result.tile_rows = pi->pTileInfo->TileRows;
1667*61046927SAndroid Build Coastguard Worker
1668*61046927SAndroid Build Coastguard Worker result.tx_mode = pi->TxMode;
1669*61046927SAndroid Build Coastguard Worker result.reference_mode = (pi->flags.reference_select == 1) ? 2 : 0;
1670*61046927SAndroid Build Coastguard Worker result.chroma_format = seq_hdr->pColorConfig->flags.mono_chrome ? 0 : 1;
1671*61046927SAndroid Build Coastguard Worker result.tile_size_bytes = pi->pTileInfo->tile_size_bytes_minus_1;
1672*61046927SAndroid Build Coastguard Worker result.context_update_tile_id = pi->pTileInfo->context_update_tile_id;
1673*61046927SAndroid Build Coastguard Worker
1674*61046927SAndroid Build Coastguard Worker for (i = 0; i < result.tile_cols; i++)
1675*61046927SAndroid Build Coastguard Worker result.tile_col_start_sb[i] = pi->pTileInfo->pMiColStarts[i];
1676*61046927SAndroid Build Coastguard Worker result.tile_col_start_sb[result.tile_cols] =
1677*61046927SAndroid Build Coastguard Worker result.tile_col_start_sb[result.tile_cols - 1] + pi->pTileInfo->pWidthInSbsMinus1[result.tile_cols - 1] + 1;
1678*61046927SAndroid Build Coastguard Worker for (i = 0; i < pi->pTileInfo->TileRows; i++)
1679*61046927SAndroid Build Coastguard Worker result.tile_row_start_sb[i] = pi->pTileInfo->pMiRowStarts[i];
1680*61046927SAndroid Build Coastguard Worker result.tile_row_start_sb[result.tile_rows] =
1681*61046927SAndroid Build Coastguard Worker result.tile_row_start_sb[result.tile_rows - 1] + pi->pTileInfo->pHeightInSbsMinus1[result.tile_rows - 1] + 1;
1682*61046927SAndroid Build Coastguard Worker
1683*61046927SAndroid Build Coastguard Worker result.max_width = seq_hdr->max_frame_width_minus_1 + 1;
1684*61046927SAndroid Build Coastguard Worker result.max_height = seq_hdr->max_frame_height_minus_1 + 1;
1685*61046927SAndroid Build Coastguard Worker VkExtent2D frameExtent = frame_info->dstPictureResource.codedExtent;
1686*61046927SAndroid Build Coastguard Worker result.superres_scale_denominator =
1687*61046927SAndroid Build Coastguard Worker pi->flags.use_superres ? pi->coded_denom + AV1_SUPERRES_DENOM_MIN : AV1_SUPERRES_NUM;
1688*61046927SAndroid Build Coastguard Worker if (pi->flags.use_superres) {
1689*61046927SAndroid Build Coastguard Worker result.width =
1690*61046927SAndroid Build Coastguard Worker (frameExtent.width * 8 + result.superres_scale_denominator / 2) / result.superres_scale_denominator;
1691*61046927SAndroid Build Coastguard Worker } else {
1692*61046927SAndroid Build Coastguard Worker result.width = frameExtent.width;
1693*61046927SAndroid Build Coastguard Worker }
1694*61046927SAndroid Build Coastguard Worker result.height = frameExtent.height;
1695*61046927SAndroid Build Coastguard Worker
1696*61046927SAndroid Build Coastguard Worker result.superres_upscaled_width = frameExtent.width;
1697*61046927SAndroid Build Coastguard Worker
1698*61046927SAndroid Build Coastguard Worker result.order_hint_bits = seq_hdr->order_hint_bits_minus_1 + 1;
1699*61046927SAndroid Build Coastguard Worker
1700*61046927SAndroid Build Coastguard Worker /* The VCN FW will evict references that aren't specified in
1701*61046927SAndroid Build Coastguard Worker * ref_frame_map, even if they are still valid. To prevent this we will
1702*61046927SAndroid Build Coastguard Worker * specify every possible reference in ref_frame_map.
1703*61046927SAndroid Build Coastguard Worker */
1704*61046927SAndroid Build Coastguard Worker uint16_t used_slots = (1 << result.curr_pic_idx);
1705*61046927SAndroid Build Coastguard Worker for (i = 0; i < frame_info->referenceSlotCount; i++) {
1706*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeAV1DpbSlotInfoKHR *ref_dpb_slot =
1707*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR);
1708*61046927SAndroid Build Coastguard Worker (void)ref_dpb_slot; /* Again, the FW is tracking this information for us, so no need for it. */
1709*61046927SAndroid Build Coastguard Worker (void)ref_dpb_slot; /* the FW is tracking this information for us, so no need for it. */
1710*61046927SAndroid Build Coastguard Worker int32_t slotIndex = frame_info->pReferenceSlots[i].slotIndex;
1711*61046927SAndroid Build Coastguard Worker result.ref_frame_map[i] = slotIndex;
1712*61046927SAndroid Build Coastguard Worker used_slots |= 1 << slotIndex;
1713*61046927SAndroid Build Coastguard Worker }
1714*61046927SAndroid Build Coastguard Worker /* Go through all the slots and fill in the ones that haven't been used. */
1715*61046927SAndroid Build Coastguard Worker for (j = 0; j < STD_VIDEO_AV1_NUM_REF_FRAMES + 1; j++) {
1716*61046927SAndroid Build Coastguard Worker if ((used_slots & (1 << j)) == 0) {
1717*61046927SAndroid Build Coastguard Worker result.ref_frame_map[i] = j;
1718*61046927SAndroid Build Coastguard Worker used_slots |= 1 << j;
1719*61046927SAndroid Build Coastguard Worker i++;
1720*61046927SAndroid Build Coastguard Worker }
1721*61046927SAndroid Build Coastguard Worker }
1722*61046927SAndroid Build Coastguard Worker
1723*61046927SAndroid Build Coastguard Worker assert(used_slots == 0x1ff && i == STD_VIDEO_AV1_NUM_REF_FRAMES);
1724*61046927SAndroid Build Coastguard Worker
1725*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_AV1_REFS_PER_FRAME; ++i) {
1726*61046927SAndroid Build Coastguard Worker result.frame_refs[i] =
1727*61046927SAndroid Build Coastguard Worker av1_pic_info->referenceNameSlotIndices[i] == -1 ? 0x7f : av1_pic_info->referenceNameSlotIndices[i];
1728*61046927SAndroid Build Coastguard Worker }
1729*61046927SAndroid Build Coastguard Worker
1730*61046927SAndroid Build Coastguard Worker result.bit_depth_luma_minus8 = result.bit_depth_chroma_minus8 = seq_hdr->pColorConfig->BitDepth - 8;
1731*61046927SAndroid Build Coastguard Worker
1732*61046927SAndroid Build Coastguard Worker int16_t *feature_data = (int16_t *)probs_ptr;
1733*61046927SAndroid Build Coastguard Worker int fd_idx = 0;
1734*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
1735*61046927SAndroid Build Coastguard Worker result.feature_mask[i] = pi->pSegmentation->FeatureEnabled[i];
1736*61046927SAndroid Build Coastguard Worker for (j = 0; j < 8; ++j) {
1737*61046927SAndroid Build Coastguard Worker result.feature_data[i][j] = pi->pSegmentation->FeatureData[i][j];
1738*61046927SAndroid Build Coastguard Worker feature_data[fd_idx++] = result.feature_data[i][j];
1739*61046927SAndroid Build Coastguard Worker }
1740*61046927SAndroid Build Coastguard Worker }
1741*61046927SAndroid Build Coastguard Worker
1742*61046927SAndroid Build Coastguard Worker memcpy(((char *)probs_ptr + 128), result.feature_mask, 8);
1743*61046927SAndroid Build Coastguard Worker result.cdef_damping = pi->pCDEF->cdef_damping_minus_3 + 3;
1744*61046927SAndroid Build Coastguard Worker result.cdef_bits = pi->pCDEF->cdef_bits;
1745*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
1746*61046927SAndroid Build Coastguard Worker result.cdef_strengths[i] = (pi->pCDEF->cdef_y_pri_strength[i] << 2) + pi->pCDEF->cdef_y_sec_strength[i];
1747*61046927SAndroid Build Coastguard Worker result.cdef_uv_strengths[i] = (pi->pCDEF->cdef_uv_pri_strength[i] << 2) + pi->pCDEF->cdef_uv_sec_strength[i];
1748*61046927SAndroid Build Coastguard Worker }
1749*61046927SAndroid Build Coastguard Worker
1750*61046927SAndroid Build Coastguard Worker if (pi->flags.UsesLr) {
1751*61046927SAndroid Build Coastguard Worker for (int plane = 0; plane < STD_VIDEO_AV1_MAX_NUM_PLANES; plane++) {
1752*61046927SAndroid Build Coastguard Worker result.frame_restoration_type[plane] = pi->pLoopRestoration->FrameRestorationType[plane];
1753*61046927SAndroid Build Coastguard Worker result.log2_restoration_unit_size_minus5[plane] = pi->pLoopRestoration->LoopRestorationSize[plane];
1754*61046927SAndroid Build Coastguard Worker }
1755*61046927SAndroid Build Coastguard Worker }
1756*61046927SAndroid Build Coastguard Worker
1757*61046927SAndroid Build Coastguard Worker if (seq_hdr->pColorConfig->BitDepth > 8) {
1758*61046927SAndroid Build Coastguard Worker if (vid->vk.picture_format == VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 ||
1759*61046927SAndroid Build Coastguard Worker vid->vk.picture_format == VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16) {
1760*61046927SAndroid Build Coastguard Worker result.p010_mode = 1;
1761*61046927SAndroid Build Coastguard Worker result.msb_mode = 1;
1762*61046927SAndroid Build Coastguard Worker } else {
1763*61046927SAndroid Build Coastguard Worker result.luma_10to8 = 1;
1764*61046927SAndroid Build Coastguard Worker result.chroma_10to8 = 1;
1765*61046927SAndroid Build Coastguard Worker }
1766*61046927SAndroid Build Coastguard Worker }
1767*61046927SAndroid Build Coastguard Worker
1768*61046927SAndroid Build Coastguard Worker result.preskip_segid = 0;
1769*61046927SAndroid Build Coastguard Worker result.last_active_segid = 0;
1770*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
1771*61046927SAndroid Build Coastguard Worker for (j = 0; j < 8; j++) {
1772*61046927SAndroid Build Coastguard Worker if (result.feature_mask[i] & (1 << j)) {
1773*61046927SAndroid Build Coastguard Worker result.last_active_segid = i;
1774*61046927SAndroid Build Coastguard Worker if (j >= 5)
1775*61046927SAndroid Build Coastguard Worker result.preskip_segid = 1;
1776*61046927SAndroid Build Coastguard Worker }
1777*61046927SAndroid Build Coastguard Worker }
1778*61046927SAndroid Build Coastguard Worker }
1779*61046927SAndroid Build Coastguard Worker result.seg_lossless_flag = 0;
1780*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
1781*61046927SAndroid Build Coastguard Worker int av1_get_qindex, qindex;
1782*61046927SAndroid Build Coastguard Worker int segfeature_active = result.feature_mask[i] & (1 << 0);
1783*61046927SAndroid Build Coastguard Worker if (segfeature_active) {
1784*61046927SAndroid Build Coastguard Worker int seg_qindex = result.base_qindex + result.feature_data[i][0];
1785*61046927SAndroid Build Coastguard Worker av1_get_qindex = seg_qindex < 0 ? 0 : (seg_qindex > 255 ? 255 : seg_qindex);
1786*61046927SAndroid Build Coastguard Worker } else {
1787*61046927SAndroid Build Coastguard Worker av1_get_qindex = result.base_qindex;
1788*61046927SAndroid Build Coastguard Worker }
1789*61046927SAndroid Build Coastguard Worker qindex = pi->flags.segmentation_enabled ? av1_get_qindex : result.base_qindex;
1790*61046927SAndroid Build Coastguard Worker result.seg_lossless_flag |= (((qindex == 0) && result.y_dc_delta_q == 0 && result.u_dc_delta_q == 0 &&
1791*61046927SAndroid Build Coastguard Worker result.v_dc_delta_q == 0 && result.u_ac_delta_q == 0 && result.v_ac_delta_q == 0)
1792*61046927SAndroid Build Coastguard Worker << i);
1793*61046927SAndroid Build Coastguard Worker }
1794*61046927SAndroid Build Coastguard Worker
1795*61046927SAndroid Build Coastguard Worker rvcn_dec_film_grain_params_t *fg_params = &result.film_grain;
1796*61046927SAndroid Build Coastguard Worker fg_params->apply_grain = pi->flags.apply_grain;
1797*61046927SAndroid Build Coastguard Worker if (fg_params->apply_grain) {
1798*61046927SAndroid Build Coastguard Worker rvcn_dec_av1_fg_init_buf_t *fg_buf = (rvcn_dec_av1_fg_init_buf_t *)((char *)probs_ptr + 256);
1799*61046927SAndroid Build Coastguard Worker fg_params->random_seed = pi->pFilmGrain->grain_seed;
1800*61046927SAndroid Build Coastguard Worker fg_params->grain_scale_shift = pi->pFilmGrain->grain_scale_shift;
1801*61046927SAndroid Build Coastguard Worker fg_params->scaling_shift = pi->pFilmGrain->grain_scaling_minus_8 + 8;
1802*61046927SAndroid Build Coastguard Worker fg_params->chroma_scaling_from_luma = pi->pFilmGrain->flags.chroma_scaling_from_luma;
1803*61046927SAndroid Build Coastguard Worker fg_params->num_y_points = pi->pFilmGrain->num_y_points;
1804*61046927SAndroid Build Coastguard Worker fg_params->num_cb_points = pi->pFilmGrain->num_cb_points;
1805*61046927SAndroid Build Coastguard Worker fg_params->num_cr_points = pi->pFilmGrain->num_cr_points;
1806*61046927SAndroid Build Coastguard Worker fg_params->cb_mult = pi->pFilmGrain->cb_mult;
1807*61046927SAndroid Build Coastguard Worker fg_params->cb_luma_mult = pi->pFilmGrain->cb_luma_mult;
1808*61046927SAndroid Build Coastguard Worker fg_params->cb_offset = pi->pFilmGrain->cb_offset;
1809*61046927SAndroid Build Coastguard Worker fg_params->cr_mult = pi->pFilmGrain->cr_mult;
1810*61046927SAndroid Build Coastguard Worker fg_params->cr_luma_mult = pi->pFilmGrain->cr_luma_mult;
1811*61046927SAndroid Build Coastguard Worker fg_params->cr_offset = pi->pFilmGrain->cr_offset;
1812*61046927SAndroid Build Coastguard Worker fg_params->bit_depth_minus_8 = result.bit_depth_luma_minus8;
1813*61046927SAndroid Build Coastguard Worker for (i = 0; i < fg_params->num_y_points; ++i) {
1814*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_y[i][0] = pi->pFilmGrain->point_y_value[i];
1815*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_y[i][1] = pi->pFilmGrain->point_y_scaling[i];
1816*61046927SAndroid Build Coastguard Worker }
1817*61046927SAndroid Build Coastguard Worker for (i = 0; i < fg_params->num_cb_points; ++i) {
1818*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_cb[i][0] = pi->pFilmGrain->point_cb_value[i];
1819*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_cb[i][1] = pi->pFilmGrain->point_cb_scaling[i];
1820*61046927SAndroid Build Coastguard Worker }
1821*61046927SAndroid Build Coastguard Worker for (i = 0; i < fg_params->num_cr_points; ++i) {
1822*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_cr[i][0] = pi->pFilmGrain->point_cr_value[i];
1823*61046927SAndroid Build Coastguard Worker fg_params->scaling_points_cr[i][1] = pi->pFilmGrain->point_cr_scaling[i];
1824*61046927SAndroid Build Coastguard Worker }
1825*61046927SAndroid Build Coastguard Worker
1826*61046927SAndroid Build Coastguard Worker fg_params->ar_coeff_lag = pi->pFilmGrain->ar_coeff_lag;
1827*61046927SAndroid Build Coastguard Worker fg_params->ar_coeff_shift = pi->pFilmGrain->ar_coeff_shift_minus_6 + 6;
1828*61046927SAndroid Build Coastguard Worker
1829*61046927SAndroid Build Coastguard Worker for (i = 0; i < 24; ++i)
1830*61046927SAndroid Build Coastguard Worker fg_params->ar_coeffs_y[i] = pi->pFilmGrain->ar_coeffs_y_plus_128[i] - 128;
1831*61046927SAndroid Build Coastguard Worker
1832*61046927SAndroid Build Coastguard Worker for (i = 0; i < 25; ++i) {
1833*61046927SAndroid Build Coastguard Worker fg_params->ar_coeffs_cb[i] = pi->pFilmGrain->ar_coeffs_cb_plus_128[i] - 128;
1834*61046927SAndroid Build Coastguard Worker fg_params->ar_coeffs_cr[i] = pi->pFilmGrain->ar_coeffs_cr_plus_128[i] - 128;
1835*61046927SAndroid Build Coastguard Worker }
1836*61046927SAndroid Build Coastguard Worker
1837*61046927SAndroid Build Coastguard Worker fg_params->overlap_flag = pi->pFilmGrain->flags.overlap_flag;
1838*61046927SAndroid Build Coastguard Worker fg_params->clip_to_restricted_range = pi->pFilmGrain->flags.clip_to_restricted_range;
1839*61046927SAndroid Build Coastguard Worker ac_vcn_av1_init_film_grain_buffer(fg_params, fg_buf);
1840*61046927SAndroid Build Coastguard Worker }
1841*61046927SAndroid Build Coastguard Worker
1842*61046927SAndroid Build Coastguard Worker result.uncompressed_header_size = 0;
1843*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; ++i) {
1844*61046927SAndroid Build Coastguard Worker result.global_motion[i].wmtype = pi->pGlobalMotion->GmType[i];
1845*61046927SAndroid Build Coastguard Worker for (j = 0; j < STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS; ++j)
1846*61046927SAndroid Build Coastguard Worker result.global_motion[i].wmmat[j] = pi->pGlobalMotion->gm_params[i][j];
1847*61046927SAndroid Build Coastguard Worker }
1848*61046927SAndroid Build Coastguard Worker for (i = 0; i < av1_pic_info->tileCount && i < 256; ++i) {
1849*61046927SAndroid Build Coastguard Worker result.tile_info[i].offset = av1_pic_info->pTileOffsets[i];
1850*61046927SAndroid Build Coastguard Worker result.tile_info[i].size = av1_pic_info->pTileSizes[i];
1851*61046927SAndroid Build Coastguard Worker }
1852*61046927SAndroid Build Coastguard Worker
1853*61046927SAndroid Build Coastguard Worker return result;
1854*61046927SAndroid Build Coastguard Worker }
1855*61046927SAndroid Build Coastguard Worker
1856*61046927SAndroid Build Coastguard Worker
1857*61046927SAndroid Build Coastguard Worker static bool
rvcn_dec_message_decode(struct radv_cmd_buffer * cmd_buffer,struct radv_video_session * vid,struct radv_video_session_params * params,void * ptr,void * it_probs_ptr,uint32_t * slice_offset,const struct VkVideoDecodeInfoKHR * frame_info)1858*61046927SAndroid Build Coastguard Worker rvcn_dec_message_decode(struct radv_cmd_buffer *cmd_buffer, struct radv_video_session *vid,
1859*61046927SAndroid Build Coastguard Worker struct radv_video_session_params *params, void *ptr, void *it_probs_ptr, uint32_t *slice_offset,
1860*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info)
1861*61046927SAndroid Build Coastguard Worker {
1862*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
1863*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
1864*61046927SAndroid Build Coastguard Worker rvcn_dec_message_header_t *header;
1865*61046927SAndroid Build Coastguard Worker rvcn_dec_message_index_t *index_codec;
1866*61046927SAndroid Build Coastguard Worker rvcn_dec_message_decode_t *decode;
1867*61046927SAndroid Build Coastguard Worker rvcn_dec_message_index_t *index_dynamic_dpb = NULL;
1868*61046927SAndroid Build Coastguard Worker rvcn_dec_message_dynamic_dpb_t2_t *dynamic_dpb_t2 = NULL;
1869*61046927SAndroid Build Coastguard Worker void *codec;
1870*61046927SAndroid Build Coastguard Worker unsigned sizes = 0, offset_decode, offset_codec, offset_dynamic_dpb;
1871*61046927SAndroid Build Coastguard Worker struct radv_image_view *dst_iv = radv_image_view_from_handle(frame_info->dstPictureResource.imageViewBinding);
1872*61046927SAndroid Build Coastguard Worker struct radv_image *img = dst_iv->image;
1873*61046927SAndroid Build Coastguard Worker struct radv_image_plane *luma = &img->planes[0];
1874*61046927SAndroid Build Coastguard Worker struct radv_image_plane *chroma = &img->planes[1];
1875*61046927SAndroid Build Coastguard Worker
1876*61046927SAndroid Build Coastguard Worker header = ptr;
1877*61046927SAndroid Build Coastguard Worker sizes += sizeof(rvcn_dec_message_header_t);
1878*61046927SAndroid Build Coastguard Worker
1879*61046927SAndroid Build Coastguard Worker index_codec = (void *)((char *)header + sizes);
1880*61046927SAndroid Build Coastguard Worker sizes += sizeof(rvcn_dec_message_index_t);
1881*61046927SAndroid Build Coastguard Worker
1882*61046927SAndroid Build Coastguard Worker if (vid->dpb_type == DPB_DYNAMIC_TIER_2) {
1883*61046927SAndroid Build Coastguard Worker index_dynamic_dpb = (void *)((char *)header + sizes);
1884*61046927SAndroid Build Coastguard Worker sizes += sizeof(rvcn_dec_message_index_t);
1885*61046927SAndroid Build Coastguard Worker }
1886*61046927SAndroid Build Coastguard Worker
1887*61046927SAndroid Build Coastguard Worker offset_decode = sizes;
1888*61046927SAndroid Build Coastguard Worker decode = (void *)((char *)header + sizes);
1889*61046927SAndroid Build Coastguard Worker sizes += sizeof(rvcn_dec_message_decode_t);
1890*61046927SAndroid Build Coastguard Worker
1891*61046927SAndroid Build Coastguard Worker if (vid->dpb_type == DPB_DYNAMIC_TIER_2) {
1892*61046927SAndroid Build Coastguard Worker offset_dynamic_dpb = sizes;
1893*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2 = (void *)((char *)header + sizes);
1894*61046927SAndroid Build Coastguard Worker sizes += sizeof(rvcn_dec_message_dynamic_dpb_t2_t);
1895*61046927SAndroid Build Coastguard Worker }
1896*61046927SAndroid Build Coastguard Worker
1897*61046927SAndroid Build Coastguard Worker offset_codec = sizes;
1898*61046927SAndroid Build Coastguard Worker codec = (void *)((char *)header + sizes);
1899*61046927SAndroid Build Coastguard Worker
1900*61046927SAndroid Build Coastguard Worker memset(ptr, 0, sizes);
1901*61046927SAndroid Build Coastguard Worker
1902*61046927SAndroid Build Coastguard Worker header->header_size = sizeof(rvcn_dec_message_header_t);
1903*61046927SAndroid Build Coastguard Worker header->total_size = sizes;
1904*61046927SAndroid Build Coastguard Worker header->msg_type = RDECODE_MSG_DECODE;
1905*61046927SAndroid Build Coastguard Worker header->stream_handle = vid->stream_handle;
1906*61046927SAndroid Build Coastguard Worker header->status_report_feedback_number = vid->dbg_frame_cnt++;
1907*61046927SAndroid Build Coastguard Worker
1908*61046927SAndroid Build Coastguard Worker header->index[0].message_id = RDECODE_MESSAGE_DECODE;
1909*61046927SAndroid Build Coastguard Worker header->index[0].offset = offset_decode;
1910*61046927SAndroid Build Coastguard Worker header->index[0].size = sizeof(rvcn_dec_message_decode_t);
1911*61046927SAndroid Build Coastguard Worker header->index[0].filled = 0;
1912*61046927SAndroid Build Coastguard Worker header->num_buffers = 1;
1913*61046927SAndroid Build Coastguard Worker
1914*61046927SAndroid Build Coastguard Worker index_codec->offset = offset_codec;
1915*61046927SAndroid Build Coastguard Worker index_codec->filled = 0;
1916*61046927SAndroid Build Coastguard Worker ++header->num_buffers;
1917*61046927SAndroid Build Coastguard Worker
1918*61046927SAndroid Build Coastguard Worker if (vid->dpb_type == DPB_DYNAMIC_TIER_2) {
1919*61046927SAndroid Build Coastguard Worker index_dynamic_dpb->message_id = RDECODE_MESSAGE_DYNAMIC_DPB;
1920*61046927SAndroid Build Coastguard Worker index_dynamic_dpb->offset = offset_dynamic_dpb;
1921*61046927SAndroid Build Coastguard Worker index_dynamic_dpb->filled = 0;
1922*61046927SAndroid Build Coastguard Worker ++header->num_buffers;
1923*61046927SAndroid Build Coastguard Worker index_dynamic_dpb->size = sizeof(rvcn_dec_message_dynamic_dpb_t2_t);
1924*61046927SAndroid Build Coastguard Worker }
1925*61046927SAndroid Build Coastguard Worker
1926*61046927SAndroid Build Coastguard Worker decode->stream_type = vid->stream_type;
1927*61046927SAndroid Build Coastguard Worker decode->decode_flags = 0;
1928*61046927SAndroid Build Coastguard Worker decode->width_in_samples = frame_info->dstPictureResource.codedExtent.width;
1929*61046927SAndroid Build Coastguard Worker decode->height_in_samples = frame_info->dstPictureResource.codedExtent.height;
1930*61046927SAndroid Build Coastguard Worker
1931*61046927SAndroid Build Coastguard Worker decode->bsd_size = frame_info->srcBufferRange;
1932*61046927SAndroid Build Coastguard Worker
1933*61046927SAndroid Build Coastguard Worker decode->dt_size = dst_iv->image->planes[0].surface.total_size + dst_iv->image->planes[1].surface.total_size;
1934*61046927SAndroid Build Coastguard Worker decode->sct_size = 0;
1935*61046927SAndroid Build Coastguard Worker decode->sc_coeff_size = 0;
1936*61046927SAndroid Build Coastguard Worker
1937*61046927SAndroid Build Coastguard Worker decode->sw_ctxt_size = RDECODE_SESSION_CONTEXT_SIZE;
1938*61046927SAndroid Build Coastguard Worker
1939*61046927SAndroid Build Coastguard Worker decode->dt_pitch = luma->surface.u.gfx9.surf_pitch * luma->surface.blk_w;
1940*61046927SAndroid Build Coastguard Worker decode->dt_uv_pitch = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;
1941*61046927SAndroid Build Coastguard Worker
1942*61046927SAndroid Build Coastguard Worker if (luma->surface.meta_offset) {
1943*61046927SAndroid Build Coastguard Worker fprintf(stderr, "DCC SURFACES NOT SUPPORTED.\n");
1944*61046927SAndroid Build Coastguard Worker return false;
1945*61046927SAndroid Build Coastguard Worker }
1946*61046927SAndroid Build Coastguard Worker
1947*61046927SAndroid Build Coastguard Worker decode->dt_tiling_mode = 0;
1948*61046927SAndroid Build Coastguard Worker decode->dt_swizzle_mode = luma->surface.u.gfx9.swizzle_mode;
1949*61046927SAndroid Build Coastguard Worker decode->dt_array_mode = pdev->vid_addr_gfx_mode;
1950*61046927SAndroid Build Coastguard Worker decode->dt_field_mode = vid->interlaced ? 1 : 0;
1951*61046927SAndroid Build Coastguard Worker decode->dt_surf_tile_config = 0;
1952*61046927SAndroid Build Coastguard Worker decode->dt_uv_surf_tile_config = 0;
1953*61046927SAndroid Build Coastguard Worker
1954*61046927SAndroid Build Coastguard Worker decode->dt_luma_top_offset = luma->surface.u.gfx9.surf_offset;
1955*61046927SAndroid Build Coastguard Worker decode->dt_chroma_top_offset = chroma->surface.u.gfx9.surf_offset;
1956*61046927SAndroid Build Coastguard Worker
1957*61046927SAndroid Build Coastguard Worker if (decode->dt_field_mode) {
1958*61046927SAndroid Build Coastguard Worker decode->dt_luma_bottom_offset = luma->surface.u.gfx9.surf_offset + luma->surface.u.gfx9.surf_slice_size;
1959*61046927SAndroid Build Coastguard Worker decode->dt_chroma_bottom_offset = chroma->surface.u.gfx9.surf_offset + chroma->surface.u.gfx9.surf_slice_size;
1960*61046927SAndroid Build Coastguard Worker } else {
1961*61046927SAndroid Build Coastguard Worker decode->dt_luma_bottom_offset = decode->dt_luma_top_offset;
1962*61046927SAndroid Build Coastguard Worker decode->dt_chroma_bottom_offset = decode->dt_chroma_top_offset;
1963*61046927SAndroid Build Coastguard Worker }
1964*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RDECODE_CODEC_AV1)
1965*61046927SAndroid Build Coastguard Worker decode->db_pitch_uv = chroma->surface.u.gfx9.surf_pitch * chroma->surface.blk_w;
1966*61046927SAndroid Build Coastguard Worker
1967*61046927SAndroid Build Coastguard Worker *slice_offset = 0;
1968*61046927SAndroid Build Coastguard Worker
1969*61046927SAndroid Build Coastguard Worker /* Intra-only decoding will only work without a setup slot for AV1
1970*61046927SAndroid Build Coastguard Worker * currently, other codecs require the application to pass a
1971*61046927SAndroid Build Coastguard Worker * setup slot for this use-case, since the FW is not able to skip write-out
1972*61046927SAndroid Build Coastguard Worker * for H26X. In order to fix that properly, additional scratch space will
1973*61046927SAndroid Build Coastguard Worker * be needed in the video session just for intra-only DPB targets.
1974*61046927SAndroid Build Coastguard Worker */
1975*61046927SAndroid Build Coastguard Worker int dpb_update_required = 1;
1976*61046927SAndroid Build Coastguard Worker
1977*61046927SAndroid Build Coastguard Worker switch (vid->vk.op) {
1978*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
1979*61046927SAndroid Build Coastguard Worker index_codec->size = sizeof(rvcn_dec_message_avc_t);
1980*61046927SAndroid Build Coastguard Worker rvcn_dec_message_avc_t avc = get_h264_msg(vid, params, frame_info, slice_offset, &decode->width_in_samples,
1981*61046927SAndroid Build Coastguard Worker &decode->height_in_samples, it_probs_ptr);
1982*61046927SAndroid Build Coastguard Worker memcpy(codec, (void *)&avc, sizeof(rvcn_dec_message_avc_t));
1983*61046927SAndroid Build Coastguard Worker index_codec->message_id = RDECODE_MESSAGE_AVC;
1984*61046927SAndroid Build Coastguard Worker break;
1985*61046927SAndroid Build Coastguard Worker }
1986*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
1987*61046927SAndroid Build Coastguard Worker index_codec->size = sizeof(rvcn_dec_message_hevc_t);
1988*61046927SAndroid Build Coastguard Worker rvcn_dec_message_hevc_t hevc = get_h265_msg(device, vid, params, frame_info,
1989*61046927SAndroid Build Coastguard Worker &decode->width_in_samples,
1990*61046927SAndroid Build Coastguard Worker &decode->height_in_samples,
1991*61046927SAndroid Build Coastguard Worker it_probs_ptr);
1992*61046927SAndroid Build Coastguard Worker memcpy(codec, (void *)&hevc, sizeof(rvcn_dec_message_hevc_t));
1993*61046927SAndroid Build Coastguard Worker index_codec->message_id = RDECODE_MESSAGE_HEVC;
1994*61046927SAndroid Build Coastguard Worker break;
1995*61046927SAndroid Build Coastguard Worker }
1996*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR: {
1997*61046927SAndroid Build Coastguard Worker index_codec->size = sizeof(rvcn_dec_message_av1_t);
1998*61046927SAndroid Build Coastguard Worker rvcn_dec_message_av1_t av1 = get_av1_msg(device, vid, params, frame_info, it_probs_ptr, &dpb_update_required);
1999*61046927SAndroid Build Coastguard Worker memcpy(codec, (void *)&av1, sizeof(rvcn_dec_message_av1_t));
2000*61046927SAndroid Build Coastguard Worker index_codec->message_id = RDECODE_MESSAGE_AV1;
2001*61046927SAndroid Build Coastguard Worker assert(frame_info->referenceSlotCount < 9);
2002*61046927SAndroid Build Coastguard Worker break;
2003*61046927SAndroid Build Coastguard Worker }
2004*61046927SAndroid Build Coastguard Worker default:
2005*61046927SAndroid Build Coastguard Worker unreachable("unknown operation");
2006*61046927SAndroid Build Coastguard Worker }
2007*61046927SAndroid Build Coastguard Worker
2008*61046927SAndroid Build Coastguard Worker if (dpb_update_required)
2009*61046927SAndroid Build Coastguard Worker assert(frame_info->pSetupReferenceSlot != NULL);
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker struct radv_image_view *dpb_iv =
2012*61046927SAndroid Build Coastguard Worker dpb_update_required
2013*61046927SAndroid Build Coastguard Worker ? radv_image_view_from_handle(frame_info->pSetupReferenceSlot->pPictureResource->imageViewBinding)
2014*61046927SAndroid Build Coastguard Worker : NULL;
2015*61046927SAndroid Build Coastguard Worker struct radv_image *dpb = dpb_update_required ? dpb_iv->image : img;
2016*61046927SAndroid Build Coastguard Worker
2017*61046927SAndroid Build Coastguard Worker int dpb_array_idx = 0;
2018*61046927SAndroid Build Coastguard Worker if (dpb_update_required) {
2019*61046927SAndroid Build Coastguard Worker if (dpb_iv->vk.view_type == VK_IMAGE_VIEW_TYPE_2D_ARRAY)
2020*61046927SAndroid Build Coastguard Worker dpb_array_idx = frame_info->pSetupReferenceSlot->pPictureResource->baseArrayLayer;
2021*61046927SAndroid Build Coastguard Worker }
2022*61046927SAndroid Build Coastguard Worker
2023*61046927SAndroid Build Coastguard Worker decode->dpb_size = (vid->dpb_type != DPB_DYNAMIC_TIER_2) ? dpb->size : 0;
2024*61046927SAndroid Build Coastguard Worker decode->db_pitch = dpb->planes[0].surface.u.gfx9.surf_pitch;
2025*61046927SAndroid Build Coastguard Worker decode->db_aligned_height = dpb->planes[0].surface.u.gfx9.surf_height;
2026*61046927SAndroid Build Coastguard Worker decode->db_swizzle_mode = dpb->planes[0].surface.u.gfx9.swizzle_mode;
2027*61046927SAndroid Build Coastguard Worker decode->db_array_mode = pdev->vid_addr_gfx_mode;
2028*61046927SAndroid Build Coastguard Worker
2029*61046927SAndroid Build Coastguard Worker decode->hw_ctxt_size = vid->ctx.size;
2030*61046927SAndroid Build Coastguard Worker
2031*61046927SAndroid Build Coastguard Worker if (vid->dpb_type != DPB_DYNAMIC_TIER_2)
2032*61046927SAndroid Build Coastguard Worker return true;
2033*61046927SAndroid Build Coastguard Worker
2034*61046927SAndroid Build Coastguard Worker uint64_t addr;
2035*61046927SAndroid Build Coastguard Worker radv_cs_add_buffer(device->ws, cmd_buffer->cs, dpb->bindings[0].bo);
2036*61046927SAndroid Build Coastguard Worker addr = radv_buffer_get_va(dpb->bindings[0].bo) + dpb->bindings[0].offset;
2037*61046927SAndroid Build Coastguard Worker
2038*61046927SAndroid Build Coastguard Worker addr += dpb_array_idx * (dpb->planes[0].surface.u.gfx9.surf_slice_size + dpb->planes[1].surface.u.gfx9.surf_slice_size);
2039*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbCurrLo = addr;
2040*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbCurrHi = addr >> 32;
2041*61046927SAndroid Build Coastguard Worker
2042*61046927SAndroid Build Coastguard Worker if (vid->vk.op == VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR) {
2043*61046927SAndroid Build Coastguard Worker /* The following loop will fill in the references for the current frame,
2044*61046927SAndroid Build Coastguard Worker * this ensures all DPB addresses are "valid" (pointing at the current
2045*61046927SAndroid Build Coastguard Worker * decode target), so that the firmware doesn't evict things it should not.
2046*61046927SAndroid Build Coastguard Worker * It will not perform any actual writes to these dummy slots.
2047*61046927SAndroid Build Coastguard Worker */
2048*61046927SAndroid Build Coastguard Worker for (int i = 0; i < STD_VIDEO_AV1_NUM_REF_FRAMES; i++) {
2049*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbAddrHi[i] = addr;
2050*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbAddrLo[i] = addr >> 32;
2051*61046927SAndroid Build Coastguard Worker }
2052*61046927SAndroid Build Coastguard Worker }
2053*61046927SAndroid Build Coastguard Worker
2054*61046927SAndroid Build Coastguard Worker for (int i = 0; i < frame_info->referenceSlotCount; i++) {
2055*61046927SAndroid Build Coastguard Worker int32_t slot_idx = frame_info->pReferenceSlots[i].slotIndex;
2056*61046927SAndroid Build Coastguard Worker assert(slot_idx >= 0 && slot_idx < 16);
2057*61046927SAndroid Build Coastguard Worker struct radv_image_view *f_dpb_iv =
2058*61046927SAndroid Build Coastguard Worker radv_image_view_from_handle(frame_info->pReferenceSlots[i].pPictureResource->imageViewBinding);
2059*61046927SAndroid Build Coastguard Worker assert(f_dpb_iv != NULL);
2060*61046927SAndroid Build Coastguard Worker struct radv_image *dpb_img = f_dpb_iv->image;
2061*61046927SAndroid Build Coastguard Worker int f_dpb_array_idx = 0;
2062*61046927SAndroid Build Coastguard Worker if (f_dpb_iv->vk.view_type == VK_IMAGE_VIEW_TYPE_2D_ARRAY)
2063*61046927SAndroid Build Coastguard Worker f_dpb_array_idx = frame_info->pReferenceSlots[i].pPictureResource->baseArrayLayer;
2064*61046927SAndroid Build Coastguard Worker
2065*61046927SAndroid Build Coastguard Worker radv_cs_add_buffer(device->ws, cmd_buffer->cs, dpb_img->bindings[0].bo);
2066*61046927SAndroid Build Coastguard Worker addr = radv_buffer_get_va(dpb_img->bindings[0].bo) + dpb_img->bindings[0].offset;
2067*61046927SAndroid Build Coastguard Worker addr += f_dpb_array_idx * (dpb_img->planes[0].surface.u.gfx9.surf_slice_size + dpb_img->planes[1].surface.u.gfx9.surf_slice_size);
2068*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbAddrLo[i] = addr;
2069*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbAddrHi[i] = addr >> 32;
2070*61046927SAndroid Build Coastguard Worker
2071*61046927SAndroid Build Coastguard Worker ++dynamic_dpb_t2->dpbArraySize;
2072*61046927SAndroid Build Coastguard Worker }
2073*61046927SAndroid Build Coastguard Worker
2074*61046927SAndroid Build Coastguard Worker radv_cs_add_buffer(device->ws, cmd_buffer->cs, dpb->bindings[0].bo);
2075*61046927SAndroid Build Coastguard Worker addr = radv_buffer_get_va(dpb->bindings[0].bo) + dpb->bindings[0].offset;
2076*61046927SAndroid Build Coastguard Worker addr += dpb_array_idx * (dpb->planes[0].surface.u.gfx9.surf_slice_size + dpb->planes[1].surface.u.gfx9.surf_slice_size);
2077*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbCurrLo = addr;
2078*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbCurrHi = addr >> 32;
2079*61046927SAndroid Build Coastguard Worker
2080*61046927SAndroid Build Coastguard Worker decode->decode_flags = 1;
2081*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbConfigFlags = 0;
2082*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbLumaPitch = luma->surface.u.gfx9.surf_pitch;
2083*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbLumaAlignedHeight = luma->surface.u.gfx9.surf_height;
2084*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbLumaAlignedSize = luma->surface.u.gfx9.surf_slice_size;
2085*61046927SAndroid Build Coastguard Worker
2086*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbChromaPitch = chroma->surface.u.gfx9.surf_pitch;
2087*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbChromaAlignedHeight = chroma->surface.u.gfx9.surf_height;
2088*61046927SAndroid Build Coastguard Worker dynamic_dpb_t2->dpbChromaAlignedSize = chroma->surface.u.gfx9.surf_slice_size;
2089*61046927SAndroid Build Coastguard Worker
2090*61046927SAndroid Build Coastguard Worker return true;
2091*61046927SAndroid Build Coastguard Worker }
2092*61046927SAndroid Build Coastguard Worker
2093*61046927SAndroid Build Coastguard Worker static struct ruvd_h264
get_uvd_h264_msg(struct radv_video_session * vid,struct radv_video_session_params * params,const struct VkVideoDecodeInfoKHR * frame_info,uint32_t * slice_offset,uint32_t * width_in_samples,uint32_t * height_in_samples,void * it_ptr)2094*61046927SAndroid Build Coastguard Worker get_uvd_h264_msg(struct radv_video_session *vid, struct radv_video_session_params *params,
2095*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info, uint32_t *slice_offset, uint32_t *width_in_samples,
2096*61046927SAndroid Build Coastguard Worker uint32_t *height_in_samples, void *it_ptr)
2097*61046927SAndroid Build Coastguard Worker {
2098*61046927SAndroid Build Coastguard Worker struct ruvd_h264 result;
2099*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264PictureInfoKHR *h264_pic_info =
2100*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H264_PICTURE_INFO_KHR);
2101*61046927SAndroid Build Coastguard Worker
2102*61046927SAndroid Build Coastguard Worker *slice_offset = h264_pic_info->pSliceOffsets[0];
2103*61046927SAndroid Build Coastguard Worker
2104*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof(result));
2105*61046927SAndroid Build Coastguard Worker
2106*61046927SAndroid Build Coastguard Worker const StdVideoH264SequenceParameterSet *sps =
2107*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_sps(¶ms->vk, h264_pic_info->pStdPictureInfo->seq_parameter_set_id);
2108*61046927SAndroid Build Coastguard Worker switch (sps->profile_idc) {
2109*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_BASELINE:
2110*61046927SAndroid Build Coastguard Worker result.profile = RUVD_H264_PROFILE_BASELINE;
2111*61046927SAndroid Build Coastguard Worker break;
2112*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_MAIN:
2113*61046927SAndroid Build Coastguard Worker result.profile = RUVD_H264_PROFILE_MAIN;
2114*61046927SAndroid Build Coastguard Worker break;
2115*61046927SAndroid Build Coastguard Worker case STD_VIDEO_H264_PROFILE_IDC_HIGH:
2116*61046927SAndroid Build Coastguard Worker result.profile = RUVD_H264_PROFILE_HIGH;
2117*61046927SAndroid Build Coastguard Worker break;
2118*61046927SAndroid Build Coastguard Worker default:
2119*61046927SAndroid Build Coastguard Worker fprintf(stderr, "UNSUPPORTED CODEC %d\n", sps->profile_idc);
2120*61046927SAndroid Build Coastguard Worker result.profile = RUVD_H264_PROFILE_MAIN;
2121*61046927SAndroid Build Coastguard Worker break;
2122*61046927SAndroid Build Coastguard Worker }
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker *width_in_samples = (sps->pic_width_in_mbs_minus1 + 1) * 16;
2125*61046927SAndroid Build Coastguard Worker *height_in_samples = (sps->pic_height_in_map_units_minus1 + 1) * 16;
2126*61046927SAndroid Build Coastguard Worker if (!sps->flags.frame_mbs_only_flag)
2127*61046927SAndroid Build Coastguard Worker *height_in_samples *= 2;
2128*61046927SAndroid Build Coastguard Worker result.level = get_h264_level(sps->level_idc);
2129*61046927SAndroid Build Coastguard Worker
2130*61046927SAndroid Build Coastguard Worker result.sps_info_flags = 0;
2131*61046927SAndroid Build Coastguard Worker
2132*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.direct_8x8_inference_flag << 0;
2133*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.mb_adaptive_frame_field_flag << 1;
2134*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.frame_mbs_only_flag << 2;
2135*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.delta_pic_order_always_zero_flag << 3;
2136*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= 1 << RDECODE_SPS_INFO_H264_EXTENSION_SUPPORT_FLAG_SHIFT;
2137*61046927SAndroid Build Coastguard Worker
2138*61046927SAndroid Build Coastguard Worker result.bit_depth_luma_minus8 = sps->bit_depth_luma_minus8;
2139*61046927SAndroid Build Coastguard Worker result.bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8;
2140*61046927SAndroid Build Coastguard Worker result.log2_max_frame_num_minus4 = sps->log2_max_frame_num_minus4;
2141*61046927SAndroid Build Coastguard Worker result.pic_order_cnt_type = sps->pic_order_cnt_type;
2142*61046927SAndroid Build Coastguard Worker result.log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4;
2143*61046927SAndroid Build Coastguard Worker
2144*61046927SAndroid Build Coastguard Worker result.chroma_format = sps->chroma_format_idc;
2145*61046927SAndroid Build Coastguard Worker
2146*61046927SAndroid Build Coastguard Worker const StdVideoH264PictureParameterSet *pps =
2147*61046927SAndroid Build Coastguard Worker vk_video_find_h264_dec_std_pps(¶ms->vk, h264_pic_info->pStdPictureInfo->pic_parameter_set_id);
2148*61046927SAndroid Build Coastguard Worker result.pps_info_flags = 0;
2149*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transform_8x8_mode_flag << 0;
2150*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.redundant_pic_cnt_present_flag << 1;
2151*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.constrained_intra_pred_flag << 2;
2152*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.deblocking_filter_control_present_flag << 3;
2153*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->weighted_bipred_idc << 4;
2154*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_pred_flag << 6;
2155*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.bottom_field_pic_order_in_frame_present_flag << 7;
2156*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.entropy_coding_mode_flag << 8;
2157*61046927SAndroid Build Coastguard Worker
2158*61046927SAndroid Build Coastguard Worker result.pic_init_qp_minus26 = pps->pic_init_qp_minus26;
2159*61046927SAndroid Build Coastguard Worker result.chroma_qp_index_offset = pps->chroma_qp_index_offset;
2160*61046927SAndroid Build Coastguard Worker result.second_chroma_qp_index_offset = pps->second_chroma_qp_index_offset;
2161*61046927SAndroid Build Coastguard Worker
2162*61046927SAndroid Build Coastguard Worker StdVideoH264ScalingLists scaling_lists;
2163*61046927SAndroid Build Coastguard Worker vk_video_derive_h264_scaling_list(sps, pps, &scaling_lists);
2164*61046927SAndroid Build Coastguard Worker update_h264_scaling(result.scaling_list_4x4, result.scaling_list_8x8, &scaling_lists);
2165*61046927SAndroid Build Coastguard Worker
2166*61046927SAndroid Build Coastguard Worker memset(it_ptr, 0, IT_SCALING_TABLE_SIZE);
2167*61046927SAndroid Build Coastguard Worker memcpy(it_ptr, result.scaling_list_4x4, 6 * 16);
2168*61046927SAndroid Build Coastguard Worker memcpy((char *)it_ptr + 96, result.scaling_list_8x8, 2 * 64);
2169*61046927SAndroid Build Coastguard Worker
2170*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l0_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
2171*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l1_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
2172*61046927SAndroid Build Coastguard Worker
2173*61046927SAndroid Build Coastguard Worker result.curr_field_order_cnt_list[0] = h264_pic_info->pStdPictureInfo->PicOrderCnt[0];
2174*61046927SAndroid Build Coastguard Worker result.curr_field_order_cnt_list[1] = h264_pic_info->pStdPictureInfo->PicOrderCnt[1];
2175*61046927SAndroid Build Coastguard Worker
2176*61046927SAndroid Build Coastguard Worker result.frame_num = h264_pic_info->pStdPictureInfo->frame_num;
2177*61046927SAndroid Build Coastguard Worker
2178*61046927SAndroid Build Coastguard Worker result.num_ref_frames = sps->max_num_ref_frames;
2179*61046927SAndroid Build Coastguard Worker memset(result.ref_frame_list, 0xff, sizeof(unsigned char) * 16);
2180*61046927SAndroid Build Coastguard Worker memset(result.frame_num_list, 0, sizeof(unsigned int) * 16);
2181*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < frame_info->referenceSlotCount; i++) {
2182*61046927SAndroid Build Coastguard Worker int idx = frame_info->pReferenceSlots[i].slotIndex;
2183*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH264DpbSlotInfoKHR *dpb_slot =
2184*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR);
2185*61046927SAndroid Build Coastguard Worker
2186*61046927SAndroid Build Coastguard Worker result.frame_num_list[i] = dpb_slot->pStdReferenceInfo->FrameNum;
2187*61046927SAndroid Build Coastguard Worker result.field_order_cnt_list[i][0] = dpb_slot->pStdReferenceInfo->PicOrderCnt[0];
2188*61046927SAndroid Build Coastguard Worker result.field_order_cnt_list[i][1] = dpb_slot->pStdReferenceInfo->PicOrderCnt[1];
2189*61046927SAndroid Build Coastguard Worker
2190*61046927SAndroid Build Coastguard Worker result.ref_frame_list[i] = idx;
2191*61046927SAndroid Build Coastguard Worker
2192*61046927SAndroid Build Coastguard Worker if (dpb_slot->pStdReferenceInfo->flags.used_for_long_term_reference)
2193*61046927SAndroid Build Coastguard Worker result.ref_frame_list[i] |= 0x80;
2194*61046927SAndroid Build Coastguard Worker }
2195*61046927SAndroid Build Coastguard Worker result.curr_pic_ref_frame_num = frame_info->referenceSlotCount;
2196*61046927SAndroid Build Coastguard Worker result.decoded_pic_idx = frame_info->pSetupReferenceSlot->slotIndex;
2197*61046927SAndroid Build Coastguard Worker
2198*61046927SAndroid Build Coastguard Worker return result;
2199*61046927SAndroid Build Coastguard Worker }
2200*61046927SAndroid Build Coastguard Worker
2201*61046927SAndroid Build Coastguard Worker static struct ruvd_h265
get_uvd_h265_msg(struct radv_device * device,struct radv_video_session * vid,struct radv_video_session_params * params,const struct VkVideoDecodeInfoKHR * frame_info,uint32_t * width_in_samples,uint32_t * height_in_samples,void * it_ptr)2202*61046927SAndroid Build Coastguard Worker get_uvd_h265_msg(struct radv_device *device, struct radv_video_session *vid, struct radv_video_session_params *params,
2203*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info, uint32_t *width_in_samples,
2204*61046927SAndroid Build Coastguard Worker uint32_t *height_in_samples, void *it_ptr)
2205*61046927SAndroid Build Coastguard Worker {
2206*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
2207*61046927SAndroid Build Coastguard Worker struct ruvd_h265 result;
2208*61046927SAndroid Build Coastguard Worker int i, j;
2209*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265PictureInfoKHR *h265_pic_info =
2210*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pNext, VIDEO_DECODE_H265_PICTURE_INFO_KHR);
2211*61046927SAndroid Build Coastguard Worker
2212*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof(result));
2213*61046927SAndroid Build Coastguard Worker
2214*61046927SAndroid Build Coastguard Worker const StdVideoH265SequenceParameterSet *sps =
2215*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_sps(¶ms->vk, h265_pic_info->pStdPictureInfo->pps_seq_parameter_set_id);
2216*61046927SAndroid Build Coastguard Worker const StdVideoH265PictureParameterSet *pps =
2217*61046927SAndroid Build Coastguard Worker vk_video_find_h265_dec_std_pps(¶ms->vk, h265_pic_info->pStdPictureInfo->pps_pic_parameter_set_id);
2218*61046927SAndroid Build Coastguard Worker
2219*61046927SAndroid Build Coastguard Worker result.sps_info_flags = 0;
2220*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.scaling_list_enabled_flag << 0;
2221*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.amp_enabled_flag << 1;
2222*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.sample_adaptive_offset_enabled_flag << 2;
2223*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.pcm_enabled_flag << 3;
2224*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.pcm_loop_filter_disabled_flag << 4;
2225*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.long_term_ref_pics_present_flag << 5;
2226*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.sps_temporal_mvp_enabled_flag << 6;
2227*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.strong_intra_smoothing_enabled_flag << 7;
2228*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= sps->flags.separate_colour_plane_flag << 8;
2229*61046927SAndroid Build Coastguard Worker
2230*61046927SAndroid Build Coastguard Worker if (pdev->info.family == CHIP_CARRIZO)
2231*61046927SAndroid Build Coastguard Worker result.sps_info_flags |= 1 << 9;
2232*61046927SAndroid Build Coastguard Worker
2233*61046927SAndroid Build Coastguard Worker *width_in_samples = sps->pic_width_in_luma_samples;
2234*61046927SAndroid Build Coastguard Worker *height_in_samples = sps->pic_height_in_luma_samples;
2235*61046927SAndroid Build Coastguard Worker result.chroma_format = sps->chroma_format_idc;
2236*61046927SAndroid Build Coastguard Worker result.bit_depth_luma_minus8 = sps->bit_depth_luma_minus8;
2237*61046927SAndroid Build Coastguard Worker result.bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8;
2238*61046927SAndroid Build Coastguard Worker result.log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4;
2239*61046927SAndroid Build Coastguard Worker result.sps_max_dec_pic_buffering_minus1 =
2240*61046927SAndroid Build Coastguard Worker sps->pDecPicBufMgr->max_dec_pic_buffering_minus1[sps->sps_max_sub_layers_minus1];
2241*61046927SAndroid Build Coastguard Worker result.log2_min_luma_coding_block_size_minus3 = sps->log2_min_luma_coding_block_size_minus3;
2242*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_luma_coding_block_size;
2243*61046927SAndroid Build Coastguard Worker result.log2_min_transform_block_size_minus2 = sps->log2_min_luma_transform_block_size_minus2;
2244*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_transform_block_size = sps->log2_diff_max_min_luma_transform_block_size;
2245*61046927SAndroid Build Coastguard Worker result.max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter;
2246*61046927SAndroid Build Coastguard Worker result.max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra;
2247*61046927SAndroid Build Coastguard Worker if (sps->flags.pcm_enabled_flag) {
2248*61046927SAndroid Build Coastguard Worker result.pcm_sample_bit_depth_luma_minus1 = sps->pcm_sample_bit_depth_luma_minus1;
2249*61046927SAndroid Build Coastguard Worker result.pcm_sample_bit_depth_chroma_minus1 = sps->pcm_sample_bit_depth_chroma_minus1;
2250*61046927SAndroid Build Coastguard Worker result.log2_min_pcm_luma_coding_block_size_minus3 = sps->log2_min_pcm_luma_coding_block_size_minus3;
2251*61046927SAndroid Build Coastguard Worker result.log2_diff_max_min_pcm_luma_coding_block_size = sps->log2_diff_max_min_pcm_luma_coding_block_size;
2252*61046927SAndroid Build Coastguard Worker }
2253*61046927SAndroid Build Coastguard Worker result.num_short_term_ref_pic_sets = sps->num_short_term_ref_pic_sets;
2254*61046927SAndroid Build Coastguard Worker
2255*61046927SAndroid Build Coastguard Worker result.pps_info_flags = 0;
2256*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.dependent_slice_segments_enabled_flag << 0;
2257*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.output_flag_present_flag << 1;
2258*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.sign_data_hiding_enabled_flag << 2;
2259*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.cabac_init_present_flag << 3;
2260*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.constrained_intra_pred_flag << 4;
2261*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transform_skip_enabled_flag << 5;
2262*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.cu_qp_delta_enabled_flag << 6;
2263*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_slice_chroma_qp_offsets_present_flag << 7;
2264*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_pred_flag << 8;
2265*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.weighted_bipred_flag << 9;
2266*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.transquant_bypass_enabled_flag << 10;
2267*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.tiles_enabled_flag << 11;
2268*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.entropy_coding_sync_enabled_flag << 12;
2269*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.uniform_spacing_flag << 13;
2270*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.loop_filter_across_tiles_enabled_flag << 14;
2271*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_loop_filter_across_slices_enabled_flag << 15;
2272*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.deblocking_filter_override_enabled_flag << 16;
2273*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.pps_deblocking_filter_disabled_flag << 17;
2274*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.lists_modification_present_flag << 18;
2275*61046927SAndroid Build Coastguard Worker result.pps_info_flags |= pps->flags.slice_segment_header_extension_present_flag << 19;
2276*61046927SAndroid Build Coastguard Worker
2277*61046927SAndroid Build Coastguard Worker result.num_extra_slice_header_bits = pps->num_extra_slice_header_bits;
2278*61046927SAndroid Build Coastguard Worker result.num_long_term_ref_pic_sps = sps->num_long_term_ref_pics_sps;
2279*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active_minus1;
2280*61046927SAndroid Build Coastguard Worker result.num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active_minus1;
2281*61046927SAndroid Build Coastguard Worker result.pps_cb_qp_offset = pps->pps_cb_qp_offset;
2282*61046927SAndroid Build Coastguard Worker result.pps_cr_qp_offset = pps->pps_cr_qp_offset;
2283*61046927SAndroid Build Coastguard Worker result.pps_beta_offset_div2 = pps->pps_beta_offset_div2;
2284*61046927SAndroid Build Coastguard Worker result.pps_tc_offset_div2 = pps->pps_tc_offset_div2;
2285*61046927SAndroid Build Coastguard Worker result.diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth;
2286*61046927SAndroid Build Coastguard Worker result.num_tile_columns_minus1 = pps->num_tile_columns_minus1;
2287*61046927SAndroid Build Coastguard Worker result.num_tile_rows_minus1 = pps->num_tile_rows_minus1;
2288*61046927SAndroid Build Coastguard Worker result.log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level_minus2;
2289*61046927SAndroid Build Coastguard Worker result.init_qp_minus26 = pps->init_qp_minus26;
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Worker for (i = 0; i < 19; ++i)
2292*61046927SAndroid Build Coastguard Worker result.column_width_minus1[i] = pps->column_width_minus1[i];
2293*61046927SAndroid Build Coastguard Worker
2294*61046927SAndroid Build Coastguard Worker for (i = 0; i < 21; ++i)
2295*61046927SAndroid Build Coastguard Worker result.row_height_minus1[i] = pps->row_height_minus1[i];
2296*61046927SAndroid Build Coastguard Worker
2297*61046927SAndroid Build Coastguard Worker result.num_delta_pocs_ref_rps_idx = h265_pic_info->pStdPictureInfo->NumDeltaPocsOfRefRpsIdx;
2298*61046927SAndroid Build Coastguard Worker result.curr_poc = h265_pic_info->pStdPictureInfo->PicOrderCntVal;
2299*61046927SAndroid Build Coastguard Worker
2300*61046927SAndroid Build Coastguard Worker uint8_t idxs[16];
2301*61046927SAndroid Build Coastguard Worker memset(result.poc_list, 0, 16 * sizeof(int));
2302*61046927SAndroid Build Coastguard Worker memset(result.ref_pic_list, 0x7f, 16);
2303*61046927SAndroid Build Coastguard Worker memset(idxs, 0xff, 16);
2304*61046927SAndroid Build Coastguard Worker for (i = 0; i < frame_info->referenceSlotCount; i++) {
2305*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265DpbSlotInfoKHR *dpb_slot =
2306*61046927SAndroid Build Coastguard Worker vk_find_struct_const(frame_info->pReferenceSlots[i].pNext, VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR);
2307*61046927SAndroid Build Coastguard Worker int idx = frame_info->pReferenceSlots[i].slotIndex;
2308*61046927SAndroid Build Coastguard Worker result.poc_list[i] = dpb_slot->pStdReferenceInfo->PicOrderCntVal;
2309*61046927SAndroid Build Coastguard Worker result.ref_pic_list[i] = idx;
2310*61046927SAndroid Build Coastguard Worker idxs[idx] = i;
2311*61046927SAndroid Build Coastguard Worker }
2312*61046927SAndroid Build Coastguard Worker result.curr_idx = frame_info->pSetupReferenceSlot->slotIndex;
2313*61046927SAndroid Build Coastguard Worker
2314*61046927SAndroid Build Coastguard Worker #define IDXS(x) ((x) == 0xff ? 0xff : idxs[(x)])
2315*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
2316*61046927SAndroid Build Coastguard Worker result.ref_pic_set_st_curr_before[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetStCurrBefore[i]);
2317*61046927SAndroid Build Coastguard Worker
2318*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
2319*61046927SAndroid Build Coastguard Worker result.ref_pic_set_st_curr_after[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetStCurrAfter[i]);
2320*61046927SAndroid Build Coastguard Worker
2321*61046927SAndroid Build Coastguard Worker for (i = 0; i < 8; ++i)
2322*61046927SAndroid Build Coastguard Worker result.ref_pic_set_lt_curr[i] = IDXS(h265_pic_info->pStdPictureInfo->RefPicSetLtCurr[i]);
2323*61046927SAndroid Build Coastguard Worker
2324*61046927SAndroid Build Coastguard Worker const StdVideoH265ScalingLists *scaling_lists = NULL;
2325*61046927SAndroid Build Coastguard Worker if (pps->flags.pps_scaling_list_data_present_flag)
2326*61046927SAndroid Build Coastguard Worker scaling_lists = pps->pScalingLists;
2327*61046927SAndroid Build Coastguard Worker else if (sps->flags.sps_scaling_list_data_present_flag)
2328*61046927SAndroid Build Coastguard Worker scaling_lists = sps->pScalingLists;
2329*61046927SAndroid Build Coastguard Worker
2330*61046927SAndroid Build Coastguard Worker update_h265_scaling(it_ptr, scaling_lists);
2331*61046927SAndroid Build Coastguard Worker if (scaling_lists) {
2332*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS; ++i)
2333*61046927SAndroid Build Coastguard Worker result.ucScalingListDCCoefSizeID2[i] = scaling_lists->ScalingListDCCoef16x16[i];
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Worker for (i = 0; i < STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS; ++i)
2336*61046927SAndroid Build Coastguard Worker result.ucScalingListDCCoefSizeID3[i] = scaling_lists->ScalingListDCCoef32x32[i];
2337*61046927SAndroid Build Coastguard Worker }
2338*61046927SAndroid Build Coastguard Worker
2339*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
2340*61046927SAndroid Build Coastguard Worker for (j = 0; j < 15; j++)
2341*61046927SAndroid Build Coastguard Worker result.direct_reflist[i][j] = 0xff;
2342*61046927SAndroid Build Coastguard Worker }
2343*61046927SAndroid Build Coastguard Worker
2344*61046927SAndroid Build Coastguard Worker if (vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10) {
2345*61046927SAndroid Build Coastguard Worker if (vid->vk.picture_format == VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16) {
2346*61046927SAndroid Build Coastguard Worker result.p010_mode = 1;
2347*61046927SAndroid Build Coastguard Worker result.msb_mode = 1;
2348*61046927SAndroid Build Coastguard Worker } else {
2349*61046927SAndroid Build Coastguard Worker result.p010_mode = 0;
2350*61046927SAndroid Build Coastguard Worker result.luma_10to8 = 5;
2351*61046927SAndroid Build Coastguard Worker result.chroma_10to8 = 5;
2352*61046927SAndroid Build Coastguard Worker result.sclr_luma10to8 = 4;
2353*61046927SAndroid Build Coastguard Worker result.sclr_chroma10to8 = 4;
2354*61046927SAndroid Build Coastguard Worker }
2355*61046927SAndroid Build Coastguard Worker }
2356*61046927SAndroid Build Coastguard Worker
2357*61046927SAndroid Build Coastguard Worker return result;
2358*61046927SAndroid Build Coastguard Worker }
2359*61046927SAndroid Build Coastguard Worker
2360*61046927SAndroid Build Coastguard Worker static unsigned
texture_offset_legacy(struct radeon_surf * surface,unsigned layer)2361*61046927SAndroid Build Coastguard Worker texture_offset_legacy(struct radeon_surf *surface, unsigned layer)
2362*61046927SAndroid Build Coastguard Worker {
2363*61046927SAndroid Build Coastguard Worker return (uint64_t)surface->u.legacy.level[0].offset_256B * 256 +
2364*61046927SAndroid Build Coastguard Worker layer * (uint64_t)surface->u.legacy.level[0].slice_size_dw * 4;
2365*61046927SAndroid Build Coastguard Worker }
2366*61046927SAndroid Build Coastguard Worker
2367*61046927SAndroid Build Coastguard Worker static bool
ruvd_dec_message_decode(struct radv_device * device,struct radv_video_session * vid,struct radv_video_session_params * params,void * ptr,void * it_ptr,uint32_t * slice_offset,const struct VkVideoDecodeInfoKHR * frame_info)2368*61046927SAndroid Build Coastguard Worker ruvd_dec_message_decode(struct radv_device *device, struct radv_video_session *vid,
2369*61046927SAndroid Build Coastguard Worker struct radv_video_session_params *params, void *ptr, void *it_ptr, uint32_t *slice_offset,
2370*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeInfoKHR *frame_info)
2371*61046927SAndroid Build Coastguard Worker {
2372*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
2373*61046927SAndroid Build Coastguard Worker struct ruvd_msg *msg = ptr;
2374*61046927SAndroid Build Coastguard Worker struct radv_image_view *dst_iv = radv_image_view_from_handle(frame_info->dstPictureResource.imageViewBinding);
2375*61046927SAndroid Build Coastguard Worker struct radv_image *img = dst_iv->image;
2376*61046927SAndroid Build Coastguard Worker struct radv_image_plane *luma = &img->planes[0];
2377*61046927SAndroid Build Coastguard Worker struct radv_image_plane *chroma = &img->planes[1];
2378*61046927SAndroid Build Coastguard Worker struct radv_image_view *dpb_iv =
2379*61046927SAndroid Build Coastguard Worker radv_image_view_from_handle(frame_info->pSetupReferenceSlot->pPictureResource->imageViewBinding);
2380*61046927SAndroid Build Coastguard Worker struct radv_image *dpb = dpb_iv->image;
2381*61046927SAndroid Build Coastguard Worker
2382*61046927SAndroid Build Coastguard Worker memset(msg, 0, sizeof(struct ruvd_msg));
2383*61046927SAndroid Build Coastguard Worker msg->size = sizeof(*msg);
2384*61046927SAndroid Build Coastguard Worker msg->msg_type = RUVD_MSG_DECODE;
2385*61046927SAndroid Build Coastguard Worker msg->stream_handle = vid->stream_handle;
2386*61046927SAndroid Build Coastguard Worker msg->status_report_feedback_number = vid->dbg_frame_cnt++;
2387*61046927SAndroid Build Coastguard Worker
2388*61046927SAndroid Build Coastguard Worker msg->body.decode.stream_type = vid->stream_type;
2389*61046927SAndroid Build Coastguard Worker msg->body.decode.decode_flags = 0x1;
2390*61046927SAndroid Build Coastguard Worker msg->body.decode.width_in_samples = frame_info->dstPictureResource.codedExtent.width;
2391*61046927SAndroid Build Coastguard Worker msg->body.decode.height_in_samples = frame_info->dstPictureResource.codedExtent.height;
2392*61046927SAndroid Build Coastguard Worker
2393*61046927SAndroid Build Coastguard Worker msg->body.decode.dpb_size = (vid->dpb_type != DPB_DYNAMIC_TIER_2) ? dpb->size : 0;
2394*61046927SAndroid Build Coastguard Worker msg->body.decode.bsd_size = frame_info->srcBufferRange;
2395*61046927SAndroid Build Coastguard Worker msg->body.decode.db_pitch = align(frame_info->dstPictureResource.codedExtent.width, vid->db_alignment);
2396*61046927SAndroid Build Coastguard Worker
2397*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RUVD_CODEC_H264_PERF && pdev->info.family >= CHIP_POLARIS10)
2398*61046927SAndroid Build Coastguard Worker msg->body.decode.dpb_reserved = vid->ctx.size;
2399*61046927SAndroid Build Coastguard Worker
2400*61046927SAndroid Build Coastguard Worker *slice_offset = 0;
2401*61046927SAndroid Build Coastguard Worker switch (vid->vk.op) {
2402*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
2403*61046927SAndroid Build Coastguard Worker msg->body.decode.codec.h264 =
2404*61046927SAndroid Build Coastguard Worker get_uvd_h264_msg(vid, params, frame_info, slice_offset, &msg->body.decode.width_in_samples,
2405*61046927SAndroid Build Coastguard Worker &msg->body.decode.height_in_samples, it_ptr);
2406*61046927SAndroid Build Coastguard Worker break;
2407*61046927SAndroid Build Coastguard Worker }
2408*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
2409*61046927SAndroid Build Coastguard Worker msg->body.decode.codec.h265 = get_uvd_h265_msg(device, vid, params, frame_info,
2410*61046927SAndroid Build Coastguard Worker &msg->body.decode.width_in_samples,
2411*61046927SAndroid Build Coastguard Worker &msg->body.decode.height_in_samples,
2412*61046927SAndroid Build Coastguard Worker it_ptr);
2413*61046927SAndroid Build Coastguard Worker
2414*61046927SAndroid Build Coastguard Worker if (vid->ctx.mem)
2415*61046927SAndroid Build Coastguard Worker msg->body.decode.dpb_reserved = vid->ctx.size;
2416*61046927SAndroid Build Coastguard Worker break;
2417*61046927SAndroid Build Coastguard Worker }
2418*61046927SAndroid Build Coastguard Worker default:
2419*61046927SAndroid Build Coastguard Worker return false;
2420*61046927SAndroid Build Coastguard Worker }
2421*61046927SAndroid Build Coastguard Worker
2422*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_field_mode = false;
2423*61046927SAndroid Build Coastguard Worker
2424*61046927SAndroid Build Coastguard Worker if (pdev->info.gfx_level >= GFX9) {
2425*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_pitch = luma->surface.u.gfx9.surf_pitch * luma->surface.blk_w;
2426*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_tiling_mode = RUVD_TILE_LINEAR;
2427*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_array_mode = RUVD_ARRAY_MODE_LINEAR;
2428*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_top_offset = luma->surface.u.gfx9.surf_offset;
2429*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_top_offset = chroma->surface.u.gfx9.surf_offset;
2430*61046927SAndroid Build Coastguard Worker if (msg->body.decode.dt_field_mode) {
2431*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_bottom_offset =
2432*61046927SAndroid Build Coastguard Worker luma->surface.u.gfx9.surf_offset + luma->surface.u.gfx9.surf_slice_size;
2433*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_bottom_offset =
2434*61046927SAndroid Build Coastguard Worker chroma->surface.u.gfx9.surf_offset + chroma->surface.u.gfx9.surf_slice_size;
2435*61046927SAndroid Build Coastguard Worker } else {
2436*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_bottom_offset = msg->body.decode.dt_luma_top_offset;
2437*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_bottom_offset = msg->body.decode.dt_chroma_top_offset;
2438*61046927SAndroid Build Coastguard Worker }
2439*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_surf_tile_config = 0;
2440*61046927SAndroid Build Coastguard Worker } else {
2441*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_pitch = luma->surface.u.legacy.level[0].nblk_x * luma->surface.blk_w;
2442*61046927SAndroid Build Coastguard Worker switch (luma->surface.u.legacy.level[0].mode) {
2443*61046927SAndroid Build Coastguard Worker case RADEON_SURF_MODE_LINEAR_ALIGNED:
2444*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_tiling_mode = RUVD_TILE_LINEAR;
2445*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_array_mode = RUVD_ARRAY_MODE_LINEAR;
2446*61046927SAndroid Build Coastguard Worker break;
2447*61046927SAndroid Build Coastguard Worker case RADEON_SURF_MODE_1D:
2448*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_tiling_mode = RUVD_TILE_8X8;
2449*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_array_mode = RUVD_ARRAY_MODE_1D_THIN;
2450*61046927SAndroid Build Coastguard Worker break;
2451*61046927SAndroid Build Coastguard Worker case RADEON_SURF_MODE_2D:
2452*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_tiling_mode = RUVD_TILE_8X8;
2453*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_array_mode = RUVD_ARRAY_MODE_2D_THIN;
2454*61046927SAndroid Build Coastguard Worker break;
2455*61046927SAndroid Build Coastguard Worker default:
2456*61046927SAndroid Build Coastguard Worker assert(0);
2457*61046927SAndroid Build Coastguard Worker break;
2458*61046927SAndroid Build Coastguard Worker }
2459*61046927SAndroid Build Coastguard Worker
2460*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_top_offset = texture_offset_legacy(&luma->surface, 0);
2461*61046927SAndroid Build Coastguard Worker if (chroma)
2462*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_top_offset = texture_offset_legacy(&chroma->surface, 0);
2463*61046927SAndroid Build Coastguard Worker if (msg->body.decode.dt_field_mode) {
2464*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_bottom_offset = texture_offset_legacy(&luma->surface, 1);
2465*61046927SAndroid Build Coastguard Worker if (chroma)
2466*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_bottom_offset = texture_offset_legacy(&chroma->surface, 1);
2467*61046927SAndroid Build Coastguard Worker } else {
2468*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_luma_bottom_offset = msg->body.decode.dt_luma_top_offset;
2469*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_chroma_bottom_offset = msg->body.decode.dt_chroma_top_offset;
2470*61046927SAndroid Build Coastguard Worker }
2471*61046927SAndroid Build Coastguard Worker
2472*61046927SAndroid Build Coastguard Worker if (chroma) {
2473*61046927SAndroid Build Coastguard Worker assert(luma->surface.u.legacy.bankw == chroma->surface.u.legacy.bankw);
2474*61046927SAndroid Build Coastguard Worker assert(luma->surface.u.legacy.bankh == chroma->surface.u.legacy.bankh);
2475*61046927SAndroid Build Coastguard Worker assert(luma->surface.u.legacy.mtilea == chroma->surface.u.legacy.mtilea);
2476*61046927SAndroid Build Coastguard Worker }
2477*61046927SAndroid Build Coastguard Worker
2478*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_surf_tile_config |= RUVD_BANK_WIDTH(util_logbase2(luma->surface.u.legacy.bankw));
2479*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_surf_tile_config |= RUVD_BANK_HEIGHT(util_logbase2(luma->surface.u.legacy.bankh));
2480*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_surf_tile_config |=
2481*61046927SAndroid Build Coastguard Worker RUVD_MACRO_TILE_ASPECT_RATIO(util_logbase2(luma->surface.u.legacy.mtilea));
2482*61046927SAndroid Build Coastguard Worker }
2483*61046927SAndroid Build Coastguard Worker
2484*61046927SAndroid Build Coastguard Worker if (pdev->info.family >= CHIP_STONEY)
2485*61046927SAndroid Build Coastguard Worker msg->body.decode.dt_wa_chroma_top_offset = msg->body.decode.dt_pitch / 2;
2486*61046927SAndroid Build Coastguard Worker
2487*61046927SAndroid Build Coastguard Worker msg->body.decode.db_surf_tile_config = msg->body.decode.dt_surf_tile_config;
2488*61046927SAndroid Build Coastguard Worker msg->body.decode.extension_support = 0x1;
2489*61046927SAndroid Build Coastguard Worker
2490*61046927SAndroid Build Coastguard Worker return true;
2491*61046927SAndroid Build Coastguard Worker }
2492*61046927SAndroid Build Coastguard Worker
2493*61046927SAndroid Build Coastguard Worker static void
ruvd_dec_message_create(struct radv_video_session * vid,void * ptr)2494*61046927SAndroid Build Coastguard Worker ruvd_dec_message_create(struct radv_video_session *vid, void *ptr)
2495*61046927SAndroid Build Coastguard Worker {
2496*61046927SAndroid Build Coastguard Worker struct ruvd_msg *msg = ptr;
2497*61046927SAndroid Build Coastguard Worker
2498*61046927SAndroid Build Coastguard Worker memset(ptr, 0, sizeof(*msg));
2499*61046927SAndroid Build Coastguard Worker msg->size = sizeof(*msg);
2500*61046927SAndroid Build Coastguard Worker msg->msg_type = RUVD_MSG_CREATE;
2501*61046927SAndroid Build Coastguard Worker msg->stream_handle = vid->stream_handle;
2502*61046927SAndroid Build Coastguard Worker msg->body.create.stream_type = vid->stream_type;
2503*61046927SAndroid Build Coastguard Worker msg->body.create.width_in_samples = vid->vk.max_coded.width;
2504*61046927SAndroid Build Coastguard Worker msg->body.create.height_in_samples = vid->vk.max_coded.height;
2505*61046927SAndroid Build Coastguard Worker }
2506*61046927SAndroid Build Coastguard Worker
2507*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_CmdBeginVideoCodingKHR(VkCommandBuffer commandBuffer,const VkVideoBeginCodingInfoKHR * pBeginInfo)2508*61046927SAndroid Build Coastguard Worker radv_CmdBeginVideoCodingKHR(VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR *pBeginInfo)
2509*61046927SAndroid Build Coastguard Worker {
2510*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
2511*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session, vid, pBeginInfo->videoSession);
2512*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_video_session_params, params, pBeginInfo->videoSessionParameters);
2513*61046927SAndroid Build Coastguard Worker
2514*61046927SAndroid Build Coastguard Worker cmd_buffer->video.vid = vid;
2515*61046927SAndroid Build Coastguard Worker cmd_buffer->video.params = params;
2516*61046927SAndroid Build Coastguard Worker
2517*61046927SAndroid Build Coastguard Worker if (vid->encode)
2518*61046927SAndroid Build Coastguard Worker radv_video_enc_begin_coding(cmd_buffer);
2519*61046927SAndroid Build Coastguard Worker }
2520*61046927SAndroid Build Coastguard Worker
2521*61046927SAndroid Build Coastguard Worker static void
radv_vcn_cmd_reset(struct radv_cmd_buffer * cmd_buffer)2522*61046927SAndroid Build Coastguard Worker radv_vcn_cmd_reset(struct radv_cmd_buffer *cmd_buffer)
2523*61046927SAndroid Build Coastguard Worker {
2524*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2525*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
2526*61046927SAndroid Build Coastguard Worker struct radv_video_session *vid = cmd_buffer->video.vid;
2527*61046927SAndroid Build Coastguard Worker uint32_t size = sizeof(rvcn_dec_message_header_t) + sizeof(rvcn_dec_message_create_t);
2528*61046927SAndroid Build Coastguard Worker
2529*61046927SAndroid Build Coastguard Worker void *ptr;
2530*61046927SAndroid Build Coastguard Worker uint32_t out_offset;
2531*61046927SAndroid Build Coastguard Worker
2532*61046927SAndroid Build Coastguard Worker if (vid->stream_type == RDECODE_CODEC_AV1) {
2533*61046927SAndroid Build Coastguard Worker uint8_t *ctxptr = radv_buffer_map(device->ws, vid->ctx.mem->bo);
2534*61046927SAndroid Build Coastguard Worker ctxptr += vid->ctx.offset;
2535*61046927SAndroid Build Coastguard Worker ac_vcn_av1_init_probs(pdev->av1_version, ctxptr);
2536*61046927SAndroid Build Coastguard Worker device->ws->buffer_unmap(device->ws, vid->ctx.mem->bo, false);
2537*61046927SAndroid Build Coastguard Worker }
2538*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr);
2539*61046927SAndroid Build Coastguard Worker
2540*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip == AMD_IP_VCN_UNIFIED)
2541*61046927SAndroid Build Coastguard Worker radv_vcn_sq_start(cmd_buffer);
2542*61046927SAndroid Build Coastguard Worker
2543*61046927SAndroid Build Coastguard Worker rvcn_dec_message_create(vid, ptr, size);
2544*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_SESSION_CONTEXT_BUFFER, vid->sessionctx.mem->bo, vid->sessionctx.offset);
2545*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_MSG_BUFFER, cmd_buffer->upload.upload_bo, out_offset);
2546*61046927SAndroid Build Coastguard Worker /* pad out the IB to the 16 dword boundary - otherwise the fw seems to be unhappy */
2547*61046927SAndroid Build Coastguard Worker
2548*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip != AMD_IP_VCN_UNIFIED) {
2549*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, 8);
2550*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < 8; i++)
2551*61046927SAndroid Build Coastguard Worker radeon_emit(cmd_buffer->cs, 0x81ff);
2552*61046927SAndroid Build Coastguard Worker } else
2553*61046927SAndroid Build Coastguard Worker radv_vcn_sq_tail(cmd_buffer->cs, &cmd_buffer->video.sq);
2554*61046927SAndroid Build Coastguard Worker }
2555*61046927SAndroid Build Coastguard Worker
2556*61046927SAndroid Build Coastguard Worker static void
radv_uvd_cmd_reset(struct radv_cmd_buffer * cmd_buffer)2557*61046927SAndroid Build Coastguard Worker radv_uvd_cmd_reset(struct radv_cmd_buffer *cmd_buffer)
2558*61046927SAndroid Build Coastguard Worker {
2559*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2560*61046927SAndroid Build Coastguard Worker struct radv_video_session *vid = cmd_buffer->video.vid;
2561*61046927SAndroid Build Coastguard Worker uint32_t size = sizeof(struct ruvd_msg);
2562*61046927SAndroid Build Coastguard Worker void *ptr;
2563*61046927SAndroid Build Coastguard Worker uint32_t out_offset;
2564*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr);
2565*61046927SAndroid Build Coastguard Worker
2566*61046927SAndroid Build Coastguard Worker ruvd_dec_message_create(vid, ptr);
2567*61046927SAndroid Build Coastguard Worker if (vid->sessionctx.mem)
2568*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_SESSION_CONTEXT_BUFFER, vid->sessionctx.mem->bo, vid->sessionctx.offset);
2569*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_MSG_BUFFER, cmd_buffer->upload.upload_bo, out_offset);
2570*61046927SAndroid Build Coastguard Worker
2571*61046927SAndroid Build Coastguard Worker /* pad out the IB to the 16 dword boundary - otherwise the fw seems to be unhappy */
2572*61046927SAndroid Build Coastguard Worker int padsize = vid->sessionctx.mem ? 4 : 6;
2573*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, padsize);
2574*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < padsize; i++)
2575*61046927SAndroid Build Coastguard Worker radeon_emit(cmd_buffer->cs, PKT2_NOP_PAD);
2576*61046927SAndroid Build Coastguard Worker }
2577*61046927SAndroid Build Coastguard Worker
2578*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_CmdControlVideoCodingKHR(VkCommandBuffer commandBuffer,const VkVideoCodingControlInfoKHR * pCodingControlInfo)2579*61046927SAndroid Build Coastguard Worker radv_CmdControlVideoCodingKHR(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR *pCodingControlInfo)
2580*61046927SAndroid Build Coastguard Worker {
2581*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
2582*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2583*61046927SAndroid Build Coastguard Worker struct radv_physical_device *pdev = radv_device_physical(device);
2584*61046927SAndroid Build Coastguard Worker
2585*61046927SAndroid Build Coastguard Worker if (cmd_buffer->video.vid->encode) {
2586*61046927SAndroid Build Coastguard Worker radv_video_enc_control_video_coding(cmd_buffer, pCodingControlInfo);
2587*61046927SAndroid Build Coastguard Worker return;
2588*61046927SAndroid Build Coastguard Worker }
2589*61046927SAndroid Build Coastguard Worker if (pCodingControlInfo->flags & VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR) {
2590*61046927SAndroid Build Coastguard Worker if (radv_has_uvd(pdev))
2591*61046927SAndroid Build Coastguard Worker radv_uvd_cmd_reset(cmd_buffer);
2592*61046927SAndroid Build Coastguard Worker else
2593*61046927SAndroid Build Coastguard Worker radv_vcn_cmd_reset(cmd_buffer);
2594*61046927SAndroid Build Coastguard Worker }
2595*61046927SAndroid Build Coastguard Worker }
2596*61046927SAndroid Build Coastguard Worker
2597*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_CmdEndVideoCodingKHR(VkCommandBuffer commandBuffer,const VkVideoEndCodingInfoKHR * pEndCodingInfo)2598*61046927SAndroid Build Coastguard Worker radv_CmdEndVideoCodingKHR(VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR *pEndCodingInfo)
2599*61046927SAndroid Build Coastguard Worker {
2600*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
2601*61046927SAndroid Build Coastguard Worker
2602*61046927SAndroid Build Coastguard Worker if (cmd_buffer->video.vid->encode) {
2603*61046927SAndroid Build Coastguard Worker radv_video_enc_end_coding(cmd_buffer);
2604*61046927SAndroid Build Coastguard Worker return;
2605*61046927SAndroid Build Coastguard Worker }
2606*61046927SAndroid Build Coastguard Worker }
2607*61046927SAndroid Build Coastguard Worker
2608*61046927SAndroid Build Coastguard Worker static void
radv_uvd_decode_video(struct radv_cmd_buffer * cmd_buffer,const VkVideoDecodeInfoKHR * frame_info)2609*61046927SAndroid Build Coastguard Worker radv_uvd_decode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoDecodeInfoKHR *frame_info)
2610*61046927SAndroid Build Coastguard Worker {
2611*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_buffer, src_buffer, frame_info->srcBuffer);
2612*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2613*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
2614*61046927SAndroid Build Coastguard Worker struct radv_video_session *vid = cmd_buffer->video.vid;
2615*61046927SAndroid Build Coastguard Worker struct radv_video_session_params *params = cmd_buffer->video.params;
2616*61046927SAndroid Build Coastguard Worker unsigned size = sizeof(struct ruvd_msg);
2617*61046927SAndroid Build Coastguard Worker void *ptr, *fb_ptr, *it_probs_ptr = NULL;
2618*61046927SAndroid Build Coastguard Worker uint32_t out_offset, fb_offset, it_probs_offset = 0;
2619*61046927SAndroid Build Coastguard Worker struct radeon_winsys_bo *msg_bo, *fb_bo, *it_probs_bo = NULL;
2620*61046927SAndroid Build Coastguard Worker unsigned fb_size = (pdev->info.family == CHIP_TONGA) ? FB_BUFFER_SIZE_TONGA : FB_BUFFER_SIZE;
2621*61046927SAndroid Build Coastguard Worker
2622*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, fb_size, &fb_offset, &fb_ptr);
2623*61046927SAndroid Build Coastguard Worker fb_bo = cmd_buffer->upload.upload_bo;
2624*61046927SAndroid Build Coastguard Worker if (have_it(vid)) {
2625*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, IT_SCALING_TABLE_SIZE, &it_probs_offset, &it_probs_ptr);
2626*61046927SAndroid Build Coastguard Worker it_probs_bo = cmd_buffer->upload.upload_bo;
2627*61046927SAndroid Build Coastguard Worker }
2628*61046927SAndroid Build Coastguard Worker
2629*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr);
2630*61046927SAndroid Build Coastguard Worker msg_bo = cmd_buffer->upload.upload_bo;
2631*61046927SAndroid Build Coastguard Worker
2632*61046927SAndroid Build Coastguard Worker uint32_t slice_offset;
2633*61046927SAndroid Build Coastguard Worker ruvd_dec_message_decode(device, vid, params, ptr, it_probs_ptr, &slice_offset, frame_info);
2634*61046927SAndroid Build Coastguard Worker rvcn_dec_message_feedback(fb_ptr);
2635*61046927SAndroid Build Coastguard Worker if (vid->sessionctx.mem)
2636*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_SESSION_CONTEXT_BUFFER, vid->sessionctx.mem->bo, vid->sessionctx.offset);
2637*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_MSG_BUFFER, msg_bo, out_offset);
2638*61046927SAndroid Build Coastguard Worker
2639*61046927SAndroid Build Coastguard Worker if (vid->dpb_type != DPB_DYNAMIC_TIER_2) {
2640*61046927SAndroid Build Coastguard Worker struct radv_image_view *dpb_iv =
2641*61046927SAndroid Build Coastguard Worker radv_image_view_from_handle(frame_info->pSetupReferenceSlot->pPictureResource->imageViewBinding);
2642*61046927SAndroid Build Coastguard Worker struct radv_image *dpb = dpb_iv->image;
2643*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_DPB_BUFFER, dpb->bindings[0].bo, dpb->bindings[0].offset);
2644*61046927SAndroid Build Coastguard Worker }
2645*61046927SAndroid Build Coastguard Worker
2646*61046927SAndroid Build Coastguard Worker if (vid->ctx.mem)
2647*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_CONTEXT_BUFFER, vid->ctx.mem->bo, vid->ctx.offset);
2648*61046927SAndroid Build Coastguard Worker
2649*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_BITSTREAM_BUFFER, src_buffer->bo,
2650*61046927SAndroid Build Coastguard Worker src_buffer->offset + frame_info->srcBufferOffset + slice_offset);
2651*61046927SAndroid Build Coastguard Worker
2652*61046927SAndroid Build Coastguard Worker struct radv_image_view *dst_iv = radv_image_view_from_handle(frame_info->dstPictureResource.imageViewBinding);
2653*61046927SAndroid Build Coastguard Worker struct radv_image *img = dst_iv->image;
2654*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_DECODING_TARGET_BUFFER, img->bindings[0].bo, img->bindings[0].offset);
2655*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_FEEDBACK_BUFFER, fb_bo, fb_offset);
2656*61046927SAndroid Build Coastguard Worker if (have_it(vid))
2657*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_IT_SCALING_TABLE_BUFFER, it_probs_bo, it_probs_offset);
2658*61046927SAndroid Build Coastguard Worker
2659*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, 2);
2660*61046927SAndroid Build Coastguard Worker set_reg(cmd_buffer, pdev->vid_dec_reg.cntl, 1);
2661*61046927SAndroid Build Coastguard Worker }
2662*61046927SAndroid Build Coastguard Worker
2663*61046927SAndroid Build Coastguard Worker static void
radv_vcn_decode_video(struct radv_cmd_buffer * cmd_buffer,const VkVideoDecodeInfoKHR * frame_info)2664*61046927SAndroid Build Coastguard Worker radv_vcn_decode_video(struct radv_cmd_buffer *cmd_buffer, const VkVideoDecodeInfoKHR *frame_info)
2665*61046927SAndroid Build Coastguard Worker {
2666*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_buffer, src_buffer, frame_info->srcBuffer);
2667*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2668*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
2669*61046927SAndroid Build Coastguard Worker struct radv_video_session *vid = cmd_buffer->video.vid;
2670*61046927SAndroid Build Coastguard Worker struct radv_video_session_params *params = cmd_buffer->video.params;
2671*61046927SAndroid Build Coastguard Worker unsigned size = 0;
2672*61046927SAndroid Build Coastguard Worker void *ptr, *fb_ptr, *it_probs_ptr = NULL;
2673*61046927SAndroid Build Coastguard Worker uint32_t out_offset, fb_offset, it_probs_offset = 0;
2674*61046927SAndroid Build Coastguard Worker struct radeon_winsys_bo *msg_bo, *fb_bo, *it_probs_bo = NULL;
2675*61046927SAndroid Build Coastguard Worker
2676*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_header_t); /* header */
2677*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_index_t); /* codec */
2678*61046927SAndroid Build Coastguard Worker if (vid->dpb_type == DPB_DYNAMIC_TIER_2) {
2679*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_index_t);
2680*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_dynamic_dpb_t2_t);
2681*61046927SAndroid Build Coastguard Worker }
2682*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_decode_t); /* decode */
2683*61046927SAndroid Build Coastguard Worker switch (vid->vk.op) {
2684*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
2685*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_avc_t);
2686*61046927SAndroid Build Coastguard Worker break;
2687*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
2688*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_hevc_t);
2689*61046927SAndroid Build Coastguard Worker break;
2690*61046927SAndroid Build Coastguard Worker case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
2691*61046927SAndroid Build Coastguard Worker size += sizeof(rvcn_dec_message_av1_t);
2692*61046927SAndroid Build Coastguard Worker break;
2693*61046927SAndroid Build Coastguard Worker default:
2694*61046927SAndroid Build Coastguard Worker unreachable("unsupported codec.");
2695*61046927SAndroid Build Coastguard Worker }
2696*61046927SAndroid Build Coastguard Worker
2697*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, FB_BUFFER_SIZE, &fb_offset, &fb_ptr);
2698*61046927SAndroid Build Coastguard Worker fb_bo = cmd_buffer->upload.upload_bo;
2699*61046927SAndroid Build Coastguard Worker if (have_it(vid)) {
2700*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, IT_SCALING_TABLE_SIZE, &it_probs_offset, &it_probs_ptr);
2701*61046927SAndroid Build Coastguard Worker it_probs_bo = cmd_buffer->upload.upload_bo;
2702*61046927SAndroid Build Coastguard Worker } else if (have_probs(vid)) {
2703*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, sizeof(rvcn_dec_av1_segment_fg_t), &it_probs_offset, &it_probs_ptr);
2704*61046927SAndroid Build Coastguard Worker it_probs_bo = cmd_buffer->upload.upload_bo;
2705*61046927SAndroid Build Coastguard Worker }
2706*61046927SAndroid Build Coastguard Worker
2707*61046927SAndroid Build Coastguard Worker radv_vid_buffer_upload_alloc(cmd_buffer, size, &out_offset, &ptr);
2708*61046927SAndroid Build Coastguard Worker msg_bo = cmd_buffer->upload.upload_bo;
2709*61046927SAndroid Build Coastguard Worker
2710*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip == AMD_IP_VCN_UNIFIED)
2711*61046927SAndroid Build Coastguard Worker radv_vcn_sq_start(cmd_buffer);
2712*61046927SAndroid Build Coastguard Worker
2713*61046927SAndroid Build Coastguard Worker uint32_t slice_offset;
2714*61046927SAndroid Build Coastguard Worker rvcn_dec_message_decode(cmd_buffer, vid, params, ptr, it_probs_ptr, &slice_offset, frame_info);
2715*61046927SAndroid Build Coastguard Worker rvcn_dec_message_feedback(fb_ptr);
2716*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_SESSION_CONTEXT_BUFFER, vid->sessionctx.mem->bo, vid->sessionctx.offset);
2717*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_MSG_BUFFER, msg_bo, out_offset);
2718*61046927SAndroid Build Coastguard Worker
2719*61046927SAndroid Build Coastguard Worker if (vid->dpb_type != DPB_DYNAMIC_TIER_2) {
2720*61046927SAndroid Build Coastguard Worker struct radv_image_view *dpb_iv =
2721*61046927SAndroid Build Coastguard Worker radv_image_view_from_handle(frame_info->pSetupReferenceSlot->pPictureResource->imageViewBinding);
2722*61046927SAndroid Build Coastguard Worker struct radv_image *dpb = dpb_iv->image;
2723*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_DPB_BUFFER, dpb->bindings[0].bo, dpb->bindings[0].offset);
2724*61046927SAndroid Build Coastguard Worker }
2725*61046927SAndroid Build Coastguard Worker
2726*61046927SAndroid Build Coastguard Worker if (vid->ctx.mem)
2727*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_CONTEXT_BUFFER, vid->ctx.mem->bo, vid->ctx.offset);
2728*61046927SAndroid Build Coastguard Worker
2729*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_BITSTREAM_BUFFER, src_buffer->bo,
2730*61046927SAndroid Build Coastguard Worker src_buffer->offset + frame_info->srcBufferOffset + slice_offset);
2731*61046927SAndroid Build Coastguard Worker
2732*61046927SAndroid Build Coastguard Worker struct radv_image_view *dst_iv = radv_image_view_from_handle(frame_info->dstPictureResource.imageViewBinding);
2733*61046927SAndroid Build Coastguard Worker struct radv_image *img = dst_iv->image;
2734*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_DECODING_TARGET_BUFFER, img->bindings[0].bo, img->bindings[0].offset);
2735*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_FEEDBACK_BUFFER, fb_bo, fb_offset);
2736*61046927SAndroid Build Coastguard Worker if (have_it(vid))
2737*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_IT_SCALING_TABLE_BUFFER, it_probs_bo, it_probs_offset);
2738*61046927SAndroid Build Coastguard Worker else if (have_probs(vid))
2739*61046927SAndroid Build Coastguard Worker send_cmd(cmd_buffer, RDECODE_CMD_PROB_TBL_BUFFER, it_probs_bo, it_probs_offset);
2740*61046927SAndroid Build Coastguard Worker
2741*61046927SAndroid Build Coastguard Worker if (pdev->vid_decode_ip != AMD_IP_VCN_UNIFIED) {
2742*61046927SAndroid Build Coastguard Worker radeon_check_space(device->ws, cmd_buffer->cs, 2);
2743*61046927SAndroid Build Coastguard Worker set_reg(cmd_buffer, pdev->vid_dec_reg.cntl, 1);
2744*61046927SAndroid Build Coastguard Worker } else
2745*61046927SAndroid Build Coastguard Worker radv_vcn_sq_tail(cmd_buffer->cs, &cmd_buffer->video.sq);
2746*61046927SAndroid Build Coastguard Worker }
2747*61046927SAndroid Build Coastguard Worker
2748*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
radv_CmdDecodeVideoKHR(VkCommandBuffer commandBuffer,const VkVideoDecodeInfoKHR * frame_info)2749*61046927SAndroid Build Coastguard Worker radv_CmdDecodeVideoKHR(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR *frame_info)
2750*61046927SAndroid Build Coastguard Worker {
2751*61046927SAndroid Build Coastguard Worker VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
2752*61046927SAndroid Build Coastguard Worker struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
2753*61046927SAndroid Build Coastguard Worker struct radv_physical_device *pdev = radv_device_physical(device);
2754*61046927SAndroid Build Coastguard Worker
2755*61046927SAndroid Build Coastguard Worker if (radv_has_uvd(pdev))
2756*61046927SAndroid Build Coastguard Worker radv_uvd_decode_video(cmd_buffer, frame_info);
2757*61046927SAndroid Build Coastguard Worker else
2758*61046927SAndroid Build Coastguard Worker radv_vcn_decode_video(cmd_buffer, frame_info);
2759*61046927SAndroid Build Coastguard Worker }
2760*61046927SAndroid Build Coastguard Worker
2761*61046927SAndroid Build Coastguard Worker void
radv_video_get_profile_alignments(struct radv_physical_device * pdev,const VkVideoProfileListInfoKHR * profile_list,uint32_t * width_align_out,uint32_t * height_align_out)2762*61046927SAndroid Build Coastguard Worker radv_video_get_profile_alignments(struct radv_physical_device *pdev, const VkVideoProfileListInfoKHR *profile_list,
2763*61046927SAndroid Build Coastguard Worker uint32_t *width_align_out, uint32_t *height_align_out)
2764*61046927SAndroid Build Coastguard Worker {
2765*61046927SAndroid Build Coastguard Worker vk_video_get_profile_alignments(profile_list, width_align_out, height_align_out);
2766*61046927SAndroid Build Coastguard Worker bool is_h265_main_10 = false;
2767*61046927SAndroid Build Coastguard Worker
2768*61046927SAndroid Build Coastguard Worker if (profile_list) {
2769*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < profile_list->profileCount; i++) {
2770*61046927SAndroid Build Coastguard Worker if (profile_list->pProfiles[i].videoCodecOperation == VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) {
2771*61046927SAndroid Build Coastguard Worker const struct VkVideoDecodeH265ProfileInfoKHR *h265_profile =
2772*61046927SAndroid Build Coastguard Worker vk_find_struct_const(profile_list->pProfiles[i].pNext, VIDEO_DECODE_H265_PROFILE_INFO_KHR);
2773*61046927SAndroid Build Coastguard Worker if (h265_profile->stdProfileIdc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10)
2774*61046927SAndroid Build Coastguard Worker is_h265_main_10 = true;
2775*61046927SAndroid Build Coastguard Worker }
2776*61046927SAndroid Build Coastguard Worker }
2777*61046927SAndroid Build Coastguard Worker } else
2778*61046927SAndroid Build Coastguard Worker is_h265_main_10 = true;
2779*61046927SAndroid Build Coastguard Worker
2780*61046927SAndroid Build Coastguard Worker uint32_t db_alignment = radv_video_get_db_alignment(pdev, 64, is_h265_main_10);
2781*61046927SAndroid Build Coastguard Worker *width_align_out = MAX2(*width_align_out, db_alignment);
2782*61046927SAndroid Build Coastguard Worker *height_align_out = MAX2(*height_align_out, db_alignment);
2783*61046927SAndroid Build Coastguard Worker }
2784