i965_drv_video: add support for VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 28 Jun 2011 01:30:21 +0000 (18:30 -0700)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 29 Jun 2011 01:54:19 +0000 (09:54 +0800)
i965_drv_video.c
i965_drv_video.h
i965_render.c

index b147b84..39ec1ba 100644 (file)
@@ -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]);
index 15be71c..94e7ed3 100644 (file)
@@ -196,6 +196,7 @@ struct object_subpic
     int height;
     int pitch;
     dri_bo *bo;
+    unsigned int flags;
 };
 
 struct hw_codec_info
index d387cb9..e86464c 100644 (file)
@@ -883,26 +883,29 @@ i965_subpic_render_upload_vertex(VADriverContextP ctx,
     struct i965_render_state *render_state = &i965->render_state;
     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;
+    VARectangle dst_rect;
     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 + sy * (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 = obj_subpic->dst_rect;
+    else {
+        const float sx  = (float)output_rect->width  / obj_surface->orig_width;
+        const float sy  = (float)output_rect->height / obj_surface->orig_height;
+        dst_rect.x      = output_rect->x + sx * obj_subpic->dst_rect.x;
+        dst_rect.y      = output_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;
+    }
 
     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;