xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/vdpau/query.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker  *
3*61046927SAndroid Build Coastguard Worker  * Copyright 2010 Younes Manton.
4*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker  * the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
16*61046927SAndroid Build Coastguard Worker  * of the Software.
17*61046927SAndroid Build Coastguard Worker  *
18*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22*61046927SAndroid Build Coastguard Worker  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*61046927SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*61046927SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker  *
26*61046927SAndroid Build Coastguard Worker  **************************************************************************/
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include <assert.h>
29*61046927SAndroid Build Coastguard Worker #include <math.h>
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #include "vdpau_private.h"
32*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
33*61046927SAndroid Build Coastguard Worker #include "pipe/p_defines.h"
34*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker #include "vl/vl_codec.h"
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker /**
39*61046927SAndroid Build Coastguard Worker  * Retrieve the VDPAU version implemented by the backend.
40*61046927SAndroid Build Coastguard Worker  */
41*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpGetApiVersion(uint32_t * api_version)42*61046927SAndroid Build Coastguard Worker vlVdpGetApiVersion(uint32_t *api_version)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker    if (!api_version)
45*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker    *api_version = 1;
48*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker /**
52*61046927SAndroid Build Coastguard Worker  * Retrieve an implementation-specific string description of the implementation.
53*61046927SAndroid Build Coastguard Worker  * This typically includes detailed version information.
54*61046927SAndroid Build Coastguard Worker  */
55*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpGetInformationString(char const ** information_string)56*61046927SAndroid Build Coastguard Worker vlVdpGetInformationString(char const **information_string)
57*61046927SAndroid Build Coastguard Worker {
58*61046927SAndroid Build Coastguard Worker    if (!information_string)
59*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    *information_string = INFORMATION_STRING;
62*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker /**
66*61046927SAndroid Build Coastguard Worker  * Query the implementation's VdpVideoSurface capabilities.
67*61046927SAndroid Build Coastguard Worker  */
68*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoSurfaceQueryCapabilities(VdpDevice device,VdpChromaType surface_chroma_type,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)69*61046927SAndroid Build Coastguard Worker vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
70*61046927SAndroid Build Coastguard Worker                                    VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
73*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
74*61046927SAndroid Build Coastguard Worker    uint32_t max_2d_texture_size;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    if (!(is_supported && max_width && max_height))
77*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
80*61046927SAndroid Build Coastguard Worker    if (!dev)
81*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
84*61046927SAndroid Build Coastguard Worker    if (!pscreen)
85*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    /* XXX: Current limits */
90*61046927SAndroid Build Coastguard Worker    *is_supported = true;
91*61046927SAndroid Build Coastguard Worker    max_2d_texture_size = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
92*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
93*61046927SAndroid Build Coastguard Worker    if (!max_2d_texture_size)
94*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    *max_width = *max_height = max_2d_texture_size;
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker /**
102*61046927SAndroid Build Coastguard Worker  * Query the implementation's VdpVideoSurface GetBits/PutBits capabilities.
103*61046927SAndroid Build Coastguard Worker  */
104*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device,VdpChromaType surface_chroma_type,VdpYCbCrFormat bits_ycbcr_format,VdpBool * is_supported)105*61046927SAndroid Build Coastguard Worker vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
106*61046927SAndroid Build Coastguard Worker                                                   VdpYCbCrFormat bits_ycbcr_format,
107*61046927SAndroid Build Coastguard Worker                                                   VdpBool *is_supported)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
110*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
111*61046927SAndroid Build Coastguard Worker    VdpYCbCrFormat ycbcrFormat;
112*61046927SAndroid Build Coastguard Worker    bool supported;
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    if (!is_supported)
115*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
118*61046927SAndroid Build Coastguard Worker    if (!dev)
119*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
122*61046927SAndroid Build Coastguard Worker    if (!pscreen)
123*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
124*61046927SAndroid Build Coastguard Worker 
125*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    ycbcrFormat = bits_ycbcr_format;
128*61046927SAndroid Build Coastguard Worker    switch(bits_ycbcr_format) {
129*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_NV12:
130*61046927SAndroid Build Coastguard Worker       supported = surface_chroma_type == VDP_CHROMA_TYPE_420;
131*61046927SAndroid Build Coastguard Worker       break;
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_YV12:
134*61046927SAndroid Build Coastguard Worker       supported = surface_chroma_type == VDP_CHROMA_TYPE_420;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker       /* We can convert YV12 to NV12 on the fly! */
137*61046927SAndroid Build Coastguard Worker       ycbcrFormat = VDP_YCBCR_FORMAT_NV12;
138*61046927SAndroid Build Coastguard Worker       break;
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_UYVY:
141*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_YUYV:
142*61046927SAndroid Build Coastguard Worker       supported = surface_chroma_type == VDP_CHROMA_TYPE_422;
143*61046927SAndroid Build Coastguard Worker       break;
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_Y8U8V8A8:
146*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_V8U8Y8A8:
147*61046927SAndroid Build Coastguard Worker       supported = surface_chroma_type == VDP_CHROMA_TYPE_444;
148*61046927SAndroid Build Coastguard Worker       break;
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_P010:
151*61046927SAndroid Build Coastguard Worker    case VDP_YCBCR_FORMAT_P016:
152*61046927SAndroid Build Coastguard Worker       /* Do any other profiles imply support for this chroma type? */
153*61046927SAndroid Build Coastguard Worker       supported = (surface_chroma_type == VDP_CHROMA_TYPE_420_16)
154*61046927SAndroid Build Coastguard Worker                   && vl_codec_supported(pscreen, PIPE_VIDEO_PROFILE_HEVC_MAIN_10, false);
155*61046927SAndroid Build Coastguard Worker       break;
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    default:
158*61046927SAndroid Build Coastguard Worker       supported = false;
159*61046927SAndroid Build Coastguard Worker       break;
160*61046927SAndroid Build Coastguard Worker    }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    if (supported &&
163*61046927SAndroid Build Coastguard Worker        !pscreen->is_video_format_supported(pscreen,
164*61046927SAndroid Build Coastguard Worker                                            FormatYCBCRToPipe(ycbcrFormat),
165*61046927SAndroid Build Coastguard Worker                                            PIPE_VIDEO_PROFILE_UNKNOWN,
166*61046927SAndroid Build Coastguard Worker                                            PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) {
167*61046927SAndroid Build Coastguard Worker       supported = false;
168*61046927SAndroid Build Coastguard Worker    }
169*61046927SAndroid Build Coastguard Worker    *is_supported = supported;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker /**
177*61046927SAndroid Build Coastguard Worker  * Query the implementation's VdpDecoder capabilities.
178*61046927SAndroid Build Coastguard Worker  */
179*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderQueryCapabilities(VdpDevice device,VdpDecoderProfile profile,VdpBool * is_supported,uint32_t * max_level,uint32_t * max_macroblocks,uint32_t * max_width,uint32_t * max_height)180*61046927SAndroid Build Coastguard Worker vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile,
181*61046927SAndroid Build Coastguard Worker                               VdpBool *is_supported, uint32_t *max_level, uint32_t *max_macroblocks,
182*61046927SAndroid Build Coastguard Worker                               uint32_t *max_width, uint32_t *max_height)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
185*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
186*61046927SAndroid Build Coastguard Worker    enum pipe_video_profile p_profile;
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker    if (!(is_supported && max_level && max_macroblocks && max_width && max_height))
189*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
192*61046927SAndroid Build Coastguard Worker    if (!dev)
193*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
196*61046927SAndroid Build Coastguard Worker    if (!pscreen)
197*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker    p_profile = ProfileToPipe(profile);
200*61046927SAndroid Build Coastguard Worker    if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)	{
201*61046927SAndroid Build Coastguard Worker       *is_supported = false;
202*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_OK;
203*61046927SAndroid Build Coastguard Worker    }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
206*61046927SAndroid Build Coastguard Worker    *is_supported = vl_codec_supported(pscreen, p_profile, false);
207*61046927SAndroid Build Coastguard Worker    if (*is_supported) {
208*61046927SAndroid Build Coastguard Worker       *max_width = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
209*61046927SAndroid Build Coastguard Worker                                             PIPE_VIDEO_CAP_MAX_WIDTH);
210*61046927SAndroid Build Coastguard Worker       *max_height = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
211*61046927SAndroid Build Coastguard Worker                                              PIPE_VIDEO_CAP_MAX_HEIGHT);
212*61046927SAndroid Build Coastguard Worker       *max_level = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
213*61046927SAndroid Build Coastguard Worker                                             PIPE_VIDEO_CAP_MAX_LEVEL);
214*61046927SAndroid Build Coastguard Worker       *max_macroblocks = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
215*61046927SAndroid Build Coastguard Worker                                             PIPE_VIDEO_CAP_MAX_MACROBLOCKS);
216*61046927SAndroid Build Coastguard Worker       if (*max_macroblocks == 0) {
217*61046927SAndroid Build Coastguard Worker          *max_macroblocks = (*max_width/16)*(*max_height/16);
218*61046927SAndroid Build Coastguard Worker       }
219*61046927SAndroid Build Coastguard Worker    } else {
220*61046927SAndroid Build Coastguard Worker       *max_width = 0;
221*61046927SAndroid Build Coastguard Worker       *max_height = 0;
222*61046927SAndroid Build Coastguard Worker       *max_level = 0;
223*61046927SAndroid Build Coastguard Worker       *max_macroblocks = 0;
224*61046927SAndroid Build Coastguard Worker    }
225*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
228*61046927SAndroid Build Coastguard Worker }
229*61046927SAndroid Build Coastguard Worker 
230*61046927SAndroid Build Coastguard Worker /**
231*61046927SAndroid Build Coastguard Worker  * Query the implementation's VdpOutputSurface capabilities.
232*61046927SAndroid Build Coastguard Worker  */
233*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)234*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
235*61046927SAndroid Build Coastguard Worker                                     VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
236*61046927SAndroid Build Coastguard Worker {
237*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
238*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
239*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
242*61046927SAndroid Build Coastguard Worker    if (!dev)
243*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
246*61046927SAndroid Build Coastguard Worker    if (!pscreen)
247*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    format = VdpFormatRGBAToPipe(surface_rgba_format);
250*61046927SAndroid Build Coastguard Worker    if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
251*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_RGBA_FORMAT;
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker    if (!(is_supported && max_width && max_height))
254*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
257*61046927SAndroid Build Coastguard Worker    *is_supported = pscreen->is_format_supported
258*61046927SAndroid Build Coastguard Worker    (
259*61046927SAndroid Build Coastguard Worker       pscreen, format, PIPE_TEXTURE_2D, 1, 1,
260*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
261*61046927SAndroid Build Coastguard Worker    );
262*61046927SAndroid Build Coastguard Worker    if (*is_supported) {
263*61046927SAndroid Build Coastguard Worker       uint32_t max_2d_texture_size = pscreen->get_param(
264*61046927SAndroid Build Coastguard Worker          pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker       if (!max_2d_texture_size) {
267*61046927SAndroid Build Coastguard Worker          mtx_unlock(&dev->mutex);
268*61046927SAndroid Build Coastguard Worker          return VDP_STATUS_ERROR;
269*61046927SAndroid Build Coastguard Worker       }
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker       *max_width = *max_height = max_2d_texture_size;
272*61046927SAndroid Build Coastguard Worker    } else {
273*61046927SAndroid Build Coastguard Worker       *max_width = 0;
274*61046927SAndroid Build Coastguard Worker       *max_height = 0;
275*61046927SAndroid Build Coastguard Worker    }
276*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker /**
282*61046927SAndroid Build Coastguard Worker  * Query the implementation's capability to perform a PutBits operation using
283*61046927SAndroid Build Coastguard Worker  * application data matching the surface's format.
284*61046927SAndroid Build Coastguard Worker  */
285*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported)286*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
287*61046927SAndroid Build Coastguard Worker                                                     VdpBool *is_supported)
288*61046927SAndroid Build Coastguard Worker {
289*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
290*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
291*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
294*61046927SAndroid Build Coastguard Worker    if (!dev)
295*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
298*61046927SAndroid Build Coastguard Worker    if (!pscreen)
299*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_ERROR;
300*61046927SAndroid Build Coastguard Worker 
301*61046927SAndroid Build Coastguard Worker    format = VdpFormatRGBAToPipe(surface_rgba_format);
302*61046927SAndroid Build Coastguard Worker    if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
303*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_RGBA_FORMAT;
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    if (!is_supported)
306*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
307*61046927SAndroid Build Coastguard Worker 
308*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
309*61046927SAndroid Build Coastguard Worker    *is_supported = pscreen->is_format_supported
310*61046927SAndroid Build Coastguard Worker    (
311*61046927SAndroid Build Coastguard Worker       pscreen, format, PIPE_TEXTURE_2D, 1, 1,
312*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
313*61046927SAndroid Build Coastguard Worker    );
314*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker /**
320*61046927SAndroid Build Coastguard Worker  * Query the implementation's capability to perform a PutBits operation using
321*61046927SAndroid Build Coastguard Worker  * application data in a specific indexed format.
322*61046927SAndroid Build Coastguard Worker  */
323*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpIndexedFormat bits_indexed_format,VdpColorTableFormat color_table_format,VdpBool * is_supported)324*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,
325*61046927SAndroid Build Coastguard Worker                                                   VdpRGBAFormat surface_rgba_format,
326*61046927SAndroid Build Coastguard Worker                                                   VdpIndexedFormat bits_indexed_format,
327*61046927SAndroid Build Coastguard Worker                                                   VdpColorTableFormat color_table_format,
328*61046927SAndroid Build Coastguard Worker                                                   VdpBool *is_supported)
329*61046927SAndroid Build Coastguard Worker {
330*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
331*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
332*61046927SAndroid Build Coastguard Worker    enum pipe_format rgba_format, index_format, colortbl_format;
333*61046927SAndroid Build Coastguard Worker 
334*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
335*61046927SAndroid Build Coastguard Worker    if (!dev)
336*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
339*61046927SAndroid Build Coastguard Worker    if (!pscreen)
340*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_ERROR;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker    rgba_format = VdpFormatRGBAToPipe(surface_rgba_format);
343*61046927SAndroid Build Coastguard Worker    if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
344*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_RGBA_FORMAT;
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker    index_format = FormatIndexedToPipe(bits_indexed_format);
347*61046927SAndroid Build Coastguard Worker    if (index_format == PIPE_FORMAT_NONE)
348*61046927SAndroid Build Coastguard Worker        return VDP_STATUS_INVALID_INDEXED_FORMAT;
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    colortbl_format = FormatColorTableToPipe(color_table_format);
351*61046927SAndroid Build Coastguard Worker    if (colortbl_format == PIPE_FORMAT_NONE)
352*61046927SAndroid Build Coastguard Worker        return VDP_STATUS_INVALID_COLOR_TABLE_FORMAT;
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker    if (!is_supported)
355*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
358*61046927SAndroid Build Coastguard Worker    *is_supported = pscreen->is_format_supported
359*61046927SAndroid Build Coastguard Worker    (
360*61046927SAndroid Build Coastguard Worker       pscreen, rgba_format, PIPE_TEXTURE_2D, 1, 1,
361*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
362*61046927SAndroid Build Coastguard Worker    );
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker    *is_supported &= pscreen->is_format_supported
365*61046927SAndroid Build Coastguard Worker    (
366*61046927SAndroid Build Coastguard Worker       pscreen, index_format, PIPE_TEXTURE_2D, 1, 1,
367*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW
368*61046927SAndroid Build Coastguard Worker    );
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker    *is_supported &= pscreen->is_format_supported
371*61046927SAndroid Build Coastguard Worker    (
372*61046927SAndroid Build Coastguard Worker       pscreen, colortbl_format, PIPE_TEXTURE_1D, 1, 1,
373*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW
374*61046927SAndroid Build Coastguard Worker    );
375*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
376*61046927SAndroid Build Coastguard Worker 
377*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker /**
381*61046927SAndroid Build Coastguard Worker  * Query the implementation's capability to perform a PutBits operation using
382*61046927SAndroid Build Coastguard Worker  * application data in a specific YCbCr/YUB format.
383*61046927SAndroid Build Coastguard Worker  */
384*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpYCbCrFormat bits_ycbcr_format,VdpBool * is_supported)385*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
386*61046927SAndroid Build Coastguard Worker                                                 VdpYCbCrFormat bits_ycbcr_format,
387*61046927SAndroid Build Coastguard Worker                                                 VdpBool *is_supported)
388*61046927SAndroid Build Coastguard Worker {
389*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
390*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
391*61046927SAndroid Build Coastguard Worker    enum pipe_format rgba_format, ycbcr_format;
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
394*61046927SAndroid Build Coastguard Worker    if (!dev)
395*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
398*61046927SAndroid Build Coastguard Worker    if (!pscreen)
399*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_ERROR;
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker    rgba_format = VdpFormatRGBAToPipe(surface_rgba_format);
402*61046927SAndroid Build Coastguard Worker    if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
403*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_RGBA_FORMAT;
404*61046927SAndroid Build Coastguard Worker 
405*61046927SAndroid Build Coastguard Worker    ycbcr_format = FormatYCBCRToPipe(bits_ycbcr_format);
406*61046927SAndroid Build Coastguard Worker    if (ycbcr_format == PIPE_FORMAT_NONE)
407*61046927SAndroid Build Coastguard Worker        return VDP_STATUS_INVALID_INDEXED_FORMAT;
408*61046927SAndroid Build Coastguard Worker 
409*61046927SAndroid Build Coastguard Worker    if (!is_supported)
410*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
413*61046927SAndroid Build Coastguard Worker    *is_supported = pscreen->is_format_supported
414*61046927SAndroid Build Coastguard Worker    (
415*61046927SAndroid Build Coastguard Worker       pscreen, rgba_format, PIPE_TEXTURE_2D, 1, 1,
416*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
417*61046927SAndroid Build Coastguard Worker    );
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker    *is_supported &= pscreen->is_video_format_supported
420*61046927SAndroid Build Coastguard Worker    (
421*61046927SAndroid Build Coastguard Worker       pscreen, ycbcr_format,
422*61046927SAndroid Build Coastguard Worker       PIPE_VIDEO_PROFILE_UNKNOWN,
423*61046927SAndroid Build Coastguard Worker       PIPE_VIDEO_ENTRYPOINT_BITSTREAM
424*61046927SAndroid Build Coastguard Worker    );
425*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
426*61046927SAndroid Build Coastguard Worker 
427*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
428*61046927SAndroid Build Coastguard Worker }
429*61046927SAndroid Build Coastguard Worker 
430*61046927SAndroid Build Coastguard Worker /**
431*61046927SAndroid Build Coastguard Worker  * Query the implementation's VdpBitmapSurface capabilities.
432*61046927SAndroid Build Coastguard Worker  */
433*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)434*61046927SAndroid Build Coastguard Worker vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
435*61046927SAndroid Build Coastguard Worker                                     VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
436*61046927SAndroid Build Coastguard Worker {
437*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev;
438*61046927SAndroid Build Coastguard Worker    struct pipe_screen *pscreen;
439*61046927SAndroid Build Coastguard Worker    enum pipe_format format;
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker    dev = vlGetDataHTAB(device);
442*61046927SAndroid Build Coastguard Worker    if (!dev)
443*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
444*61046927SAndroid Build Coastguard Worker 
445*61046927SAndroid Build Coastguard Worker    pscreen = dev->vscreen->pscreen;
446*61046927SAndroid Build Coastguard Worker    if (!pscreen)
447*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_RESOURCES;
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker    format = VdpFormatRGBAToPipe(surface_rgba_format);
450*61046927SAndroid Build Coastguard Worker    if (format == PIPE_FORMAT_NONE)
451*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_RGBA_FORMAT;
452*61046927SAndroid Build Coastguard Worker 
453*61046927SAndroid Build Coastguard Worker    if (!(is_supported && max_width && max_height))
454*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
455*61046927SAndroid Build Coastguard Worker 
456*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
457*61046927SAndroid Build Coastguard Worker    *is_supported = pscreen->is_format_supported
458*61046927SAndroid Build Coastguard Worker    (
459*61046927SAndroid Build Coastguard Worker       pscreen, format, PIPE_TEXTURE_2D, 1, 1,
460*61046927SAndroid Build Coastguard Worker       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
461*61046927SAndroid Build Coastguard Worker    );
462*61046927SAndroid Build Coastguard Worker    if (*is_supported) {
463*61046927SAndroid Build Coastguard Worker       uint32_t max_2d_texture_size = pscreen->get_param(
464*61046927SAndroid Build Coastguard Worker          pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker       if (!max_2d_texture_size) {
467*61046927SAndroid Build Coastguard Worker          mtx_unlock(&dev->mutex);
468*61046927SAndroid Build Coastguard Worker          return VDP_STATUS_ERROR;
469*61046927SAndroid Build Coastguard Worker       }
470*61046927SAndroid Build Coastguard Worker 
471*61046927SAndroid Build Coastguard Worker       *max_width = *max_height = max_2d_texture_size;
472*61046927SAndroid Build Coastguard Worker    } else {
473*61046927SAndroid Build Coastguard Worker       *max_width = 0;
474*61046927SAndroid Build Coastguard Worker       *max_height = 0;
475*61046927SAndroid Build Coastguard Worker    }
476*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
477*61046927SAndroid Build Coastguard Worker 
478*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker /**
482*61046927SAndroid Build Coastguard Worker  * Query the implementation's support for a specific feature.
483*61046927SAndroid Build Coastguard Worker  */
484*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryFeatureSupport(VdpDevice device,VdpVideoMixerFeature feature,VdpBool * is_supported)485*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryFeatureSupport(VdpDevice device, VdpVideoMixerFeature feature,
486*61046927SAndroid Build Coastguard Worker                                    VdpBool *is_supported)
487*61046927SAndroid Build Coastguard Worker {
488*61046927SAndroid Build Coastguard Worker    if (!is_supported)
489*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
490*61046927SAndroid Build Coastguard Worker 
491*61046927SAndroid Build Coastguard Worker    switch (feature) {
492*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_FEATURE_SHARPNESS:
493*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION:
494*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL:
495*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY:
496*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
497*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_TRUE;
498*61046927SAndroid Build Coastguard Worker       break;
499*61046927SAndroid Build Coastguard Worker    default:
500*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_FALSE;
501*61046927SAndroid Build Coastguard Worker       break;
502*61046927SAndroid Build Coastguard Worker    }
503*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker 
506*61046927SAndroid Build Coastguard Worker /**
507*61046927SAndroid Build Coastguard Worker  * Query the implementation's support for a specific parameter.
508*61046927SAndroid Build Coastguard Worker  */
509*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryParameterSupport(VdpDevice device,VdpVideoMixerParameter parameter,VdpBool * is_supported)510*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter parameter,
511*61046927SAndroid Build Coastguard Worker                                      VdpBool *is_supported)
512*61046927SAndroid Build Coastguard Worker {
513*61046927SAndroid Build Coastguard Worker    if (!is_supported)
514*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
515*61046927SAndroid Build Coastguard Worker 
516*61046927SAndroid Build Coastguard Worker    switch (parameter) {
517*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
518*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
519*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
520*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
521*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_TRUE;
522*61046927SAndroid Build Coastguard Worker       break;
523*61046927SAndroid Build Coastguard Worker    default:
524*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_FALSE;
525*61046927SAndroid Build Coastguard Worker       break;
526*61046927SAndroid Build Coastguard Worker    }
527*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker /**
531*61046927SAndroid Build Coastguard Worker  * Query the implementation's supported for a specific parameter.
532*61046927SAndroid Build Coastguard Worker  */
533*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryParameterValueRange(VdpDevice device,VdpVideoMixerParameter parameter,void * min_value,void * max_value)534*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter,
535*61046927SAndroid Build Coastguard Worker                                         void *min_value, void *max_value)
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker    vlVdpDevice *dev = vlGetDataHTAB(device);
538*61046927SAndroid Build Coastguard Worker    struct pipe_screen *screen;
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker    if (!dev)
541*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_HANDLE;
542*61046927SAndroid Build Coastguard Worker    if (!(min_value && max_value))
543*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
544*61046927SAndroid Build Coastguard Worker 
545*61046927SAndroid Build Coastguard Worker    mtx_lock(&dev->mutex);
546*61046927SAndroid Build Coastguard Worker    screen = dev->vscreen->pscreen;
547*61046927SAndroid Build Coastguard Worker    switch (parameter) {
548*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
549*61046927SAndroid Build Coastguard Worker       *(uint32_t*)min_value = 48;
550*61046927SAndroid Build Coastguard Worker       *(uint32_t*)max_value = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
551*61046927SAndroid Build Coastguard Worker                                                       PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
552*61046927SAndroid Build Coastguard Worker                                                       PIPE_VIDEO_CAP_MAX_WIDTH);
553*61046927SAndroid Build Coastguard Worker       break;
554*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
555*61046927SAndroid Build Coastguard Worker       *(uint32_t*)min_value = 48;
556*61046927SAndroid Build Coastguard Worker       *(uint32_t*)max_value = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
557*61046927SAndroid Build Coastguard Worker                                                       PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
558*61046927SAndroid Build Coastguard Worker                                                       PIPE_VIDEO_CAP_MAX_HEIGHT);
559*61046927SAndroid Build Coastguard Worker       break;
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
562*61046927SAndroid Build Coastguard Worker       *(uint32_t*)min_value = 0;
563*61046927SAndroid Build Coastguard Worker       *(uint32_t*)max_value = 4;
564*61046927SAndroid Build Coastguard Worker       break;
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
567*61046927SAndroid Build Coastguard Worker    default:
568*61046927SAndroid Build Coastguard Worker       mtx_unlock(&dev->mutex);
569*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
570*61046927SAndroid Build Coastguard Worker    }
571*61046927SAndroid Build Coastguard Worker    mtx_unlock(&dev->mutex);
572*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker /**
576*61046927SAndroid Build Coastguard Worker  * Query the implementation's support for a specific attribute.
577*61046927SAndroid Build Coastguard Worker  */
578*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryAttributeSupport(VdpDevice device,VdpVideoMixerAttribute attribute,VdpBool * is_supported)579*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute attribute,
580*61046927SAndroid Build Coastguard Worker                                      VdpBool *is_supported)
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker    if (!is_supported)
583*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker    switch (attribute) {
586*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
587*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
588*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
589*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
590*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
591*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
592*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
593*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_TRUE;
594*61046927SAndroid Build Coastguard Worker       break;
595*61046927SAndroid Build Coastguard Worker    default:
596*61046927SAndroid Build Coastguard Worker       *is_supported = VDP_FALSE;
597*61046927SAndroid Build Coastguard Worker    }
598*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker 
601*61046927SAndroid Build Coastguard Worker /**
602*61046927SAndroid Build Coastguard Worker  * Query the implementation's supported for a specific attribute.
603*61046927SAndroid Build Coastguard Worker  */
604*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device,VdpVideoMixerAttribute attribute,void * min_value,void * max_value)605*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device, VdpVideoMixerAttribute attribute,
606*61046927SAndroid Build Coastguard Worker                                         void *min_value, void *max_value)
607*61046927SAndroid Build Coastguard Worker {
608*61046927SAndroid Build Coastguard Worker    if (!(min_value && max_value))
609*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_POINTER;
610*61046927SAndroid Build Coastguard Worker 
611*61046927SAndroid Build Coastguard Worker    switch (attribute) {
612*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
613*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
614*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
615*61046927SAndroid Build Coastguard Worker       *(float*)min_value = 0.0f;
616*61046927SAndroid Build Coastguard Worker       *(float*)max_value = 1.0f;
617*61046927SAndroid Build Coastguard Worker       break;
618*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
619*61046927SAndroid Build Coastguard Worker       *(float*)min_value = -1.0f;
620*61046927SAndroid Build Coastguard Worker       *(float*)max_value = 1.0f;
621*61046927SAndroid Build Coastguard Worker       break;
622*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
623*61046927SAndroid Build Coastguard Worker       *(uint8_t*)min_value = 0;
624*61046927SAndroid Build Coastguard Worker       *(uint8_t*)max_value = 1;
625*61046927SAndroid Build Coastguard Worker       break;
626*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
627*61046927SAndroid Build Coastguard Worker    case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
628*61046927SAndroid Build Coastguard Worker    default:
629*61046927SAndroid Build Coastguard Worker       return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE;
630*61046927SAndroid Build Coastguard Worker    }
631*61046927SAndroid Build Coastguard Worker    return VDP_STATUS_OK;
632*61046927SAndroid Build Coastguard Worker }
633