diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/va/surface.c | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/src/gallium/state_trackers/va/surface.c b/src/gallium/state_trackers/va/surface.c index 1d8d981d1c2..3561117d42f 100644 --- a/src/gallium/state_trackers/va/surface.c +++ b/src/gallium/state_trackers/va/surface.c @@ -488,8 +488,7 @@ vlVaQuerySurfaceAttributes(VADriverContextP ctx, VAConfigID config_id, static VAStatus suface_from_external_memory(VADriverContextP ctx, vlVaSurface *surface, VASurfaceAttribExternalBuffers *memory_attibute, - int index, VASurfaceID *surfaces, - struct pipe_video_buffer *templat) + unsigned index, struct pipe_video_buffer *templat) { vlVaDriver *drv; struct pipe_screen *pscreen; @@ -498,9 +497,6 @@ suface_from_external_memory(VADriverContextP ctx, vlVaSurface *surface, struct winsys_handle whandle; struct pipe_resource *resources[VL_NUM_COMPONENTS]; - if (!ctx) - return VA_STATUS_ERROR_INVALID_PARAMETER; - pscreen = VL_VA_PSCREEN(ctx); drv = VL_VA_DRIVER(ctx); @@ -554,14 +550,6 @@ suface_from_external_memory(VADriverContextP ctx, vlVaSurface *surface, if (!surface->buffer) return VA_STATUS_ERROR_ALLOCATION_FAILED; - util_dynarray_init(&surface->subpics); - surfaces[index] = handle_table_add(drv->htab, surface); - - if (!surfaces[index]) { - surface->buffer->destroy(surface->buffer); - return VA_STATUS_ERROR_ALLOCATION_FAILED; - } - return VA_STATUS_SUCCESS; } @@ -579,6 +567,7 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, int memory_type; int expected_fourcc; VAStatus vaStatus; + vlVaSurface *surf; if (!ctx) return VA_STATUS_ERROR_INVALID_CONTEXT; @@ -688,9 +677,11 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, mtx_lock(&drv->mutex); for (i = 0; i < num_surfaces; i++) { - vlVaSurface *surf = CALLOC(1, sizeof(vlVaSurface)); - if (!surf) + surf = CALLOC(1, sizeof(vlVaSurface)); + if (!surf) { + vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; goto no_res; + } surf->templat = templat; @@ -706,33 +697,44 @@ vlVaCreateSurfaces2(VADriverContextP ctx, unsigned int format, surf->buffer = drv->pipe->create_video_buffer(drv->pipe, &templat); if (!surf->buffer) { - FREE(surf); - goto no_res; + vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; + goto free_surf; } - util_dynarray_init(&surf->subpics); - surfaces[i] = handle_table_add(drv->htab, surf); break; + case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME: - vaStatus = suface_from_external_memory(ctx, surf, memory_attibute, i, surfaces, &templat); - if (vaStatus != VA_STATUS_SUCCESS) { - FREE(surf); - goto no_res; - } + vaStatus = suface_from_external_memory(ctx, surf, memory_attibute, i, &templat); + if (vaStatus != VA_STATUS_SUCCESS) + goto free_surf; break; + default: assert(0); } + + util_dynarray_init(&surf->subpics); + surfaces[i] = handle_table_add(drv->htab, surf); + if (!surfaces[i]) { + vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; + goto destroy_surf; + } } mtx_unlock(&drv->mutex); return VA_STATUS_SUCCESS; +destroy_surf: + surf->buffer->destroy(surf->buffer); + +free_surf: + FREE(surf); + no_res: mtx_unlock(&drv->mutex); if (i) vlVaDestroySurfaces(ctx, surfaces, i); - return VA_STATUS_ERROR_ALLOCATION_FAILED; + return vaStatus; } VAStatus |