From f1d1deb0157fd011daa60d439157bb16f30566ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20K=C3=B6nig?= Date: Tue, 7 Mar 2017 15:20:08 +0100 Subject: [PATCH] st/va: clear the video surface on allocation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This makes debugging of decoding problems quite a bit easier. Signed-off-by: Christian König Reviewed-by: Mark Thompson --- src/gallium/state_trackers/va/surface.c | 39 ++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c index 3561117d42f..543a00ac71f 100644 --- a/src/gallium/state_trackers/va/surface.c +++ b/src/gallium/state_trackers/va/surface.c @@ -553,6 +553,39 @@ suface_from_external_memory(VADriverContextP ctx, vlVaSurface *surface, return VA_STATUS_SUCCESS; } +static VAStatus +surface_allocate(VADriverContextP ctx, vlVaSurface *surface, + struct pipe_video_buffer *templat) +{ + vlVaDriver *drv; + struct pipe_surface **surfaces; + unsigned i; + + drv = VL_VA_DRIVER(ctx); + + surface->buffer = drv->pipe->create_video_buffer(drv->pipe, templat); + if (!surface->buffer) + return VA_STATUS_ERROR_ALLOCATION_FAILED; + + surfaces = surface->buffer->get_surfaces(surface->buffer); + for (i = 0; i < VL_MAX_SURFACES; ++i) { + union pipe_color_union c = {}; + + if (!surfaces[i]) + continue; + + if (i > !!surface->buffer->interlaced) + c.f[0] = c.f[1] = c.f[2] = c.f[3] = 0.5f; + + drv->pipe->clear_render_target(drv->pipe, surfaces[i], &c, 0, 0, + surfaces[i]->width, surfaces[i]->height, + false); + } + drv->pipe->flush(drv->pipe, NULL, 0); + + return VA_STATUS_SUCCESS; +} + VAStatus vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, unsigned int width, unsigned int height, @@ -695,11 +728,9 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, !(memory_attibute->flags & VA_SURFACE_EXTBUF_DESC_ENABLE_TILING)) templat.bind = PIPE_BIND_LINEAR | PIPE_BIND_SHARED; - surf->buffer = drv->pipe->create_video_buffer(drv->pipe, &templat); - if (!surf->buffer) { - vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; + vaStatus = surface_allocate(ctx, surf, &templat); + if (vaStatus != VA_STATUS_SUCCESS) goto free_surf; - } break; case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME: -- 2.30.2