summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Lankhorst <m.b.lankhorst@gmail.com>2011-07-29 19:37:51 +0200
committerMichel Dänzer <michel@daenzer.net>2011-08-23 12:13:03 +0200
commit8f26b59f53d6d80bf7d3c39a4dd3c438a2c305a4 (patch)
treef0b935f682aa5a019e5338d049cf174be0840c37
parent29d7a0bb16dba1416e3a63f7f44cf82e307ac46a (diff)
st/xorg: Advertise support for XvMC
Formats were based on a patch sent to xf86-video-nouveau by Bryan Cain Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com> [Michel Dänzer: Add xorg_xvmc.c to SConscript.]
-rw-r--r--src/gallium/state_trackers/xorg/SConscript1
-rw-r--r--src/gallium/state_trackers/xorg/xorg_tracker.h7
-rw-r--r--src/gallium/state_trackers/xorg/xorg_xv.c2
-rw-r--r--src/gallium/state_trackers/xorg/xorg_xvmc.c119
4 files changed, 129 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/xorg/SConscript b/src/gallium/state_trackers/xorg/SConscript
index 4ea4ec4ee8b..1768f701e48 100644
--- a/src/gallium/state_trackers/xorg/SConscript
+++ b/src/gallium/state_trackers/xorg/SConscript
@@ -29,12 +29,13 @@ sources = [
'xorg_driver.c',
'xorg_exa.c',
'xorg_exa_tgsi.c',
'xorg_output.c',
'xorg_renderer.c',
'xorg_xv.c',
+ 'xorg_xvmc.c',
]
st_xorg = env.ConvenienceLibrary(
target = 'st_xorg',
source = sources,
)
diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h
index 664e8c75730..84a3a2fa4e2 100644
--- a/src/gallium/state_trackers/xorg/xorg_tracker.h
+++ b/src/gallium/state_trackers/xorg/xorg_tracker.h
@@ -219,7 +219,14 @@ xorg_output_get_id(xf86OutputPtr output);
* xorg_xv.c
*/
void
xorg_xv_init(ScreenPtr pScreen);
+/***********************************************************************
+ * xorg_xvmc.c
+ */
+void
+xorg_xvmc_init(ScreenPtr pScreen, char *name);
+
+
#endif /* _XORG_TRACKER_H_ */
diff --git a/src/gallium/state_trackers/xorg/xorg_xv.c b/src/gallium/state_trackers/xorg/xorg_xv.c
index af4992fc2ed..67fd6dfb501 100644
--- a/src/gallium/state_trackers/xorg/xorg_xv.c
+++ b/src/gallium/state_trackers/xorg/xorg_xv.c
@@ -747,12 +747,14 @@ xorg_xv_init(ScreenPtr pScreen)
if (textured_adapter) {
adaptors[num_adaptors++] = textured_adapter;
}
if (num_adaptors) {
xf86XVScreenInit(pScreen, adaptors, num_adaptors);
+ if (textured_adapter)
+ xorg_xvmc_init(pScreen, textured_adapter->name);
} else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Disabling Xv because no adaptors could be initialized.\n");
}
free(adaptors);
diff --git a/src/gallium/state_trackers/xorg/xorg_xvmc.c b/src/gallium/state_trackers/xorg/xorg_xvmc.c
new file mode 100644
index 00000000000..0f3f3f00907
--- /dev/null
+++ b/src/gallium/state_trackers/xorg/xorg_xvmc.c
@@ -0,0 +1,119 @@
+#include "xorg_tracker.h"
+
+#include <xf86.h>
+#include <xf86xv.h>
+#include <xf86xvmc.h>
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/XvMC.h>
+#include <fourcc.h>
+
+#define FOURCC_RGB 0x0000003
+#define XVIMAGE_RGB \
+{ \
+ FOURCC_RGB, \
+ XvRGB, \
+ LSBFirst, \
+ { \
+ 'R', 'G', 'B', 0x00, \
+ 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71 \
+ }, \
+ 32, \
+ XvPacked, \
+ 1, \
+ 24, 0x00FF0000, 0x0000FF00, 0x000000FF, \
+ 0, 0, 0, \
+ 0, 0, 0, \
+ 0, 0, 0, \
+ { \
+ 'B','G','R','X', \
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \
+ }, \
+ XvTopToBottom \
+}
+
+static int subpicture_index_list[] = {
+ FOURCC_RGB,
+ FOURCC_IA44,
+ FOURCC_AI44
+};
+
+static XF86MCImageIDList subpicture_list =
+{
+ sizeof(subpicture_index_list)/sizeof(*subpicture_index_list),
+ subpicture_index_list
+};
+
+static XF86MCSurfaceInfoRec yv12_mpeg2_surface =
+{
+ FOURCC_I420,
+ XVMC_CHROMA_FORMAT_420,
+ 0,
+ 2048, 2048, 2048, 2048,
+ XVMC_IDCT | XVMC_MPEG_2,
+ XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
+ &subpicture_list
+};
+
+static const XF86MCSurfaceInfoRec uyvy_mpeg2_surface =
+{
+ FOURCC_UYVY,
+ XVMC_CHROMA_FORMAT_422,
+ 0,
+ 2048, 2048, 2048, 2048,
+ XVMC_IDCT | XVMC_MPEG_2,
+ XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
+ &subpicture_list
+};
+
+static XF86MCSurfaceInfoPtr surfaces[] =
+{
+ (XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface,
+ (XF86MCSurfaceInfoPtr)&uyvy_mpeg2_surface
+};
+
+static const XF86ImageRec rgb_subpicture = XVIMAGE_RGB;
+static const XF86ImageRec ia44_subpicture = XVIMAGE_IA44;
+static const XF86ImageRec ai44_subpicture = XVIMAGE_AI44;
+
+static XF86ImagePtr subpictures[] =
+{
+ (XF86ImagePtr)&rgb_subpicture,
+ (XF86ImagePtr)&ia44_subpicture,
+ (XF86ImagePtr)&ai44_subpicture
+};
+
+static const XF86MCAdaptorRec adaptor_template =
+{
+ "",
+ sizeof(surfaces)/sizeof(*surfaces),
+ surfaces,
+ sizeof(subpictures)/sizeof(*subpictures),
+ subpictures,
+ (xf86XvMCCreateContextProcPtr)NULL,
+ (xf86XvMCDestroyContextProcPtr)NULL,
+ (xf86XvMCCreateSurfaceProcPtr)NULL,
+ (xf86XvMCDestroySurfaceProcPtr)NULL,
+ (xf86XvMCCreateSubpictureProcPtr)NULL,
+ (xf86XvMCDestroySubpictureProcPtr)NULL
+};
+
+void
+xorg_xvmc_init(ScreenPtr pScreen, char *name)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ XF86MCAdaptorPtr adaptorXvMC = xf86XvMCCreateAdaptorRec();
+ if (!adaptorXvMC)
+ return;
+
+ *adaptorXvMC = adaptor_template;
+ adaptorXvMC->name = name;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[XvMC] Associated with %s.\n", name);
+ if (!xf86XvMCScreenInit(pScreen, 1, &adaptorXvMC))
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "[XvMC] Failed to initialize extension.\n");
+ else
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "[XvMC] Extension initialized.\n");
+ xf86XvMCDestroyAdaptorRec(adaptorXvMC);
+}