xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/va/config.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker  *
3*61046927SAndroid Build Coastguard Worker  * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
4*61046927SAndroid Build Coastguard Worker  * Copyright 2014 Advanced Micro Devices, Inc.
5*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
9*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
10*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
11*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
12*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
13*61046927SAndroid Build Coastguard Worker  * the following conditions:
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
16*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
17*61046927SAndroid Build Coastguard Worker  * of the Software.
18*61046927SAndroid Build Coastguard Worker  *
19*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*61046927SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22*61046927SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
23*61046927SAndroid Build Coastguard Worker  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24*61046927SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25*61046927SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26*61046927SAndroid Build Coastguard Worker  *
27*61046927SAndroid Build Coastguard Worker  **************************************************************************/
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "util/u_video.h"
32*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include "vl/vl_winsys.h"
35*61046927SAndroid Build Coastguard Worker #include "vl/vl_codec.h"
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker #include "va_private.h"
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "util/u_handle_table.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false)
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigProfiles(VADriverContextP ctx,VAProfile * profile_list,int * num_profiles)44*61046927SAndroid Build Coastguard Worker vlVaQueryConfigProfiles(VADriverContextP ctx, VAProfile *profile_list, int *num_profiles)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
47*61046927SAndroid Build Coastguard Worker    enum pipe_video_profile p;
48*61046927SAndroid Build Coastguard Worker    VAProfile vap;
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    if (!ctx)
51*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    *num_profiles = 0;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    pscreen = VL_VA_PSCREEN(ctx);
56*61046927SAndroid Build Coastguard Worker    for (p = PIPE_VIDEO_PROFILE_MPEG2_SIMPLE; p <= PIPE_VIDEO_PROFILE_AV1_MAIN; ++p) {
57*61046927SAndroid Build Coastguard Worker       if (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 && !debug_get_option_mpeg4())
58*61046927SAndroid Build Coastguard Worker          continue;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker       if (vl_codec_supported(pscreen, p, false) ||
61*61046927SAndroid Build Coastguard Worker           vl_codec_supported(pscreen, p, true)) {
62*61046927SAndroid Build Coastguard Worker          vap = PipeToProfile(p);
63*61046927SAndroid Build Coastguard Worker          if (vap != VAProfileNone)
64*61046927SAndroid Build Coastguard Worker             profile_list[(*num_profiles)++] = vap;
65*61046927SAndroid Build Coastguard Worker       }
66*61046927SAndroid Build Coastguard Worker    }
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    /* Support postprocessing through vl_compositor */
69*61046927SAndroid Build Coastguard Worker    profile_list[(*num_profiles)++] = VAProfileNone;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigEntrypoints(VADriverContextP ctx,VAProfile profile,VAEntrypoint * entrypoint_list,int * num_entrypoints)75*61046927SAndroid Build Coastguard Worker vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile,
76*61046927SAndroid Build Coastguard Worker                            VAEntrypoint *entrypoint_list, int *num_entrypoints)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
79*61046927SAndroid Build Coastguard Worker    enum pipe_video_profile p;
80*61046927SAndroid Build Coastguard Worker    bool check_av1enc_support = false;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    if (!ctx)
83*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    *num_entrypoints = 0;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker    if (profile == VAProfileNone) {
88*61046927SAndroid Build Coastguard Worker       entrypoint_list[(*num_entrypoints)++] = VAEntrypointVideoProc;
89*61046927SAndroid Build Coastguard Worker       return VA_STATUS_SUCCESS;
90*61046927SAndroid Build Coastguard Worker    }
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    p = ProfileToPipe(profile);
93*61046927SAndroid Build Coastguard Worker    if (p == PIPE_VIDEO_PROFILE_UNKNOWN ||
94*61046927SAndroid Build Coastguard Worker       (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 &&
95*61046927SAndroid Build Coastguard Worker       !debug_get_option_mpeg4()))
96*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    pscreen = VL_VA_PSCREEN(ctx);
99*61046927SAndroid Build Coastguard Worker    if (vl_codec_supported(pscreen, p, false))
100*61046927SAndroid Build Coastguard Worker       entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 16, 0)
103*61046927SAndroid Build Coastguard Worker    if (p == PIPE_VIDEO_PROFILE_AV1_MAIN)
104*61046927SAndroid Build Coastguard Worker       check_av1enc_support = true;
105*61046927SAndroid Build Coastguard Worker #endif
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    if (p != PIPE_VIDEO_PROFILE_AV1_MAIN || check_av1enc_support == true)
108*61046927SAndroid Build Coastguard Worker       if (vl_codec_supported(pscreen, p, true))
109*61046927SAndroid Build Coastguard Worker          entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice;
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    if (*num_entrypoints == 0)
112*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    assert(*num_entrypoints <= ctx->max_entrypoints);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker 
get_screen_supported_va_rt_formats(struct pipe_screen * pscreen,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint)119*61046927SAndroid Build Coastguard Worker static unsigned int get_screen_supported_va_rt_formats(struct pipe_screen *pscreen,
120*61046927SAndroid Build Coastguard Worker                                                        enum pipe_video_profile profile,
121*61046927SAndroid Build Coastguard Worker                                                        enum pipe_video_entrypoint entrypoint)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker    unsigned int supported_rt_formats = 0;
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12,
126*61046927SAndroid Build Coastguard Worker                                           profile,
127*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
128*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12,
129*61046927SAndroid Build Coastguard Worker                                           profile,
130*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
131*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV,
132*61046927SAndroid Build Coastguard Worker                                           profile,
133*61046927SAndroid Build Coastguard Worker                                           entrypoint))
134*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_YUV420;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010,
137*61046927SAndroid Build Coastguard Worker                                           profile,
138*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
139*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016,
140*61046927SAndroid Build Coastguard Worker                                           profile,
141*61046927SAndroid Build Coastguard Worker                                           entrypoint))
142*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP;
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM,
145*61046927SAndroid Build Coastguard Worker                                           profile,
146*61046927SAndroid Build Coastguard Worker                                           entrypoint))
147*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_YUV400;
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_U8_V8_444_UNORM,
150*61046927SAndroid Build Coastguard Worker                                           profile,
151*61046927SAndroid Build Coastguard Worker                                           entrypoint))
152*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_YUV444;
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_UYVY,
155*61046927SAndroid Build Coastguard Worker                                           profile,
156*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
157*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YUYV,
158*61046927SAndroid Build Coastguard Worker                                           profile,
159*61046927SAndroid Build Coastguard Worker                                           entrypoint))
160*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_YUV422;
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UNORM,
163*61046927SAndroid Build Coastguard Worker                                           profile,
164*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
165*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UINT,
166*61046927SAndroid Build Coastguard Worker                                           profile,
167*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
168*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UNORM,
169*61046927SAndroid Build Coastguard Worker                                           profile,
170*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
171*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UINT,
172*61046927SAndroid Build Coastguard Worker                                           profile,
173*61046927SAndroid Build Coastguard Worker                                           entrypoint))
174*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_RGB32;
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10A2_UNORM,
177*61046927SAndroid Build Coastguard Worker                                           profile,
178*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
179*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10A2_UNORM,
180*61046927SAndroid Build Coastguard Worker                                           profile,
181*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
182*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10X2_UNORM,
183*61046927SAndroid Build Coastguard Worker                                           profile,
184*61046927SAndroid Build Coastguard Worker                                           entrypoint) ||
185*61046927SAndroid Build Coastguard Worker        pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10X2_UNORM,
186*61046927SAndroid Build Coastguard Worker                                           profile,
187*61046927SAndroid Build Coastguard Worker                                           entrypoint))
188*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_RGB32_10;
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker    if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8_G8_B8_UNORM,
191*61046927SAndroid Build Coastguard Worker                                           profile,
192*61046927SAndroid Build Coastguard Worker                                           entrypoint))
193*61046927SAndroid Build Coastguard Worker       supported_rt_formats |= VA_RT_FORMAT_RGBP;
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    return supported_rt_formats;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker VAStatus
vlVaGetConfigAttributes(VADriverContextP ctx,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs)200*61046927SAndroid Build Coastguard Worker vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
201*61046927SAndroid Build Coastguard Worker                         VAConfigAttrib *attrib_list, int num_attribs)
202*61046927SAndroid Build Coastguard Worker {
203*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
204*61046927SAndroid Build Coastguard Worker    int i;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    if (!ctx)
207*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
208*61046927SAndroid Build Coastguard Worker 
209*61046927SAndroid Build Coastguard Worker    pscreen = VL_VA_PSCREEN(ctx);
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    for (i = 0; i < num_attribs; ++i) {
212*61046927SAndroid Build Coastguard Worker       unsigned int value;
213*61046927SAndroid Build Coastguard Worker       if ((entrypoint == VAEntrypointVLD) &&
214*61046927SAndroid Build Coastguard Worker           (vl_codec_supported(pscreen, ProfileToPipe(profile), false))) {
215*61046927SAndroid Build Coastguard Worker          switch (attrib_list[i].type) {
216*61046927SAndroid Build Coastguard Worker          case VAConfigAttribRTFormat:
217*61046927SAndroid Build Coastguard Worker             /*
218*61046927SAndroid Build Coastguard Worker             * Different gallium drivers will have different supported formats
219*61046927SAndroid Build Coastguard Worker             * If modifying this, please query the driver like below
220*61046927SAndroid Build Coastguard Worker             */
221*61046927SAndroid Build Coastguard Worker             value = get_screen_supported_va_rt_formats(pscreen,
222*61046927SAndroid Build Coastguard Worker                                                        ProfileToPipe(profile),
223*61046927SAndroid Build Coastguard Worker                                                        PIPE_VIDEO_ENTRYPOINT_BITSTREAM);
224*61046927SAndroid Build Coastguard Worker             break;
225*61046927SAndroid Build Coastguard Worker          case VAConfigAttribMaxPictureWidth:
226*61046927SAndroid Build Coastguard Worker          {
227*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
228*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
229*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_WIDTH);
230*61046927SAndroid Build Coastguard Worker             value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
231*61046927SAndroid Build Coastguard Worker          } break;
232*61046927SAndroid Build Coastguard Worker          case VAConfigAttribMaxPictureHeight:
233*61046927SAndroid Build Coastguard Worker          {
234*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
235*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
236*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_HEIGHT);
237*61046927SAndroid Build Coastguard Worker             value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
238*61046927SAndroid Build Coastguard Worker          } break;
239*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 21, 0)
240*61046927SAndroid Build Coastguard Worker          case VAConfigAttribDecJPEG:
241*61046927SAndroid Build Coastguard Worker          {
242*61046927SAndroid Build Coastguard Worker             VAConfigAttribValDecJPEG attr_jpeg = { .value = 0 };
243*61046927SAndroid Build Coastguard Worker             /* Check if ROI Decode is supported */
244*61046927SAndroid Build Coastguard Worker             int supportsCropDec =
245*61046927SAndroid Build Coastguard Worker                   pscreen->get_video_param(pscreen, ProfileToPipe(profile),
246*61046927SAndroid Build Coastguard Worker                                            PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
247*61046927SAndroid Build Coastguard Worker                                            PIPE_VIDEO_CAP_ROI_CROP_DEC);
248*61046927SAndroid Build Coastguard Worker             if (supportsCropDec <= 0)
249*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
250*61046927SAndroid Build Coastguard Worker             else {
251*61046927SAndroid Build Coastguard Worker                attr_jpeg.bits.crop = 1;
252*61046927SAndroid Build Coastguard Worker                value = attr_jpeg.value;
253*61046927SAndroid Build Coastguard Worker             }
254*61046927SAndroid Build Coastguard Worker          } break;
255*61046927SAndroid Build Coastguard Worker #endif
256*61046927SAndroid Build Coastguard Worker          default:
257*61046927SAndroid Build Coastguard Worker             value = VA_ATTRIB_NOT_SUPPORTED;
258*61046927SAndroid Build Coastguard Worker             break;
259*61046927SAndroid Build Coastguard Worker          }
260*61046927SAndroid Build Coastguard Worker       } else if ((entrypoint == VAEntrypointEncSlice) &&
261*61046927SAndroid Build Coastguard Worker                  (vl_codec_supported(pscreen, ProfileToPipe(profile), true))) {
262*61046927SAndroid Build Coastguard Worker          switch (attrib_list[i].type) {
263*61046927SAndroid Build Coastguard Worker          case VAConfigAttribRTFormat:
264*61046927SAndroid Build Coastguard Worker             value = get_screen_supported_va_rt_formats(pscreen,
265*61046927SAndroid Build Coastguard Worker                                                        ProfileToPipe(profile),
266*61046927SAndroid Build Coastguard Worker                                                        PIPE_VIDEO_ENTRYPOINT_ENCODE);
267*61046927SAndroid Build Coastguard Worker             break;
268*61046927SAndroid Build Coastguard Worker          case VAConfigAttribRateControl:
269*61046927SAndroid Build Coastguard Worker          {
270*61046927SAndroid Build Coastguard Worker             /* Legacy behavior reports these three modes for all drivers */
271*61046927SAndroid Build Coastguard Worker             value = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR;
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker             /* Check for optional mode QVBR */
274*61046927SAndroid Build Coastguard Worker             int supports_qvbr = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
275*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
276*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR);
277*61046927SAndroid Build Coastguard Worker             if (supports_qvbr > 0)
278*61046927SAndroid Build Coastguard Worker                value |= VA_RC_QVBR;
279*61046927SAndroid Build Coastguard Worker          } break;
280*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncRateControlExt:
281*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
282*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
283*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_TEMPORAL_LAYERS);
284*61046927SAndroid Build Coastguard Worker             assert(value <= 4);
285*61046927SAndroid Build Coastguard Worker             if (value > 0) {
286*61046927SAndroid Build Coastguard Worker                value -= 1;
287*61046927SAndroid Build Coastguard Worker                value |= (1 << 8);   /* temporal_layer_bitrate_control_flag */
288*61046927SAndroid Build Coastguard Worker             }
289*61046927SAndroid Build Coastguard Worker             break;
290*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncPackedHeaders:
291*61046927SAndroid Build Coastguard Worker             value = VA_ENC_PACKED_HEADER_NONE;
292*61046927SAndroid Build Coastguard Worker             if ((u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_MPEG4_AVC))
293*61046927SAndroid Build Coastguard Worker                value |= ENC_PACKED_HEADERS_H264;
294*61046927SAndroid Build Coastguard Worker             else if ((u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_HEVC))
295*61046927SAndroid Build Coastguard Worker                value |= ENC_PACKED_HEADERS_HEVC;
296*61046927SAndroid Build Coastguard Worker             else if (u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_AV1)
297*61046927SAndroid Build Coastguard Worker                value |= ENC_PACKED_HEADERS_AV1;
298*61046927SAndroid Build Coastguard Worker 
299*61046927SAndroid Build Coastguard Worker             break;
300*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncMaxSlices:
301*61046927SAndroid Build Coastguard Worker          {
302*61046927SAndroid Build Coastguard Worker             /**
303*61046927SAndroid Build Coastguard Worker              * \brief Maximum number of slices per frame. Read-only.
304*61046927SAndroid Build Coastguard Worker              *
305*61046927SAndroid Build Coastguard Worker              * This attribute determines the maximum number of slices the
306*61046927SAndroid Build Coastguard Worker              * driver can support to encode a single frame.
307*61046927SAndroid Build Coastguard Worker              */
308*61046927SAndroid Build Coastguard Worker             int maxSlicesPerEncodedPic = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
309*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
310*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_MAX_SLICES_PER_FRAME);
311*61046927SAndroid Build Coastguard Worker             if (maxSlicesPerEncodedPic <= 0)
312*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
313*61046927SAndroid Build Coastguard Worker             else
314*61046927SAndroid Build Coastguard Worker                value = maxSlicesPerEncodedPic;
315*61046927SAndroid Build Coastguard Worker          } break;
316*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncMaxRefFrames:
317*61046927SAndroid Build Coastguard Worker          {
318*61046927SAndroid Build Coastguard Worker             int maxL0L1ReferencesPerFrame = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
319*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
320*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_MAX_REFERENCES_PER_FRAME);
321*61046927SAndroid Build Coastguard Worker             if (maxL0L1ReferencesPerFrame <= 0)
322*61046927SAndroid Build Coastguard Worker                value = 1;
323*61046927SAndroid Build Coastguard Worker             else
324*61046927SAndroid Build Coastguard Worker                value = maxL0L1ReferencesPerFrame;
325*61046927SAndroid Build Coastguard Worker          } break;
326*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncSliceStructure:
327*61046927SAndroid Build Coastguard Worker          {
328*61046927SAndroid Build Coastguard Worker             /* The VA enum values match the pipe_video_cap_slice_structure definitions*/
329*61046927SAndroid Build Coastguard Worker             int supportedSliceStructuresFlagSet = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
330*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
331*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE);
332*61046927SAndroid Build Coastguard Worker             if (supportedSliceStructuresFlagSet <= 0)
333*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
334*61046927SAndroid Build Coastguard Worker             else
335*61046927SAndroid Build Coastguard Worker                value = supportedSliceStructuresFlagSet;
336*61046927SAndroid Build Coastguard Worker          } break;
337*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncQualityRange:
338*61046927SAndroid Build Coastguard Worker          {
339*61046927SAndroid Build Coastguard Worker             /*
340*61046927SAndroid Build Coastguard Worker              * this quality range provides different options within the range; and it isn't strictly
341*61046927SAndroid Build Coastguard Worker              * faster when higher value used.
342*61046927SAndroid Build Coastguard Worker              * 0, not used; 1, default value; others are using vlVaQualityBits for different modes.
343*61046927SAndroid Build Coastguard Worker              */
344*61046927SAndroid Build Coastguard Worker             int quality_range = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
345*61046927SAndroid Build Coastguard Worker                                  PIPE_VIDEO_ENTRYPOINT_ENCODE,
346*61046927SAndroid Build Coastguard Worker                                  PIPE_VIDEO_CAP_ENC_QUALITY_LEVEL);
347*61046927SAndroid Build Coastguard Worker             value = quality_range ? quality_range : VA_ATTRIB_NOT_SUPPORTED;
348*61046927SAndroid Build Coastguard Worker          } break;
349*61046927SAndroid Build Coastguard Worker          case VAConfigAttribMaxFrameSize:
350*61046927SAndroid Build Coastguard Worker          {
351*61046927SAndroid Build Coastguard Worker             /* Max Frame Size can be used to control picture level frame size.
352*61046927SAndroid Build Coastguard Worker              * This frame size is in bits.
353*61046927SAndroid Build Coastguard Worker              */
354*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
355*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
356*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_SUPPORTS_MAX_FRAME_SIZE);
357*61046927SAndroid Build Coastguard Worker             value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
358*61046927SAndroid Build Coastguard Worker          } break;
359*61046927SAndroid Build Coastguard Worker          case VAConfigAttribMaxPictureWidth:
360*61046927SAndroid Build Coastguard Worker          {
361*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
362*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
363*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_WIDTH);
364*61046927SAndroid Build Coastguard Worker             value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
365*61046927SAndroid Build Coastguard Worker          } break;
366*61046927SAndroid Build Coastguard Worker          case VAConfigAttribMaxPictureHeight:
367*61046927SAndroid Build Coastguard Worker          {
368*61046927SAndroid Build Coastguard Worker             value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
369*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
370*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_HEIGHT);
371*61046927SAndroid Build Coastguard Worker             value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
372*61046927SAndroid Build Coastguard Worker          } break;
373*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 12, 0)
374*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncHEVCFeatures:
375*61046927SAndroid Build Coastguard Worker          {
376*61046927SAndroid Build Coastguard Worker             union pipe_h265_enc_cap_features pipe_features;
377*61046927SAndroid Build Coastguard Worker             pipe_features.value = 0u;
378*61046927SAndroid Build Coastguard Worker             /* get_video_param sets pipe_features.bits.config_supported = 1
379*61046927SAndroid Build Coastguard Worker                to distinguish between supported cap with all bits off and unsupported by driver
380*61046927SAndroid Build Coastguard Worker                with value = 0
381*61046927SAndroid Build Coastguard Worker             */
382*61046927SAndroid Build Coastguard Worker             int supportedHEVCEncFeaturesFlagSet = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
383*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
384*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_HEVC_FEATURE_FLAGS);
385*61046927SAndroid Build Coastguard Worker             if (supportedHEVCEncFeaturesFlagSet <= 0)
386*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
387*61046927SAndroid Build Coastguard Worker             else {
388*61046927SAndroid Build Coastguard Worker                /* Assign unsigned typed variable "value" after checking supportedHEVCEncFeaturesFlagSet > 0 */
389*61046927SAndroid Build Coastguard Worker                pipe_features.value = supportedHEVCEncFeaturesFlagSet;
390*61046927SAndroid Build Coastguard Worker                VAConfigAttribValEncHEVCFeatures va_features;
391*61046927SAndroid Build Coastguard Worker                va_features.value = 0;
392*61046927SAndroid Build Coastguard Worker                va_features.bits.separate_colour_planes = pipe_features.bits.separate_colour_planes;
393*61046927SAndroid Build Coastguard Worker                va_features.bits.scaling_lists = pipe_features.bits.scaling_lists;
394*61046927SAndroid Build Coastguard Worker                va_features.bits.amp = pipe_features.bits.amp;
395*61046927SAndroid Build Coastguard Worker                va_features.bits.sao = pipe_features.bits.sao;
396*61046927SAndroid Build Coastguard Worker                va_features.bits.pcm = pipe_features.bits.pcm;
397*61046927SAndroid Build Coastguard Worker                va_features.bits.temporal_mvp = pipe_features.bits.temporal_mvp;
398*61046927SAndroid Build Coastguard Worker                va_features.bits.strong_intra_smoothing = pipe_features.bits.strong_intra_smoothing;
399*61046927SAndroid Build Coastguard Worker                va_features.bits.dependent_slices = pipe_features.bits.dependent_slices;
400*61046927SAndroid Build Coastguard Worker                va_features.bits.sign_data_hiding = pipe_features.bits.sign_data_hiding;
401*61046927SAndroid Build Coastguard Worker                va_features.bits.constrained_intra_pred = pipe_features.bits.constrained_intra_pred;
402*61046927SAndroid Build Coastguard Worker                va_features.bits.transform_skip = pipe_features.bits.transform_skip;
403*61046927SAndroid Build Coastguard Worker                va_features.bits.cu_qp_delta = pipe_features.bits.cu_qp_delta;
404*61046927SAndroid Build Coastguard Worker                va_features.bits.weighted_prediction = pipe_features.bits.weighted_prediction;
405*61046927SAndroid Build Coastguard Worker                va_features.bits.transquant_bypass = pipe_features.bits.transquant_bypass;
406*61046927SAndroid Build Coastguard Worker                va_features.bits.deblocking_filter_disable = pipe_features.bits.deblocking_filter_disable;
407*61046927SAndroid Build Coastguard Worker                value = va_features.value;
408*61046927SAndroid Build Coastguard Worker             }
409*61046927SAndroid Build Coastguard Worker          } break;
410*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncHEVCBlockSizes:
411*61046927SAndroid Build Coastguard Worker          {
412*61046927SAndroid Build Coastguard Worker             union pipe_h265_enc_cap_block_sizes pipe_block_sizes;
413*61046927SAndroid Build Coastguard Worker             pipe_block_sizes.value = 0;
414*61046927SAndroid Build Coastguard Worker             /* get_video_param sets pipe_block_sizes.bits.config_supported = 1
415*61046927SAndroid Build Coastguard Worker                to distinguish between supported cap with all bits off and unsupported by driver
416*61046927SAndroid Build Coastguard Worker                with value = 0
417*61046927SAndroid Build Coastguard Worker             */
418*61046927SAndroid Build Coastguard Worker             int supportedHEVCEncBlockSizes = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
419*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
420*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_HEVC_BLOCK_SIZES);
421*61046927SAndroid Build Coastguard Worker             if (supportedHEVCEncBlockSizes <= 0)
422*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
423*61046927SAndroid Build Coastguard Worker             else {
424*61046927SAndroid Build Coastguard Worker                /* Assign unsigned typed variable "value" after checking supportedHEVCEncBlockSizes > 0 */
425*61046927SAndroid Build Coastguard Worker                pipe_block_sizes.value = supportedHEVCEncBlockSizes;
426*61046927SAndroid Build Coastguard Worker                VAConfigAttribValEncHEVCBlockSizes va_block_sizes;
427*61046927SAndroid Build Coastguard Worker                va_block_sizes.value = 0;
428*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_max_coding_tree_block_size_minus3 =
429*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_max_coding_tree_block_size_minus3;
430*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_min_coding_tree_block_size_minus3 =
431*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_min_coding_tree_block_size_minus3;
432*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_min_luma_coding_block_size_minus3 =
433*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_min_luma_coding_block_size_minus3;
434*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_max_luma_transform_block_size_minus2 =
435*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_max_luma_transform_block_size_minus2;
436*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_min_luma_transform_block_size_minus2 =
437*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_min_luma_transform_block_size_minus2;
438*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.max_max_transform_hierarchy_depth_inter =
439*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.max_max_transform_hierarchy_depth_inter;
440*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.min_max_transform_hierarchy_depth_inter =
441*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.min_max_transform_hierarchy_depth_inter;
442*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.max_max_transform_hierarchy_depth_intra =
443*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.max_max_transform_hierarchy_depth_intra;
444*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.min_max_transform_hierarchy_depth_intra =
445*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.min_max_transform_hierarchy_depth_intra;
446*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_max_pcm_coding_block_size_minus3 =
447*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_max_pcm_coding_block_size_minus3;
448*61046927SAndroid Build Coastguard Worker                va_block_sizes.bits.log2_min_pcm_coding_block_size_minus3 =
449*61046927SAndroid Build Coastguard Worker                               pipe_block_sizes.bits.log2_min_pcm_coding_block_size_minus3;
450*61046927SAndroid Build Coastguard Worker                value = va_block_sizes.value;
451*61046927SAndroid Build Coastguard Worker             }
452*61046927SAndroid Build Coastguard Worker          } break;
453*61046927SAndroid Build Coastguard Worker #endif
454*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 6, 0)
455*61046927SAndroid Build Coastguard Worker          case VAConfigAttribPredictionDirection:
456*61046927SAndroid Build Coastguard Worker          {
457*61046927SAndroid Build Coastguard Worker             /* The VA enum values match the pipe_h265_enc_pred_direction definitions*/
458*61046927SAndroid Build Coastguard Worker             int h265_enc_pred_direction = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
459*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
460*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_HEVC_PREDICTION_DIRECTION);
461*61046927SAndroid Build Coastguard Worker             if (h265_enc_pred_direction <= 0)
462*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
463*61046927SAndroid Build Coastguard Worker             else
464*61046927SAndroid Build Coastguard Worker                value = h265_enc_pred_direction;
465*61046927SAndroid Build Coastguard Worker          } break;
466*61046927SAndroid Build Coastguard Worker #endif
467*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 16, 0)
468*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncAV1:
469*61046927SAndroid Build Coastguard Worker          {
470*61046927SAndroid Build Coastguard Worker             union pipe_av1_enc_cap_features features;
471*61046927SAndroid Build Coastguard Worker             features.value = 0;
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker             int support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
474*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_ENTRYPOINT_ENCODE,
475*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_CAP_ENC_AV1_FEATURE);
476*61046927SAndroid Build Coastguard Worker             if (support <= 0)
477*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
478*61046927SAndroid Build Coastguard Worker             else {
479*61046927SAndroid Build Coastguard Worker                VAConfigAttribValEncAV1 attrib;
480*61046927SAndroid Build Coastguard Worker                features.value = support;
481*61046927SAndroid Build Coastguard Worker                attrib.value = features.value;
482*61046927SAndroid Build Coastguard Worker                value = attrib.value;
483*61046927SAndroid Build Coastguard Worker             }
484*61046927SAndroid Build Coastguard Worker          } break;
485*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncAV1Ext1:
486*61046927SAndroid Build Coastguard Worker          {
487*61046927SAndroid Build Coastguard Worker             union pipe_av1_enc_cap_features_ext1 features_ext1;
488*61046927SAndroid Build Coastguard Worker             features_ext1.value = 0;
489*61046927SAndroid Build Coastguard Worker             int support =  pscreen->get_video_param(pscreen, ProfileToPipe(profile),
490*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_ENTRYPOINT_ENCODE,
491*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT1);
492*61046927SAndroid Build Coastguard Worker             if (support <= 0)
493*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
494*61046927SAndroid Build Coastguard Worker             else {
495*61046927SAndroid Build Coastguard Worker                VAConfigAttribValEncAV1Ext1 attrib;
496*61046927SAndroid Build Coastguard Worker                features_ext1.value = support;
497*61046927SAndroid Build Coastguard Worker                attrib.value = features_ext1.value;
498*61046927SAndroid Build Coastguard Worker                value = attrib.value;
499*61046927SAndroid Build Coastguard Worker             }
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker          } break;
502*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncAV1Ext2:
503*61046927SAndroid Build Coastguard Worker          {
504*61046927SAndroid Build Coastguard Worker             union pipe_av1_enc_cap_features_ext2 features_ext2;
505*61046927SAndroid Build Coastguard Worker             features_ext2.value = 0;
506*61046927SAndroid Build Coastguard Worker 
507*61046927SAndroid Build Coastguard Worker             int support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
508*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_ENTRYPOINT_ENCODE,
509*61046927SAndroid Build Coastguard Worker                                        PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT2);
510*61046927SAndroid Build Coastguard Worker             if (support <= 0)
511*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
512*61046927SAndroid Build Coastguard Worker             else {
513*61046927SAndroid Build Coastguard Worker                VAConfigAttribValEncAV1Ext2 attrib;
514*61046927SAndroid Build Coastguard Worker                features_ext2.value = support;
515*61046927SAndroid Build Coastguard Worker                attrib.value = features_ext2.value;
516*61046927SAndroid Build Coastguard Worker                value = attrib.value;
517*61046927SAndroid Build Coastguard Worker            }
518*61046927SAndroid Build Coastguard Worker 
519*61046927SAndroid Build Coastguard Worker          } break;
520*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncTileSupport:
521*61046927SAndroid Build Coastguard Worker          {
522*61046927SAndroid Build Coastguard Worker             int encode_tile_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
523*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
524*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_SUPPORTS_TILE);
525*61046927SAndroid Build Coastguard Worker             if (encode_tile_support <= 0)
526*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
527*61046927SAndroid Build Coastguard Worker             else
528*61046927SAndroid Build Coastguard Worker                value = encode_tile_support;
529*61046927SAndroid Build Coastguard Worker          } break;
530*61046927SAndroid Build Coastguard Worker #endif
531*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 21, 0)
532*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncMaxTileRows:
533*61046927SAndroid Build Coastguard Worker          {
534*61046927SAndroid Build Coastguard Worker             int max_tile_rows = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
535*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
536*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_MAX_TILE_ROWS);
537*61046927SAndroid Build Coastguard Worker             if (max_tile_rows <= 0)
538*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
539*61046927SAndroid Build Coastguard Worker             else
540*61046927SAndroid Build Coastguard Worker                value = max_tile_rows;
541*61046927SAndroid Build Coastguard Worker          } break;
542*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncMaxTileCols:
543*61046927SAndroid Build Coastguard Worker          {
544*61046927SAndroid Build Coastguard Worker             int max_tile_cols = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
545*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
546*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_MAX_TILE_COLS);
547*61046927SAndroid Build Coastguard Worker             if (max_tile_cols <= 0)
548*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
549*61046927SAndroid Build Coastguard Worker             else
550*61046927SAndroid Build Coastguard Worker                value = max_tile_cols;
551*61046927SAndroid Build Coastguard Worker          } break;
552*61046927SAndroid Build Coastguard Worker #endif
553*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncIntraRefresh:
554*61046927SAndroid Build Coastguard Worker          {
555*61046927SAndroid Build Coastguard Worker             int ir_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
556*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
557*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_INTRA_REFRESH);
558*61046927SAndroid Build Coastguard Worker             if (ir_support <= 0)
559*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
560*61046927SAndroid Build Coastguard Worker             else
561*61046927SAndroid Build Coastguard Worker                value = ir_support;
562*61046927SAndroid Build Coastguard Worker          } break;
563*61046927SAndroid Build Coastguard Worker 
564*61046927SAndroid Build Coastguard Worker          case VAConfigAttribEncROI:
565*61046927SAndroid Build Coastguard Worker          {
566*61046927SAndroid Build Coastguard Worker             int roi_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
567*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_ENTRYPOINT_ENCODE,
568*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_ENC_ROI);
569*61046927SAndroid Build Coastguard Worker             if (roi_support <= 0)
570*61046927SAndroid Build Coastguard Worker                value = VA_ATTRIB_NOT_SUPPORTED;
571*61046927SAndroid Build Coastguard Worker             else
572*61046927SAndroid Build Coastguard Worker                value = roi_support;
573*61046927SAndroid Build Coastguard Worker          } break;
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker          default:
576*61046927SAndroid Build Coastguard Worker             value = VA_ATTRIB_NOT_SUPPORTED;
577*61046927SAndroid Build Coastguard Worker             break;
578*61046927SAndroid Build Coastguard Worker          }
579*61046927SAndroid Build Coastguard Worker       } else if (entrypoint == VAEntrypointVideoProc) {
580*61046927SAndroid Build Coastguard Worker          switch (attrib_list[i].type) {
581*61046927SAndroid Build Coastguard Worker          case VAConfigAttribRTFormat:
582*61046927SAndroid Build Coastguard Worker             value = get_screen_supported_va_rt_formats(pscreen,
583*61046927SAndroid Build Coastguard Worker                                                        PIPE_VIDEO_PROFILE_UNKNOWN,
584*61046927SAndroid Build Coastguard Worker                                                        PIPE_VIDEO_ENTRYPOINT_PROCESSING);
585*61046927SAndroid Build Coastguard Worker             break;
586*61046927SAndroid Build Coastguard Worker          default:
587*61046927SAndroid Build Coastguard Worker             value = VA_ATTRIB_NOT_SUPPORTED;
588*61046927SAndroid Build Coastguard Worker             break;
589*61046927SAndroid Build Coastguard Worker          }
590*61046927SAndroid Build Coastguard Worker       } else {
591*61046927SAndroid Build Coastguard Worker          value = VA_ATTRIB_NOT_SUPPORTED;
592*61046927SAndroid Build Coastguard Worker       }
593*61046927SAndroid Build Coastguard Worker       attrib_list[i].value = value;
594*61046927SAndroid Build Coastguard Worker    }
595*61046927SAndroid Build Coastguard Worker 
596*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker 
599*61046927SAndroid Build Coastguard Worker VAStatus
vlVaCreateConfig(VADriverContextP ctx,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs,VAConfigID * config_id)600*61046927SAndroid Build Coastguard Worker vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
601*61046927SAndroid Build Coastguard Worker                  VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id)
602*61046927SAndroid Build Coastguard Worker {
603*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
604*61046927SAndroid Build Coastguard Worker    vlVaConfig *config;
605*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
606*61046927SAndroid Build Coastguard Worker    enum pipe_video_profile p;
607*61046927SAndroid Build Coastguard Worker    unsigned int supported_rt_formats;
608*61046927SAndroid Build Coastguard Worker 
609*61046927SAndroid Build Coastguard Worker    if (!ctx)
610*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
611*61046927SAndroid Build Coastguard Worker 
612*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
613*61046927SAndroid Build Coastguard Worker    pscreen = VL_VA_PSCREEN(ctx);
614*61046927SAndroid Build Coastguard Worker 
615*61046927SAndroid Build Coastguard Worker    if (!drv)
616*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
617*61046927SAndroid Build Coastguard Worker 
618*61046927SAndroid Build Coastguard Worker    config = CALLOC(1, sizeof(vlVaConfig));
619*61046927SAndroid Build Coastguard Worker    if (!config)
620*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_ALLOCATION_FAILED;
621*61046927SAndroid Build Coastguard Worker 
622*61046927SAndroid Build Coastguard Worker    if (profile == VAProfileNone) {
623*61046927SAndroid Build Coastguard Worker       if (entrypoint != VAEntrypointVideoProc) {
624*61046927SAndroid Build Coastguard Worker          FREE(config);
625*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
626*61046927SAndroid Build Coastguard Worker       }
627*61046927SAndroid Build Coastguard Worker 
628*61046927SAndroid Build Coastguard Worker       config->entrypoint = PIPE_VIDEO_ENTRYPOINT_PROCESSING;
629*61046927SAndroid Build Coastguard Worker       config->profile = PIPE_VIDEO_PROFILE_UNKNOWN;
630*61046927SAndroid Build Coastguard Worker       supported_rt_formats = get_screen_supported_va_rt_formats(pscreen,
631*61046927SAndroid Build Coastguard Worker                                                                 config->profile,
632*61046927SAndroid Build Coastguard Worker                                                                 config->entrypoint);
633*61046927SAndroid Build Coastguard Worker       for (int i = 0; i < num_attribs; i++) {
634*61046927SAndroid Build Coastguard Worker          if (attrib_list[i].type == VAConfigAttribRTFormat) {
635*61046927SAndroid Build Coastguard Worker             if (attrib_list[i].value & supported_rt_formats) {
636*61046927SAndroid Build Coastguard Worker                config->rt_format = attrib_list[i].value;
637*61046927SAndroid Build Coastguard Worker             } else {
638*61046927SAndroid Build Coastguard Worker                FREE(config);
639*61046927SAndroid Build Coastguard Worker                return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
640*61046927SAndroid Build Coastguard Worker             }
641*61046927SAndroid Build Coastguard Worker          } else {
642*61046927SAndroid Build Coastguard Worker             /*other attrib_types are not supported.*/
643*61046927SAndroid Build Coastguard Worker             FREE(config);
644*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_INVALID_VALUE;
645*61046927SAndroid Build Coastguard Worker          }
646*61046927SAndroid Build Coastguard Worker       }
647*61046927SAndroid Build Coastguard Worker 
648*61046927SAndroid Build Coastguard Worker       /* Default value if not specified in the input attributes. */
649*61046927SAndroid Build Coastguard Worker       if (!config->rt_format)
650*61046927SAndroid Build Coastguard Worker          config->rt_format = supported_rt_formats;
651*61046927SAndroid Build Coastguard Worker 
652*61046927SAndroid Build Coastguard Worker       mtx_lock(&drv->mutex);
653*61046927SAndroid Build Coastguard Worker       *config_id = handle_table_add(drv->htab, config);
654*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
655*61046927SAndroid Build Coastguard Worker       return VA_STATUS_SUCCESS;
656*61046927SAndroid Build Coastguard Worker    }
657*61046927SAndroid Build Coastguard Worker 
658*61046927SAndroid Build Coastguard Worker    p = ProfileToPipe(profile);
659*61046927SAndroid Build Coastguard Worker    if (p == PIPE_VIDEO_PROFILE_UNKNOWN  ||
660*61046927SAndroid Build Coastguard Worker       (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 &&
661*61046927SAndroid Build Coastguard Worker       !debug_get_option_mpeg4())) {
662*61046927SAndroid Build Coastguard Worker       FREE(config);
663*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
664*61046927SAndroid Build Coastguard Worker    }
665*61046927SAndroid Build Coastguard Worker 
666*61046927SAndroid Build Coastguard Worker    switch (entrypoint) {
667*61046927SAndroid Build Coastguard Worker    case VAEntrypointVLD:
668*61046927SAndroid Build Coastguard Worker       if (!vl_codec_supported(pscreen, p, false)) {
669*61046927SAndroid Build Coastguard Worker          FREE(config);
670*61046927SAndroid Build Coastguard Worker          if (!vl_codec_supported(pscreen, p, true))
671*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
672*61046927SAndroid Build Coastguard Worker          else
673*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
674*61046927SAndroid Build Coastguard Worker       }
675*61046927SAndroid Build Coastguard Worker 
676*61046927SAndroid Build Coastguard Worker       config->entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
677*61046927SAndroid Build Coastguard Worker       break;
678*61046927SAndroid Build Coastguard Worker 
679*61046927SAndroid Build Coastguard Worker    case VAEntrypointEncSlice:
680*61046927SAndroid Build Coastguard Worker       if (!vl_codec_supported(pscreen, p, true)) {
681*61046927SAndroid Build Coastguard Worker          FREE(config);
682*61046927SAndroid Build Coastguard Worker          if (!vl_codec_supported(pscreen, p, false))
683*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
684*61046927SAndroid Build Coastguard Worker          else
685*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
686*61046927SAndroid Build Coastguard Worker       }
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker       config->entrypoint = PIPE_VIDEO_ENTRYPOINT_ENCODE;
689*61046927SAndroid Build Coastguard Worker       break;
690*61046927SAndroid Build Coastguard Worker 
691*61046927SAndroid Build Coastguard Worker    default:
692*61046927SAndroid Build Coastguard Worker       FREE(config);
693*61046927SAndroid Build Coastguard Worker       if (!vl_codec_supported(pscreen, p, false) &&
694*61046927SAndroid Build Coastguard Worker           !vl_codec_supported(pscreen, p, true))
695*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
696*61046927SAndroid Build Coastguard Worker       else
697*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
698*61046927SAndroid Build Coastguard Worker    }
699*61046927SAndroid Build Coastguard Worker 
700*61046927SAndroid Build Coastguard Worker    config->profile = p;
701*61046927SAndroid Build Coastguard Worker    supported_rt_formats = get_screen_supported_va_rt_formats(pscreen,
702*61046927SAndroid Build Coastguard Worker                                                              config->profile,
703*61046927SAndroid Build Coastguard Worker                                                              config->entrypoint);
704*61046927SAndroid Build Coastguard Worker    for (int i = 0; i <num_attribs ; i++) {
705*61046927SAndroid Build Coastguard Worker       if (attrib_list[i].type != VAConfigAttribRTFormat &&
706*61046927SAndroid Build Coastguard Worker          entrypoint == VAEntrypointVLD ) {
707*61046927SAndroid Build Coastguard Worker          FREE(config);
708*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_INVALID_VALUE;
709*61046927SAndroid Build Coastguard Worker       }
710*61046927SAndroid Build Coastguard Worker       if (attrib_list[i].type == VAConfigAttribRateControl) {
711*61046927SAndroid Build Coastguard Worker          if (attrib_list[i].value == VA_RC_CBR)
712*61046927SAndroid Build Coastguard Worker             config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT;
713*61046927SAndroid Build Coastguard Worker          else if (attrib_list[i].value == VA_RC_VBR)
714*61046927SAndroid Build Coastguard Worker             config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE;
715*61046927SAndroid Build Coastguard Worker          else if (attrib_list[i].value == VA_RC_CQP)
716*61046927SAndroid Build Coastguard Worker             config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE;
717*61046927SAndroid Build Coastguard Worker          else if (attrib_list[i].value == VA_RC_QVBR &&
718*61046927SAndroid Build Coastguard Worker                      (pscreen->get_video_param(pscreen, ProfileToPipe(profile),
719*61046927SAndroid Build Coastguard Worker                         PIPE_VIDEO_ENTRYPOINT_ENCODE,
720*61046927SAndroid Build Coastguard Worker                         PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR) > 0))
721*61046927SAndroid Build Coastguard Worker             config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE;
722*61046927SAndroid Build Coastguard Worker          else {
723*61046927SAndroid Build Coastguard Worker             FREE(config);
724*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_INVALID_VALUE;
725*61046927SAndroid Build Coastguard Worker          }
726*61046927SAndroid Build Coastguard Worker       }
727*61046927SAndroid Build Coastguard Worker       if (attrib_list[i].type == VAConfigAttribRTFormat) {
728*61046927SAndroid Build Coastguard Worker          if (attrib_list[i].value & supported_rt_formats) {
729*61046927SAndroid Build Coastguard Worker             config->rt_format = attrib_list[i].value;
730*61046927SAndroid Build Coastguard Worker          } else {
731*61046927SAndroid Build Coastguard Worker             FREE(config);
732*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
733*61046927SAndroid Build Coastguard Worker          }
734*61046927SAndroid Build Coastguard Worker       }
735*61046927SAndroid Build Coastguard Worker       if (attrib_list[i].type == VAConfigAttribEncPackedHeaders) {
736*61046927SAndroid Build Coastguard Worker          uint32_t attrib_value = attrib_list[i].value;
737*61046927SAndroid Build Coastguard Worker          if (config->entrypoint != PIPE_VIDEO_ENTRYPOINT_ENCODE ||
738*61046927SAndroid Build Coastguard Worker              (((attrib_value != 0)) &&
739*61046927SAndroid Build Coastguard Worker               ((attrib_value & ENC_PACKED_HEADERS_H264) != attrib_value ||
740*61046927SAndroid Build Coastguard Worker                   u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_MPEG4_AVC) &&
741*61046927SAndroid Build Coastguard Worker               ((attrib_value & ENC_PACKED_HEADERS_HEVC) != attrib_value ||
742*61046927SAndroid Build Coastguard Worker                   u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_HEVC) &&
743*61046927SAndroid Build Coastguard Worker               ((attrib_value & ENC_PACKED_HEADERS_AV1) != attrib_value ||
744*61046927SAndroid Build Coastguard Worker                   u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_AV1))) {
745*61046927SAndroid Build Coastguard Worker             FREE(config);
746*61046927SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_INVALID_VALUE;
747*61046927SAndroid Build Coastguard Worker          }
748*61046927SAndroid Build Coastguard Worker       }
749*61046927SAndroid Build Coastguard Worker    }
750*61046927SAndroid Build Coastguard Worker 
751*61046927SAndroid Build Coastguard Worker    /* Default value if not specified in the input attributes. */
752*61046927SAndroid Build Coastguard Worker    if (!config->rt_format)
753*61046927SAndroid Build Coastguard Worker       config->rt_format = supported_rt_formats;
754*61046927SAndroid Build Coastguard Worker 
755*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
756*61046927SAndroid Build Coastguard Worker    *config_id = handle_table_add(drv->htab, config);
757*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
758*61046927SAndroid Build Coastguard Worker 
759*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
760*61046927SAndroid Build Coastguard Worker }
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker VAStatus
vlVaDestroyConfig(VADriverContextP ctx,VAConfigID config_id)763*61046927SAndroid Build Coastguard Worker vlVaDestroyConfig(VADriverContextP ctx, VAConfigID config_id)
764*61046927SAndroid Build Coastguard Worker {
765*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
766*61046927SAndroid Build Coastguard Worker    vlVaConfig *config;
767*61046927SAndroid Build Coastguard Worker 
768*61046927SAndroid Build Coastguard Worker    if (!ctx)
769*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
770*61046927SAndroid Build Coastguard Worker 
771*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
772*61046927SAndroid Build Coastguard Worker 
773*61046927SAndroid Build Coastguard Worker    if (!drv)
774*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
775*61046927SAndroid Build Coastguard Worker 
776*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
777*61046927SAndroid Build Coastguard Worker    config = handle_table_get(drv->htab, config_id);
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker    if (!config) {
780*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
781*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONFIG;
782*61046927SAndroid Build Coastguard Worker    }
783*61046927SAndroid Build Coastguard Worker 
784*61046927SAndroid Build Coastguard Worker    FREE(config);
785*61046927SAndroid Build Coastguard Worker    handle_table_remove(drv->htab, config_id);
786*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
787*61046927SAndroid Build Coastguard Worker 
788*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker 
791*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigAttributes(VADriverContextP ctx,VAConfigID config_id,VAProfile * profile,VAEntrypoint * entrypoint,VAConfigAttrib * attrib_list,int * num_attribs)792*61046927SAndroid Build Coastguard Worker vlVaQueryConfigAttributes(VADriverContextP ctx, VAConfigID config_id, VAProfile *profile,
793*61046927SAndroid Build Coastguard Worker                           VAEntrypoint *entrypoint, VAConfigAttrib *attrib_list, int *num_attribs)
794*61046927SAndroid Build Coastguard Worker {
795*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
796*61046927SAndroid Build Coastguard Worker    vlVaConfig *config;
797*61046927SAndroid Build Coastguard Worker 
798*61046927SAndroid Build Coastguard Worker    if (!ctx)
799*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
800*61046927SAndroid Build Coastguard Worker 
801*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
802*61046927SAndroid Build Coastguard Worker 
803*61046927SAndroid Build Coastguard Worker    if (!drv)
804*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
805*61046927SAndroid Build Coastguard Worker 
806*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
807*61046927SAndroid Build Coastguard Worker    config = handle_table_get(drv->htab, config_id);
808*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
809*61046927SAndroid Build Coastguard Worker 
810*61046927SAndroid Build Coastguard Worker    if (!config)
811*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONFIG;
812*61046927SAndroid Build Coastguard Worker 
813*61046927SAndroid Build Coastguard Worker    *profile = PipeToProfile(config->profile);
814*61046927SAndroid Build Coastguard Worker 
815*61046927SAndroid Build Coastguard Worker    switch (config->entrypoint) {
816*61046927SAndroid Build Coastguard Worker    case PIPE_VIDEO_ENTRYPOINT_BITSTREAM:
817*61046927SAndroid Build Coastguard Worker       *entrypoint = VAEntrypointVLD;
818*61046927SAndroid Build Coastguard Worker       break;
819*61046927SAndroid Build Coastguard Worker    case PIPE_VIDEO_ENTRYPOINT_ENCODE:
820*61046927SAndroid Build Coastguard Worker       *entrypoint = VAEntrypointEncSlice;
821*61046927SAndroid Build Coastguard Worker       break;
822*61046927SAndroid Build Coastguard Worker    case PIPE_VIDEO_ENTRYPOINT_PROCESSING:
823*61046927SAndroid Build Coastguard Worker       *entrypoint = VAEntrypointVideoProc;
824*61046927SAndroid Build Coastguard Worker       break;
825*61046927SAndroid Build Coastguard Worker    default:
826*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONFIG;
827*61046927SAndroid Build Coastguard Worker    }
828*61046927SAndroid Build Coastguard Worker 
829*61046927SAndroid Build Coastguard Worker    *num_attribs = 1;
830*61046927SAndroid Build Coastguard Worker    attrib_list[0].type = VAConfigAttribRTFormat;
831*61046927SAndroid Build Coastguard Worker    attrib_list[0].value = config->rt_format;
832*61046927SAndroid Build Coastguard Worker 
833*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
834*61046927SAndroid Build Coastguard Worker }
835