git-log is no longer valid for git 1.6, switch to git log.
[nouveau] / src / vl_hwmc.c
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 #define FOURCC_RGB      0x0000003
13 #define XVIMAGE_RGB                                                             \
14 {                                                                               \
15         FOURCC_RGB,                                                             \
16         XvRGB,                                                                  \
17         LSBFirst,                                                               \
18         {                                                                       \
19                 'R', 'G', 'B', 0x00,                                            \
20                 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71     \
21         },                                                                      \
22         32,                                                                     \
23         XvPacked,                                                               \
24         1,                                                                      \
25         24, 0x00FF0000, 0x0000FF00, 0x000000FF,                                 \
26         0, 0, 0,                                                                \
27         0, 0, 0,                                                                \
28         0, 0, 0,                                                                \
29         {                                                                       \
30                 'B','G','R','X',                                                \
31                 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         \
32         },                                                                      \
33         XvTopToBottom                                                           \
34 }
35
36 static int subpicture_index_list[] =
37 {
38         FOURCC_RGB
39 };
40
41 static XF86MCImageIDList subpicture_list =
42 {
43         1,
44         subpicture_index_list
45 };
46
47 static XF86MCSurfaceInfoRec yv12_mpeg2_surface =
48 {
49         FOURCC_YV12,
50         XVMC_CHROMA_FORMAT_420,
51         0,
52         2048,
53         2048,
54         2048,
55         2048,
56         /*XVMC_IDCT*/ XVMC_MOCOMP | XVMC_MPEG_2,
57         XVMC_INTRA_UNSIGNED | XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
58         &subpicture_list
59 };
60
61 static XF86MCSurfaceInfoPtr surfaces[] =
62 {
63         (XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface
64 };
65
66 static XF86ImageRec rgb_subpicture = XVIMAGE_RGB;
67
68 static XF86ImagePtr subpictures[] =
69 {
70         (XF86ImagePtr)&rgb_subpicture
71 };
72
73 static XF86MCAdaptorRec adaptor_template =
74 {
75         "",
76         1,
77         surfaces,
78         1,
79         subpictures,
80         (xf86XvMCCreateContextProcPtr)NULL,
81         (xf86XvMCDestroyContextProcPtr)NULL,
82         (xf86XvMCCreateSurfaceProcPtr)NULL,
83         (xf86XvMCDestroySurfaceProcPtr)NULL,
84         (xf86XvMCCreateSubpictureProcPtr)NULL,
85         (xf86XvMCDestroySubpictureProcPtr)NULL
86 };
87
88 XF86MCAdaptorPtr vlCreateAdaptorXvMC(ScreenPtr pScreen, char *xv_adaptor_name)
89 {
90         XF86MCAdaptorPtr        adaptor;
91         ScrnInfoPtr             pScrn;
92         
93         assert(pScreen);
94         assert(xv_adaptor_name);
95         
96         pScrn = xf86Screens[pScreen->myNum];
97         adaptor = xf86XvMCCreateAdaptorRec();
98         
99         if (!adaptor)
100         {
101                 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Memory allocation failed.\n");
102                 return NULL;
103         }
104         
105         *adaptor = adaptor_template;
106         adaptor->name = xv_adaptor_name;
107         
108         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Associated with %s.\n", xv_adaptor_name);
109         
110         return adaptor;
111 }
112
113 void vlDestroyAdaptorXvMC(XF86MCAdaptorPtr adaptor)
114 {
115         assert(adaptor);
116         xf86XvMCDestroyAdaptorRec(adaptor);
117 }
118
119 /* TODO: Manage adaptor list and adaptor rec memory internally */
120
121 void vlInitXvMC(ScreenPtr pScreen, unsigned int num_adaptors, XF86MCAdaptorPtr *adaptors)
122 {
123         ScrnInfoPtr     pScrn;
124         int             i;
125         
126         assert(pScreen);
127         assert(adaptors);
128         
129         for (i = 0; i < num_adaptors; ++i)
130                 assert(adaptors[i]);
131         
132         pScrn = xf86Screens[pScreen->myNum];
133         
134         if (!xf86XvMCScreenInit(pScreen, num_adaptors, adaptors))
135                 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Failed to initialize extension.\n");
136         else
137                 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Extension initialized.\n");
138         
139 #if (XvMCVersion > 1) || (XvMCRevision > 0)
140         /*
141         if (xf86XvMCRegisterDRInfo(pScreen, "XvMCg3dvl", "0:0.0", -1, -1, -1) != Success)
142                 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Failed to register client library, using XvMCConfig.\n");
143         else
144                 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Registered client library.\n");
145         */
146 #endif
147 }
148