diff options
author | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-31 13:43:46 +0800 |
---|---|---|
committer | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-31 13:43:46 +0800 |
commit | 14222e1b4c542a211c118db0aeec6cc859e2f614 (patch) | |
tree | 7831f2d6454b448f4518aba4beae2c17812bace1 | |
parent | ce10ee7fc946764b65b4707322767cacdb8d6247 (diff) |
xvmc: Add XvMCCreateSurface and XvMCDestroySurface
-rw-r--r-- | src/r500_hwmc.c | 2 | ||||
-rw-r--r-- | src/r500_hwmc.h | 1 | ||||
-rw-r--r-- | src/xvmc/radeon_xvmc.c | 66 | ||||
-rw-r--r-- | src/xvmc/radeon_xvmc.h | 13 |
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; |