13867933ecbc34ed1f68d735282580ca1e4eedea1Christian König/**************************************************************************
23867933ecbc34ed1f68d735282580ca1e4eedea1Christian König *
33867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
43867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * Copyright 2014 Advanced Micro Devices, Inc.
53867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * All Rights Reserved.
63867933ecbc34ed1f68d735282580ca1e4eedea1Christian König *
73867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * Permission is hereby granted, free of charge, to any person obtaining a
83867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * copy of this software and associated documentation files (the
93867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * "Software"), to deal in the Software without restriction, including
103867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * without limitation the rights to use, copy, modify, merge, publish,
113867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * distribute, sub license, and/or sell copies of the Software, and to
123867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * permit persons to whom the Software is furnished to do so, subject to
133867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * the following conditions:
143867933ecbc34ed1f68d735282580ca1e4eedea1Christian König *
153867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * The above copyright notice and this permission notice (including the
163867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * next paragraph) shall be included in all copies or substantial portions
173867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * of the Software.
183867933ecbc34ed1f68d735282580ca1e4eedea1Christian König *
193867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
203867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
213867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
223867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
233867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
243867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
253867933ecbc34ed1f68d735282580ca1e4eedea1Christian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
263867933ecbc34ed1f68d735282580ca1e4eedea1Christian König *
273867933ecbc34ed1f68d735282580ca1e4eedea1Christian König **************************************************************************/
283867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
291be55158381f509d420e42f40018ec95fe329f5bChristian König#include "pipe/p_screen.h"
307913c8943a1d1dd1b3f77f34bb4b0108a10a1d20Christian König#include "pipe/p_video_codec.h"
311be55158381f509d420e42f40018ec95fe329f5bChristian König
3205b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce#include "state_tracker/drm_driver.h"
3305b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce
341be55158381f509d420e42f40018ec95fe329f5bChristian König#include "util/u_memory.h"
351be55158381f509d420e42f40018ec95fe329f5bChristian König#include "util/u_handle_table.h"
361be55158381f509d420e42f40018ec95fe329f5bChristian König#include "util/u_rect.h"
379460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga#include "util/u_sampler.h"
389460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga#include "util/u_surface.h"
391be55158381f509d420e42f40018ec95fe329f5bChristian König
401be55158381f509d420e42f40018ec95fe329f5bChristian König#include "vl/vl_compositor.h"
41adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce#include "vl/vl_video_buffer.h"
421be55158381f509d420e42f40018ec95fe329f5bChristian König#include "vl/vl_winsys.h"
431be55158381f509d420e42f40018ec95fe329f5bChristian König
443867933ecbc34ed1f68d735282580ca1e4eedea1Christian König#include "va_private.h"
453867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
4610dec2de2d9f568675d66d736b48701fa26f7b50Boyuan ZhangDEBUG_GET_ONCE_BOOL_OPTION(nointerlace, "VAAPI_DISABLE_INTERLACE", FALSE);
4710dec2de2d9f568675d66d736b48701fa26f7b50Boyuan Zhang
4805b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce#include <va/va_drmcommon.h>
4905b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce
50cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorcestatic const enum pipe_format vpp_surface_formats[] = {
51cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   PIPE_FORMAT_B8G8R8A8_UNORM, PIPE_FORMAT_R8G8B8A8_UNORM,
52cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   PIPE_FORMAT_B8G8R8X8_UNORM, PIPE_FORMAT_R8G8B8X8_UNORM
53cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce};
54cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce
553867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
563867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaCreateSurfaces(VADriverContextP ctx, int width, int height, int format,
573867933ecbc34ed1f68d735282580ca1e4eedea1Christian König                   int num_surfaces, VASurfaceID *surfaces)
583867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
59adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce   return vlVaCreateSurfaces2(ctx, format, width, height, surfaces, num_surfaces,
60adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce                              NULL, 0);
613867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
623867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
633867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
643867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID *surface_list, int num_surfaces)
653867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
661be55158381f509d420e42f40018ec95fe329f5bChristian König   vlVaDriver *drv;
671be55158381f509d420e42f40018ec95fe329f5bChristian König   int i;
681be55158381f509d420e42f40018ec95fe329f5bChristian König
693867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
703867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
713867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
721be55158381f509d420e42f40018ec95fe329f5bChristian König   drv = VL_VA_DRIVER(ctx);
738479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_lock(drv->mutex);
741be55158381f509d420e42f40018ec95fe329f5bChristian König   for (i = 0; i < num_surfaces; ++i) {
751be55158381f509d420e42f40018ec95fe329f5bChristian König      vlVaSurface *surf = handle_table_get(drv->htab, surface_list[i]);
7646dba701d81199e6450dc50ef3f0ff476dbfb17fGurkirpal Singh      if (!surf) {
7746dba701d81199e6450dc50ef3f0ff476dbfb17fGurkirpal Singh         pipe_mutex_unlock(drv->mutex);
7846dba701d81199e6450dc50ef3f0ff476dbfb17fGurkirpal Singh         return VA_STATUS_ERROR_INVALID_SURFACE;
7946dba701d81199e6450dc50ef3f0ff476dbfb17fGurkirpal Singh      }
801be55158381f509d420e42f40018ec95fe329f5bChristian König      if (surf->buffer)
811be55158381f509d420e42f40018ec95fe329f5bChristian König         surf->buffer->destroy(surf->buffer);
829460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      util_dynarray_fini(&surf->subpics);
831be55158381f509d420e42f40018ec95fe329f5bChristian König      FREE(surf);
841be55158381f509d420e42f40018ec95fe329f5bChristian König      handle_table_remove(drv->htab, surface_list[i]);
851be55158381f509d420e42f40018ec95fe329f5bChristian König   }
868479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_unlock(drv->mutex);
871be55158381f509d420e42f40018ec95fe329f5bChristian König
881be55158381f509d420e42f40018ec95fe329f5bChristian König   return VA_STATUS_SUCCESS;
893867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
903867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
913867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
923867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaSyncSurface(VADriverContextP ctx, VASurfaceID render_target)
933867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
94c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   vlVaDriver *drv;
95c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   vlVaContext *context;
96c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   vlVaSurface *surf;
97c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang
983867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
993867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
1003867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
101c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   drv = VL_VA_DRIVER(ctx);
102c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   if (!drv)
103c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      return VA_STATUS_ERROR_INVALID_CONTEXT;
104c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang
105c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   pipe_mutex_lock(drv->mutex);
106c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   surf = handle_table_get(drv->htab, render_target);
107c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang
108cd340052adf4246284311f5262664ab8867396e2Eric Engestrom   if (!surf || !surf->buffer) {
109cd340052adf4246284311f5262664ab8867396e2Eric Engestrom      pipe_mutex_unlock(drv->mutex);
110c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      return VA_STATUS_ERROR_INVALID_SURFACE;
111cd340052adf4246284311f5262664ab8867396e2Eric Engestrom   }
112c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang
113a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson   if (!surf->feedback) {
114a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson      // No outstanding operation: nothing to do.
115a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson      pipe_mutex_unlock(drv->mutex);
116a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson      return VA_STATUS_SUCCESS;
117a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson   }
118a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson
119c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   context = handle_table_get(drv->htab, surf->ctx);
120c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   if (!context) {
121c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      pipe_mutex_unlock(drv->mutex);
122c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      return VA_STATUS_ERROR_INVALID_CONTEXT;
123c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   }
124c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang
125c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
126c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      int frame_diff;
1278206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang      if (context->desc.h264enc.frame_num_cnt >= surf->frame_num_cnt)
128c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang         frame_diff = context->desc.h264enc.frame_num_cnt - surf->frame_num_cnt;
129c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      else
130c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang         frame_diff = 0xFFFFFFFF - surf->frame_num_cnt + 1 + context->desc.h264enc.frame_num_cnt;
1318206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang      if ((frame_diff == 0) &&
1328206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang          (surf->force_flushed == false) &&
1338206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang          (context->desc.h264enc.frame_num_cnt % 2 != 0)) {
134c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang         context->decoder->flush(context->decoder);
1358206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang         context->first_single_submitted = true;
1368206882392c9cc070e21d6fbc90368c94235d8cdBoyuan Zhang      }
137c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang      context->decoder->get_feedback(context->decoder, surf->feedback, &(surf->coded_buf->coded_size));
138a543f231d712dbdfd309ff589766179c5cb32b20Mark Thompson      surf->feedback = NULL;
139c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   }
140c59628d11b134fc016388a170880f7646e100d6fBoyuan Zhang   pipe_mutex_unlock(drv->mutex);
1411be55158381f509d420e42f40018ec95fe329f5bChristian König   return VA_STATUS_SUCCESS;
1423867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
1433867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
1443867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
1453867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaQuerySurfaceStatus(VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status)
1463867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
1473867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
1483867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
1493867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
1501be55158381f509d420e42f40018ec95fe329f5bChristian König   return VA_STATUS_SUCCESS;
1513867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
1523867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
1533867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
1543867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaQuerySurfaceError(VADriverContextP ctx, VASurfaceID render_target, VAStatus error_status, void **error_info)
1553867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
1563867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
1573867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
1583867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
1593867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   return VA_STATUS_ERROR_UNIMPLEMENTED;
1603867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
1613867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
1629460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Vargastatic void
1639460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Vargaupload_sampler(struct pipe_context *pipe, struct pipe_sampler_view *dst,
1649460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga               const struct pipe_box *dst_box, const void *src, unsigned src_stride,
1659460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga               unsigned src_x, unsigned src_y)
1669460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga{
1679460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   struct pipe_transfer *transfer;
1689460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   void *map;
1699460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1709460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   map = pipe->transfer_map(pipe, dst->texture, 0, PIPE_TRANSFER_WRITE,
1719460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                            dst_box, &transfer);
1729460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   if (!map)
1739460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      return;
1749460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1759460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   util_copy_rect(map, dst->texture->format, transfer->stride, 0, 0,
1769460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                  dst_box->width, dst_box->height,
1779460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                  src, src_stride, src_x, src_y);
1789460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1799460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   pipe->transfer_unmap(pipe, transfer);
1809460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga}
1819460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1829460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Vargastatic VAStatus
1839460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael VargavlVaPutSubpictures(vlVaSurface *surf, vlVaDriver *drv,
1849460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                   struct pipe_surface *surf_draw, struct u_rect *dirty_area,
1859460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                   struct u_rect *src_rect, struct u_rect *dst_rect)
1869460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga{
1879460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   vlVaSubpicture *sub;
1889460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   int i;
1899460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1909460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   if (!(surf->subpics.data || surf->subpics.size))
1919460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      return VA_STATUS_SUCCESS;
1929460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
1939460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   for (i = 0; i < surf->subpics.size/sizeof(vlVaSubpicture *); i++) {
1949460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      struct pipe_blend_state blend;
1959460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      void *blend_state;
1969460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vlVaBuffer *buf;
1979460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      struct pipe_box box;
1989460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      struct u_rect *s, *d, sr, dr, c;
1999460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      int sw, sh, dw, dh;
2009460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2019460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sub = ((vlVaSubpicture **)surf->subpics.data)[i];
2029460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      if (!sub)
2039460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga         continue;
2049460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2059460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      buf = handle_table_get(drv->htab, sub->image->buf);
2069460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      if (!buf)
2079460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga         return VA_STATUS_ERROR_INVALID_IMAGE;
2089460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2099460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.x = 0;
2109460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.y = 0;
2119460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.z = 0;
2129460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.width = sub->dst_rect.x1 - sub->dst_rect.x0;
2139460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.height = sub->dst_rect.y1 - sub->dst_rect.y0;
2149460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      box.depth = 1;
2159460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2169460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      s = &sub->src_rect;
2179460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      d = &sub->dst_rect;
2189460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sw = s->x1 - s->x0;
2199460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sh = s->y1 - s->y0;
2209460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dw = d->x1 - d->x0;
2219460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dh = d->y1 - d->y0;
2229460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      c.x0 = MAX2(d->x0, s->x0);
2239460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      c.y0 = MAX2(d->y0, s->y0);
2249460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      c.x1 = MIN2(d->x0 + dw, src_rect->x1);
2259460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      c.y1 = MIN2(d->y0 + dh, src_rect->y1);
2269460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sr.x0 = s->x0 + (c.x0 - d->x0)*(sw/(float)dw);
2279460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sr.y0 = s->y0 + (c.y0 - d->y0)*(sh/(float)dh);
2289460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sr.x1 = s->x0 + (c.x1 - d->x0)*(sw/(float)dw);
2299460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sr.y1 = s->y0 + (c.y1 - d->y0)*(sh/(float)dh);
2309460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2319460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      s = src_rect;
2329460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      d = dst_rect;
2339460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sw = s->x1 - s->x0;
2349460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      sh = s->y1 - s->y0;
2359460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dw = d->x1 - d->x0;
2369460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dh = d->y1 - d->y0;
2379460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dr.x0 = d->x0 + c.x0*(dw/(float)sw);
2389460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dr.y0 = d->y0 + c.y0*(dh/(float)sh);
2399460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dr.x1 = d->x0 + c.x1*(dw/(float)sw);
2409460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      dr.y1 = d->y0 + c.y1*(dh/(float)sh);
2419460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2429460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      memset(&blend, 0, sizeof(blend));
2439460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.independent_blend_enable = 0;
2449460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].blend_enable = 1;
2459460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
2469460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
2479460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
2489460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
2499460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].rgb_func = PIPE_BLEND_ADD;
2509460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].alpha_func = PIPE_BLEND_ADD;
2519460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.rt[0].colormask = PIPE_MASK_RGBA;
2529460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.logicop_enable = 0;
2539460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.logicop_func = PIPE_LOGICOP_CLEAR;
2549460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend.dither = 0;
2559460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      blend_state = drv->pipe->create_blend_state(drv->pipe, &blend);
2569460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2579460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vl_compositor_clear_layers(&drv->cstate);
2589460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vl_compositor_set_layer_blend(&drv->cstate, 0, blend_state, false);
2599460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      upload_sampler(drv->pipe, sub->sampler, &box, buf->data,
2609460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                     sub->image->pitches[0], 0, 0);
2619460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vl_compositor_set_rgba_layer(&drv->cstate, &drv->compositor, 0, sub->sampler,
2629460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga                                   &sr, NULL, NULL);
2639460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dr);
2649460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      vl_compositor_render(&drv->cstate, &drv->compositor, surf_draw, dirty_area, false);
2659460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      drv->pipe->delete_blend_state(drv->pipe, blend_state);
2669460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   }
2679460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2689460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   return VA_STATUS_SUCCESS;
2699460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga}
2709460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
2713867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
2721be55158381f509d420e42f40018ec95fe329f5bChristian KönigvlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short srcx, short srcy,
2733867933ecbc34ed1f68d735282580ca1e4eedea1Christian König               unsigned short srcw, unsigned short srch, short destx, short desty,
2743867933ecbc34ed1f68d735282580ca1e4eedea1Christian König               unsigned short destw, unsigned short desth, VARectangle *cliprects,
2753867933ecbc34ed1f68d735282580ca1e4eedea1Christian König               unsigned int number_cliprects,  unsigned int flags)
2763867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
2771be55158381f509d420e42f40018ec95fe329f5bChristian König   vlVaDriver *drv;
2781be55158381f509d420e42f40018ec95fe329f5bChristian König   vlVaSurface *surf;
2791be55158381f509d420e42f40018ec95fe329f5bChristian König   struct pipe_screen *screen;
2801be55158381f509d420e42f40018ec95fe329f5bChristian König   struct pipe_resource *tex;
2811be55158381f509d420e42f40018ec95fe329f5bChristian König   struct pipe_surface surf_templ, *surf_draw;
282422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov   struct vl_screen *vscreen;
2831be55158381f509d420e42f40018ec95fe329f5bChristian König   struct u_rect src_rect, *dirty_area;
2849460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   struct u_rect dst_rect = {destx, destx + destw, desty, desty + desth};
2859460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   VAStatus status;
2861be55158381f509d420e42f40018ec95fe329f5bChristian König
2873867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
2883867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
2893867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
2901be55158381f509d420e42f40018ec95fe329f5bChristian König   drv = VL_VA_DRIVER(ctx);
2918479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_lock(drv->mutex);
2921be55158381f509d420e42f40018ec95fe329f5bChristian König   surf = handle_table_get(drv->htab, surface_id);
2938479782361ab58eeacee7f81b18d9597553859ceChristian König   if (!surf) {
2948479782361ab58eeacee7f81b18d9597553859ceChristian König      pipe_mutex_unlock(drv->mutex);
2951be55158381f509d420e42f40018ec95fe329f5bChristian König      return VA_STATUS_ERROR_INVALID_SURFACE;
2968479782361ab58eeacee7f81b18d9597553859ceChristian König   }
2971be55158381f509d420e42f40018ec95fe329f5bChristian König
2981be55158381f509d420e42f40018ec95fe329f5bChristian König   screen = drv->pipe->screen;
299422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov   vscreen = drv->vscreen;
3001be55158381f509d420e42f40018ec95fe329f5bChristian König
301422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov   tex = vscreen->texture_from_drawable(vscreen, draw);
3028479782361ab58eeacee7f81b18d9597553859ceChristian König   if (!tex) {
3038479782361ab58eeacee7f81b18d9597553859ceChristian König      pipe_mutex_unlock(drv->mutex);
3041be55158381f509d420e42f40018ec95fe329f5bChristian König      return VA_STATUS_ERROR_INVALID_DISPLAY;
3058479782361ab58eeacee7f81b18d9597553859ceChristian König   }
3061be55158381f509d420e42f40018ec95fe329f5bChristian König
307422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov   dirty_area = vscreen->get_dirty_area(vscreen);
3081be55158381f509d420e42f40018ec95fe329f5bChristian König
3091be55158381f509d420e42f40018ec95fe329f5bChristian König   memset(&surf_templ, 0, sizeof(surf_templ));
3101be55158381f509d420e42f40018ec95fe329f5bChristian König   surf_templ.format = tex->format;
3111be55158381f509d420e42f40018ec95fe329f5bChristian König   surf_draw = drv->pipe->create_surface(drv->pipe, tex, &surf_templ);
3121be55158381f509d420e42f40018ec95fe329f5bChristian König   if (!surf_draw) {
3131be55158381f509d420e42f40018ec95fe329f5bChristian König      pipe_resource_reference(&tex, NULL);
3148479782361ab58eeacee7f81b18d9597553859ceChristian König      pipe_mutex_unlock(drv->mutex);
3151be55158381f509d420e42f40018ec95fe329f5bChristian König      return VA_STATUS_ERROR_INVALID_DISPLAY;
3161be55158381f509d420e42f40018ec95fe329f5bChristian König   }
3171be55158381f509d420e42f40018ec95fe329f5bChristian König
3181be55158381f509d420e42f40018ec95fe329f5bChristian König   src_rect.x0 = srcx;
3191be55158381f509d420e42f40018ec95fe329f5bChristian König   src_rect.y0 = srcy;
3201be55158381f509d420e42f40018ec95fe329f5bChristian König   src_rect.x1 = srcw + srcx;
3211be55158381f509d420e42f40018ec95fe329f5bChristian König   src_rect.y1 = srch + srcy;
3221be55158381f509d420e42f40018ec95fe329f5bChristian König
3231be55158381f509d420e42f40018ec95fe329f5bChristian König   vl_compositor_clear_layers(&drv->cstate);
3241be55158381f509d420e42f40018ec95fe329f5bChristian König   vl_compositor_set_buffer_layer(&drv->cstate, &drv->compositor, 0, surf->buffer, &src_rect, NULL, VL_COMPOSITOR_WEAVE);
3259460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dst_rect);
3261be55158381f509d420e42f40018ec95fe329f5bChristian König   vl_compositor_render(&drv->cstate, &drv->compositor, surf_draw, dirty_area, true);
3271be55158381f509d420e42f40018ec95fe329f5bChristian König
3289460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga   status = vlVaPutSubpictures(surf, drv, surf_draw, dirty_area, &src_rect, &dst_rect);
3298479782361ab58eeacee7f81b18d9597553859ceChristian König   if (status) {
3308479782361ab58eeacee7f81b18d9597553859ceChristian König      pipe_mutex_unlock(drv->mutex);
3319460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga      return status;
3328479782361ab58eeacee7f81b18d9597553859ceChristian König   }
3339460cd39e8c74a6a8aba7e5c57bb4929ab135c29Michael Varga
3340301858a316af7d831655778cf69bc49b12ee6acNayan Deshmukh   /* flush before calling flush_frontbuffer so that rendering is flushed
3350301858a316af7d831655778cf69bc49b12ee6acNayan Deshmukh    * to back buffer so the texture can be copied in flush_frontbuffer
3360301858a316af7d831655778cf69bc49b12ee6acNayan Deshmukh    */
3370301858a316af7d831655778cf69bc49b12ee6acNayan Deshmukh   drv->pipe->flush(drv->pipe, NULL, 0);
3380301858a316af7d831655778cf69bc49b12ee6acNayan Deshmukh
339422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov   screen->flush_frontbuffer(screen, tex, 0, 0,
340422356ed2f05ef0f5bcdac13899a529df5497357Emil Velikov                             vscreen->get_private(vscreen), NULL);
3411be55158381f509d420e42f40018ec95fe329f5bChristian König
3421be55158381f509d420e42f40018ec95fe329f5bChristian König
3431be55158381f509d420e42f40018ec95fe329f5bChristian König   pipe_resource_reference(&tex, NULL);
3441be55158381f509d420e42f40018ec95fe329f5bChristian König   pipe_surface_reference(&surf_draw, NULL);
3458479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_unlock(drv->mutex);
3461be55158381f509d420e42f40018ec95fe329f5bChristian König
3471be55158381f509d420e42f40018ec95fe329f5bChristian König   return VA_STATUS_SUCCESS;
3483867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
3493867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
3503867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
3513867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaLockSurface(VADriverContextP ctx, VASurfaceID surface, unsigned int *fourcc,
3523867933ecbc34ed1f68d735282580ca1e4eedea1Christian König                unsigned int *luma_stride, unsigned int *chroma_u_stride, unsigned int *chroma_v_stride,
3533867933ecbc34ed1f68d735282580ca1e4eedea1Christian König                unsigned int *luma_offset, unsigned int *chroma_u_offset, unsigned int *chroma_v_offset,
3543867933ecbc34ed1f68d735282580ca1e4eedea1Christian König                unsigned int *buffer_name, void **buffer)
3553867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
3563867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
3573867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
3583867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
3593867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   return VA_STATUS_ERROR_UNIMPLEMENTED;
3603867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
3613867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
3623867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigVAStatus
3633867933ecbc34ed1f68d735282580ca1e4eedea1Christian KönigvlVaUnlockSurface(VADriverContextP ctx, VASurfaceID surface)
3643867933ecbc34ed1f68d735282580ca1e4eedea1Christian König{
3653867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   if (!ctx)
3663867933ecbc34ed1f68d735282580ca1e4eedea1Christian König      return VA_STATUS_ERROR_INVALID_CONTEXT;
3673867933ecbc34ed1f68d735282580ca1e4eedea1Christian König
3683867933ecbc34ed1f68d735282580ca1e4eedea1Christian König   return VA_STATUS_ERROR_UNIMPLEMENTED;
3693867933ecbc34ed1f68d735282580ca1e4eedea1Christian König}
370adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
371adf11331186b1e63ed3cadbcea102ecdd18627e3Julien IsorceVAStatus
3725bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan ZhangvlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id,
373adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce                           VASurfaceAttrib *attrib_list, unsigned int *num_attribs)
374adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce{
375e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   vlVaDriver *drv;
3765bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   vlVaConfig *config;
377e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   VASurfaceAttrib *attribs;
378e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_screen *pscreen;
379cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   int i, j;
380cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce
381cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   STATIC_ASSERT(ARRAY_SIZE(vpp_surface_formats) <= VL_VA_MAX_IMAGE_FORMATS);
382adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
3835bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   if (config_id == VA_INVALID_ID)
384e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONFIG;
385adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
386e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!attrib_list && !num_attribs)
387e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
388adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
389e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!attrib_list) {
390cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce      *num_attribs = VL_VA_MAX_IMAGE_FORMATS + VASurfaceAttribCount;
391e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_SUCCESS;
392e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
393adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
394e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!ctx)
395e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
396adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
397e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   drv = VL_VA_DRIVER(ctx);
398adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
399e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!drv)
400e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
401adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
4025bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   pipe_mutex_lock(drv->mutex);
4035bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   config = handle_table_get(drv->htab, config_id);
4045bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   pipe_mutex_unlock(drv->mutex);
4055bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang
4065bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   if (!config)
4075bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang      return VA_STATUS_ERROR_INVALID_CONFIG;
4085bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang
409e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   pscreen = VL_VA_PSCREEN(ctx);
410adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
411e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!pscreen)
412e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
413adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
414cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   attribs = CALLOC(VL_VA_MAX_IMAGE_FORMATS + VASurfaceAttribCount,
415cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce                    sizeof(VASurfaceAttrib));
416adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
417e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!attribs)
418e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_ALLOCATION_FAILED;
419adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
420e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   i = 0;
421adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
422cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce   /* vlVaCreateConfig returns PIPE_VIDEO_PROFILE_UNKNOWN
423cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce    * only for VAEntrypointVideoProc. */
4245bcaa1b9e9707aea7be73b406345bb9e46f92a18Boyuan Zhang   if (config->profile == PIPE_VIDEO_PROFILE_UNKNOWN) {
425dbc8e181166c96d8344355757e46c4cfc8f634e5Julien Isorce      if (config->rt_format & VA_RT_FORMAT_RGB32) {
426e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson         for (j = 0; j < ARRAY_SIZE(vpp_surface_formats); ++j) {
427e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson            attribs[i].type = VASurfaceAttribPixelFormat;
428e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson            attribs[i].value.type = VAGenericValueTypeInteger;
429e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson            attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
430e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson            attribs[i].value.value.i = PipeFormatToVaFourcc(vpp_surface_formats[j]);
431e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson            i++;
432e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson         }
433dbc8e181166c96d8344355757e46c4cfc8f634e5Julien Isorce      }
434dbc8e181166c96d8344355757e46c4cfc8f634e5Julien Isorce      if (config->rt_format & VA_RT_FORMAT_YUV420) {
435cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce         attribs[i].type = VASurfaceAttribPixelFormat;
436cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce         attribs[i].value.type = VAGenericValueTypeInteger;
437cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce         attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
438e0604eed9f0cd6e65dde0e2d96c031b8db2c4fe5Mark Thompson         attribs[i].value.value.i = VA_FOURCC_NV12;
439cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce         i++;
440cc1e5c972eff8c774c93c8dc51d89b550d00633eJulien Isorce      }
441e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   } else {
442e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      /* Assume VAEntrypointVLD for now. */
443e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      attribs[i].type = VASurfaceAttribPixelFormat;
444e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      attribs[i].value.type = VAGenericValueTypeInteger;
445e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
446e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      attribs[i].value.value.i = VA_FOURCC_NV12;
447e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      i++;
448e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
449e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
450e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].type = VASurfaceAttribMemoryType;
451e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.type = VAGenericValueTypeInteger;
452e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
453e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_VA |
454e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
455e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   i++;
456e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
457e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].type = VASurfaceAttribExternalBufferDescriptor;
458e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.type = VAGenericValueTypePointer;
459e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].flags = VA_SURFACE_ATTRIB_SETTABLE;
460e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.value.p = NULL; /* ignore */
461e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   i++;
462e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
463e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].type = VASurfaceAttribMaxWidth;
464e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.type = VAGenericValueTypeInteger;
465e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
466e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
467e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   i++;
468e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
469e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].type = VASurfaceAttribMaxHeight;
470e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.type = VAGenericValueTypeInteger;
471e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].flags = VA_SURFACE_ATTRIB_GETTABLE;
472e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   attribs[i].value.value.i = vl_video_buffer_max_size(pscreen);
473e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   i++;
474e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
475e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (i > *num_attribs) {
476e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      *num_attribs = i;
477e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      FREE(attribs);
478e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
479e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
480e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
481e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   *num_attribs = i;
482e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memcpy(attrib_list, attribs, i * sizeof(VASurfaceAttrib));
483e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   FREE(attribs);
484e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
485e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   return VA_STATUS_SUCCESS;
486adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce}
487adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
48805b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorcestatic VAStatus
48905b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorcesuface_from_external_memory(VADriverContextP ctx, vlVaSurface *surface,
49005b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce                            VASurfaceAttribExternalBuffers *memory_attibute,
49105b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce                            int index, VASurfaceID *surfaces,
49205b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce                            struct pipe_video_buffer *templat)
49305b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce{
494e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   vlVaDriver *drv;
495e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_screen *pscreen;
496e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_resource *resource;
497e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_resource res_templ;
498e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct winsys_handle whandle;
499e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_resource *resources[VL_NUM_COMPONENTS];
500e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
501e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!ctx)
502e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
503e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
504e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   pscreen = VL_VA_PSCREEN(ctx);
505e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   drv = VL_VA_DRIVER(ctx);
506e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
507e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!memory_attibute || !memory_attibute->buffers ||
508e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       index > memory_attibute->num_buffers)
509e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
510e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
511e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (surface->templat.width != memory_attibute->width ||
512e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       surface->templat.height != memory_attibute->height ||
513e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       memory_attibute->num_planes < 1)
514e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
515e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
516e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   switch (memory_attibute->pixel_format) {
517e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_FOURCC_RGBA:
518e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_FOURCC_RGBX:
519e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_FOURCC_BGRA:
520e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_FOURCC_BGRX:
521e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if (memory_attibute->num_planes != 1)
522e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         return VA_STATUS_ERROR_INVALID_PARAMETER;
523e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      break;
524e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   default:
525e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
526e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
527e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
528e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memset(&res_templ, 0, sizeof(res_templ));
529e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.target = PIPE_TEXTURE_2D;
530e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.last_level = 0;
531e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.depth0 = 1;
532e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.array_size = 1;
533e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.width0 = memory_attibute->width;
534e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.height0 = memory_attibute->height;
535e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.format = surface->templat.buffer_format;
536e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.bind = PIPE_BIND_SAMPLER_VIEW;
537e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   res_templ.usage = PIPE_USAGE_DEFAULT;
538e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
539e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memset(&whandle, 0, sizeof(struct winsys_handle));
540e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   whandle.type = DRM_API_HANDLE_TYPE_FD;
541e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   whandle.handle = memory_attibute->buffers[index];
542e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   whandle.stride = memory_attibute->pitches[index];
543e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
54482db518f1519cec9e3842f23455a105e2006afbdMarek Olšák   resource = pscreen->resource_from_handle(pscreen, &res_templ, &whandle,
54582db518f1519cec9e3842f23455a105e2006afbdMarek Olšák                                            PIPE_HANDLE_USAGE_READ_WRITE);
546e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
547e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!resource)
548e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_ALLOCATION_FAILED;
549e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
550e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memset(resources, 0, sizeof resources);
551e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   resources[0] = resource;
552e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
553e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   surface->buffer = vl_video_buffer_create_ex2(drv->pipe, templat, resources);
554e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!surface->buffer)
55505b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce      return VA_STATUS_ERROR_ALLOCATION_FAILED;
55605b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce
557e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   util_dynarray_init(&surface->subpics);
558e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   surfaces[index] = handle_table_add(drv->htab, surface);
559e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
560497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce   if (!surfaces[index]) {
561497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce      surface->buffer->destroy(surface->buffer);
562e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_ALLOCATION_FAILED;
563497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce   }
564e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
565e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   return VA_STATUS_SUCCESS;
56605b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce}
56705b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce
568adf11331186b1e63ed3cadbcea102ecdd18627e3Julien IsorceVAStatus
569adf11331186b1e63ed3cadbcea102ecdd18627e3Julien IsorcevlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format,
570adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce                    unsigned int width, unsigned int height,
571adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce                    VASurfaceID *surfaces, unsigned int num_surfaces,
572adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce                    VASurfaceAttrib *attrib_list, unsigned int num_attribs)
573adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce{
574e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   vlVaDriver *drv;
575e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   VASurfaceAttribExternalBuffers *memory_attibute;
576e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_video_buffer templat;
577e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   struct pipe_screen *pscreen;
578e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   int i;
579e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   int memory_type;
580e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   int expected_fourcc;
581e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   VAStatus vaStatus;
582e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
583e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!ctx)
584e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
585e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
586e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!(width && height))
587e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
588e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
589e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   drv = VL_VA_DRIVER(ctx);
590e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
591e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!drv)
592e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
593e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
594e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   pscreen = VL_VA_PSCREEN(ctx);
59505b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce
596e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (!pscreen)
597e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
598e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
599e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   /* Default. */
600e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memory_attibute = NULL;
601e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memory_type = VA_SURFACE_ATTRIB_MEM_TYPE_VA;
602e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   expected_fourcc = 0;
603e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
604e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   for (i = 0; i < num_attribs && attrib_list; i++) {
605e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if ((attrib_list[i].type == VASurfaceAttribPixelFormat) &&
606e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce          (attrib_list[i].flags & VA_SURFACE_ATTRIB_SETTABLE)) {
607e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         if (attrib_list[i].value.type != VAGenericValueTypeInteger)
608e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            return VA_STATUS_ERROR_INVALID_PARAMETER;
609e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         expected_fourcc = attrib_list[i].value.value.i;
610e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      }
611e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
612e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if ((attrib_list[i].type == VASurfaceAttribMemoryType) &&
613e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce          (attrib_list[i].flags & VA_SURFACE_ATTRIB_SETTABLE)) {
614e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
615e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         if (attrib_list[i].value.type != VAGenericValueTypeInteger)
616e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            return VA_STATUS_ERROR_INVALID_PARAMETER;
617e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
618e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         switch (attrib_list[i].value.value.i) {
619e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         case VA_SURFACE_ATTRIB_MEM_TYPE_VA:
620e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME:
621e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            memory_type = attrib_list[i].value.value.i;
62205b6ce42097d6ebd2820129e8155113abce0bb42Julien Isorce            break;
623e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         default:
624e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE;
625e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         }
626e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      }
627e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
628e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if ((attrib_list[i].type == VASurfaceAttribExternalBufferDescriptor) &&
629e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce          (attrib_list[i].flags == VA_SURFACE_ATTRIB_SETTABLE)) {
630e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         if (attrib_list[i].value.type != VAGenericValueTypePointer)
631e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            return VA_STATUS_ERROR_INVALID_PARAMETER;
632e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         memory_attibute = (VASurfaceAttribExternalBuffers *)attrib_list[i].value.value.p;
633e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      }
634e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
635e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
636e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (VA_RT_FORMAT_YUV420 != format &&
637e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       VA_RT_FORMAT_YUV422 != format &&
638e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       VA_RT_FORMAT_YUV444 != format &&
639e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce       VA_RT_FORMAT_RGB32  != format) {
640e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
641e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
642e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
643e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   switch (memory_type) {
644e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_SURFACE_ATTRIB_MEM_TYPE_VA:
645e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      break;
646e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME:
647e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if (!memory_attibute)
648e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         return VA_STATUS_ERROR_INVALID_PARAMETER;
649e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
650e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      expected_fourcc = memory_attibute->pixel_format;
651e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      break;
652e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   default:
653e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      assert(0);
654e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
655e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
656e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memset(&templat, 0, sizeof(templat));
657e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
658bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce   templat.buffer_format = pscreen->get_video_param(
659bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      pscreen,
660bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_PROFILE_UNKNOWN,
661bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
662bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_CAP_PREFERED_FORMAT
663bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce   );
664bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce   templat.interlaced = pscreen->get_video_param(
665bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      pscreen,
666bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_PROFILE_UNKNOWN,
667bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
668bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      PIPE_VIDEO_CAP_PREFERS_INTERLACED
669bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce   );
670bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce
671e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   if (expected_fourcc) {
672bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      enum pipe_format expected_format = VaFourccToPipeFormat(expected_fourcc);
673bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce
674bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      if (expected_format != templat.buffer_format || memory_attibute)
675bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce        templat.interlaced = 0;
676bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce
677bf901a2f8c8954e55a3eebc6cd1b725f18802012Julien Isorce      templat.buffer_format = expected_format;
678e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
679e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
680e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   templat.chroma_format = ChromaToPipe(format);
681e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
682e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   templat.width = width;
683e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   templat.height = height;
68410dec2de2d9f568675d66d736b48701fa26f7b50Boyuan Zhang   if (debug_get_option_nointerlace())
68510dec2de2d9f568675d66d736b48701fa26f7b50Boyuan Zhang      templat.interlaced = false;
686e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
687e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   memset(surfaces, VA_INVALID_ID, num_surfaces * sizeof(VASurfaceID));
688e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
6898479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_lock(drv->mutex);
690e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   for (i = 0; i < num_surfaces; i++) {
691e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      vlVaSurface *surf = CALLOC(1, sizeof(vlVaSurface));
692e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      if (!surf)
693e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         goto no_res;
694e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
695e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      surf->templat = templat;
696e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce
697e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      switch (memory_type) {
698e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      case VA_SURFACE_ATTRIB_MEM_TYPE_VA:
6991cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce         /* The application will clear the TILING flag when the surface is
7001cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce          * intended to be exported as dmabuf. Adding shared flag because not
7011cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce          * null memory_attibute means VASurfaceAttribExternalBuffers is used.
7021cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce          */
7031cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce         if (memory_attibute &&
7041cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce             !(memory_attibute->flags & VA_SURFACE_EXTBUF_DESC_ENABLE_TILING))
7051cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce            templat.bind = PIPE_BIND_LINEAR | PIPE_BIND_SHARED;
7061cdb4da1d6ce94d947e41d4f0e568074f4f59577Julien Isorce
707e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         surf->buffer = drv->pipe->create_video_buffer(drv->pipe, &templat);
708497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce         if (!surf->buffer) {
709497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce            FREE(surf);
710e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce            goto no_res;
711497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce         }
712e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         util_dynarray_init(&surf->subpics);
713e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         surfaces[i] = handle_table_add(drv->htab, surf);
714e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         break;
715e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME:
716e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         vaStatus = suface_from_external_memory(ctx, surf, memory_attibute, i, surfaces, &templat);
717497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce         if (vaStatus != VA_STATUS_SUCCESS) {
718497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce            FREE(surf);
719adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce            goto no_res;
720497bde6727260e7719c680dc483b10c0751a3fcdJulien Isorce         }
721e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         break;
722e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      default:
723e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce         assert(0);
724e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      }
725e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   }
7268479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_unlock(drv->mutex);
727adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
728e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce   return VA_STATUS_SUCCESS;
729adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
730adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorceno_res:
7318479782361ab58eeacee7f81b18d9597553859ceChristian König   pipe_mutex_unlock(drv->mutex);
732adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce   if (i)
733adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce      vlVaDestroySurfaces(ctx, surfaces, i);
734adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce
735adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce   return VA_STATUS_ERROR_ALLOCATION_FAILED;
736adf11331186b1e63ed3cadbcea102ecdd18627e3Julien Isorce}
7370b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7380b868807e4d6f209d5fec9948a5994936138ffccJulien IsorceVAStatus
7390b868807e4d6f209d5fec9948a5994936138ffccJulien IsorcevlVaQueryVideoProcFilters(VADriverContextP ctx, VAContextID context,
7400b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce                          VAProcFilterType *filters, unsigned int *num_filters)
7410b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce{
7420b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   unsigned int num = 0;
7430b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7440b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!ctx)
7450b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
7460b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7470b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!num_filters || !filters)
7480b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
7490b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
750e945235aed86f473f27362bae902fbe67d5f0f20Christian König   filters[num++] = VAProcFilterDeinterlacing;
7510b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7520b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   *num_filters = num;
7530b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7540b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   return VA_STATUS_SUCCESS;
7550b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce}
7560b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7570b868807e4d6f209d5fec9948a5994936138ffccJulien IsorceVAStatus
7580b868807e4d6f209d5fec9948a5994936138ffccJulien IsorcevlVaQueryVideoProcFilterCaps(VADriverContextP ctx, VAContextID context,
7590b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce                             VAProcFilterType type, void *filter_caps,
7600b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce                             unsigned int *num_filter_caps)
7610b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce{
7620b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   unsigned int i;
7630b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7640b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!ctx)
7650b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
7660b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7670b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!filter_caps || !num_filter_caps)
7680b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
7690b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7700b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   i = 0;
7710b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7720b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   switch (type) {
7730b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   case VAProcFilterNone:
7740b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      break;
775e945235aed86f473f27362bae902fbe67d5f0f20Christian König   case VAProcFilterDeinterlacing: {
776e945235aed86f473f27362bae902fbe67d5f0f20Christian König      VAProcFilterCapDeinterlacing *deint = filter_caps;
777e945235aed86f473f27362bae902fbe67d5f0f20Christian König
778eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      if (*num_filter_caps < 3) {
779eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         *num_filter_caps = 3;
780e945235aed86f473f27362bae902fbe67d5f0f20Christian König         return VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
781e945235aed86f473f27362bae902fbe67d5f0f20Christian König      }
782e945235aed86f473f27362bae902fbe67d5f0f20Christian König
783e945235aed86f473f27362bae902fbe67d5f0f20Christian König      deint[i++].type = VAProcDeinterlacingBob;
784e945235aed86f473f27362bae902fbe67d5f0f20Christian König      deint[i++].type = VAProcDeinterlacingWeave;
785eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      deint[i++].type = VAProcDeinterlacingMotionAdaptive;
786e945235aed86f473f27362bae902fbe67d5f0f20Christian König      break;
787e945235aed86f473f27362bae902fbe67d5f0f20Christian König   }
788e945235aed86f473f27362bae902fbe67d5f0f20Christian König
7890b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   case VAProcFilterNoiseReduction:
7900b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   case VAProcFilterSharpening:
7910b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   case VAProcFilterColorBalance:
7920b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   case VAProcFilterSkinToneEnhancement:
7930b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_UNIMPLEMENTED;
7940b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   default:
7950b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      assert(0);
7960b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   }
7970b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
7980b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   *num_filter_caps = i;
7990b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8000b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   return VA_STATUS_SUCCESS;
8010b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce}
8020b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
80327a276f62548ca3e6436b91da44c4ff94ba6f229Christian Königstatic VAProcColorStandardType vpp_input_color_standards[] = {
8040b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   VAProcColorStandardBT601
8050b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce};
8060b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
80727a276f62548ca3e6436b91da44c4ff94ba6f229Christian Königstatic VAProcColorStandardType vpp_output_color_standards[] = {
8080b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   VAProcColorStandardBT601
8090b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce};
8100b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8110b868807e4d6f209d5fec9948a5994936138ffccJulien IsorceVAStatus
8120b868807e4d6f209d5fec9948a5994936138ffccJulien IsorcevlVaQueryVideoProcPipelineCaps(VADriverContextP ctx, VAContextID context,
8130b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce                               VABufferID *filters, unsigned int num_filters,
8140b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce                               VAProcPipelineCaps *pipeline_cap)
8150b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce{
8160b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   unsigned int i = 0;
8170b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8180b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!ctx)
8190b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_CONTEXT;
8200b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8210b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (!pipeline_cap)
822e0b896c86c92c4dd02aea7fb5eb8eabe089b9e58Julien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
8230b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8240b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   if (num_filters && !filters)
8250b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      return VA_STATUS_ERROR_INVALID_PARAMETER;
8260b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8270b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->pipeline_flags = 0;
8280b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->filter_flags = 0;
8290b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->num_forward_references = 0;
8300b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->num_backward_references = 0;
83147b390fe45e5e6f982c60b58985892438959cd8eJan Vesely   pipeline_cap->num_input_color_standards = ARRAY_SIZE(vpp_input_color_standards);
8320b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->input_color_standards = vpp_input_color_standards;
83347b390fe45e5e6f982c60b58985892438959cd8eJan Vesely   pipeline_cap->num_output_color_standards = ARRAY_SIZE(vpp_output_color_standards);
8340b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   pipeline_cap->output_color_standards = vpp_output_color_standards;
8350b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8360b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   for (i = 0; i < num_filters; i++) {
8370b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce      vlVaBuffer *buf = handle_table_get(VL_VA_DRIVER(ctx)->htab, filters[i]);
838eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      VAProcFilterParameterBufferBase *filter;
8390b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
840eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      if (!buf || buf->type != VAProcFilterParameterBufferType)
8410b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce         return VA_STATUS_ERROR_INVALID_BUFFER;
842eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König
843eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      filter = buf->data;
844eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      switch (filter->type) {
845eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      case VAProcFilterDeinterlacing: {
846eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         VAProcFilterParameterBufferDeinterlacing *deint = buf->data;
847eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         if (deint->algorithm == VAProcDeinterlacingMotionAdaptive) {
848eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König            pipeline_cap->num_forward_references = 1;
849eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König            pipeline_cap->num_backward_references = 2;
850eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         }
851eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         break;
852eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      }
853eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      default:
854eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König         return VA_STATUS_ERROR_UNIMPLEMENTED;
855eaf7ec9cfc5165f461bddc365aaaf6cb25c2d9bdChristian König      }
8560b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   }
8570b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce
8580b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce   return VA_STATUS_SUCCESS;
8590b868807e4d6f209d5fec9948a5994936138ffccJulien Isorce}
860