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