1 /* 2 * Copyright (c) 2007 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial portions 14 * of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 #define _GNU_SOURCE 1 26 #include "sysdeps.h" 27 #include "va.h" 28 #include "va_backend.h" 29 #include "va_trace.h" 30 #include "va_fool.h" 31 #include "va_x11.h" 32 #include "va_dri.h" 33 #include "va_dri2.h" 34 #include "va_dricommon.h" 35 #include "va_nvctrl.h" 36 #include "va_fglrx.h" 37 #include <stdio.h> 38 #include <stdlib.h> 39 #include <stdarg.h> 40 #include <string.h> 41 #include <unistd.h> 42 #include <sys/types.h> 43 #include <sys/stat.h> 44 #include <fcntl.h> 45 #include <errno.h> 46 47 static int va_DisplayContextIsValid ( 48 VADisplayContextP pDisplayContext 49 ) 50 { 51 return (pDisplayContext != NULL && 52 pDisplayContext->pDriverContext != NULL); 53 } 54 55 static void va_DisplayContextDestroy ( 56 VADisplayContextP pDisplayContext 57 ) 58 { 59 VADriverContextP ctx; 60 struct dri_state *dri_state; 61 62 if (pDisplayContext == NULL) 63 return; 64 65 ctx = pDisplayContext->pDriverContext; 66 dri_state = ctx->drm_state; 67 68 if (dri_state && dri_state->close) 69 dri_state->close(ctx); 70 71 free(pDisplayContext->pDriverContext->drm_state); 72 free(pDisplayContext->pDriverContext); 73 free(pDisplayContext); 74 } 75 76 77 static VAStatus va_DRI2GetDriverName ( 78 VADisplayContextP pDisplayContext, 79 char **driver_name 80 ) 81 { 82 VADriverContextP ctx = pDisplayContext->pDriverContext; 83 84 if (!isDRI2Connected(ctx, driver_name)) 85 return VA_STATUS_ERROR_UNKNOWN; 86 87 return VA_STATUS_SUCCESS; 88 } 89 90 static VAStatus va_DRIGetDriverName ( 91 VADisplayContextP pDisplayContext, 92 char **driver_name 93 ) 94 { 95 VADriverContextP ctx = pDisplayContext->pDriverContext; 96 97 if (!isDRI1Connected(ctx, driver_name)) 98 return VA_STATUS_ERROR_UNKNOWN; 99 100 return VA_STATUS_SUCCESS; 101 } 102 103 static VAStatus va_NVCTRL_GetDriverName ( 104 VADisplayContextP pDisplayContext, 105 char **driver_name 106 ) 107 { 108 VADriverContextP ctx = pDisplayContext->pDriverContext; 109 int direct_capable, driver_major, driver_minor, driver_patch; 110 Bool result; 111 112 result = VA_NVCTRLQueryDirectRenderingCapable(ctx->native_dpy, ctx->x11_screen, 113 &direct_capable); 114 if (!result || !direct_capable) 115 return VA_STATUS_ERROR_UNKNOWN; 116 117 result = VA_NVCTRLGetClientDriverName(ctx->native_dpy, ctx->x11_screen, 118 &driver_major, &driver_minor, 119 &driver_patch, driver_name); 120 if (!result) 121 return VA_STATUS_ERROR_UNKNOWN; 122 123 return VA_STATUS_SUCCESS; 124 } 125 126 static VAStatus va_FGLRX_GetDriverName ( 127 VADisplayContextP pDisplayContext, 128 char **driver_name 129 ) 130 { 131 VADriverContextP ctx = pDisplayContext->pDriverContext; 132 int driver_major, driver_minor, driver_patch; 133 Bool result; 134 135 result = VA_FGLRXGetClientDriverName(ctx->native_dpy, ctx->x11_screen, 136 &driver_major, &driver_minor, 137 &driver_patch, driver_name); 138 if (!result) 139 return VA_STATUS_ERROR_UNKNOWN; 140 141 return VA_STATUS_SUCCESS; 142 } 143 144 static VAStatus va_DisplayContextGetDriverName ( 145 VADisplayContextP pDisplayContext, 146 char **driver_name 147 ) 148 { 149 VAStatus vaStatus; 150 151 if (driver_name) 152 *driver_name = NULL; 153 else 154 return VA_STATUS_ERROR_UNKNOWN; 155 156 vaStatus = va_DRI2GetDriverName(pDisplayContext, driver_name); 157 if (vaStatus != VA_STATUS_SUCCESS) 158 vaStatus = va_DRIGetDriverName(pDisplayContext, driver_name); 159 if (vaStatus != VA_STATUS_SUCCESS) 160 vaStatus = va_NVCTRL_GetDriverName(pDisplayContext, driver_name); 161 if (vaStatus != VA_STATUS_SUCCESS) 162 vaStatus = va_FGLRX_GetDriverName(pDisplayContext, driver_name); 163 return vaStatus; 164 } 165 166 167 VADisplay vaGetDisplay ( 168 Display *native_dpy /* implementation specific */ 169 ) 170 { 171 VADisplay dpy = NULL; 172 VADisplayContextP pDisplayContext; 173 174 if (!native_dpy) 175 return NULL; 176 177 if (!dpy) 178 { 179 /* create new entry */ 180 VADriverContextP pDriverContext; 181 struct dri_state *dri_state; 182 pDisplayContext = calloc(1, sizeof(*pDisplayContext)); 183 pDriverContext = calloc(1, sizeof(*pDriverContext)); 184 dri_state = calloc(1, sizeof(*dri_state)); 185 if (pDisplayContext && pDriverContext && dri_state) 186 { 187 pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC; 188 189 pDriverContext->native_dpy = (void *)native_dpy; 190 pDriverContext->display_type = VA_DISPLAY_X11; 191 pDisplayContext->pDriverContext = pDriverContext; 192 pDisplayContext->vaIsValid = va_DisplayContextIsValid; 193 pDisplayContext->vaDestroy = va_DisplayContextDestroy; 194 pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName; 195 pDisplayContext->opaque = NULL; 196 pDriverContext->drm_state = dri_state; 197 dpy = (VADisplay)pDisplayContext; 198 } 199 else 200 { 201 if (pDisplayContext) 202 free(pDisplayContext); 203 if (pDriverContext) 204 free(pDriverContext); 205 if (dri_state) 206 free(dri_state); 207 } 208 } 209 210 return dpy; 211 } 212 213 #define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext) 214 #define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; } 215 216 void va_TracePutSurface ( 217 VADisplay dpy, 218 VASurfaceID surface, 219 void *draw, /* the target Drawable */ 220 short srcx, 221 short srcy, 222 unsigned short srcw, 223 unsigned short srch, 224 short destx, 225 short desty, 226 unsigned short destw, 227 unsigned short desth, 228 VARectangle *cliprects, /* client supplied clip list */ 229 unsigned int number_cliprects, /* number of clip rects in the clip list */ 230 unsigned int flags /* de-interlacing flags */ 231 ); 232 233 234 VAStatus vaPutSurface ( 235 VADisplay dpy, 236 VASurfaceID surface, 237 Drawable draw, /* X Drawable */ 238 short srcx, 239 short srcy, 240 unsigned short srcw, 241 unsigned short srch, 242 short destx, 243 short desty, 244 unsigned short destw, 245 unsigned short desth, 246 VARectangle *cliprects, /* client supplied clip list */ 247 unsigned int number_cliprects, /* number of clip rects in the clip list */ 248 unsigned int flags /* de-interlacing flags */ 249 ) 250 { 251 VADriverContextP ctx; 252 253 if (fool_postp) 254 return VA_STATUS_SUCCESS; 255 256 CHECK_DISPLAY(dpy); 257 ctx = CTX(dpy); 258 259 VA_TRACE_LOG(va_TracePutSurface, dpy, surface, (void *)draw, srcx, srcy, srcw, srch, 260 destx, desty, destw, desth, 261 cliprects, number_cliprects, flags ); 262 263 return ctx->vtable->vaPutSurface( ctx, surface, (void *)draw, srcx, srcy, srcw, srch, 264 destx, desty, destw, desth, 265 cliprects, number_cliprects, flags ); 266 } 267