OSDN Git Service

Add support for P010 in vaPutSurface() in a X window system
authorXiang, Haihao <haihao.xiang@intel.com>
Tue, 7 Jul 2015 08:32:14 +0000 (16:32 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Mon, 7 Dec 2015 05:31:28 +0000 (13:31 +0800)
Currently it converts P010 to RGBA32 because the drawable to vaPutSurface() is RGBA color

v2: P010 has interleaved UV planar (Peng)

v3: change commit log

Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Signed-off-by: peng.chen <peng.c.chen@intel.com>
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
Cc: Emil Velikov <emil.l.velikov@gmail.com>
(cherry picked from commit bace1e29c669f3fe47cb41c57fc817b493fc7882)

src/gen9_render.c

index b45543a..4c24443 100644 (file)
@@ -249,35 +249,48 @@ gen9_render_src_surfaces_state(
     rh = obj_surface->orig_height;
     region = obj_surface->bo;
 
-    gen9_render_src_surface_state(ctx, 1, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags);     /* Y */
-    gen9_render_src_surface_state(ctx, 2, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags);
-
-    if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2')) {
+    if (obj_surface->fourcc == VA_FOURCC('P', '0', '1', '0')) {
+        gen9_render_src_surface_state(ctx, 1, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R16_UNORM, flags);     /* Y */
+        gen9_render_src_surface_state(ctx, 2, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R16_UNORM, flags);
         gen9_render_src_surface_state(ctx, 3, region,
                                       region_pitch * obj_surface->y_cb_offset,
                                       obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8G8_UNORM, flags); /* UV */
+                                      I965_SURFACEFORMAT_R16G16_UNORM, flags); /* UV */
         gen9_render_src_surface_state(ctx, 4, region,
                                       region_pitch * obj_surface->y_cb_offset,
                                       obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8G8_UNORM, flags);
+                                      I965_SURFACEFORMAT_R16G16_UNORM, flags);
     } else {
-        gen9_render_src_surface_state(ctx, 3, region,
-                                      region_pitch * obj_surface->y_cb_offset,
-                                      obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8_UNORM, flags); /* U */
-        gen9_render_src_surface_state(ctx, 4, region,
-                                      region_pitch * obj_surface->y_cb_offset,
-                                      obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8_UNORM, flags);
-        gen9_render_src_surface_state(ctx, 5, region,
-                                      region_pitch * obj_surface->y_cr_offset,
-                                      obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8_UNORM, flags); /* V */
-        gen9_render_src_surface_state(ctx, 6, region,
-                                      region_pitch * obj_surface->y_cr_offset,
-                                      obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
-                                      I965_SURFACEFORMAT_R8_UNORM, flags);
+        gen9_render_src_surface_state(ctx, 1, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags);     /* Y */
+        gen9_render_src_surface_state(ctx, 2, region, 0, rw, rh, region_pitch, I965_SURFACEFORMAT_R8_UNORM, flags);
+
+        if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2')) {
+            gen9_render_src_surface_state(ctx, 3, region,
+                                          region_pitch * obj_surface->y_cb_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8G8_UNORM, flags); /* UV */
+            gen9_render_src_surface_state(ctx, 4, region,
+                                          region_pitch * obj_surface->y_cb_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8G8_UNORM, flags);
+        } else {
+            gen9_render_src_surface_state(ctx, 3, region,
+                                          region_pitch * obj_surface->y_cb_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8_UNORM, flags); /* U */
+            gen9_render_src_surface_state(ctx, 4, region,
+                                          region_pitch * obj_surface->y_cb_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8_UNORM, flags);
+            gen9_render_src_surface_state(ctx, 5, region,
+                                          region_pitch * obj_surface->y_cr_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8_UNORM, flags); /* V */
+            gen9_render_src_surface_state(ctx, 6, region,
+                                          region_pitch * obj_surface->y_cr_offset,
+                                          obj_surface->cb_cr_width, obj_surface->cb_cr_height, obj_surface->cb_cr_pitch,
+                                          I965_SURFACEFORMAT_R8_UNORM, flags);
+        }
     }
 }
 
@@ -773,7 +786,8 @@ gen9_render_upload_constants(VADriverContextP ctx,
 
         *constant_buffer = 2;
     } else {
-        if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2'))
+        if (obj_surface->fourcc == VA_FOURCC('N', 'V', '1', '2') ||
+            obj_surface->fourcc == VA_FOURCC('P', '0', '1', '0'))
             *constant_buffer = 1;
         else
             *constant_buffer = 0;