xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_video.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Red Hat
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "vk_video/vulkan_video_codecs_common.h"
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker VkResult
anv_CreateVideoSessionKHR(VkDevice _device,const VkVideoSessionCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkVideoSessionKHR * pVideoSession)29*61046927SAndroid Build Coastguard Worker anv_CreateVideoSessionKHR(VkDevice _device,
30*61046927SAndroid Build Coastguard Worker                            const VkVideoSessionCreateInfoKHR *pCreateInfo,
31*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *pAllocator,
32*61046927SAndroid Build Coastguard Worker                            VkVideoSessionKHR *pVideoSession)
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker    struct anv_video_session *vid =
37*61046927SAndroid Build Coastguard Worker       vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*vid), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
38*61046927SAndroid Build Coastguard Worker    if (!vid)
39*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    memset(vid, 0, sizeof(struct anv_video_session));
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    VkResult result = vk_video_session_init(&device->vk,
44*61046927SAndroid Build Coastguard Worker                                            &vid->vk,
45*61046927SAndroid Build Coastguard Worker                                            pCreateInfo);
46*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
47*61046927SAndroid Build Coastguard Worker       vk_free2(&device->vk.alloc, pAllocator, vid);
48*61046927SAndroid Build Coastguard Worker       return result;
49*61046927SAndroid Build Coastguard Worker    }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    *pVideoSession = anv_video_session_to_handle(vid);
52*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
53*61046927SAndroid Build Coastguard Worker }
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker void
anv_DestroyVideoSessionKHR(VkDevice _device,VkVideoSessionKHR _session,const VkAllocationCallbacks * pAllocator)56*61046927SAndroid Build Coastguard Worker anv_DestroyVideoSessionKHR(VkDevice _device,
57*61046927SAndroid Build Coastguard Worker                            VkVideoSessionKHR _session,
58*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *pAllocator)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
61*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session, vid, _session);
62*61046927SAndroid Build Coastguard Worker    if (!_session)
63*61046927SAndroid Build Coastguard Worker       return;
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker    vk_object_base_finish(&vid->vk.base);
66*61046927SAndroid Build Coastguard Worker    vk_free2(&device->vk.alloc, pAllocator, vid);
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker VkResult
anv_CreateVideoSessionParametersKHR(VkDevice _device,const VkVideoSessionParametersCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkVideoSessionParametersKHR * pVideoSessionParameters)70*61046927SAndroid Build Coastguard Worker anv_CreateVideoSessionParametersKHR(VkDevice _device,
71*61046927SAndroid Build Coastguard Worker                                      const VkVideoSessionParametersCreateInfoKHR *pCreateInfo,
72*61046927SAndroid Build Coastguard Worker                                      const VkAllocationCallbacks *pAllocator,
73*61046927SAndroid Build Coastguard Worker                                      VkVideoSessionParametersKHR *pVideoSessionParameters)
74*61046927SAndroid Build Coastguard Worker {
75*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
76*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session, vid, pCreateInfo->videoSession);
77*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session_params, templ, pCreateInfo->videoSessionParametersTemplate);
78*61046927SAndroid Build Coastguard Worker    struct anv_video_session_params *params =
79*61046927SAndroid Build Coastguard Worker       vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*params), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
80*61046927SAndroid Build Coastguard Worker    if (!params)
81*61046927SAndroid Build Coastguard Worker       return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    VkResult result = vk_video_session_parameters_init(&device->vk,
84*61046927SAndroid Build Coastguard Worker                                                       &params->vk,
85*61046927SAndroid Build Coastguard Worker                                                       &vid->vk,
86*61046927SAndroid Build Coastguard Worker                                                       templ ? &templ->vk : NULL,
87*61046927SAndroid Build Coastguard Worker                                                       pCreateInfo);
88*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
89*61046927SAndroid Build Coastguard Worker       vk_free2(&device->vk.alloc, pAllocator, params);
90*61046927SAndroid Build Coastguard Worker       return result;
91*61046927SAndroid Build Coastguard Worker    }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    *pVideoSessionParameters = anv_video_session_params_to_handle(params);
94*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker void
anv_DestroyVideoSessionParametersKHR(VkDevice _device,VkVideoSessionParametersKHR _params,const VkAllocationCallbacks * pAllocator)98*61046927SAndroid Build Coastguard Worker anv_DestroyVideoSessionParametersKHR(VkDevice _device,
99*61046927SAndroid Build Coastguard Worker                                       VkVideoSessionParametersKHR _params,
100*61046927SAndroid Build Coastguard Worker                                       const VkAllocationCallbacks *pAllocator)
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
103*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session_params, params, _params);
104*61046927SAndroid Build Coastguard Worker    if (!_params)
105*61046927SAndroid Build Coastguard Worker       return;
106*61046927SAndroid Build Coastguard Worker    vk_video_session_parameters_finish(&device->vk, &params->vk);
107*61046927SAndroid Build Coastguard Worker    vk_free2(&device->vk.alloc, pAllocator, params);
108*61046927SAndroid Build Coastguard Worker }
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker VkResult
anv_GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice,const VkVideoProfileInfoKHR * pVideoProfile,VkVideoCapabilitiesKHR * pCapabilities)111*61046927SAndroid Build Coastguard Worker anv_GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice,
112*61046927SAndroid Build Coastguard Worker                                            const VkVideoProfileInfoKHR *pVideoProfile,
113*61046927SAndroid Build Coastguard Worker                                            VkVideoCapabilitiesKHR *pCapabilities)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice);
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker    pCapabilities->minBitstreamBufferOffsetAlignment = 32;
118*61046927SAndroid Build Coastguard Worker    pCapabilities->minBitstreamBufferSizeAlignment = 32;
119*61046927SAndroid Build Coastguard Worker    pCapabilities->maxCodedExtent.width = 4096;
120*61046927SAndroid Build Coastguard Worker    pCapabilities->maxCodedExtent.height = 4096;
121*61046927SAndroid Build Coastguard Worker    pCapabilities->flags = VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    struct VkVideoDecodeCapabilitiesKHR *dec_caps = (struct VkVideoDecodeCapabilitiesKHR *)
124*61046927SAndroid Build Coastguard Worker       vk_find_struct(pCapabilities->pNext, VIDEO_DECODE_CAPABILITIES_KHR);
125*61046927SAndroid Build Coastguard Worker    if (dec_caps)
126*61046927SAndroid Build Coastguard Worker       dec_caps->flags = VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    /* H264 allows different luma and chroma bit depths */
129*61046927SAndroid Build Coastguard Worker    if (pVideoProfile->lumaBitDepth != pVideoProfile->chromaBitDepth)
130*61046927SAndroid Build Coastguard Worker       return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    if (pVideoProfile->chromaSubsampling != VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR)
133*61046927SAndroid Build Coastguard Worker       return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    switch (pVideoProfile->videoCodecOperation) {
136*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: {
137*61046927SAndroid Build Coastguard Worker       struct VkVideoDecodeH264CapabilitiesKHR *ext = (struct VkVideoDecodeH264CapabilitiesKHR *)
138*61046927SAndroid Build Coastguard Worker          vk_find_struct(pCapabilities->pNext, VIDEO_DECODE_H264_CAPABILITIES_KHR);
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker       if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR)
141*61046927SAndroid Build Coastguard Worker          return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker       pCapabilities->maxDpbSlots = 17;
144*61046927SAndroid Build Coastguard Worker       pCapabilities->maxActiveReferencePictures = ANV_VIDEO_H264_MAX_NUM_REF_FRAME;
145*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.width = ANV_MB_WIDTH;
146*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.height = ANV_MB_HEIGHT;
147*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.width = ANV_MB_WIDTH;
148*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.height = ANV_MB_HEIGHT;
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker       ext->fieldOffsetGranularity.x = 0;
151*61046927SAndroid Build Coastguard Worker       ext->fieldOffsetGranularity.y = 0;
152*61046927SAndroid Build Coastguard Worker       ext->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_1;
153*61046927SAndroid Build Coastguard Worker       strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME);
154*61046927SAndroid Build Coastguard Worker       pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION;
155*61046927SAndroid Build Coastguard Worker       break;
156*61046927SAndroid Build Coastguard Worker    }
157*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: {
158*61046927SAndroid Build Coastguard Worker       struct VkVideoDecodeH265CapabilitiesKHR *ext = (struct VkVideoDecodeH265CapabilitiesKHR *)
159*61046927SAndroid Build Coastguard Worker          vk_find_struct(pCapabilities->pNext, VIDEO_DECODE_H265_CAPABILITIES_KHR);
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker       const struct VkVideoDecodeH265ProfileInfoKHR *h265_profile =
162*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pVideoProfile->pNext,
163*61046927SAndroid Build Coastguard Worker                               VIDEO_DECODE_H265_PROFILE_INFO_KHR);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker       /* No hardware supports the scc extension profile */
166*61046927SAndroid Build Coastguard Worker       if (h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN &&
167*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_10 &&
168*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE &&
169*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_FORMAT_RANGE_EXTENSIONS)
170*61046927SAndroid Build Coastguard Worker          return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker       /* Skylake only supports the main profile */
173*61046927SAndroid Build Coastguard Worker       if (h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN &&
174*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE &&
175*61046927SAndroid Build Coastguard Worker           pdevice->info.platform <= INTEL_PLATFORM_SKL)
176*61046927SAndroid Build Coastguard Worker          return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker       /* Gfx10 and under don't support the range extension profile */
179*61046927SAndroid Build Coastguard Worker       if (h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN &&
180*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_10 &&
181*61046927SAndroid Build Coastguard Worker           h265_profile->stdProfileIdc != STD_VIDEO_H265_PROFILE_IDC_MAIN_STILL_PICTURE &&
182*61046927SAndroid Build Coastguard Worker           pdevice->info.ver <= 10)
183*61046927SAndroid Build Coastguard Worker          return VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR;
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker       if (pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR &&
186*61046927SAndroid Build Coastguard Worker           pVideoProfile->lumaBitDepth != VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR)
187*61046927SAndroid Build Coastguard Worker          return VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR;
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.width = ANV_MAX_H265_CTB_SIZE;
190*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.height = ANV_MAX_H265_CTB_SIZE;
191*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.width = ANV_MAX_H265_CTB_SIZE;
192*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.height = ANV_MAX_H265_CTB_SIZE;
193*61046927SAndroid Build Coastguard Worker       pCapabilities->maxDpbSlots = ANV_VIDEO_H265_MAX_NUM_REF_FRAME;
194*61046927SAndroid Build Coastguard Worker       pCapabilities->maxActiveReferencePictures = ANV_VIDEO_H265_HCP_NUM_REF_FRAME;
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker       ext->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_6_2;
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker       strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME);
199*61046927SAndroid Build Coastguard Worker       pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION;
200*61046927SAndroid Build Coastguard Worker       break;
201*61046927SAndroid Build Coastguard Worker    }
202*61046927SAndroid Build Coastguard Worker    default:
203*61046927SAndroid Build Coastguard Worker       break;
204*61046927SAndroid Build Coastguard Worker    }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    struct VkVideoEncodeCapabilitiesKHR *enc_caps = (struct VkVideoEncodeCapabilitiesKHR *)
207*61046927SAndroid Build Coastguard Worker       vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_CAPABILITIES_KHR);
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    if (enc_caps) {
210*61046927SAndroid Build Coastguard Worker       enc_caps->flags = 0;
211*61046927SAndroid Build Coastguard Worker       enc_caps->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR;
212*61046927SAndroid Build Coastguard Worker       enc_caps->maxRateControlLayers = 1;
213*61046927SAndroid Build Coastguard Worker       enc_caps->maxQualityLevels = 1;
214*61046927SAndroid Build Coastguard Worker       enc_caps->encodeInputPictureGranularity.width = 32;
215*61046927SAndroid Build Coastguard Worker       enc_caps->encodeInputPictureGranularity.height = 32;
216*61046927SAndroid Build Coastguard Worker       enc_caps->supportedEncodeFeedbackFlags =
217*61046927SAndroid Build Coastguard Worker          VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR |
218*61046927SAndroid Build Coastguard Worker          VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
219*61046927SAndroid Build Coastguard Worker    }
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    switch (pVideoProfile->videoCodecOperation) {
222*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
223*61046927SAndroid Build Coastguard Worker       struct VkVideoEncodeH264CapabilitiesKHR *ext = (struct VkVideoEncodeH264CapabilitiesKHR *)
224*61046927SAndroid Build Coastguard Worker          vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_H264_CAPABILITIES_KHR);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker       if (ext) {
227*61046927SAndroid Build Coastguard Worker          ext->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR;
228*61046927SAndroid Build Coastguard Worker          ext->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_1;
229*61046927SAndroid Build Coastguard Worker          ext->maxSliceCount = 1;
230*61046927SAndroid Build Coastguard Worker          ext->maxPPictureL0ReferenceCount = 8;
231*61046927SAndroid Build Coastguard Worker          ext->maxBPictureL0ReferenceCount = 8;
232*61046927SAndroid Build Coastguard Worker          ext->maxL1ReferenceCount = 0;
233*61046927SAndroid Build Coastguard Worker          ext->maxTemporalLayerCount = 0;
234*61046927SAndroid Build Coastguard Worker          ext->expectDyadicTemporalLayerPattern = false;
235*61046927SAndroid Build Coastguard Worker          ext->prefersGopRemainingFrames = 0;
236*61046927SAndroid Build Coastguard Worker          ext->requiresGopRemainingFrames = 0;
237*61046927SAndroid Build Coastguard Worker          ext->minQp = 10;
238*61046927SAndroid Build Coastguard Worker          ext->maxQp = 51;
239*61046927SAndroid Build Coastguard Worker       }
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker       pCapabilities->minBitstreamBufferOffsetAlignment = 32;
242*61046927SAndroid Build Coastguard Worker       pCapabilities->minBitstreamBufferSizeAlignment = 4096;
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker       pCapabilities->maxDpbSlots = ANV_VIDEO_H264_MAX_NUM_REF_FRAME;
245*61046927SAndroid Build Coastguard Worker       pCapabilities->maxActiveReferencePictures = ANV_VIDEO_H264_MAX_NUM_REF_FRAME;
246*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.width = ANV_MB_WIDTH;
247*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.height = ANV_MB_HEIGHT;
248*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.width = ANV_MB_WIDTH;
249*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.height = ANV_MB_HEIGHT;
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker       strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME);
252*61046927SAndroid Build Coastguard Worker       pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION;
253*61046927SAndroid Build Coastguard Worker       break;
254*61046927SAndroid Build Coastguard Worker    }
255*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
256*61046927SAndroid Build Coastguard Worker       struct VkVideoEncodeH265CapabilitiesKHR *ext = (struct VkVideoEncodeH265CapabilitiesKHR *)
257*61046927SAndroid Build Coastguard Worker          vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_H265_CAPABILITIES_KHR);
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker       if (ext) {
260*61046927SAndroid Build Coastguard Worker          ext->flags = 0;
261*61046927SAndroid Build Coastguard Worker          ext->maxLevelIdc = STD_VIDEO_H265_LEVEL_IDC_5_1;
262*61046927SAndroid Build Coastguard Worker          ext->ctbSizes = VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR;
263*61046927SAndroid Build Coastguard Worker          ext->transformBlockSizes = VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR |
264*61046927SAndroid Build Coastguard Worker                                     VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR |
265*61046927SAndroid Build Coastguard Worker                                     VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR |
266*61046927SAndroid Build Coastguard Worker                                     VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR;
267*61046927SAndroid Build Coastguard Worker          ext->maxPPictureL0ReferenceCount = 8;
268*61046927SAndroid Build Coastguard Worker          ext->maxBPictureL0ReferenceCount = 8;
269*61046927SAndroid Build Coastguard Worker          ext->maxL1ReferenceCount = 1;
270*61046927SAndroid Build Coastguard Worker          ext->minQp = 10;
271*61046927SAndroid Build Coastguard Worker          ext->maxQp = 51;
272*61046927SAndroid Build Coastguard Worker          ext->maxSliceSegmentCount = 128;
273*61046927SAndroid Build Coastguard Worker          ext->maxTiles.width = 1;
274*61046927SAndroid Build Coastguard Worker          ext->maxTiles.height = 1;
275*61046927SAndroid Build Coastguard Worker          ext->maxSubLayerCount = 1;
276*61046927SAndroid Build Coastguard Worker          ext->expectDyadicTemporalSubLayerPattern = false;
277*61046927SAndroid Build Coastguard Worker          ext->prefersGopRemainingFrames = 0;
278*61046927SAndroid Build Coastguard Worker          ext->requiresGopRemainingFrames = 0;
279*61046927SAndroid Build Coastguard Worker       }
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker       pCapabilities->minBitstreamBufferOffsetAlignment = 4096;
282*61046927SAndroid Build Coastguard Worker       pCapabilities->minBitstreamBufferSizeAlignment = 4096;
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker       pCapabilities->maxDpbSlots = ANV_VIDEO_H265_MAX_NUM_REF_FRAME;
285*61046927SAndroid Build Coastguard Worker       pCapabilities->maxActiveReferencePictures = ANV_VIDEO_H265_MAX_NUM_REF_FRAME;
286*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.width = ANV_MAX_H265_CTB_SIZE;
287*61046927SAndroid Build Coastguard Worker       pCapabilities->pictureAccessGranularity.height = ANV_MAX_H265_CTB_SIZE;
288*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.width = ANV_MAX_H265_CTB_SIZE;
289*61046927SAndroid Build Coastguard Worker       pCapabilities->minCodedExtent.height = ANV_MAX_H265_CTB_SIZE;
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker       strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME);
292*61046927SAndroid Build Coastguard Worker       pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION;
293*61046927SAndroid Build Coastguard Worker       break;
294*61046927SAndroid Build Coastguard Worker    }
295*61046927SAndroid Build Coastguard Worker    default:
296*61046927SAndroid Build Coastguard Worker       break;
297*61046927SAndroid Build Coastguard Worker    }
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
300*61046927SAndroid Build Coastguard Worker }
301*61046927SAndroid Build Coastguard Worker 
302*61046927SAndroid Build Coastguard Worker VkResult
anv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceVideoFormatInfoKHR * pVideoFormatInfo,uint32_t * pVideoFormatPropertyCount,VkVideoFormatPropertiesKHR * pVideoFormatProperties)303*61046927SAndroid Build Coastguard Worker anv_GetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice,
304*61046927SAndroid Build Coastguard Worker                                                const VkPhysicalDeviceVideoFormatInfoKHR *pVideoFormatInfo,
305*61046927SAndroid Build Coastguard Worker                                                uint32_t *pVideoFormatPropertyCount,
306*61046927SAndroid Build Coastguard Worker                                                VkVideoFormatPropertiesKHR *pVideoFormatProperties)
307*61046927SAndroid Build Coastguard Worker {
308*61046927SAndroid Build Coastguard Worker    VK_OUTARRAY_MAKE_TYPED(VkVideoFormatPropertiesKHR, out,
309*61046927SAndroid Build Coastguard Worker                           pVideoFormatProperties,
310*61046927SAndroid Build Coastguard Worker                           pVideoFormatPropertyCount);
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    bool need_10bit = false;
313*61046927SAndroid Build Coastguard Worker    const struct VkVideoProfileListInfoKHR *prof_list = (struct VkVideoProfileListInfoKHR *)
314*61046927SAndroid Build Coastguard Worker       vk_find_struct_const(pVideoFormatInfo->pNext, VIDEO_PROFILE_LIST_INFO_KHR);
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    if (prof_list) {
317*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < prof_list->profileCount; i++) {
318*61046927SAndroid Build Coastguard Worker          const VkVideoProfileInfoKHR *profile = &prof_list->pProfiles[i];
319*61046927SAndroid Build Coastguard Worker          if (profile->lumaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR ||
320*61046927SAndroid Build Coastguard Worker              profile->chromaBitDepth & VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR)
321*61046927SAndroid Build Coastguard Worker             need_10bit = true;
322*61046927SAndroid Build Coastguard Worker       }
323*61046927SAndroid Build Coastguard Worker    }
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker    vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p) {
326*61046927SAndroid Build Coastguard Worker       p->format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
327*61046927SAndroid Build Coastguard Worker       p->imageType = VK_IMAGE_TYPE_2D;
328*61046927SAndroid Build Coastguard Worker       p->imageTiling = VK_IMAGE_TILING_OPTIMAL;
329*61046927SAndroid Build Coastguard Worker       p->imageUsageFlags = pVideoFormatInfo->imageUsage;
330*61046927SAndroid Build Coastguard Worker    }
331*61046927SAndroid Build Coastguard Worker 
332*61046927SAndroid Build Coastguard Worker    if (need_10bit) {
333*61046927SAndroid Build Coastguard Worker       vk_outarray_append_typed(VkVideoFormatPropertiesKHR, &out, p) {
334*61046927SAndroid Build Coastguard Worker          p->format = VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16;
335*61046927SAndroid Build Coastguard Worker          p->imageType = VK_IMAGE_TYPE_2D;
336*61046927SAndroid Build Coastguard Worker          p->imageTiling = VK_IMAGE_TILING_OPTIMAL;
337*61046927SAndroid Build Coastguard Worker          p->imageUsageFlags = pVideoFormatInfo->imageUsage;
338*61046927SAndroid Build Coastguard Worker       }
339*61046927SAndroid Build Coastguard Worker    }
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker    return vk_outarray_status(&out);
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker 
344*61046927SAndroid Build Coastguard Worker static uint64_t
get_h264_video_mem_size(struct anv_video_session * vid,uint32_t mem_idx)345*61046927SAndroid Build Coastguard Worker get_h264_video_mem_size(struct anv_video_session *vid, uint32_t mem_idx)
346*61046927SAndroid Build Coastguard Worker {
347*61046927SAndroid Build Coastguard Worker    uint32_t width_in_mb =
348*61046927SAndroid Build Coastguard Worker       align(vid->vk.max_coded.width, ANV_MB_WIDTH) / ANV_MB_WIDTH;
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    switch (mem_idx) {
351*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H264_INTRA_ROW_STORE:
352*61046927SAndroid Build Coastguard Worker       return width_in_mb * 64;
353*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H264_DEBLOCK_FILTER_ROW_STORE:
354*61046927SAndroid Build Coastguard Worker       return width_in_mb * 64 * 4;
355*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H264_BSD_MPC_ROW_SCRATCH:
356*61046927SAndroid Build Coastguard Worker       return width_in_mb * 64 * 2;
357*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H264_MPR_ROW_SCRATCH:
358*61046927SAndroid Build Coastguard Worker       return width_in_mb * 64 * 2;
359*61046927SAndroid Build Coastguard Worker    default:
360*61046927SAndroid Build Coastguard Worker       unreachable("unknown memory");
361*61046927SAndroid Build Coastguard Worker    }
362*61046927SAndroid Build Coastguard Worker }
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker static uint64_t
get_h265_video_mem_size(struct anv_video_session * vid,uint32_t mem_idx)365*61046927SAndroid Build Coastguard Worker get_h265_video_mem_size(struct anv_video_session *vid, uint32_t mem_idx)
366*61046927SAndroid Build Coastguard Worker {
367*61046927SAndroid Build Coastguard Worker    uint32_t bit_shift =
368*61046927SAndroid Build Coastguard Worker       vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10 ? 2 : 3;
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker    /* TODO. these sizes can be determined dynamically depending on ctb sizes of each slice. */
371*61046927SAndroid Build Coastguard Worker    uint32_t width_in_ctb =
372*61046927SAndroid Build Coastguard Worker       align(vid->vk.max_coded.width, ANV_MAX_H265_CTB_SIZE) / ANV_MAX_H265_CTB_SIZE;
373*61046927SAndroid Build Coastguard Worker    uint32_t height_in_ctb =
374*61046927SAndroid Build Coastguard Worker       align(vid->vk.max_coded.height, ANV_MAX_H265_CTB_SIZE) / ANV_MAX_H265_CTB_SIZE;
375*61046927SAndroid Build Coastguard Worker    uint64_t size;
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker    switch (mem_idx) {
378*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_LINE:
379*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_TILE_LINE:
380*61046927SAndroid Build Coastguard Worker       size = align(vid->vk.max_coded.width, 32) >> bit_shift;
381*61046927SAndroid Build Coastguard Worker       break;
382*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_TILE_COLUMN:
383*61046927SAndroid Build Coastguard Worker       size = align(vid->vk.max_coded.height + 6 * height_in_ctb, 32) >> bit_shift;
384*61046927SAndroid Build Coastguard Worker       break;
385*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_METADATA_LINE:
386*61046927SAndroid Build Coastguard Worker       size = (((vid->vk.max_coded.width + 15) >> 4) * 188 + width_in_ctb * 9 + 1023) >> 9;
387*61046927SAndroid Build Coastguard Worker       break;
388*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_METADATA_TILE_LINE:
389*61046927SAndroid Build Coastguard Worker       size = (((vid->vk.max_coded.width + 15) >> 4) * 172 + width_in_ctb * 9 + 1023) >> 9;
390*61046927SAndroid Build Coastguard Worker       break;
391*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_METADATA_TILE_COLUMN:
392*61046927SAndroid Build Coastguard Worker       size = (((vid->vk.max_coded.height + 15) >> 4) * 176 + height_in_ctb * 89 + 1023) >> 9;
393*61046927SAndroid Build Coastguard Worker       break;
394*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_SAO_LINE:
395*61046927SAndroid Build Coastguard Worker       size = align((vid->vk.max_coded.width >> 1) + width_in_ctb * 3, 16) >> bit_shift;
396*61046927SAndroid Build Coastguard Worker       break;
397*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_SAO_TILE_LINE:
398*61046927SAndroid Build Coastguard Worker       size = align((vid->vk.max_coded.width >> 1) + width_in_ctb * 6, 16) >> bit_shift;
399*61046927SAndroid Build Coastguard Worker       break;
400*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_SAO_TILE_COLUMN:
401*61046927SAndroid Build Coastguard Worker       size = align((vid->vk.max_coded.height >> 1) + height_in_ctb * 6, 16) >> bit_shift;
402*61046927SAndroid Build Coastguard Worker       break;
403*61046927SAndroid Build Coastguard Worker    case ANV_VID_MEM_H265_SSE_SRC_PIX_ROW_STORE: {
404*61046927SAndroid Build Coastguard Worker       /* Take the formula from media-driver */
405*61046927SAndroid Build Coastguard Worker #define CACHELINE_SIZE 64
406*61046927SAndroid Build Coastguard Worker #define HEVC_MIN_TILE_SIZE 128
407*61046927SAndroid Build Coastguard Worker       uint32_t max_tile_cols = DIV_ROUND_UP(vid->vk.max_coded.width, HEVC_MIN_TILE_SIZE);
408*61046927SAndroid Build Coastguard Worker       size = 2 * ((CACHELINE_SIZE * (4 + 4)) << 1) * (width_in_ctb + 3 * max_tile_cols);
409*61046927SAndroid Build Coastguard Worker       return size;
410*61046927SAndroid Build Coastguard Worker    }
411*61046927SAndroid Build Coastguard Worker    default:
412*61046927SAndroid Build Coastguard Worker       unreachable("unknown memory");
413*61046927SAndroid Build Coastguard Worker    }
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker    return size << 6;
416*61046927SAndroid Build Coastguard Worker }
417*61046927SAndroid Build Coastguard Worker 
418*61046927SAndroid Build Coastguard Worker static void
get_h264_video_session_mem_reqs(struct anv_video_session * vid,VkVideoSessionMemoryRequirementsKHR * mem_reqs,uint32_t * pVideoSessionMemoryRequirementsCount,uint32_t memory_types)419*61046927SAndroid Build Coastguard Worker get_h264_video_session_mem_reqs(struct anv_video_session *vid,
420*61046927SAndroid Build Coastguard Worker                                 VkVideoSessionMemoryRequirementsKHR *mem_reqs,
421*61046927SAndroid Build Coastguard Worker                                 uint32_t *pVideoSessionMemoryRequirementsCount,
422*61046927SAndroid Build Coastguard Worker                                 uint32_t memory_types)
423*61046927SAndroid Build Coastguard Worker {
424*61046927SAndroid Build Coastguard Worker    VK_OUTARRAY_MAKE_TYPED(VkVideoSessionMemoryRequirementsKHR,
425*61046927SAndroid Build Coastguard Worker                           out,
426*61046927SAndroid Build Coastguard Worker                           mem_reqs,
427*61046927SAndroid Build Coastguard Worker                           pVideoSessionMemoryRequirementsCount);
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ANV_VID_MEM_H264_MAX; i++) {
430*61046927SAndroid Build Coastguard Worker       uint32_t bind_index = ANV_VID_MEM_H264_INTRA_ROW_STORE + i;
431*61046927SAndroid Build Coastguard Worker       uint64_t size = get_h264_video_mem_size(vid, i);
432*61046927SAndroid Build Coastguard Worker 
433*61046927SAndroid Build Coastguard Worker       vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, p) {
434*61046927SAndroid Build Coastguard Worker          p->memoryBindIndex = bind_index;
435*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.size = size;
436*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.alignment = 4096;
437*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.memoryTypeBits = memory_types;
438*61046927SAndroid Build Coastguard Worker       }
439*61046927SAndroid Build Coastguard Worker    }
440*61046927SAndroid Build Coastguard Worker }
441*61046927SAndroid Build Coastguard Worker 
442*61046927SAndroid Build Coastguard Worker static void
get_h265_video_session_mem_reqs(struct anv_video_session * vid,VkVideoSessionMemoryRequirementsKHR * mem_reqs,uint32_t * pVideoSessionMemoryRequirementsCount,uint32_t memory_types)443*61046927SAndroid Build Coastguard Worker get_h265_video_session_mem_reqs(struct anv_video_session *vid,
444*61046927SAndroid Build Coastguard Worker                                 VkVideoSessionMemoryRequirementsKHR *mem_reqs,
445*61046927SAndroid Build Coastguard Worker                                 uint32_t *pVideoSessionMemoryRequirementsCount,
446*61046927SAndroid Build Coastguard Worker                                 uint32_t memory_types)
447*61046927SAndroid Build Coastguard Worker {
448*61046927SAndroid Build Coastguard Worker    VK_OUTARRAY_MAKE_TYPED(VkVideoSessionMemoryRequirementsKHR,
449*61046927SAndroid Build Coastguard Worker                           out,
450*61046927SAndroid Build Coastguard Worker                           mem_reqs,
451*61046927SAndroid Build Coastguard Worker                           pVideoSessionMemoryRequirementsCount);
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    uint32_t mem_cnt = (vid->vk.op & VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR) ?
454*61046927SAndroid Build Coastguard Worker                        ANV_VID_MEM_H265_DEC_MAX : ANV_VID_MEM_H265_ENC_MAX;
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < mem_cnt; i++) {
457*61046927SAndroid Build Coastguard Worker       uint32_t bind_index =
458*61046927SAndroid Build Coastguard Worker          ANV_VID_MEM_H265_DEBLOCK_FILTER_ROW_STORE_LINE + i;
459*61046927SAndroid Build Coastguard Worker       uint64_t size = get_h265_video_mem_size(vid, i);
460*61046927SAndroid Build Coastguard Worker 
461*61046927SAndroid Build Coastguard Worker       vk_outarray_append_typed(VkVideoSessionMemoryRequirementsKHR, &out, p) {
462*61046927SAndroid Build Coastguard Worker          p->memoryBindIndex = bind_index;
463*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.size = size;
464*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.alignment = 4096;
465*61046927SAndroid Build Coastguard Worker          p->memoryRequirements.memoryTypeBits = memory_types;
466*61046927SAndroid Build Coastguard Worker       }
467*61046927SAndroid Build Coastguard Worker    }
468*61046927SAndroid Build Coastguard Worker }
469*61046927SAndroid Build Coastguard Worker 
470*61046927SAndroid Build Coastguard Worker VkResult
anv_GetVideoSessionMemoryRequirementsKHR(VkDevice _device,VkVideoSessionKHR videoSession,uint32_t * pVideoSessionMemoryRequirementsCount,VkVideoSessionMemoryRequirementsKHR * mem_reqs)471*61046927SAndroid Build Coastguard Worker anv_GetVideoSessionMemoryRequirementsKHR(VkDevice _device,
472*61046927SAndroid Build Coastguard Worker                                          VkVideoSessionKHR videoSession,
473*61046927SAndroid Build Coastguard Worker                                          uint32_t *pVideoSessionMemoryRequirementsCount,
474*61046927SAndroid Build Coastguard Worker                                          VkVideoSessionMemoryRequirementsKHR *mem_reqs)
475*61046927SAndroid Build Coastguard Worker {
476*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_device, device, _device);
477*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session, vid, videoSession);
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker    uint32_t memory_types =
480*61046927SAndroid Build Coastguard Worker       (vid->vk.flags & VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR) ?
481*61046927SAndroid Build Coastguard Worker       device->physical->memory.protected_mem_types :
482*61046927SAndroid Build Coastguard Worker       device->physical->memory.default_buffer_mem_types;
483*61046927SAndroid Build Coastguard Worker    switch (vid->vk.op) {
484*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
485*61046927SAndroid Build Coastguard Worker       get_h264_video_session_mem_reqs(vid,
486*61046927SAndroid Build Coastguard Worker                                       mem_reqs,
487*61046927SAndroid Build Coastguard Worker                                       pVideoSessionMemoryRequirementsCount,
488*61046927SAndroid Build Coastguard Worker                                       memory_types);
489*61046927SAndroid Build Coastguard Worker       break;
490*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
491*61046927SAndroid Build Coastguard Worker       get_h265_video_session_mem_reqs(vid,
492*61046927SAndroid Build Coastguard Worker                                       mem_reqs,
493*61046927SAndroid Build Coastguard Worker                                       pVideoSessionMemoryRequirementsCount,
494*61046927SAndroid Build Coastguard Worker                                       memory_types);
495*61046927SAndroid Build Coastguard Worker       break;
496*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
497*61046927SAndroid Build Coastguard Worker       get_h264_video_session_mem_reqs(vid,
498*61046927SAndroid Build Coastguard Worker                                       mem_reqs,
499*61046927SAndroid Build Coastguard Worker                                       pVideoSessionMemoryRequirementsCount,
500*61046927SAndroid Build Coastguard Worker                                       memory_types);
501*61046927SAndroid Build Coastguard Worker       break;
502*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
503*61046927SAndroid Build Coastguard Worker       get_h265_video_session_mem_reqs(vid,
504*61046927SAndroid Build Coastguard Worker                                       mem_reqs,
505*61046927SAndroid Build Coastguard Worker                                       pVideoSessionMemoryRequirementsCount,
506*61046927SAndroid Build Coastguard Worker                                       memory_types);
507*61046927SAndroid Build Coastguard Worker       break;
508*61046927SAndroid Build Coastguard Worker    default:
509*61046927SAndroid Build Coastguard Worker       unreachable("unknown codec");
510*61046927SAndroid Build Coastguard Worker    }
511*61046927SAndroid Build Coastguard Worker 
512*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
513*61046927SAndroid Build Coastguard Worker }
514*61046927SAndroid Build Coastguard Worker 
515*61046927SAndroid Build Coastguard Worker VkResult
anv_UpdateVideoSessionParametersKHR(VkDevice _device,VkVideoSessionParametersKHR _params,const VkVideoSessionParametersUpdateInfoKHR * pUpdateInfo)516*61046927SAndroid Build Coastguard Worker anv_UpdateVideoSessionParametersKHR(VkDevice _device,
517*61046927SAndroid Build Coastguard Worker                                      VkVideoSessionParametersKHR _params,
518*61046927SAndroid Build Coastguard Worker                                      const VkVideoSessionParametersUpdateInfoKHR *pUpdateInfo)
519*61046927SAndroid Build Coastguard Worker {
520*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session_params, params, _params);
521*61046927SAndroid Build Coastguard Worker    return vk_video_session_parameters_update(&params->vk, pUpdateInfo);
522*61046927SAndroid Build Coastguard Worker }
523*61046927SAndroid Build Coastguard Worker 
524*61046927SAndroid Build Coastguard Worker static void
copy_bind(struct anv_vid_mem * dst,const VkBindVideoSessionMemoryInfoKHR * src)525*61046927SAndroid Build Coastguard Worker copy_bind(struct anv_vid_mem *dst,
526*61046927SAndroid Build Coastguard Worker           const VkBindVideoSessionMemoryInfoKHR *src)
527*61046927SAndroid Build Coastguard Worker {
528*61046927SAndroid Build Coastguard Worker    dst->mem = anv_device_memory_from_handle(src->memory);
529*61046927SAndroid Build Coastguard Worker    dst->offset = src->memoryOffset;
530*61046927SAndroid Build Coastguard Worker    dst->size = src->memorySize;
531*61046927SAndroid Build Coastguard Worker }
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker VkResult
anv_BindVideoSessionMemoryKHR(VkDevice _device,VkVideoSessionKHR videoSession,uint32_t bind_mem_count,const VkBindVideoSessionMemoryInfoKHR * bind_mem)534*61046927SAndroid Build Coastguard Worker anv_BindVideoSessionMemoryKHR(VkDevice _device,
535*61046927SAndroid Build Coastguard Worker                               VkVideoSessionKHR videoSession,
536*61046927SAndroid Build Coastguard Worker                               uint32_t bind_mem_count,
537*61046927SAndroid Build Coastguard Worker                               const VkBindVideoSessionMemoryInfoKHR *bind_mem)
538*61046927SAndroid Build Coastguard Worker {
539*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session, vid, videoSession);
540*61046927SAndroid Build Coastguard Worker 
541*61046927SAndroid Build Coastguard Worker    switch (vid->vk.op) {
542*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
543*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
544*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < bind_mem_count; i++) {
545*61046927SAndroid Build Coastguard Worker          copy_bind(&vid->vid_mem[bind_mem[i].memoryBindIndex], &bind_mem[i]);
546*61046927SAndroid Build Coastguard Worker       }
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    case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR:
550*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < bind_mem_count; i++) {
551*61046927SAndroid Build Coastguard Worker          copy_bind(&vid->vid_mem[bind_mem[i].memoryBindIndex], &bind_mem[i]);
552*61046927SAndroid Build Coastguard Worker       }
553*61046927SAndroid Build Coastguard Worker       break;
554*61046927SAndroid Build Coastguard Worker    default:
555*61046927SAndroid Build Coastguard Worker       unreachable("unknown codec");
556*61046927SAndroid Build Coastguard Worker    }
557*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
558*61046927SAndroid Build Coastguard Worker }
559*61046927SAndroid Build Coastguard Worker 
560*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
anv_GetEncodedVideoSessionParametersKHR(VkDevice device,const VkVideoEncodeSessionParametersGetInfoKHR * pVideoSessionParametersInfo,VkVideoEncodeSessionParametersFeedbackInfoKHR * pFeedbackInfo,size_t * pDataSize,void * pData)561*61046927SAndroid Build Coastguard Worker anv_GetEncodedVideoSessionParametersKHR(VkDevice device,
562*61046927SAndroid Build Coastguard Worker                                         const VkVideoEncodeSessionParametersGetInfoKHR* pVideoSessionParametersInfo,
563*61046927SAndroid Build Coastguard Worker                                         VkVideoEncodeSessionParametersFeedbackInfoKHR* pFeedbackInfo,
564*61046927SAndroid Build Coastguard Worker                                         size_t *pDataSize,
565*61046927SAndroid Build Coastguard Worker                                         void *pData)
566*61046927SAndroid Build Coastguard Worker {
567*61046927SAndroid Build Coastguard Worker    ANV_FROM_HANDLE(anv_video_session_params, params, pVideoSessionParametersInfo->videoSessionParameters);
568*61046927SAndroid Build Coastguard Worker    size_t total_size = 0;
569*61046927SAndroid Build Coastguard Worker    size_t size_limit = 0;
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker    if (pData)
572*61046927SAndroid Build Coastguard Worker       size_limit = *pDataSize;
573*61046927SAndroid Build Coastguard Worker 
574*61046927SAndroid Build Coastguard Worker    switch (params->vk.op) {
575*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
576*61046927SAndroid Build Coastguard Worker       const struct VkVideoEncodeH264SessionParametersGetInfoKHR *h264_get_info =
577*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR);
578*61046927SAndroid Build Coastguard Worker       size_t sps_size = 0, pps_size = 0;
579*61046927SAndroid Build Coastguard Worker       if (h264_get_info->writeStdSPS) {
580*61046927SAndroid Build Coastguard Worker          for (unsigned i = 0; i < params->vk.h264_enc.h264_sps_count; i++)
581*61046927SAndroid Build Coastguard Worker             if (params->vk.h264_enc.h264_sps[i].base.seq_parameter_set_id == h264_get_info->stdSPSId)
582*61046927SAndroid Build Coastguard Worker                vk_video_encode_h264_sps(&params->vk.h264_enc.h264_sps[i].base, size_limit, &sps_size, pData);
583*61046927SAndroid Build Coastguard Worker       }
584*61046927SAndroid Build Coastguard Worker       if (h264_get_info->writeStdPPS) {
585*61046927SAndroid Build Coastguard Worker          char *data_ptr = pData ? (char *)pData + sps_size : NULL;
586*61046927SAndroid Build Coastguard Worker          for (unsigned i = 0; i < params->vk.h264_enc.h264_pps_count; i++)
587*61046927SAndroid Build Coastguard Worker             if (params->vk.h264_enc.h264_pps[i].base.pic_parameter_set_id == h264_get_info->stdPPSId) {
588*61046927SAndroid Build Coastguard Worker                vk_video_encode_h264_pps(&params->vk.h264_enc.h264_pps[i].base, false, size_limit, &pps_size, data_ptr);
589*61046927SAndroid Build Coastguard Worker             }
590*61046927SAndroid Build Coastguard Worker       }
591*61046927SAndroid Build Coastguard Worker       total_size = sps_size + pps_size;
592*61046927SAndroid Build Coastguard Worker       break;
593*61046927SAndroid Build Coastguard Worker    }
594*61046927SAndroid Build Coastguard Worker    case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: {
595*61046927SAndroid Build Coastguard Worker       const struct VkVideoEncodeH265SessionParametersGetInfoKHR *h265_get_info =
596*61046927SAndroid Build Coastguard Worker          vk_find_struct_const(pVideoSessionParametersInfo->pNext, VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR);
597*61046927SAndroid Build Coastguard Worker       size_t sps_size = 0, pps_size = 0, vps_size = 0;
598*61046927SAndroid Build Coastguard Worker       if (h265_get_info->writeStdVPS) {
599*61046927SAndroid Build Coastguard Worker          for (unsigned i = 0; i < params->vk.h265_enc.h265_vps_count; i++)
600*61046927SAndroid Build Coastguard Worker             if (params->vk.h265_enc.h265_vps[i].base.vps_video_parameter_set_id == h265_get_info->stdVPSId)
601*61046927SAndroid Build Coastguard Worker                vk_video_encode_h265_vps(&params->vk.h265_enc.h265_vps[i].base, size_limit, &vps_size, pData);
602*61046927SAndroid Build Coastguard Worker       }
603*61046927SAndroid Build Coastguard Worker       if (h265_get_info->writeStdSPS) {
604*61046927SAndroid Build Coastguard Worker          char *data_ptr = pData ? (char *)pData + vps_size : NULL;
605*61046927SAndroid Build Coastguard Worker          for (unsigned i = 0; i < params->vk.h265_enc.h265_sps_count; i++)
606*61046927SAndroid Build Coastguard Worker             if (params->vk.h265_enc.h265_sps[i].base.sps_seq_parameter_set_id == h265_get_info->stdSPSId) {
607*61046927SAndroid Build Coastguard Worker                vk_video_encode_h265_sps(&params->vk.h265_enc.h265_sps[i].base, size_limit, &sps_size, data_ptr);
608*61046927SAndroid Build Coastguard Worker             }
609*61046927SAndroid Build Coastguard Worker       }
610*61046927SAndroid Build Coastguard Worker       if (h265_get_info->writeStdPPS) {
611*61046927SAndroid Build Coastguard Worker          char *data_ptr = pData ? (char *)pData + vps_size + sps_size : NULL;
612*61046927SAndroid Build Coastguard Worker          for (unsigned i = 0; i < params->vk.h265_enc.h265_pps_count; i++)
613*61046927SAndroid Build Coastguard Worker             if (params->vk.h265_enc.h265_pps[i].base.pps_seq_parameter_set_id == h265_get_info->stdPPSId) {
614*61046927SAndroid Build Coastguard Worker                params->vk.h265_enc.h265_pps[i].base.flags.cu_qp_delta_enabled_flag = 0;
615*61046927SAndroid Build Coastguard Worker                vk_video_encode_h265_pps(&params->vk.h265_enc.h265_pps[i].base, size_limit, &pps_size, data_ptr);
616*61046927SAndroid Build Coastguard Worker             }
617*61046927SAndroid Build Coastguard Worker       }
618*61046927SAndroid Build Coastguard Worker       total_size = sps_size + pps_size + vps_size;
619*61046927SAndroid Build Coastguard Worker       break;
620*61046927SAndroid Build Coastguard Worker    }
621*61046927SAndroid Build Coastguard Worker    default:
622*61046927SAndroid Build Coastguard Worker       break;
623*61046927SAndroid Build Coastguard Worker    }
624*61046927SAndroid Build Coastguard Worker 
625*61046927SAndroid Build Coastguard Worker    /* vk_video_encode_h26x functions support to be safe even if size_limit is not enough,
626*61046927SAndroid Build Coastguard Worker     * so we could just confirm whether pDataSize is valid afterwards.
627*61046927SAndroid Build Coastguard Worker     */
628*61046927SAndroid Build Coastguard Worker    if (pData && *pDataSize < total_size) {
629*61046927SAndroid Build Coastguard Worker       *pDataSize = 0;
630*61046927SAndroid Build Coastguard Worker       return VK_INCOMPLETE;
631*61046927SAndroid Build Coastguard Worker    }
632*61046927SAndroid Build Coastguard Worker 
633*61046927SAndroid Build Coastguard Worker    *pDataSize = total_size;
634*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker 
637*61046927SAndroid Build Coastguard Worker VkResult
anv_GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR * pQualityLevelInfo,VkVideoEncodeQualityLevelPropertiesKHR * pQualityLevelProperties)638*61046927SAndroid Build Coastguard Worker anv_GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(VkPhysicalDevice physicalDevice,
639*61046927SAndroid Build Coastguard Worker                                                           const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR* pQualityLevelInfo,
640*61046927SAndroid Build Coastguard Worker                                                           VkVideoEncodeQualityLevelPropertiesKHR* pQualityLevelProperties)
641*61046927SAndroid Build Coastguard Worker {
642*61046927SAndroid Build Coastguard Worker    /* TODO. */
643*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
644*61046927SAndroid Build Coastguard Worker }
645