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