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