vl_hwmc.c revision 861b9fee
1#ifdef HAVE_CONFIG_H
2#include "config.h"
3#endif
4
5#include "vl_hwmc.h"
6#include <os.h>
7#include <X11/extensions/Xv.h>
8#include <X11/extensions/XvMC.h>
9#include <xf86.h>
10#include <fourcc.h>
11
12#include "compat-api.h"
13
14#define FOURCC_RGB	0x0000003
15#define XVIMAGE_RGB								\
16{										\
17	FOURCC_RGB,								\
18	XvRGB,									\
19	LSBFirst,								\
20	{									\
21		'R', 'G', 'B', 0x00,						\
22		0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71	\
23	},									\
24	32,									\
25	XvPacked,								\
26	1,									\
27	24, 0x00FF0000, 0x0000FF00, 0x000000FF,					\
28	0, 0, 0,								\
29	0, 0, 0,								\
30	0, 0, 0,								\
31	{									\
32		'B','G','R','X',						\
33		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		\
34	},									\
35	XvTopToBottom								\
36}
37
38static int subpicture_index_list[] =
39{
40	FOURCC_RGB,
41	FOURCC_IA44,
42	FOURCC_AI44
43};
44
45static XF86MCImageIDList subpicture_list =
46{
47	3,
48	subpicture_index_list
49};
50
51static XF86MCSurfaceInfoRec yv12_mpeg2_surface =
52{
53	FOURCC_YV12,
54	XVMC_CHROMA_FORMAT_420,
55	0,
56	2048,
57	2048,
58	2048,
59	2048,
60	XVMC_IDCT | XVMC_MOCOMP | XVMC_MPEG_2,
61	XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
62	&subpicture_list
63};
64
65static XF86MCSurfaceInfoRec uyvy_mpeg2_surface =
66{
67	FOURCC_UYVY,
68	XVMC_CHROMA_FORMAT_422,
69	0,
70	2048,
71	2048,
72	2048,
73	2048,
74	XVMC_IDCT | XVMC_MOCOMP | XVMC_MPEG_2,
75	XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
76	&subpicture_list
77};
78
79static XF86MCSurfaceInfoPtr surfaces[] =
80{
81	(XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface,
82	(XF86MCSurfaceInfoPtr)&uyvy_mpeg2_surface
83};
84
85static XF86ImageRec rgb_subpicture = XVIMAGE_RGB;
86static XF86ImageRec ia44_subpicture = XVIMAGE_IA44;
87static XF86ImageRec ai44_subpicture = XVIMAGE_AI44;
88
89static XF86ImagePtr subpictures[] =
90{
91	(XF86ImagePtr)&rgb_subpicture,
92	(XF86ImagePtr)&ia44_subpicture,
93	(XF86ImagePtr)&ai44_subpicture
94};
95
96static XF86MCAdaptorRec adaptor_template =
97{
98	"",
99	2,
100	surfaces,
101	3,
102	subpictures,
103	(xf86XvMCCreateContextProcPtr)NULL,
104	(xf86XvMCDestroyContextProcPtr)NULL,
105	(xf86XvMCCreateSurfaceProcPtr)NULL,
106	(xf86XvMCDestroySurfaceProcPtr)NULL,
107	(xf86XvMCCreateSubpictureProcPtr)NULL,
108	(xf86XvMCDestroySubpictureProcPtr)NULL
109};
110
111XF86MCAdaptorPtr vlCreateAdaptorXvMC(ScreenPtr pScreen, const char *xv_adaptor_name)
112{
113	XF86MCAdaptorPtr	adaptor;
114	ScrnInfoPtr		pScrn;
115
116	assert(pScreen);
117	assert(xv_adaptor_name);
118
119	pScrn = xf86ScreenToScrn(pScreen);
120	adaptor = xf86XvMCCreateAdaptorRec();
121
122	if (!adaptor)
123	{
124		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Memory allocation failed.\n");
125		return NULL;
126	}
127
128	*adaptor = adaptor_template;
129	adaptor->name = xv_adaptor_name;
130
131	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Associated with %s.\n", xv_adaptor_name);
132
133	return adaptor;
134}
135
136void vlDestroyAdaptorXvMC(XF86MCAdaptorPtr adaptor)
137{
138	assert(adaptor);
139	xf86XvMCDestroyAdaptorRec(adaptor);
140}
141
142/* TODO: Manage adaptor list and adaptor rec memory internally */
143
144void vlInitXvMC(ScreenPtr pScreen, unsigned int num_adaptors, XF86MCAdaptorPtr *adaptors)
145{
146	ScrnInfoPtr	pScrn;
147	int		i;
148
149	assert(pScreen);
150	assert(adaptors);
151
152	for (i = 0; i < num_adaptors; ++i)
153		assert(adaptors[i]);
154
155	pScrn = xf86ScreenToScrn(pScreen);
156
157	if (!xf86XvMCScreenInit(pScreen, num_adaptors, adaptors))
158		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Failed to initialize extension.\n");
159	else
160		xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Extension initialized.\n");
161
162#if (XvMCVersion > 1) || (XvMCRevision > 0)
163	/*
164	if (xf86XvMCRegisterDRInfo(pScreen, "XvMCg3dvl", "0:0.0", -1, -1, -1) != Success)
165		xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Failed to register client library, using XvMCConfig.\n");
166	else
167		xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Registered client library.\n");
168	*/
169#endif
170}
171
172