st/va/postproc: implement the DRM prime grabber

Acked-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
Leo Liu
2017-09-19 13:06:38 -04:00
parent b47bdf55dc
commit f3ed1d2f6b

View File

@@ -119,9 +119,15 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context,
struct u_rect src_rect;
struct u_rect dst_rect;
bool scale = false;
bool grab = false;
unsigned i;
if (src->interlaced != dst->interlaced && dst->interlaced)
if ((src->buffer_format == PIPE_FORMAT_B8G8R8A8_UNORM ||
src->buffer_format == PIPE_FORMAT_B8G8R8X8_UNORM) &&
!src->interlaced)
grab = true;
if (src->interlaced != dst->interlaced && dst->interlaced && !grab)
return VA_STATUS_ERROR_INVALID_SURFACE;
if ((src->width != dst->width || src->height != dst->height) &&
@@ -132,7 +138,7 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context,
if (!src_surfaces || !src_surfaces[0])
return VA_STATUS_ERROR_INVALID_SURFACE;
if (scale) {
if (scale || (grab && dst->interlaced)) {
vlVaSurface *surf;
surf = handle_table_get(drv->htab, context->target_id);
@@ -159,6 +165,14 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context,
dst_rect.x1 = dst_region->x + dst_region->width;
dst_rect.y1 = dst_region->y + dst_region->height;
if (grab) {
vl_compositor_convert_rgb_to_yuv(&drv->cstate, &drv->compositor, 0,
((struct vl_video_buffer *)src)->resources[0],
dst, &src_rect, &dst_rect);
return VA_STATUS_SUCCESS;
}
if (src->interlaced != dst->interlaced) {
vl_compositor_yuv_deint_full(&drv->cstate, &drv->compositor,
src, dst, &src_rect, &dst_rect,