1de2362d3Smrg/*
2de2362d3Smrg * Copyright 2010 Christian König
3de2362d3Smrg *
4de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5de2362d3Smrg * copy of this software and associated documentation files (the "Software"),
6de2362d3Smrg * to deal in the Software without restriction, including without limitation
7de2362d3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8de2362d3Smrg * and/or sell copies of the Software, and to permit persons to whom the
9de2362d3Smrg * Software is furnished to do so, subject to the following conditions:
10de2362d3Smrg *
11de2362d3Smrg * The above copyright notice and this permission notice (including the next
12de2362d3Smrg * paragraph) shall be included in all copies or substantial portions of the
13de2362d3Smrg * Software.
14de2362d3Smrg *
15de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16de2362d3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17de2362d3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18de2362d3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19de2362d3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20de2362d3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21de2362d3Smrg * SOFTWARE.
22de2362d3Smrg *
23de2362d3Smrg *
24de2362d3Smrg * Based on vl_hwmc.c from xf86-video-nouveau
25de2362d3Smrg *
26de2362d3Smrg */
27de2362d3Smrg
28de2362d3Smrg#ifdef HAVE_CONFIG_H
29de2362d3Smrg#include "config.h"
30de2362d3Smrg#endif
31de2362d3Smrg
32de2362d3Smrg#include <xf86.h>
33de2362d3Smrg#include "radeon_video.h"
34de2362d3Smrg#include "compat-api.h"
35de2362d3Smrg
36de2362d3Smrg#include <X11/extensions/Xv.h>
37de2362d3Smrg#include <X11/extensions/XvMC.h>
38de2362d3Smrg#include "fourcc.h"
39de2362d3Smrg
40de2362d3Smrg#define FOURCC_RGB	0x0000003
41de2362d3Smrg
42de2362d3Smrgstatic int subpicture_index_list[] =
43de2362d3Smrg{
44de2362d3Smrg	FOURCC_RGB,
45de2362d3Smrg	FOURCC_IA44,
46de2362d3Smrg	FOURCC_AI44
47de2362d3Smrg};
48de2362d3Smrg
49de2362d3Smrgstatic XF86MCImageIDList subpicture_list =
50de2362d3Smrg{
51de2362d3Smrg	3,
52de2362d3Smrg	subpicture_index_list
53de2362d3Smrg};
54de2362d3Smrg
55de2362d3Smrgstatic XF86MCSurfaceInfoRec yv12_mpeg2_surface =
56de2362d3Smrg{
57de2362d3Smrg	FOURCC_YV12,
58de2362d3Smrg	XVMC_CHROMA_FORMAT_420,
59de2362d3Smrg	0,
60de2362d3Smrg	2048,
61de2362d3Smrg	2048,
62de2362d3Smrg	2048,
63de2362d3Smrg	2048,
64de2362d3Smrg	XVMC_IDCT | XVMC_MOCOMP | XVMC_MPEG_2,
65de2362d3Smrg	XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE,
66de2362d3Smrg	&subpicture_list
67de2362d3Smrg};
68de2362d3Smrg
69de2362d3Smrgstatic XF86MCSurfaceInfoPtr surfaces[] =
70de2362d3Smrg{
71de2362d3Smrg	(XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface,
72de2362d3Smrg};
73de2362d3Smrg
74de2362d3Smrgstatic XF86ImageRec rgb_subpicture =
75de2362d3Smrg{
76de2362d3Smrg	FOURCC_RGB,
77de2362d3Smrg	XvRGB,
78de2362d3Smrg	LSBFirst,
79de2362d3Smrg	{
80de2362d3Smrg		'R', 'G', 'B', 0x00,
81de2362d3Smrg		0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
82de2362d3Smrg	},
83de2362d3Smrg	32,
84de2362d3Smrg	XvPacked,
85de2362d3Smrg	1,
86de2362d3Smrg	24, 0x00FF0000, 0x0000FF00, 0x000000FF,
87de2362d3Smrg	0, 0, 0,
88de2362d3Smrg	0, 0, 0,
89de2362d3Smrg	0, 0, 0,
90de2362d3Smrg	{
91de2362d3Smrg		'B','G','R','X',
92de2362d3Smrg		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
93de2362d3Smrg	},
94de2362d3Smrg	XvTopToBottom
95de2362d3Smrg};
96de2362d3Smrg
97de2362d3Smrgstatic XF86ImageRec ia44_subpicture = XVIMAGE_IA44;
98de2362d3Smrgstatic XF86ImageRec ai44_subpicture = XVIMAGE_AI44;
99de2362d3Smrg
100de2362d3Smrgstatic XF86ImagePtr subpictures[] =
101de2362d3Smrg{
102de2362d3Smrg	(XF86ImagePtr)&rgb_subpicture,
103de2362d3Smrg	(XF86ImagePtr)&ia44_subpicture,
104de2362d3Smrg	(XF86ImagePtr)&ai44_subpicture
105de2362d3Smrg};
106de2362d3Smrg
107de2362d3Smrgstatic XF86MCAdaptorRec adaptor_template =
108de2362d3Smrg{
109de2362d3Smrg	"",
110de2362d3Smrg	1,
111de2362d3Smrg	surfaces,
112de2362d3Smrg	3,
113de2362d3Smrg	subpictures,
114de2362d3Smrg	(xf86XvMCCreateContextProcPtr)NULL,
115de2362d3Smrg	(xf86XvMCDestroyContextProcPtr)NULL,
116de2362d3Smrg	(xf86XvMCCreateSurfaceProcPtr)NULL,
117de2362d3Smrg	(xf86XvMCDestroySurfaceProcPtr)NULL,
118de2362d3Smrg	(xf86XvMCCreateSubpictureProcPtr)NULL,
119de2362d3Smrg	(xf86XvMCDestroySubpictureProcPtr)NULL
120de2362d3Smrg};
121de2362d3Smrg
122de2362d3SmrgXF86MCAdaptorPtr
123861b9feeSmrgRADEONCreateAdaptorXvMC(ScreenPtr pScreen, const char *xv_adaptor_name)
124de2362d3Smrg{
125de2362d3Smrg	XF86MCAdaptorPtr	adaptor;
126de2362d3Smrg	ScrnInfoPtr		pScrn;
127de2362d3Smrg
128de2362d3Smrg	assert(pScreen);
129de2362d3Smrg
130de2362d3Smrg	pScrn = xf86ScreenToScrn(pScreen);
131de2362d3Smrg	adaptor = xf86XvMCCreateAdaptorRec();
132de2362d3Smrg
133de2362d3Smrg	if (!adaptor)
134de2362d3Smrg	{
135de2362d3Smrg		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Memory allocation failed.\n");
136de2362d3Smrg		return NULL;
137de2362d3Smrg	}
138de2362d3Smrg
139de2362d3Smrg	*adaptor = adaptor_template;
140de2362d3Smrg	adaptor->name = xv_adaptor_name;
141de2362d3Smrg
142de2362d3Smrg	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Associated with %s.\n", adaptor->name);
143de2362d3Smrg
144de2362d3Smrg	return adaptor;
145de2362d3Smrg}
146