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 | 9 ++++ src/gallium/state_trackers/va/surface.c | 61 +++++++++++++++++++++++++++- src/gallium/state_trackers/va/va_private.h | 22 ++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c index 5940422..51eb259 100644 --- a/src/gallium/state_trackers/va/context.c +++ b/src/gallium/state_trackers/va/context.c @@ -30,6 +30,7 @@ #include "pipe/p_video_decoder.h" #include "util/u_memory.h" +#include "util/u_handle_table.h" #include "vl/vl_winsys.h" #include "va_private.h" @@ -100,6 +101,13 @@ __vaDriverInit_0_32(VADriverContextP ctx) return VA_STATUS_ERROR_ALLOCATION_FAILED; } + drv->htab = handle_table_create(); + if (!drv->htab) { + vl_screen_destroy(drv->vscreen); + FREE(drv); + return VA_STATUS_ERROR_ALLOCATION_FAILED; + } + ctx->pDriverData = (void *)drv; ctx->version_major = 0; ctx->version_minor = 1; @@ -145,6 +153,7 @@ vlVaTerminate(VADriverContextP ctx) drv = ctx->pDriverData; vl_screen_destroy(drv->vscreen); + handle_table_destroy(drv->htab); FREE(drv); return VA_STATUS_SUCCESS; diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c index 56356e4..5b54d7c 100644 --- a/src/gallium/state_trackers/va/surface.c +++ b/src/gallium/state_trackers/va/surface.c @@ -26,28 +26,85 @@ * **************************************************************************/ +#include "pipe/p_screen.h" + +#include "util/u_memory.h" +#include "util/u_handle_table.h" +#include "vl/vl_winsys.h" + #include "va_private.h" VAStatus vlVaCreateSurfaces(VADriverContextP ctx, int width, int height, int format, int num_surfaces, VASurfaceID *surfaces) { + struct pipe_video_buffer templat = {}; + struct pipe_screen *pscreen; + vlVaDriver *drv; + int i; + if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; if (!(width && height)) return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT; - return VA_STATUS_ERROR_UNIMPLEMENTED; + drv = VL_VA_DRIVER(ctx); + pscreen = VL_VA_PSCREEN(ctx); + + templat.buffer_format = pscreen->get_video_param + ( + pscreen, + PIPE_VIDEO_PROFILE_UNKNOWN, + PIPE_VIDEO_CAP_PREFERED_FORMAT + ); + templat.chroma_format = ChromaToPipe(format); + templat.width = width; + templat.height = height; + templat.interlaced = pscreen->get_video_param + ( + pscreen, + PIPE_VIDEO_PROFILE_UNKNOWN, + PIPE_VIDEO_CAP_PREFERS_INTERLACED + ); + + for (i = 0; i < num_surfaces; ++i) { + vlVaSurface *surf = CALLOC(1, sizeof(vlVaSurface)); + if (!surf) + goto no_res; + + surf->templat = templat; + surfaces[i] = handle_table_add(drv->htab, surf); + } + + return VA_STATUS_SUCCESS; + +no_res: + if (i) + vlVaDestroySurfaces(ctx, surfaces, i); + + return VA_STATUS_ERROR_ALLOCATION_FAILED; } VAStatus vlVaDestroySurfaces(VADriverContextP ctx, VASurfaceID *surface_list, int num_surfaces) { + vlVaDriver *drv; + int i; + if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; - return VA_STATUS_ERROR_UNIMPLEMENTED; + drv = VL_VA_DRIVER(ctx); + for (i = 0; i < num_surfaces; ++i) { + vlVaSurface *surf = handle_table_get(drv->htab, surface_list[i]); + if (surf->buffer) + surf->buffer->destroy(surf->buffer); + FREE(surf); + handle_table_remove(drv->htab, surface_list[i]); + } + + return VA_STATUS_SUCCESS; } VAStatus diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h index cd6c7d7..88418f9 100644 --- a/src/gallium/state_trackers/va/va_private.h +++ b/src/gallium/state_trackers/va/va_private.h @@ -35,10 +35,27 @@ #include <va/va_backend.h> #include "pipe/p_video_enums.h" +#include "pipe/p_video_decoder.h" #define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData) #define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen) +static inline enum pipe_video_chroma_format +ChromaToPipe(int format) +{ + switch (format) { + case VA_RT_FORMAT_YUV420: + return PIPE_VIDEO_CHROMA_FORMAT_420; + case VA_RT_FORMAT_YUV422: + return PIPE_VIDEO_CHROMA_FORMAT_422; + case VA_RT_FORMAT_YUV444: + return PIPE_VIDEO_CHROMA_FORMAT_444; + default: + assert(0); + return PIPE_VIDEO_CHROMA_FORMAT_420; + } +} + static inline VAProfile PipeToProfile(enum pipe_video_profile profile) { @@ -100,8 +117,13 @@ ProfileToPipe(VAProfile profile) typedef struct { struct vl_screen *vscreen; + struct handle_table *htab; } vlVaDriver; +typedef struct { + struct pipe_video_buffer templat, *buffer; +} vlVaSurface; + // Public functions: VAStatus __vaDriverInit_0_32(VADriverContextP ctx); -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev