From: Christian König <christian.koe...@amd.com> Signed-off-by: Christian König <christian.koe...@amd.com> --- src/gallium/state_trackers/va/context.c | 71 +++++++++++++++++++++++----- src/gallium/state_trackers/va/va_private.h | 12 +++++ 2 files changed, 70 insertions(+), 13 deletions(-)
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c index 51eb259..d535a6b 100644 --- a/src/gallium/state_trackers/va/context.c +++ b/src/gallium/state_trackers/va/context.c @@ -96,17 +96,16 @@ __vaDriverInit_0_32(VADriverContextP ctx) return VA_STATUS_ERROR_ALLOCATION_FAILED; drv->vscreen = vl_screen_create(ctx->native_dpy, ctx->x11_screen); - if (!drv->vscreen) { - FREE(drv); - return VA_STATUS_ERROR_ALLOCATION_FAILED; - } + if (!drv->vscreen) + goto error_screen; + + drv->pipe = drv->vscreen->pscreen->context_create(drv->vscreen->pscreen, drv->vscreen); + if (!drv->pipe) + goto error_pipe; drv->htab = handle_table_create(); - if (!drv->htab) { - vl_screen_destroy(drv->vscreen); - FREE(drv); - return VA_STATUS_ERROR_ALLOCATION_FAILED; - } + if (!drv->htab) + goto error_htab; ctx->pDriverData = (void *)drv; ctx->version_major = 0; @@ -121,26 +120,71 @@ __vaDriverInit_0_32(VADriverContextP ctx) ctx->str_vendor = "mesa gallium vaapi"; return VA_STATUS_SUCCESS; + +error_htab: + drv->pipe->destroy(drv->pipe); + +error_pipe: + vl_screen_destroy(drv->vscreen); + +error_screen: + FREE(drv); + return VA_STATUS_ERROR_ALLOCATION_FAILED; } VAStatus vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width, int picture_height, int flag, VASurfaceID *render_targets, - int num_render_targets, VAContextID *conext) + int num_render_targets, VAContextID *context_id) { + vlVaDriver *drv; + vlVaContext *context; + if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; - return VA_STATUS_ERROR_UNIMPLEMENTED; + if (!(picture_width && picture_height)) + return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT; + + drv = VL_VA_DRIVER(ctx); + context = CALLOC(1, sizeof(vlVaContext)); + if (!context) + return VA_STATUS_ERROR_ALLOCATION_FAILED; + + context->decoder = drv->pipe->create_video_decoder + ( + drv->pipe, config_id, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CHROMA_FORMAT_420, + picture_width, picture_height, num_render_targets, + true + ); + if (!context->decoder) { + FREE(context); + return VA_STATUS_ERROR_ALLOCATION_FAILED; + } + + context->desc.base.profile = config_id; + *context_id = handle_table_add(drv->htab, context); + + return VA_STATUS_SUCCESS; } VAStatus -vlVaDestroyContext(VADriverContextP ctx, VAContextID context) +vlVaDestroyContext(VADriverContextP ctx, VAContextID context_id) { + vlVaDriver *drv; + vlVaContext *context; + if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; - return VA_STATUS_ERROR_UNIMPLEMENTED; + drv = VL_VA_DRIVER(ctx); + context = handle_table_get(drv->htab, context_id); + context->decoder->destroy(context->decoder); + FREE(context); + + return VA_STATUS_SUCCESS; } VAStatus @@ -152,6 +196,7 @@ vlVaTerminate(VADriverContextP ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; drv = ctx->pDriverData; + drv->pipe->destroy(drv->pipe); vl_screen_destroy(drv->vscreen); handle_table_destroy(drv->htab); FREE(drv); diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h index 88418f9..fcc1c59 100644 --- a/src/gallium/state_trackers/va/va_private.h +++ b/src/gallium/state_trackers/va/va_private.h @@ -117,10 +117,22 @@ ProfileToPipe(VAProfile profile) typedef struct { struct vl_screen *vscreen; + struct pipe_context *pipe; struct handle_table *htab; } vlVaDriver; typedef struct { + struct pipe_video_decoder *decoder; + union { + struct pipe_picture_desc base; + struct pipe_mpeg12_picture_desc mpeg12; + struct pipe_mpeg4_picture_desc mpeg4; + struct pipe_vc1_picture_desc vc1; + struct pipe_h264_picture_desc h264; + } desc; +} vlVaContext; + +typedef struct { struct pipe_video_buffer templat, *buffer; } vlVaSurface; -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev