diff options
Diffstat (limited to 'i965_drv_video')
-rw-r--r-- | i965_drv_video/i965_drv_video.c | 9 | ||||
-rw-r--r-- | i965_drv_video/i965_drv_video.h | 1 | ||||
-rw-r--r-- | i965_drv_video/i965_render.c | 27 |
3 files changed, 21 insertions, 16 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 d387cb9..e86464c 100644 --- a/i965_drv_video/i965_render.c +++ b/i965_drv_video/i965_render.c @@ -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; |