OSDN Git Service

Check and allocate (if not exist) bo for dst_obj_surface in vpp
authorWang, Tiantian <tiantian.wang@intel.com>
Mon, 10 Apr 2017 06:12:24 +0000 (02:12 -0400)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 13 Apr 2017 05:37:49 +0000 (13:37 +0800)
    This fixes #20
    https://github.com/01org/intel-vaapi-driver/issues/20

Signed-off-by: Wang Tiantian <tiantian.wang@intel.com>
src/i965_post_processing.c

index b855123..61da761 100755 (executable)
@@ -5852,6 +5852,9 @@ i965_proc_picture_fast(VADriverContextP ctx,
     if (!src_obj_surface->fourcc)
         return VA_STATUS_ERROR_INVALID_IMAGE_FORMAT;
 
+    if (!src_obj_surface->bo)
+        return VA_STATUS_ERROR_INVALID_SURFACE;
+
     if (pipeline_param->surface_region) {
         src_rect.x = pipeline_param->surface_region->x;
         src_rect.y = pipeline_param->surface_region->y;
@@ -5959,16 +5962,40 @@ i965_proc_picture(VADriverContextP ctx,
     unsigned int tiling = 0, swizzle = 0;
     int in_width, in_height;
 
-    status = i965_proc_picture_fast(ctx, proc_context, proc_state);
-    if (status != VA_STATUS_ERROR_UNIMPLEMENTED)
-        return status;
-
     if (pipeline_param->surface == VA_INVALID_ID ||
         proc_state->current_render_target == VA_INVALID_ID) {
         status = VA_STATUS_ERROR_INVALID_SURFACE;
         goto error;
     }
 
+    obj_surface = SURFACE(proc_state->current_render_target);
+    if (!obj_surface)
+        return VA_STATUS_ERROR_INVALID_SURFACE;
+
+    if (!obj_surface->bo) {
+        unsigned int expected_format = obj_surface->expected_format;
+        int fourcc = 0;
+        int subsample = 0;
+        int tiling = HAS_TILED_SURFACE(i965);
+        switch (expected_format) {
+        case VA_RT_FORMAT_YUV420:
+            fourcc = VA_FOURCC_NV12;
+            subsample = SUBSAMPLE_YUV420;
+            break;
+        case VA_RT_FORMAT_YUV420_10BPP:
+            fourcc = VA_FOURCC_P010;
+            subsample = SUBSAMPLE_YUV420;
+            break;
+        case VA_RT_FORMAT_RGB32:
+            fourcc = VA_FOURCC_RGBA;
+            subsample = SUBSAMPLE_RGBX;
+            break;
+        default:
+            return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
+        }
+        i965_check_alloc_surface_bo(ctx, obj_surface, tiling, fourcc, subsample);
+    }
+
     obj_surface = SURFACE(pipeline_param->surface);
 
     if (!obj_surface) {
@@ -5986,6 +6013,10 @@ i965_proc_picture(VADriverContextP ctx,
         goto error;
     }
 
+    status = i965_proc_picture_fast(ctx, proc_context, proc_state);
+    if (status != VA_STATUS_ERROR_UNIMPLEMENTED)
+        return status;
+
     in_width = obj_surface->orig_width;
     in_height = obj_surface->orig_height;
     dri_bo_get_tiling(obj_surface->bo, &tiling, &swizzle);