is_surface_busy looks for locked or derived. If VPP and surface is not locked it should only check fail for derived if it is not exported to dmabuf.
XXX: maybe checking CODEC_PROC + not locked is enough to allow processing. Signed-off-by: Julien Isorce <[email protected]> --- src/i965_drv_video.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index bf599d6..0d6f513 100644 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -2610,8 +2610,28 @@ i965_BeginPicture(VADriverContextP ctx, obj_config = obj_context->obj_config; ASSERT_RET(obj_config, VA_STATUS_ERROR_INVALID_CONFIG); - if (is_surface_busy(i965, obj_surface)) - return VA_STATUS_ERROR_SURFACE_BUSY; + if (obj_context->codec_type == CODEC_PROC) { + if (obj_surface->locked_image_id != VA_INVALID_ID) + return VA_STATUS_ERROR_SURFACE_BUSY; + + if (obj_surface->derived_image_id != VA_INVALID_ID) { + /* Allow derived surface exported to dmabuf. */ + struct object_buffer *obj_buffer = NULL; + struct object_image *obj_image = IMAGE(obj_surface->derived_image_id); + if (!obj_image) + return VA_STATUS_ERROR_INVALID_IMAGE; + + obj_buffer = BUFFER(obj_image->image.buf); + if (!obj_buffer) + return VA_STATUS_ERROR_INVALID_BUFFER; + + if (obj_buffer->export_state.mem_type != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME) + return VA_STATUS_ERROR_SURFACE_BUSY; + } + } else { + if (is_surface_busy(i965, obj_surface)) + return VA_STATUS_ERROR_SURFACE_BUSY; + } if (obj_context->codec_type == CODEC_PROC) { obj_context->codec_state.proc.current_render_target = render_target; -- 1.9.1 _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
