[Libva] [PATCH 2/2] i965_drv_video: add support for VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD.

Gwenole Beauchesne gb.devel at gmail.com
Mon Jun 27 21:10:33 PDT 2011


From: Gwenole Beauchesne <gwenole.beauchesne at intel.com>

---
 i965_drv_video/i965_drv_video.c |    9 +++++----
 i965_drv_video/i965_drv_video.h |    1 +
 i965_drv_video/i965_render.c    |   28 ++++++++++++++++++----------
 3 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
index b147b84..39ec1ba 100644
--- a/i965_drv_video/i965_drv_video.c
+++ b/i965_drv_video/i965_drv_video.c
@@ -104,18 +104,18 @@ static const i965_subpic_format_map_t
 i965_subpic_formats_map[I965_MAX_SUBPIC_FORMATS + 1] = {
     { I965_SURFACETYPE_INDEXED, I965_SURFACEFORMAT_P4A4_UNORM,
       { VA_FOURCC('I','A','4','4'), VA_MSB_FIRST, 8, },
-      0 },
+      VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD },
     { I965_SURFACETYPE_INDEXED, I965_SURFACEFORMAT_A4P4_UNORM,
       { VA_FOURCC('A','I','4','4'), VA_MSB_FIRST, 8, },
-      0 },
+      VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD },
     { I965_SURFACETYPE_RGBA, I965_SURFACEFORMAT_B8G8R8A8_UNORM,
       { VA_FOURCC('B','G','R','A'), VA_LSB_FIRST, 32,
         32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 },
-      0 },
+      VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD },
     { I965_SURFACETYPE_RGBA, I965_SURFACEFORMAT_R8G8B8A8_UNORM,
       { VA_FOURCC('R','G','B','A'), VA_LSB_FIRST, 32,
         32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 },
-      0 },
+      VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD },
 };
 
 static const i965_subpic_format_map_t *
@@ -695,6 +695,7 @@ i965_AssociateSubpicture(VADriverContextP ctx,
     obj_subpic->dst_rect.y      = dest_y;
     obj_subpic->dst_rect.width  = dest_width;
     obj_subpic->dst_rect.height = dest_height;
+    obj_subpic->flags           = flags;
 
     for (i = 0; i < num_surfaces; i++) {
         struct object_surface *obj_surface = SURFACE(target_surfaces[i]);
diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h
index 15be71c..94e7ed3 100644
--- a/i965_drv_video/i965_drv_video.h
+++ b/i965_drv_video/i965_drv_video.h
@@ -196,6 +196,7 @@ struct object_subpic
     int height;
     int pitch;
     dri_bo *bo;
+    unsigned int flags;
 };
 
 struct hw_codec_info
diff --git a/i965_drv_video/i965_render.c b/i965_drv_video/i965_render.c
index 1742fe5..c7c5f7b 100644
--- a/i965_drv_video/i965_render.c
+++ b/i965_drv_video/i965_render.c
@@ -884,25 +884,33 @@ i965_subpic_render_upload_vertex(VADriverContextP ctx,
     struct object_surface    *obj_surface  = SURFACE(surface);
     struct object_subpic     *obj_subpic   = SUBPIC(obj_surface->subpic);
 
-    const float sx = (float)output_rect->width  / (float)obj_surface->orig_width;
-    const float sy = (float)output_rect->height / (float)obj_surface->orig_height;
+    const float sx = (float)output_rect->width  / obj_surface->orig_width;
+    const float sy = (float)output_rect->height / obj_surface->orig_height;
     float *vb, tx1, tx2, ty1, ty2, x1, x2, y1, y2;
     int i = 0;
 
     VARectangle dst_rect;
-    dst_rect.x      = output_rect->x + sx * (float)obj_subpic->dst_rect.x;
-    dst_rect.y      = output_rect->y + sx * (float)obj_subpic->dst_rect.y;
-    dst_rect.width  = sx * (float)obj_subpic->dst_rect.width;
-    dst_rect.height = sy * (float)obj_subpic->dst_rect.height;
+    if (obj_subpic->flags & VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD) {
+        dst_rect.x      = sx * obj_subpic->dst_rect.x;
+        dst_rect.y      = sy * obj_subpic->dst_rect.y;
+        dst_rect.width  = sx * obj_subpic->dst_rect.width;
+        dst_rect.height = sy * obj_subpic->dst_rect.height;
+    }
+    else {
+        dst_rect.x      = output_rect->x + sx * obj_subpic->dst_rect.x;
+        dst_rect.y      = output_rect->y + sx * obj_subpic->dst_rect.y;
+        dst_rect.width  = sx * obj_subpic->dst_rect.width;
+        dst_rect.height = sy * obj_subpic->dst_rect.height;
+    }
 
     dri_bo_map(render_state->vb.vertex_buffer, 1);
     assert(render_state->vb.vertex_buffer->virtual);
     vb = render_state->vb.vertex_buffer->virtual;
 
-    tx1 = (float)obj_subpic->src_rect.x / (float)obj_subpic->width;
-    ty1 = (float)obj_subpic->src_rect.y / (float)obj_subpic->height;
-    tx2 = (float)(obj_subpic->src_rect.x + obj_subpic->src_rect.width) / (float)obj_subpic->width;
-    ty2 = (float)(obj_subpic->src_rect.y + obj_subpic->src_rect.height) / (float)obj_subpic->height;
+    tx1 = (float)obj_subpic->src_rect.x / obj_subpic->width;
+    ty1 = (float)obj_subpic->src_rect.y / obj_subpic->height;
+    tx2 = (float)(obj_subpic->src_rect.x + obj_subpic->src_rect.width) / obj_subpic->width;
+    ty2 = (float)(obj_subpic->src_rect.y + obj_subpic->src_rect.height) / obj_subpic->height;
 
     x1 = (float)dst_rect.x;
     y1 = (float)dst_rect.y;
-- 
1.7.4.1



More information about the Libva mailing list