diff options
Diffstat (limited to 'src')
-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, |