1 /**************************************************************************
3 * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
4 * Copyright 2014 Advanced Micro Devices, Inc.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 **************************************************************************/
29 #include "util/u_memory.h"
30 #include "util/u_handle_table.h"
31 #include "util/u_sampler.h"
33 #include "va_private.h"
35 static VAImageFormat subpic_formats
[] = {
37 .fourcc
= VA_FOURCC_BGRA
,
38 .byte_order
= VA_LSB_FIRST
,
41 .red_mask
= 0x00ff0000ul
,
42 .green_mask
= 0x0000ff00ul
,
43 .blue_mask
= 0x000000fful
,
44 .alpha_mask
= 0xff000000ul
,
49 vlVaQuerySubpictureFormats(VADriverContextP ctx
, VAImageFormat
*format_list
,
50 unsigned int *flags
, unsigned int *num_formats
)
53 return VA_STATUS_ERROR_INVALID_CONTEXT
;
55 if (!(format_list
&& flags
&& num_formats
))
56 return VA_STATUS_ERROR_UNKNOWN
;
58 *num_formats
= sizeof(subpic_formats
)/sizeof(VAImageFormat
);
59 memcpy(format_list
, subpic_formats
, sizeof(subpic_formats
));
61 return VA_STATUS_SUCCESS
;
65 vlVaCreateSubpicture(VADriverContextP ctx
, VAImageID image
,
66 VASubpictureID
*subpicture
)
72 return VA_STATUS_ERROR_INVALID_CONTEXT
;
74 img
= handle_table_get(VL_VA_DRIVER(ctx
)->htab
, image
);
76 return VA_STATUS_ERROR_INVALID_IMAGE
;
78 sub
= CALLOC(1, sizeof(*sub
));
80 return VA_STATUS_ERROR_ALLOCATION_FAILED
;
83 *subpicture
= handle_table_add(VL_VA_DRIVER(ctx
)->htab
, sub
);
85 return VA_STATUS_SUCCESS
;
89 vlVaDestroySubpicture(VADriverContextP ctx
, VASubpictureID subpicture
)
94 return VA_STATUS_ERROR_INVALID_CONTEXT
;
96 sub
= handle_table_get(VL_VA_DRIVER(ctx
)->htab
, subpicture
);
98 return VA_STATUS_ERROR_INVALID_SUBPICTURE
;
101 handle_table_remove(VL_VA_DRIVER(ctx
)->htab
, subpicture
);
103 return VA_STATUS_SUCCESS
;
107 vlVaSubpictureImage(VADriverContextP ctx
, VASubpictureID subpicture
, VAImageID image
)
113 return VA_STATUS_ERROR_INVALID_CONTEXT
;
115 img
= handle_table_get(VL_VA_DRIVER(ctx
)->htab
, image
);
117 return VA_STATUS_ERROR_INVALID_IMAGE
;
119 sub
= handle_table_get(VL_VA_DRIVER(ctx
)->htab
, subpicture
);
121 return VA_STATUS_ERROR_INVALID_SUBPICTURE
;
125 return VA_STATUS_SUCCESS
;
129 vlVaSetSubpictureChromakey(VADriverContextP ctx
, VASubpictureID subpicture
,
130 unsigned int chromakey_min
, unsigned int chromakey_max
, unsigned int chromakey_mask
)
133 return VA_STATUS_ERROR_INVALID_CONTEXT
;
135 return VA_STATUS_ERROR_UNIMPLEMENTED
;
139 vlVaSetSubpictureGlobalAlpha(VADriverContextP ctx
, VASubpictureID subpicture
, float global_alpha
)
142 return VA_STATUS_ERROR_INVALID_CONTEXT
;
144 return VA_STATUS_ERROR_UNIMPLEMENTED
;
148 vlVaAssociateSubpicture(VADriverContextP ctx
, VASubpictureID subpicture
,
149 VASurfaceID
*target_surfaces
, int num_surfaces
,
150 short src_x
, short src_y
, unsigned short src_width
,
151 unsigned short src_height
, short dest_x
, short dest_y
,
152 unsigned short dest_width
, unsigned short dest_height
,
156 struct pipe_resource tex_temp
, *tex
;
157 struct pipe_sampler_view sampler_templ
;
161 struct u_rect src_rect
= {src_x
, src_x
+ src_width
, src_y
, src_y
+ src_height
};
162 struct u_rect dst_rect
= {dest_x
, dest_x
+ dest_width
, dest_y
, dest_y
+ dest_height
};
165 return VA_STATUS_ERROR_INVALID_CONTEXT
;
166 drv
= VL_VA_DRIVER(ctx
);
168 sub
= handle_table_get(drv
->htab
, subpicture
);
170 return VA_STATUS_ERROR_INVALID_SUBPICTURE
;
172 for (i
= 0; i
< num_surfaces
; i
++) {
173 surf
= handle_table_get(drv
->htab
, target_surfaces
[i
]);
175 return VA_STATUS_ERROR_INVALID_SURFACE
;
178 sub
->src_rect
= src_rect
;
179 sub
->dst_rect
= dst_rect
;
181 memset(&tex_temp
, 0, sizeof(tex_temp
));
182 tex_temp
.target
= PIPE_TEXTURE_2D
;
183 tex_temp
.format
= PIPE_FORMAT_B8G8R8A8_UNORM
;
184 tex_temp
.last_level
= 0;
185 tex_temp
.width0
= src_width
;
186 tex_temp
.height0
= src_height
;
188 tex_temp
.array_size
= 1;
189 tex_temp
.usage
= PIPE_USAGE_DYNAMIC
;
190 tex_temp
.bind
= PIPE_BIND_SAMPLER_VIEW
| PIPE_BIND_RENDER_TARGET
;
192 if (!drv
->pipe
->screen
->is_format_supported(
193 drv
->pipe
->screen
, tex_temp
.format
, tex_temp
.target
,
194 tex_temp
.nr_samples
, tex_temp
.bind
))
195 return VA_STATUS_ERROR_ALLOCATION_FAILED
;
197 tex
= drv
->pipe
->screen
->resource_create(drv
->pipe
->screen
, &tex_temp
);
199 memset(&sampler_templ
, 0, sizeof(sampler_templ
));
200 u_sampler_view_default_template(&sampler_templ
, tex
, tex
->format
);
201 sub
->sampler
= drv
->pipe
->create_sampler_view(drv
->pipe
, tex
, &sampler_templ
);
202 pipe_resource_reference(&tex
, NULL
);
204 return VA_STATUS_ERROR_ALLOCATION_FAILED
;
206 for (i
= 0; i
< num_surfaces
; i
++) {
207 surf
= handle_table_get(drv
->htab
, target_surfaces
[i
]);
208 util_dynarray_append(&surf
->subpics
, vlVaSubpicture
*, sub
);
211 return VA_STATUS_SUCCESS
;
215 vlVaDeassociateSubpicture(VADriverContextP ctx
, VASubpictureID subpicture
,
216 VASurfaceID
*target_surfaces
, int num_surfaces
)
221 vlVaSubpicture
*sub
, **array
;
225 return VA_STATUS_ERROR_INVALID_CONTEXT
;
226 drv
= VL_VA_DRIVER(ctx
);
228 sub
= handle_table_get(drv
->htab
, subpicture
);
230 return VA_STATUS_ERROR_INVALID_SUBPICTURE
;
232 for (i
= 0; i
< num_surfaces
; i
++) {
233 surf
= handle_table_get(drv
->htab
, target_surfaces
[i
]);
235 return VA_STATUS_ERROR_INVALID_SURFACE
;
237 array
= surf
->subpics
.data
;
241 for (j
= 0; j
< surf
->subpics
.size
/sizeof(vlVaSubpicture
*); j
++) {
246 while (surf
->subpics
.size
&& util_dynarray_top(&surf
->subpics
, vlVaSubpicture
*) == NULL
)
247 (void)util_dynarray_pop(&surf
->subpics
, vlVaSubpicture
*);
250 return VA_STATUS_SUCCESS
;