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 | 6 ++++ src/gallium/state_trackers/va/surface.c | 50 ++++++++++++++++++++++++++-- src/gallium/state_trackers/va/va_private.h | 6 ++++ 3 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c index d535a6b..b3c5757 100644 --- a/src/gallium/state_trackers/va/context.c +++ b/src/gallium/state_trackers/va/context.c @@ -107,6 +107,12 @@ __vaDriverInit_0_32(VADriverContextP ctx) if (!drv->htab) goto error_htab; + vl_compositor_init(&drv->compositor, drv->pipe); + vl_compositor_init_state(&drv->cstate, drv->pipe); + + vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, true, &drv->csc); + vl_compositor_set_csc_matrix(&drv->cstate, (const vl_csc_matrix *)&drv->csc); + ctx->pDriverData = (void *)drv; ctx->version_major = 0; ctx->version_minor = 1; diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c index 7641ded..58303c6 100644 --- a/src/gallium/state_trackers/va/surface.c +++ b/src/gallium/state_trackers/va/surface.c @@ -31,6 +31,9 @@ #include "util/u_memory.h" #include "util/u_handle_table.h" +#include "util/u_rect.h" + +#include "vl/vl_compositor.h" #include "vl/vl_winsys.h" #include "va_private.h" @@ -136,15 +139,58 @@ vlVaQuerySurfaceError(VADriverContextP ctx, VASurfaceID render_target, VAStatus } VAStatus -vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface, void* draw, short srcx, short srcy, +vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short srcx, short srcy, unsigned short srcw, unsigned short srch, short destx, short desty, unsigned short destw, unsigned short desth, VARectangle *cliprects, unsigned int number_cliprects, unsigned int flags) { + vlVaDriver *drv; + vlVaSurface *surf; + struct pipe_resource *tex; + struct pipe_surface surf_templ, *surf_draw; + struct u_rect src_rect, *dirty_area; + if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; - return VA_STATUS_ERROR_UNIMPLEMENTED; + drv = VL_VA_DRIVER(ctx); + surf = handle_table_get(drv->htab, surface_id); + if (!surf) + return VA_STATUS_ERROR_INVALID_SURFACE; + + tex = vl_screen_texture_from_drawable(drv->vscreen, (Drawable)draw); + if (!tex) + return VA_STATUS_ERROR_INVALID_DISPLAY; + + dirty_area = vl_screen_get_dirty_area(drv->vscreen); + + memset(&surf_templ, 0, sizeof(surf_templ)); + surf_templ.format = tex->format; + surf_draw = drv->pipe->create_surface(drv->pipe, tex, &surf_templ); + if (!surf_draw) { + pipe_resource_reference(&tex, NULL); + return VA_STATUS_ERROR_INVALID_DISPLAY; + } + + src_rect.x0 = srcx; + src_rect.y0 = srcy; + src_rect.x1 = srcw + srcx; + src_rect.y1 = srch + srcy; + + vl_compositor_clear_layers(&drv->cstate); + vl_compositor_set_buffer_layer(&drv->cstate, &drv->compositor, 0, surf->buffer, &src_rect, NULL, VL_COMPOSITOR_WEAVE); + vl_compositor_render(&drv->cstate, &drv->compositor, surf_draw, dirty_area, true); + + drv->pipe->screen->flush_frontbuffer + ( + drv->pipe->screen, tex, 0, 0, + vl_screen_get_private(drv->vscreen) + ); + + pipe_resource_reference(&tex, NULL); + pipe_surface_reference(&surf_draw, NULL); + + 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 58b787d..ebbbedd 100644 --- a/src/gallium/state_trackers/va/va_private.h +++ b/src/gallium/state_trackers/va/va_private.h @@ -37,6 +37,9 @@ #include "pipe/p_video_enums.h" #include "pipe/p_video_state.h" +#include "vl/vl_compositor.h" +#include "vl/vl_csc.h" + #define VL_VA_DRIVER(ctx) ((vlVaDriver *)ctx->pDriverData) #define VL_VA_PSCREEN(ctx) (VL_VA_DRIVER(ctx)->vscreen->pscreen) @@ -119,6 +122,9 @@ typedef struct { struct vl_screen *vscreen; struct pipe_context *pipe; struct handle_table *htab; + struct vl_compositor compositor; + struct vl_compositor_state cstate; + vl_csc_matrix csc; } vlVaDriver; typedef struct { -- 1.7.9.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev