xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/va/subpicture.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker  *
3*61046927SAndroid Build Coastguard Worker  * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
4*61046927SAndroid Build Coastguard Worker  * Copyright 2014 Advanced Micro Devices, Inc.
5*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
9*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
10*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
11*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
12*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
13*61046927SAndroid Build Coastguard Worker  * the following conditions:
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
16*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
17*61046927SAndroid Build Coastguard Worker  * of the Software.
18*61046927SAndroid Build Coastguard Worker  *
19*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*61046927SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22*61046927SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
23*61046927SAndroid Build Coastguard Worker  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24*61046927SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25*61046927SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26*61046927SAndroid Build Coastguard Worker  *
27*61046927SAndroid Build Coastguard Worker  **************************************************************************/
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
30*61046927SAndroid Build Coastguard Worker #include "util/u_handle_table.h"
31*61046927SAndroid Build Coastguard Worker #include "util/u_sampler.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "va_private.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker static VAImageFormat subpic_formats[] = {
36*61046927SAndroid Build Coastguard Worker    {
37*61046927SAndroid Build Coastguard Worker    .fourcc = VA_FOURCC_BGRA,
38*61046927SAndroid Build Coastguard Worker    .byte_order = VA_LSB_FIRST,
39*61046927SAndroid Build Coastguard Worker    .bits_per_pixel = 32,
40*61046927SAndroid Build Coastguard Worker    .depth = 32,
41*61046927SAndroid Build Coastguard Worker    .red_mask   = 0x00ff0000ul,
42*61046927SAndroid Build Coastguard Worker    .green_mask = 0x0000ff00ul,
43*61046927SAndroid Build Coastguard Worker    .blue_mask  = 0x000000fful,
44*61046927SAndroid Build Coastguard Worker    .alpha_mask = 0xff000000ul,
45*61046927SAndroid Build Coastguard Worker    },
46*61046927SAndroid Build Coastguard Worker };
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQuerySubpictureFormats(VADriverContextP ctx,VAImageFormat * format_list,unsigned int * flags,unsigned int * num_formats)49*61046927SAndroid Build Coastguard Worker vlVaQuerySubpictureFormats(VADriverContextP ctx, VAImageFormat *format_list,
50*61046927SAndroid Build Coastguard Worker                            unsigned int *flags, unsigned int *num_formats)
51*61046927SAndroid Build Coastguard Worker {
52*61046927SAndroid Build Coastguard Worker    if (!ctx)
53*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    if (!(format_list && flags && num_formats))
56*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_UNKNOWN;
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker    *num_formats = sizeof(subpic_formats)/sizeof(VAImageFormat);
59*61046927SAndroid Build Coastguard Worker    memcpy(format_list, subpic_formats, sizeof(subpic_formats));
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
62*61046927SAndroid Build Coastguard Worker }
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker VAStatus
vlVaCreateSubpicture(VADriverContextP ctx,VAImageID image,VASubpictureID * subpicture)65*61046927SAndroid Build Coastguard Worker vlVaCreateSubpicture(VADriverContextP ctx, VAImageID image,
66*61046927SAndroid Build Coastguard Worker                      VASubpictureID *subpicture)
67*61046927SAndroid Build Coastguard Worker {
68*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
69*61046927SAndroid Build Coastguard Worker    vlVaSubpicture *sub;
70*61046927SAndroid Build Coastguard Worker    VAImage *img;
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    if (!ctx)
73*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
76*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
77*61046927SAndroid Build Coastguard Worker    img = handle_table_get(drv->htab, image);
78*61046927SAndroid Build Coastguard Worker    if (!img) {
79*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
80*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_IMAGE;
81*61046927SAndroid Build Coastguard Worker    }
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    sub = CALLOC(1, sizeof(*sub));
84*61046927SAndroid Build Coastguard Worker    if (!sub) {
85*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
86*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_ALLOCATION_FAILED;
87*61046927SAndroid Build Coastguard Worker    }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    sub->image = img;
90*61046927SAndroid Build Coastguard Worker    *subpicture = handle_table_add(VL_VA_DRIVER(ctx)->htab, sub);
91*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker VAStatus
vlVaDestroySubpicture(VADriverContextP ctx,VASubpictureID subpicture)97*61046927SAndroid Build Coastguard Worker vlVaDestroySubpicture(VADriverContextP ctx, VASubpictureID subpicture)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
100*61046927SAndroid Build Coastguard Worker    vlVaSubpicture *sub;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker    if (!ctx)
103*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
106*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker    sub = handle_table_get(drv->htab, subpicture);
109*61046927SAndroid Build Coastguard Worker    if (!sub) {
110*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
111*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_SUBPICTURE;
112*61046927SAndroid Build Coastguard Worker    }
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    FREE(sub);
115*61046927SAndroid Build Coastguard Worker    handle_table_remove(drv->htab, subpicture);
116*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker VAStatus
vlVaSubpictureImage(VADriverContextP ctx,VASubpictureID subpicture,VAImageID image)122*61046927SAndroid Build Coastguard Worker vlVaSubpictureImage(VADriverContextP ctx, VASubpictureID subpicture, VAImageID image)
123*61046927SAndroid Build Coastguard Worker {
124*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
125*61046927SAndroid Build Coastguard Worker    vlVaSubpicture *sub;
126*61046927SAndroid Build Coastguard Worker    VAImage *img;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    if (!ctx)
129*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
132*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    img = handle_table_get(drv->htab, image);
135*61046927SAndroid Build Coastguard Worker    if (!img) {
136*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
137*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_IMAGE;
138*61046927SAndroid Build Coastguard Worker    }
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker    sub = handle_table_get(drv->htab, subpicture);
141*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
142*61046927SAndroid Build Coastguard Worker    if (!sub)
143*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_SUBPICTURE;
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker    sub->image = img;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker VAStatus
vlVaSetSubpictureChromakey(VADriverContextP ctx,VASubpictureID subpicture,unsigned int chromakey_min,unsigned int chromakey_max,unsigned int chromakey_mask)151*61046927SAndroid Build Coastguard Worker vlVaSetSubpictureChromakey(VADriverContextP ctx, VASubpictureID subpicture,
152*61046927SAndroid Build Coastguard Worker                            unsigned int chromakey_min, unsigned int chromakey_max, unsigned int chromakey_mask)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker    if (!ctx)
155*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    return VA_STATUS_ERROR_UNIMPLEMENTED;
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker VAStatus
vlVaSetSubpictureGlobalAlpha(VADriverContextP ctx,VASubpictureID subpicture,float global_alpha)161*61046927SAndroid Build Coastguard Worker vlVaSetSubpictureGlobalAlpha(VADriverContextP ctx, VASubpictureID subpicture, float global_alpha)
162*61046927SAndroid Build Coastguard Worker {
163*61046927SAndroid Build Coastguard Worker    if (!ctx)
164*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    return VA_STATUS_ERROR_UNIMPLEMENTED;
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker VAStatus
vlVaAssociateSubpicture(VADriverContextP ctx,VASubpictureID subpicture,VASurfaceID * target_surfaces,int num_surfaces,short src_x,short src_y,unsigned short src_width,unsigned short src_height,short dest_x,short dest_y,unsigned short dest_width,unsigned short dest_height,unsigned int flags)170*61046927SAndroid Build Coastguard Worker vlVaAssociateSubpicture(VADriverContextP ctx, VASubpictureID subpicture,
171*61046927SAndroid Build Coastguard Worker                         VASurfaceID *target_surfaces, int num_surfaces,
172*61046927SAndroid Build Coastguard Worker                         short src_x, short src_y, unsigned short src_width,
173*61046927SAndroid Build Coastguard Worker                         unsigned short src_height, short dest_x, short dest_y,
174*61046927SAndroid Build Coastguard Worker                         unsigned short dest_width, unsigned short dest_height,
175*61046927SAndroid Build Coastguard Worker                         unsigned int flags)
176*61046927SAndroid Build Coastguard Worker {
177*61046927SAndroid Build Coastguard Worker    vlVaSubpicture *sub;
178*61046927SAndroid Build Coastguard Worker    struct pipe_resource tex_temp, *tex;
179*61046927SAndroid Build Coastguard Worker    struct pipe_sampler_view sampler_templ;
180*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
181*61046927SAndroid Build Coastguard Worker    vlVaSurface *surf;
182*61046927SAndroid Build Coastguard Worker    int i;
183*61046927SAndroid Build Coastguard Worker    struct u_rect src_rect = {src_x, src_x + src_width, src_y, src_y + src_height};
184*61046927SAndroid Build Coastguard Worker    struct u_rect dst_rect = {dest_x, dest_x + dest_width, dest_y, dest_y + dest_height};
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    if (!ctx)
187*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
188*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
189*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    sub = handle_table_get(drv->htab, subpicture);
192*61046927SAndroid Build Coastguard Worker    if (!sub) {
193*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
194*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_SUBPICTURE;
195*61046927SAndroid Build Coastguard Worker    }
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    for (i = 0; i < num_surfaces; i++) {
198*61046927SAndroid Build Coastguard Worker       surf = handle_table_get(drv->htab, target_surfaces[i]);
199*61046927SAndroid Build Coastguard Worker       if (!surf) {
200*61046927SAndroid Build Coastguard Worker          mtx_unlock(&drv->mutex);
201*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_INVALID_SURFACE;
202*61046927SAndroid Build Coastguard Worker       }
203*61046927SAndroid Build Coastguard Worker    }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    sub->src_rect = src_rect;
206*61046927SAndroid Build Coastguard Worker    sub->dst_rect = dst_rect;
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    memset(&tex_temp, 0, sizeof(tex_temp));
209*61046927SAndroid Build Coastguard Worker    tex_temp.target = PIPE_TEXTURE_2D;
210*61046927SAndroid Build Coastguard Worker    tex_temp.format = PIPE_FORMAT_B8G8R8A8_UNORM;
211*61046927SAndroid Build Coastguard Worker    tex_temp.last_level = 0;
212*61046927SAndroid Build Coastguard Worker    tex_temp.width0 = src_width;
213*61046927SAndroid Build Coastguard Worker    tex_temp.height0 = src_height;
214*61046927SAndroid Build Coastguard Worker    tex_temp.depth0 = 1;
215*61046927SAndroid Build Coastguard Worker    tex_temp.array_size = 1;
216*61046927SAndroid Build Coastguard Worker    tex_temp.usage = PIPE_USAGE_DYNAMIC;
217*61046927SAndroid Build Coastguard Worker    tex_temp.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
218*61046927SAndroid Build Coastguard Worker    tex_temp.flags = 0;
219*61046927SAndroid Build Coastguard Worker    if (!drv->pipe->screen->is_format_supported(
220*61046927SAndroid Build Coastguard Worker           drv->pipe->screen, tex_temp.format, tex_temp.target,
221*61046927SAndroid Build Coastguard Worker           tex_temp.nr_samples, tex_temp.nr_storage_samples, tex_temp.bind)) {
222*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
223*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_ALLOCATION_FAILED;
224*61046927SAndroid Build Coastguard Worker    }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    tex = drv->pipe->screen->resource_create(drv->pipe->screen, &tex_temp);
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker    memset(&sampler_templ, 0, sizeof(sampler_templ));
229*61046927SAndroid Build Coastguard Worker    u_sampler_view_default_template(&sampler_templ, tex, tex->format);
230*61046927SAndroid Build Coastguard Worker    sub->sampler = drv->pipe->create_sampler_view(drv->pipe, tex, &sampler_templ);
231*61046927SAndroid Build Coastguard Worker    pipe_resource_reference(&tex, NULL);
232*61046927SAndroid Build Coastguard Worker    if (!sub->sampler) {
233*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
234*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_ALLOCATION_FAILED;
235*61046927SAndroid Build Coastguard Worker    }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    for (i = 0; i < num_surfaces; i++) {
238*61046927SAndroid Build Coastguard Worker       surf = handle_table_get(drv->htab, target_surfaces[i]);
239*61046927SAndroid Build Coastguard Worker       if (!surf) {
240*61046927SAndroid Build Coastguard Worker          mtx_unlock(&drv->mutex);
241*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_INVALID_SURFACE;
242*61046927SAndroid Build Coastguard Worker       }
243*61046927SAndroid Build Coastguard Worker       util_dynarray_append(&surf->subpics, vlVaSubpicture *, sub);
244*61046927SAndroid Build Coastguard Worker    }
245*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker VAStatus
vlVaDeassociateSubpicture(VADriverContextP ctx,VASubpictureID subpicture,VASurfaceID * target_surfaces,int num_surfaces)251*61046927SAndroid Build Coastguard Worker vlVaDeassociateSubpicture(VADriverContextP ctx, VASubpictureID subpicture,
252*61046927SAndroid Build Coastguard Worker                           VASurfaceID *target_surfaces, int num_surfaces)
253*61046927SAndroid Build Coastguard Worker {
254*61046927SAndroid Build Coastguard Worker    int i;
255*61046927SAndroid Build Coastguard Worker    int j;
256*61046927SAndroid Build Coastguard Worker    vlVaSurface *surf;
257*61046927SAndroid Build Coastguard Worker    vlVaSubpicture *sub, **array;
258*61046927SAndroid Build Coastguard Worker    vlVaDriver *drv;
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker    if (!ctx)
261*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_CONTEXT;
262*61046927SAndroid Build Coastguard Worker    drv = VL_VA_DRIVER(ctx);
263*61046927SAndroid Build Coastguard Worker    mtx_lock(&drv->mutex);
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker    sub = handle_table_get(drv->htab, subpicture);
266*61046927SAndroid Build Coastguard Worker    if (!sub) {
267*61046927SAndroid Build Coastguard Worker       mtx_unlock(&drv->mutex);
268*61046927SAndroid Build Coastguard Worker       return VA_STATUS_ERROR_INVALID_SUBPICTURE;
269*61046927SAndroid Build Coastguard Worker    }
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker    for (i = 0; i < num_surfaces; i++) {
272*61046927SAndroid Build Coastguard Worker       surf = handle_table_get(drv->htab, target_surfaces[i]);
273*61046927SAndroid Build Coastguard Worker       if (!surf) {
274*61046927SAndroid Build Coastguard Worker          mtx_unlock(&drv->mutex);
275*61046927SAndroid Build Coastguard Worker          return VA_STATUS_ERROR_INVALID_SURFACE;
276*61046927SAndroid Build Coastguard Worker       }
277*61046927SAndroid Build Coastguard Worker 
278*61046927SAndroid Build Coastguard Worker       array = surf->subpics.data;
279*61046927SAndroid Build Coastguard Worker       if (!array)
280*61046927SAndroid Build Coastguard Worker          continue;
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker       for (j = 0; j < surf->subpics.size/sizeof(vlVaSubpicture *); j++) {
283*61046927SAndroid Build Coastguard Worker          if (array[j] == sub)
284*61046927SAndroid Build Coastguard Worker             array[j] = NULL;
285*61046927SAndroid Build Coastguard Worker       }
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker       while (surf->subpics.size && util_dynarray_top(&surf->subpics, vlVaSubpicture *) == NULL)
288*61046927SAndroid Build Coastguard Worker          (void)util_dynarray_pop(&surf->subpics, vlVaSubpicture *);
289*61046927SAndroid Build Coastguard Worker    }
290*61046927SAndroid Build Coastguard Worker    pipe_sampler_view_reference(&sub->sampler,NULL);
291*61046927SAndroid Build Coastguard Worker    mtx_unlock(&drv->mutex);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    return VA_STATUS_SUCCESS;
294*61046927SAndroid Build Coastguard Worker }
295