[Mesa-dev] [RFC PATCH 7/7] st/va: Rework the state tracker for the new compositor abstraction
Thomas Hellstrom
thellstrom at vmware.com
Thu Mar 2 20:00:11 UTC 2017
Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
Reviewed-by: Sinclair Yeh <syeh at vmware.com>
---
src/gallium/state_trackers/va/context.c | 21 ++++++++++++++-------
src/gallium/state_trackers/va/postproc.c | 30 +++++++++++++++++-------------
src/gallium/state_trackers/va/surface.c | 23 +++++++++++++----------
src/gallium/state_trackers/va/va_private.h | 6 +++---
4 files changed, 47 insertions(+), 33 deletions(-)
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c
index d749e65..d9d9210 100644
--- a/src/gallium/state_trackers/va/context.c
+++ b/src/gallium/state_trackers/va/context.c
@@ -33,6 +33,7 @@
#include "util/u_video.h"
#include "vl/vl_deint_filter.h"
#include "vl/vl_winsys.h"
+#include "vl/vl_postproc.h"
#include "va_private.h"
@@ -155,14 +156,20 @@ VA_DRIVER_INIT_FUNC(VADriverContextP ctx)
if (!drv->htab)
goto error_htab;
- if (!vl_compositor_init(&drv->compositor, drv->pipe))
+ drv->compositor = vl_pproc_create(drv->pipe, NULL);
+ if (!drv->compositor)
goto error_compositor;
- if (!vl_compositor_init_state(&drv->cstate, drv->pipe))
+
+ drv->cctx = drv->compositor->context_create(drv->compositor);
+ if (!drv->cctx)
goto error_compositor_state;
vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, true, &drv->csc);
- if (!vl_compositor_set_csc_matrix(&drv->cstate, (const vl_csc_matrix *)&drv->csc, 1.0f, 0.0f))
+ if (!drv->cctx->set_csc_matrix
+ (drv->cctx, (const util_video_compositor_csc_matrix *)&drv->csc)) {
goto error_csc_matrix;
+ }
+
pipe_mutex_init(drv->mutex);
ctx->pDriverData = (void *)drv;
@@ -181,10 +188,10 @@ VA_DRIVER_INIT_FUNC(VADriverContextP ctx)
return VA_STATUS_SUCCESS;
error_csc_matrix:
- vl_compositor_cleanup_state(&drv->cstate);
+ drv->cctx->destroy(drv->cctx);
error_compositor_state:
- vl_compositor_cleanup(&drv->compositor);
+ drv->compositor->destroy(drv->compositor);
error_compositor:
handle_table_destroy(drv->htab);
@@ -346,8 +353,8 @@ vlVaTerminate(VADriverContextP ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
drv = ctx->pDriverData;
- vl_compositor_cleanup_state(&drv->cstate);
- vl_compositor_cleanup(&drv->compositor);
+ drv->cctx->destroy(drv->cctx);
+ drv->compositor->destroy(drv->compositor);
drv->pipe->destroy(drv->pipe);
drv->vscreen->destroy(drv->vscreen);
handle_table_destroy(drv->htab);
diff --git a/src/gallium/state_trackers/va/postproc.c b/src/gallium/state_trackers/va/postproc.c
index 01e240f..fe35334 100644
--- a/src/gallium/state_trackers/va/postproc.c
+++ b/src/gallium/state_trackers/va/postproc.c
@@ -31,6 +31,8 @@
#include "vl/vl_video_buffer.h"
#include "vl/vl_deint_filter.h"
+#include "util/u_video_compositor.h"
+
#include "va_private.h"
static const VARectangle *
@@ -54,11 +56,12 @@ vlVaPostProcCompositor(vlVaDriver *drv, vlVaContext *context,
const VARectangle *dst_region,
struct pipe_video_buffer *src,
struct pipe_video_buffer *dst,
- enum vl_compositor_deinterlace deinterlace)
+ enum util_video_compositor_deinterlace deinterlace)
{
struct pipe_surface **surfaces;
struct u_rect src_rect;
struct u_rect dst_rect;
+ struct util_video_compositor_context *cctx = drv->cctx;
surfaces = dst->get_surfaces(dst);
if (!surfaces || !surfaces[0])
@@ -74,11 +77,10 @@ vlVaPostProcCompositor(vlVaDriver *drv, vlVaContext *context,
dst_rect.x1 = dst_region->x + dst_region->width;
dst_rect.y1 = dst_region->y + dst_region->height;
- vl_compositor_clear_layers(&drv->cstate);
- vl_compositor_set_buffer_layer(&drv->cstate, &drv->compositor, 0, src,
- &src_rect, NULL, deinterlace);
- vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dst_rect);
- vl_compositor_render(&drv->cstate, &drv->compositor, surfaces[0], NULL, false);
+ cctx->clear_layers(cctx);
+ cctx->set_buffer_layer(cctx, 0, src, &src_rect, NULL, deinterlace);
+ cctx->set_layer_dst_area(cctx, 0, &dst_rect);
+ cctx->render(cctx, surfaces[0], NULL, false, NULL, NULL, 0, 0);
drv->pipe->flush(drv->pipe, NULL, 0);
return VA_STATUS_SUCCESS;
@@ -111,7 +113,8 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context,
const VARectangle *dst_region,
struct pipe_video_buffer *src,
struct pipe_video_buffer *dst,
- enum vl_compositor_deinterlace deinterlace)
+ enum util_video_compositor_deinterlace
+ deinterlace)
{
struct pipe_surface **src_surfaces;
struct pipe_surface **dst_surfaces;
@@ -135,10 +138,10 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context,
if (src->interlaced) {
/* Not 100% accurate, but close enough */
switch (deinterlace) {
- case VL_COMPOSITOR_BOB_TOP:
+ case UTIL_VIDEO_COMPOSITOR_BOB_TOP:
from = src_surfaces[i & ~1];
break;
- case VL_COMPOSITOR_BOB_BOTTOM:
+ case UTIL_VIDEO_COMPOSITOR_BOB_BOTTOM:
from = src_surfaces[(i & ~1) + 1];
break;
default:
@@ -224,7 +227,8 @@ vlVaApplyDeint(vlVaDriver *drv, vlVaContext *context,
VAStatus
vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
{
- enum vl_compositor_deinterlace deinterlace = VL_COMPOSITOR_WEAVE;
+ enum util_video_compositor_deinterlace deinterlace =
+ UTIL_VIDEO_COMPOSITOR_WEAVE;
VARectangle def_src_region, def_dst_region;
const VARectangle *src_region, *dst_region;
VAProcPipelineParameterBuffer *param;
@@ -263,13 +267,13 @@ vlVaHandleVAProcPipelineParameterBufferType(vlVaDriver *drv, vlVaContext *contex
switch (deint->algorithm) {
case VAProcDeinterlacingBob:
if (deint->flags & VA_DEINTERLACING_BOTTOM_FIELD)
- deinterlace = VL_COMPOSITOR_BOB_BOTTOM;
+ deinterlace = UTIL_VIDEO_COMPOSITOR_BOB_BOTTOM;
else
- deinterlace = VL_COMPOSITOR_BOB_TOP;
+ deinterlace = UTIL_VIDEO_COMPOSITOR_BOB_TOP;
break;
case VAProcDeinterlacingWeave:
- deinterlace = VL_COMPOSITOR_WEAVE;
+ deinterlace = UTIL_VIDEO_COMPOSITOR_WEAVE;
break;
case VAProcDeinterlacingMotionAdaptive:
diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c
index 0e1dbe0..e39af4e 100644
--- a/src/gallium/state_trackers/va/surface.c
+++ b/src/gallium/state_trackers/va/surface.c
@@ -186,6 +186,7 @@ vlVaPutSubpictures(vlVaSurface *surf, vlVaDriver *drv,
{
vlVaSubpicture *sub;
int i;
+ struct util_video_compositor_context *cctx = drv->cctx;
if (!(surf->subpics.data || surf->subpics.size))
return VA_STATUS_SUCCESS;
@@ -254,14 +255,13 @@ vlVaPutSubpictures(vlVaSurface *surf, vlVaDriver *drv,
blend.dither = 0;
blend_state = drv->pipe->create_blend_state(drv->pipe, &blend);
- vl_compositor_clear_layers(&drv->cstate);
- vl_compositor_set_layer_blend(&drv->cstate, 0, blend_state, false);
+ cctx->clear_layers(cctx);
+ cctx->set_layer_blend(cctx, 0, blend_state, false);
upload_sampler(drv->pipe, sub->sampler, &box, buf->data,
sub->image->pitches[0], 0, 0);
- vl_compositor_set_rgba_layer(&drv->cstate, &drv->compositor, 0, sub->sampler,
- &sr, NULL, NULL);
- vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dr);
- vl_compositor_render(&drv->cstate, &drv->compositor, surf_draw, dirty_area, false);
+ cctx->set_rgba_layer(cctx, 0, sub->sampler, &sr, NULL, NULL);
+ cctx->set_layer_dst_area(cctx, 0, &dr);
+ cctx->render(cctx, surf_draw, dirty_area, false, NULL, NULL, 0, 0);
drv->pipe->delete_blend_state(drv->pipe, blend_state);
}
@@ -283,11 +283,13 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s
struct u_rect src_rect, *dirty_area;
struct u_rect dst_rect = {destx, destx + destw, desty, desty + desth};
VAStatus status;
+ struct util_video_compositor_context *cctx;
if (!ctx)
return VA_STATUS_ERROR_INVALID_CONTEXT;
drv = VL_VA_DRIVER(ctx);
+ cctx = drv->cctx;
pipe_mutex_lock(drv->mutex);
surf = handle_table_get(drv->htab, surface_id);
if (!surf) {
@@ -320,10 +322,11 @@ vlVaPutSurface(VADriverContextP ctx, VASurfaceID surface_id, void* draw, short s
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_set_layer_dst_area(&drv->cstate, 0, &dst_rect);
- vl_compositor_render(&drv->cstate, &drv->compositor, surf_draw, dirty_area, true);
+ cctx->clear_layers(cctx);
+ cctx->set_buffer_layer(cctx, 0, surf->buffer, &src_rect, NULL,
+ UTIL_VIDEO_COMPOSITOR_WEAVE);
+ cctx->set_layer_dst_area(cctx, 0, &dst_rect);
+ cctx->render(cctx, surf_draw, dirty_area, true, NULL, NULL, 0, 0);
status = vlVaPutSubpictures(surf, drv, surf_draw, dirty_area, &src_rect, &dst_rect);
if (status) {
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
index a744461..2f9accc 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++ b/src/gallium/state_trackers/va/va_private.h
@@ -40,7 +40,7 @@
#include "pipe/p_video_codec.h"
#include "pipe/p_video_state.h"
-#include "vl/vl_compositor.h"
+#include "util/u_video_compositor.h"
#include "vl/vl_csc.h"
#include "util/u_dynarray.h"
@@ -206,8 +206,8 @@ typedef struct {
struct vl_screen *vscreen;
struct pipe_context *pipe;
struct handle_table *htab;
- struct vl_compositor compositor;
- struct vl_compositor_state cstate;
+ struct util_video_compositor *compositor;
+ struct util_video_compositor_context *cctx;
vl_csc_matrix csc;
pipe_mutex mutex;
} vlVaDriver;
--
2.4.11
More information about the mesa-dev
mailing list