diff options
author | Leo Liu <[email protected]> | 2017-09-19 13:06:38 -0400 |
---|---|---|
committer | Leo Liu <[email protected]> | 2017-09-25 09:42:14 -0400 |
commit | f3ed1d2f6b0fac9af64279eed96afa45e511650b (patch) | |
tree | 831e8a4cb9a4bf4884ff46592f9e7af660172f80 /src/gallium | |
parent | b47bdf55dc91278e43e31579b7d2a496facae0e8 (diff) |
st/va/postproc: implement the DRM prime grabber
Acked-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/state_trackers/va/postproc.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/va/postproc.c b/src/gallium/state_trackers/va/postproc.c index d3eafe9b53b..21d316c7e97 100644 --- a/src/gallium/state_trackers/va/postproc.c +++ b/src/gallium/state_trackers/va/postproc.c @@ -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, |