112 lines
3.5 KiB
Diff
112 lines
3.5 KiB
Diff
From 000807cfbd8bcbc9cd4bf28a066087fee43396b4 Mon Sep 17 00:00:00 2001
|
|
From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
|
|
Date: Wed, 4 Nov 2009 13:36:39 +0000
|
|
Subject: [PATCH] =?utf-8?q?[G45]=C2=A0Implement=20vaPutImage()=20for=20full-sized=20surface=20uploads.?=
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=utf-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
---
|
|
i965_drv_video/i965_drv_video.c | 78 +++++++++++++++++++++++++++++++--------
|
|
1 files changed, 62 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
|
|
index d8a7bd1..e8f638c 100644
|
|
--- a/i965_drv_video/i965_drv_video.c
|
|
+++ b/i965_drv_video/i965_drv_video.c
|
|
@@ -443,22 +443,6 @@ i965_QueryImageFormats(VADriverContextP ctx,
|
|
}
|
|
|
|
VAStatus
|
|
-i965_PutImage(VADriverContextP ctx,
|
|
- VASurfaceID surface,
|
|
- VAImageID image,
|
|
- int src_x,
|
|
- int src_y,
|
|
- unsigned int src_width,
|
|
- unsigned int src_height,
|
|
- int dest_x,
|
|
- int dest_y,
|
|
- unsigned int dest_width,
|
|
- unsigned int dest_height)
|
|
-{
|
|
- return VA_STATUS_SUCCESS;
|
|
-}
|
|
-
|
|
-VAStatus
|
|
i965_QuerySubpictureFormats(VADriverContextP ctx,
|
|
VAImageFormat *format_list, /* out */
|
|
unsigned int *flags, /* out */
|
|
@@ -1439,6 +1423,68 @@ i965_GetImage(VADriverContextP ctx,
|
|
}
|
|
|
|
VAStatus
|
|
+i965_PutImage(VADriverContextP ctx,
|
|
+ VASurfaceID surface,
|
|
+ VAImageID image,
|
|
+ int src_x,
|
|
+ int src_y,
|
|
+ unsigned int src_width,
|
|
+ unsigned int src_height,
|
|
+ int dest_x,
|
|
+ int dest_y,
|
|
+ unsigned int dest_width,
|
|
+ unsigned int dest_height)
|
|
+{
|
|
+ struct i965_driver_data *i965 = i965_driver_data(ctx);
|
|
+
|
|
+ struct object_surface *obj_surface = SURFACE(surface);
|
|
+ if (!obj_surface)
|
|
+ return VA_STATUS_ERROR_INVALID_SURFACE;
|
|
+
|
|
+ struct object_image *obj_image = IMAGE(image);
|
|
+ if (!obj_image)
|
|
+ return VA_STATUS_ERROR_INVALID_IMAGE;
|
|
+
|
|
+ /* XXX: we don't support partial video surface updates */
|
|
+ if (src_x != 0 ||
|
|
+ src_y != 0 ||
|
|
+ src_width != obj_image->image.width ||
|
|
+ src_height != obj_image->image.height)
|
|
+ return VA_STATUS_ERROR_OPERATION_FAILED;
|
|
+ if (dest_x != 0 ||
|
|
+ dest_y != 0 ||
|
|
+ dest_width != obj_surface->width ||
|
|
+ dest_height != obj_surface->height)
|
|
+ return VA_STATUS_ERROR_OPERATION_FAILED;
|
|
+ if (src_width != dest_width ||
|
|
+ src_height != dest_height)
|
|
+ return VA_STATUS_ERROR_OPERATION_FAILED;
|
|
+
|
|
+ VAStatus va_status;
|
|
+ void *image_data = NULL;
|
|
+
|
|
+ va_status = i965_MapBuffer(ctx, obj_image->image.buf, &image_data);
|
|
+ if (va_status != VA_STATUS_SUCCESS)
|
|
+ return va_status;
|
|
+
|
|
+ dri_bo_map(obj_surface->bo, 1);
|
|
+
|
|
+ switch (obj_image->image.format.fourcc) {
|
|
+ case VA_FOURCC('Y','V','1','2'): /* YV12 is native format here */
|
|
+ memcpy(obj_surface->bo->virtual, image_data, obj_surface->bo->size);
|
|
+ break;
|
|
+ default:
|
|
+ va_status = VA_STATUS_ERROR_OPERATION_FAILED;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ dri_bo_unmap(obj_surface->bo);
|
|
+
|
|
+ i965_UnmapBuffer(ctx, obj_image->image.buf);
|
|
+ return va_status;
|
|
+}
|
|
+
|
|
+VAStatus
|
|
i965_PutSurface(VADriverContextP ctx,
|
|
VASurfaceID surface,
|
|
Drawable draw, /* X Drawable */
|
|
--
|
|
1.5.4.3
|
|
|