summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCooper Yuan <cooperyuan@gmail.com>2009-05-27 17:31:58 +0800
committerCooper Yuan <cooperyuan@gmail.com>2009-05-27 17:31:58 +0800
commit9cd6384cbbe0ad3fbee0eae9a63d3bb7252650bd (patch)
tree9a4ab5db1876d2055b26ef8b7654289bf68f5bd1
parentf8e409b4e81416a81be9966572b8c85bd8447e68 (diff)
xvmc: Add XvMCCreateContext function, not done
-rw-r--r--src/Makefile.am2
-rw-r--r--src/r500_hwmc.c133
-rw-r--r--src/r500_hwmc.h34
-rw-r--r--src/xvmc/r100_xvmc.c4
-rw-r--r--src/xvmc/r500_xvmc.c5
-rw-r--r--src/xvmc/r500_xvmc.h101
-rw-r--r--src/xvmc/radeon_xvmc.c98
-rw-r--r--src/xvmc/radeon_xvmc.h48
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