diff options
author | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-27 17:31:58 +0800 |
---|---|---|
committer | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-27 17:31:58 +0800 |
commit | 9cd6384cbbe0ad3fbee0eae9a63d3bb7252650bd (patch) | |
tree | 9a4ab5db1876d2055b26ef8b7654289bf68f5bd1 | |
parent | f8e409b4e81416a81be9966572b8c85bd8447e68 (diff) |
xvmc: Add XvMCCreateContext function, not done
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/r500_hwmc.c | 133 | ||||
-rw-r--r-- | src/r500_hwmc.h | 34 | ||||
-rw-r--r-- | src/xvmc/r100_xvmc.c | 4 | ||||
-rw-r--r-- | src/xvmc/r500_xvmc.c | 5 | ||||
-rw-r--r-- | src/xvmc/r500_xvmc.h | 101 | ||||
-rw-r--r-- | src/xvmc/radeon_xvmc.c | 98 | ||||
-rw-r--r-- | src/xvmc/radeon_xvmc.h | 48 |
8 files changed, 303 insertions, 122 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index d9ee691..c83da18 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -94,7 +94,7 @@ radeon_drv_la_SOURCES = \ radeon_driver.c radeon_video.c radeon_bios.c radeon_mm_i2c.c \ radeon_vip.c radeon_misc.c radeon_probe.c \ legacy_crtc.c legacy_output.c \ - xvmc/radeon_xvmc.c xvmc/r500_xvmc.c xvmc/r100_xvmc.c r500_hwmc.c \ + r500_hwmc.c \ radeon_textured_video.c radeon_pm.c \ radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \ $(RADEON_ATOMBIOS_SOURCES) radeon_atombios.c radeon_atomwrapper.c \ diff --git a/src/r500_hwmc.c b/src/r500_hwmc.c index 2c7073b..d191273 100644 --- a/src/r500_hwmc.c +++ b/src/r500_hwmc.c @@ -22,4 +22,135 @@ * * Author: Cooper Yuan <cooper.yuan@amd.com> * - */
\ No newline at end of file + */ +#include <string.h> + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "compiler.h" +#include "xf86PciInfo.h" +#include "xf86Pci.h" +#include "xf86fbman.h" +#include "regionstr.h" +#include "xf86drm.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include <X11/extensions/XvMC.h> +#include "xaa.h" +#include "xaalocal.h" +#include "dixstruct.h" +#include "fourcc.h" + +#define _RADEON_XVMC_SERVER_ +#include "r500_hwmc.h" + +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, + SURFACE_TYPE_MPEG1_MPML, + SURFACE_TYPE_MAX +}; + +static XF86MCSurfaceInfoRec r500_YV12_mpg2_surface = +{ + SURFACE_TYPE_MPEG2_MPML, + XVMC_CHROMA_FORMAT_420, + 0, + 720, + 576, + 720, + 576, + XVMC_MPEG_2, + /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING,*/ + 0, + /* &yv12_subpicture_list*/ + NULL, +}; + +static XF86MCSurfaceInfoRec r500_YV12_mpg1_surface = +{ + SURFACE_TYPE_MPEG1_MPML, + XVMC_CHROMA_FORMAT_420, + 0, + 720, + 576, + 720, + 576, + XVMC_MPEG_1, + /* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING,*/ + 0, + /* &yv12_subpicture_list*/ + NULL, +}; + +static XF86MCSurfaceInfoPtr ppSI[2] = +{ + (XF86MCSurfaceInfoPtr)&r500_YV12_mpg2_surface, + (XF86MCSurfaceInfoPtr)&r500_YV12_mpg1_surface +}; + +static int r500_hwmc_create_context (ScrnInfoPtr pScrn, XvMCContextPtr pContext, + int *num_priv, long **priv ) +{ +} + +static void r500_hwmc_destroy_context (ScrnInfoPtr pScrn, XvMCContextPtr pContext) +{ +} + +static int r500_hwmc_create_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, + int *num_priv, long **priv ) +{ +} + +static void r500_hwmc_destroy_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) +{ +} + +static int r500_hwmc_create_subpict(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp, + int *num_priv, long **priv ) +{ +} + +static void r500_hwmc_destroy_subpict (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp) +{ +} + +static Bool r500_hwmc_init(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt) +{ +} + +static void r500_hwmc_fini(ScrnInfoPtr pScrn) +{ +} + +static XF86MCAdaptorRec pAdapt = +{ + .name = "AMD(R) XcMC Video", + .num_surfaces = ARRAY_SIZE(ppSI), + .surfaces = ppSI, + .num_subpictures = 0, + .subpictures = NULL, + .CreateContext = (xf86XvMCCreateContextProcPtr) r500_hwmc_create_context, + .DestroyContext = (xf86XvMCDestroyContextProcPtr) r500_hwmc_destroy_context, + .CreateSurface = (xf86XvMCCreateSurfaceProcPtr) r500_hwmc_create_surface, + .DestroySurface = (xf86XvMCDestroySurfaceProcPtr) r500_hwmc_destroy_surface, + .CreateSubpicture = (xf86XvMCCreateSubpictureProcPtr) r500_hwmc_create_subpict, + .DestroySubpicture = (xf86XvMCDestroySubpictureProcPtr) r500_hwmc_destroy_subpict, +}; + +struct radeon_hwmc_driver r500_hwmc_driver = +{ + .name = "r500_xvmc", + .adaptor = &pAdapt, + .flag = XVMC_R500_MPEG2_MC, + .init = r500_hwmc_init, + .fini = r500_hwmc_fini, +}; diff --git a/src/r500_hwmc.h b/src/r500_hwmc.h index ba615e2..a8c829b 100644 --- a/src/r500_hwmc.h +++ b/src/r500_hwmc.h @@ -27,6 +27,40 @@ #ifndef RADEON_HWMC_H #define RADEON_HWMC_H +#define XVMC_R500_MPEG2_MC 0x1 +struct hwmc_buffer +{ + drm_handle_t handle; + unsigned long offset; + unsigned long size; + unsigned long bus_addr; +}; + +struct radeon_xvmc_common { + unsigned int type; + unsigned int sarea_size; + struct hwmc_buffer batchbuffer; +}; + +#ifdef _RADEON_XVMC_SERVER_ +#include <xf86xvmc.h> +struct radeon_hwmc_driver +{ + char *name; + XF86MCAdaptorPtr adaptor; + unsigned int flag; +// r500_memory *batch; + drm_handle_t batch_handle; + + /* more items for xvmv surface manage? */ + Bool (*init)(ScrnInfoPtr, XF86VideoAdaptorPtr); + void (*fini)(ScrnInfoPtr); + void* devPrivate; +}; + +extern struct radeon_hwmc_driver *hwmc_driver_ptr; +extern struct radeon_hwmc_driver *r500_hwmc_driver_ptr; +#endif #endif
\ No newline at end of file diff --git a/src/xvmc/r100_xvmc.c b/src/xvmc/r100_xvmc.c index ff85db5..81d9ae1 100644 --- a/src/xvmc/r100_xvmc.c +++ b/src/xvmc/r100_xvmc.c @@ -72,9 +72,9 @@ static int r100_xvmc_get_surface_status(Display *display, { } -struct _radeon_xvmc_driver_rec r100_xvmc_driver = +struct radeon_xvmc_driver r100_xvmc_driver = { - .type = XVMC_RADEON_MPEG2_MC, + .type = 2, //XVMC_R100_MPEG2_MC, .num_ctx = 0, .create_context = r100_xvmc_create_context, .destroy_context = r100_xvmc_destroy_context, diff --git a/src/xvmc/r500_xvmc.c b/src/xvmc/r500_xvmc.c index 0066ff0..dc3fa5c 100644 --- a/src/xvmc/r500_xvmc.c +++ b/src/xvmc/r500_xvmc.c @@ -23,7 +23,6 @@ * Author: Cooper Yuan <cooper.yuan@amd.com> * */ - #include "radeon_xvmc.h" static Status r500_xvmc_create_context(Display *display, XvMCContext *context, @@ -72,9 +71,9 @@ static int r500_xvmc_get_surface_status(Display *display, { } -struct _radeon_xvmc_driver_rec r500_xvmc_driver = +struct radeon_xvmc_driver r500_xvmc_driver = { - .type = XVMC_RADEON_MPEG2_MC, + .type = XVMC_R500_MPEG2_MC, .num_ctx = 0, .create_context = r500_xvmc_create_context, .destroy_context = r500_xvmc_destroy_context, diff --git a/src/xvmc/r500_xvmc.h b/src/xvmc/r500_xvmc.h index fdeb7a5..c5baabf 100644 --- a/src/xvmc/r500_xvmc.h +++ b/src/xvmc/r500_xvmc.h @@ -26,104 +26,7 @@ #ifndef RADEON_XVMC_H #define RADEON_XVMC_H -#include <pthread.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#include <signal.h> -#include <fcntl.h> -#include <dirent.h> -#include <string.h> -#include <assert.h> -#include <signal.h> -#include <stdint.h> - -#include <xf86drm.h> -#include <X11/X.h> -#include <X11/Xlibint.h> -#include <X11/Xutil.h> -#include <fourcc.h> -#include <X11/extensions/Xv.h> -#include <X11/extensions/Xvlib.h> -#include <X11/extensions/XvMC.h> -#include <X11/extensions/XvMClib.h> -#include <drm_sarea.h> - -typedef struct _radeon_xvmc_driver_rec -{ - int type; /* hw xvmc type */ - int screen; /* current screen num*/ - - int fd; /* drm file handler */ - drm_handle_t hsarea; /* DRI open connect */ - char busID[32]; - - unsigned int sarea_size; - drmAddress sarea_address; - - struct - { - unsigned int start_offset; - unsigned int size; - unsigned int space; - unsigned char *ptr; - } batch; - - struct - { - void *ptr; - unsigned int size; - unsigned int offset; - unsigned int active_buf; - unsigned int irq_emitted; - } alloc; - -// radeon_xvmc_drm_map_t batchbuffer; - unsigned int last_render; - - sigset_t sa_mask; - pthread_mutex_t ctxmutex; - int lock; - int locked; - drmLock *driHwLock; - - int num_ctx; - int num_surf; - - void *private; - - /* driver specific xvmc callbacks */ - Status (*create_context)(Display* display, XvMCContext *context, - int priv_count, CARD32 *priv_data); - - Status (*destroy_context)(Display* display, XvMCContext *context); - - Status (*create_surface)(Display* display, XvMCContext *context, - XvMCSurface *surface, int priv_count, CARD32 *priv_data); - - Status (*destroy_surface)(Display* display, XvMCSurface *surface); - - Status (*render_surface)(Display *display, XvMCContext *context, - unsigned int picture_structure, - XvMCSurface *target_surface, - XvMCSurface *past_surface, - XvMCSurface *future_surface, - unsigned int flags, - unsigned int num_macroblocks, - unsigned int first_macroblock, - XvMCMacroBlockArray *macroblock_array, - XvMCBlockArray *blocks); - - Status (*put_surface)(Display *display, XvMCSurface *surface, - Drawable draw, short srcx, short srcy, - unsigned short srcw, unsigned short srch, - short destx, short desty, - unsigned short destw, unsigned short desth, - int flags, struct intel_xvmc_command *data); - - Status (*get_surface_status)(Display *display, XvMCSurface *surface, - int *stat); -}; +#include "radeon_xvmc.h" +#include "r500_hwmc.h" #endif
\ No newline at end of file diff --git a/src/xvmc/radeon_xvmc.c b/src/xvmc/radeon_xvmc.c index cac6a35..1fadbef 100644 --- a/src/xvmc/radeon_xvmc.c +++ b/src/xvmc/radeon_xvmc.c @@ -25,7 +25,8 @@ */ #include "radeon_xvmc.h" -#include "r500_hwmc.h" + +struct radeon_xvmc_driver *xvmc_driver_ptr = NULL; /* * Function: XvMCCreateContext @@ -47,6 +48,101 @@ _X_EXPORT Status XvMCCreateContext(Display *display, XvPortID port, int surface_type_id, int width, int height, int flags, XvMCContext *context) { + Status ret; + drm_sarea_t *pSAREA; + char *curBusID; + CARD32 *priv_data = NULL; + struct radeon_xvmc_common *comm; + drm_magic_t magic; + int major, minor; + int priv_count; + int isCapable; + int event_base, error_base; + int screen = DefaultScreen(display); + radeon_xvmc_context_ptr intel_ctx; + int fd; + + /* Verify Obvious things first */ + if (!display || !context) + return BadValue; + + if (!(flags & XVMC_DIRECT)) + { + ErrorF("Radeon: Indirect Rendering not supported! Using Direct."); + return BadValue; + } + + context->surface_type_id = surface_type_id; + context->width = (unsigned short)((width + 15) & ~15); + context->height = (unsigned short)((height + 15) & ~15); + context->flags = flags; + context->port = port; + + if (!XvMCQueryExtension(display, &event_base, &error_base)) + { + ErrorF("Radeon: XvMCExtension is not available!"); + return BadValue; + } + + ret = XvMCQueryVersion(display, &major, &minor); + if (ret) + { + ErrorF("Radeon: XvMCQueryVersion Failed, unable to determine protocol version."); + return ret; + } + + /* + * Pass control to the X server to create a drm_context_t for us and + * validate the with/height and flags. + */ + if ((ret = _xvmc_create_context(display, context, &priv_count, &priv_data))) + { + ErrorF("Radeon: Unable to create XvMC Context."); + return ret; + } + + comm = (struct radeon_xvmc_common *)priv_data; + + if (xvmc_driver_ptr == NULL || xvmc_driver_ptr->type != comm->type) + { + switch (comm->type) + { + case XVMC_R500_MPEG2_MC: + xvmc_driver_ptr = &r500_xvmc_driver; + break; + default: + ErrorF("Radeon: unimplemented xvmc type %d", comm->type); + XFree(priv_data); + priv_data = NULL; + return BadValue; + } + } + + if (xvmc_driver_ptr == NULL || xvmc_driver_ptr->type != comm->type) + { + ErrorF("Radeon: fail to load xvmc driver for type %d\n", comm->type); + return BadValue; + } + + xvmc_driver_ptr->sarea_size = comm->sarea_size; + xvmc_driver_ptr->batchbuffer.handle = comm->batchbuffer.handle; + xvmc_driver_ptr->batchbuffer.offset = comm->batchbuffer.offset; + xvmc_driver_ptr->batchbuffer.size = comm->batchbuffer.size; + + /* + * call driver hook. + * driver hook should free priv_data after return if success. + */ + ret = (xvmc_driver_ptr->create_context)(display, context, priv_count, priv_data); + if (ret) + { + ErrorF("driver create context failed\n"); + XFree(priv_data); + drmUnmap(xvmc_driver_ptr->sarea_address, xvmc_driver_ptr->sarea_size); + return ret; + } + + return Success; } /* diff --git a/src/xvmc/radeon_xvmc.h b/src/xvmc/radeon_xvmc.h index 7770ae7..be98ac2 100644 --- a/src/xvmc/radeon_xvmc.h +++ b/src/xvmc/radeon_xvmc.h @@ -50,39 +50,54 @@ #include <X11/extensions/XvMClib.h> #include <drm_sarea.h> -/* hw xvmc support type */ -#define XVMC_RADEON_MPEG2_MC 0x01 +#include "r500_hwmc.h" -typedef struct _radeon_xvmc_driver_rec +typedef struct radeon_xvmc_context { - int type; /* hw xvmc type */ - int screen; /* current screen num*/ + XvMCContext *context; + drm_context_t hw_context; /* context id to kernel drm */ + struct _radeon_xvmc_context *next; +} radeon_xvmc_context_t, *radeon_xvmc_context_ptr; - int fd; /* drm file handler */ - drm_handle_t hsarea; /* DRI open connect */ - char busID[32]; +typedef struct radeon_xvmc_drm_map +{ + drm_handle_t handle; + unsigned long offset; + unsigned long size; + unsigned long bus_addr; + drmAddress map; +} radeon_xvmc_drm_map_t, *radeon_xvmc_drm_map_ptr; + +typedef struct radeon_xvmc_driver +{ + int type; /* hw xvmc type */ + int screen; /* current screen num*/ + + int fd; /* drm file handler */ + drm_handle_t hsarea; /* DRI open connect */ + char busID[32]; unsigned int sarea_size; - drmAddress sarea_address; + drmAddress sarea_address; struct { - unsigned int start_offset; - unsigned int size; - unsigned int space; + unsigned int start_offset; + unsigned int size; + unsigned int space; unsigned char *ptr; } batch; struct { - void *ptr; + void *ptr; unsigned int size; unsigned int offset; unsigned int active_buf; unsigned int irq_emitted; } alloc; -// radeon_xvmc_drm_map_t batchbuffer; + radeon_xvmc_drm_map_t batchbuffer; unsigned int last_render; sigset_t sa_mask; @@ -127,6 +142,9 @@ typedef struct _radeon_xvmc_driver_rec Status (*get_surface_status)(Display *display, XvMCSurface *surface, int *stat); -}; +}radeon_xvmc_driver_t, *radeon_xvmc_driver_ptr; + +extern struct radeon_xvmc_driver *xvmc_driver_ptr; +extern struct radeon_xvmc_driver r500_xvmc_driver; #endif
\ No newline at end of file |