summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCooper Yuan <cooperyuan@gmail.com>2009-05-31 13:43:46 +0800
committerCooper Yuan <cooperyuan@gmail.com>2009-05-31 13:43:46 +0800
commit14222e1b4c542a211c118db0aeec6cc859e2f614 (patch)
tree7831f2d6454b448f4518aba4beae2c17812bace1
parentce10ee7fc946764b65b4707322767cacdb8d6247 (diff)
xvmc: Add XvMCCreateSurface and XvMCDestroySurface
-rw-r--r--src/r500_hwmc.c2
-rw-r--r--src/r500_hwmc.h1
-rw-r--r--src/xvmc/radeon_xvmc.c66
-rw-r--r--src/xvmc/radeon_xvmc.h13
4 files changed, 80 insertions, 2 deletions
diff --git a/src/r500_hwmc.c b/src/r500_hwmc.c
index d191273..64babf8 100644
--- a/src/r500_hwmc.c
+++ b/src/r500_hwmc.c
@@ -49,8 +49,6 @@ struct radeon_hwmc_driver *hwmc_driver_ptr;
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
-#define FOURCC_XVMC (('C' << 24) + ('M' << 16) + ('V' << 8) + 'X')
-
enum
{
SURFACE_TYPE_MPEG2_MPML = FOURCC_XVMC,
diff --git a/src/r500_hwmc.h b/src/r500_hwmc.h
index a8c829b..db4fdaf 100644
--- a/src/r500_hwmc.h
+++ b/src/r500_hwmc.h
@@ -27,6 +27,7 @@
#ifndef RADEON_HWMC_H
#define RADEON_HWMC_H
+#define FOURCC_XVMC (('C' << 24) + ('M' << 16) + ('V' << 8) + 'X')
#define XVMC_R500_MPEG2_MC 0x1
struct hwmc_buffer
diff --git a/src/xvmc/radeon_xvmc.c b/src/xvmc/radeon_xvmc.c
index 1874133..1f464d4 100644
--- a/src/xvmc/radeon_xvmc.c
+++ b/src/xvmc/radeon_xvmc.c
@@ -388,6 +388,53 @@ _X_EXPORT Status XvMCDestroyContext(Display *display, XvMCContext *context)
*/
_X_EXPORT Status XvMCCreateSurface(Display *display, XvMCContext *context, XvMCSurface *surface)
{
+ Status ret;
+ int priv_count;
+ CARD32 *priv_data;
+ radeon_xvmc_surface_ptr radeon_surf = NULL;
+
+ if (!display || !context)
+ return XvMCBadContext;
+
+ if (!surface)
+ return XvMCBadSurface;
+
+ radeon_surf = radeon_xvmc_new_surface(display);
+ if (!radeon_surf)
+ return BadAlloc;
+ radeon_surf->surface = surface;
+
+ if ((ret = _xvmc_create_surface(display, context, surface,
+ &priv_count, &priv_data)))
+ {
+ ErrorF("[XvMC]: Unable to create XvMCSurface.");
+ return ret;
+ }
+
+ radeon_surf->image = XvCreateImage(display, context->port,
+ FOURCC_XVMC,
+ (char *)&radeon_surf->data,
+ surface->width,
+ surface->height);
+ if (!radeon_surf->image)
+ {
+ ErrorF("[XvMC]: Can't create XvImage for surface\n");
+ _xvmc_destroy_surface(display, surface);
+ radeon_xvmc_free_surface(surface->surface_id);
+ return BadAlloc;
+ }
+
+ radeon_surf->image->data = (char *)&radeon_surf->data;
+
+ ret = (xvmc_driver_ptr->create_surface)(display, context, surface,
+ priv_count, priv_data);
+ if (ret)
+ {
+ ErrorF("[XvMC]: create surface failed\n");
+ return ret;
+ }
+
+ return Success;
}
/*
@@ -395,6 +442,25 @@ _X_EXPORT Status XvMCCreateSurface(Display *display, XvMCContext *context, XvMCS
*/
_X_EXPORT Status XvMCDestroySurface(Display *display, XvMCSurface *surface)
{
+ radeon_xvmc_surface_ptr radeon_surf;
+
+ if (!display || !surface)
+ return XvMCBadSurface;
+
+ radeon_surf = radeon_xvmc_find_surface(surface->surface_id);
+ if (!radeon_surf)
+ return XvMCBadSurface;
+
+ XFree(radeon_surf->image);
+ if (radeon_surf->gc_init)
+ XFreeGC(display, radeon_surf->gc);
+ radeon_xvmc_free_surface(surface->surface_id);
+
+ (xvmc_driver_ptr->destroy_surface)(display, surface);
+
+ _xvmc_destroy_surface(display, surface);
+
+ return Success;
}
/*
diff --git a/src/xvmc/radeon_xvmc.h b/src/xvmc/radeon_xvmc.h
index 1f4032c..5561088 100644
--- a/src/xvmc/radeon_xvmc.h
+++ b/src/xvmc/radeon_xvmc.h
@@ -60,12 +60,25 @@ typedef struct radeon_xvmc_context
struct radeon_xvmc_context *next;
} radeon_xvmc_context_t, *radeon_xvmc_context_ptr;
+struct radeon_xvmc_command
+{
+ unsigned int command;
+ unsigned int ctxNo;
+ unsigned int srfNo;
+ unsigned int subPicNo;
+ unsigned int flags;
+ unsigned int real_id;
+ unsigned int surf_offset;
+ unsigned int pad[5];
+};
+
typedef struct radeon_xvmc_surface
{
XvMCSurface *surface;
XvImage *image;
GC gc;
Bool gc_init;
+ struct radeon_xvmc_command data;
Drawable last_draw;
struct radeon_xvmc_surface *next;
} radeon_xvmc_surface_t, *radeon_xvmc_surface_ptr;