Index: third_party/libva/va/x11/va_nvctrl.c |
diff --git a/third_party/libva/va/x11/va_nvctrl.c b/third_party/libva/va/x11/va_nvctrl.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b14db47ab24cf512de8f60e29e16a7dc6aabf60d |
--- /dev/null |
+++ b/third_party/libva/va/x11/va_nvctrl.c |
@@ -0,0 +1,399 @@ |
+/* |
+ * Copyright (c) 2008 NVIDIA, Corporation |
+ * |
+ * Permission is hereby granted, free of charge, to any person obtaining a copy |
+ * of this software and associated documentation files (the "Software"), to deal |
+ * in the Software without restriction, including without limitation the rights |
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
+ * copies of the Software, and to permit persons to whom the Software is |
+ * furnished to do so, subject to the following conditions: |
+ * |
+ * The above copyright notice and this permission notice (including the next |
+ * paragraph) shall be included in all copies or substantial portions of the |
+ * Software. |
+ * |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
+ * SOFTWARE. |
+ */ |
+ |
+#define _GNU_SOURCE 1 |
+#include <string.h> |
+ |
+#define NEED_REPLIES |
+#include <stdlib.h> |
+#include <X11/Xlibint.h> |
+#include <X11/Xutil.h> |
+#include <X11/extensions/Xext.h> |
+#include <X11/extensions/extutil.h> |
+#include "va_nvctrl.h" |
+ |
+#define NV_CONTROL_ERRORS 0 |
+#define NV_CONTROL_EVENTS 5 |
+#define NV_CONTROL_NAME "NV-CONTROL" |
+ |
+#define NV_CTRL_TARGET_TYPE_X_SCREEN 0 |
+#define NV_CTRL_TARGET_TYPE_GPU 1 |
+#define NV_CTRL_TARGET_TYPE_FRAMELOCK 2 |
+#define NV_CTRL_TARGET_TYPE_VCSC 3 /* Visual Computing System */ |
+ |
+#define NV_CTRL_STRING_NVIDIA_DRIVER_VERSION 3 /* R--G */ |
+ |
+#define X_nvCtrlQueryExtension 0 |
+#define X_nvCtrlIsNv 1 |
+#define X_nvCtrlQueryStringAttribute 4 |
+ |
+typedef struct { |
+ CARD8 reqType; |
+ CARD8 nvReqType; |
+ CARD16 length B16; |
+} xnvCtrlQueryExtensionReq; |
+#define sz_xnvCtrlQueryExtensionReq 4 |
+ |
+typedef struct { |
+ BYTE type; /* X_Reply */ |
+ CARD8 padb1; |
+ CARD16 sequenceNumber B16; |
+ CARD32 length B32; |
+ CARD16 major B16; |
+ CARD16 minor B16; |
+ CARD32 padl4 B32; |
+ CARD32 padl5 B32; |
+ CARD32 padl6 B32; |
+ CARD32 padl7 B32; |
+ CARD32 padl8 B32; |
+} xnvCtrlQueryExtensionReply; |
+#define sz_xnvCtrlQueryExtensionReply 32 |
+ |
+typedef struct { |
+ CARD8 reqType; |
+ CARD8 nvReqType; |
+ CARD16 length B16; |
+ CARD32 screen B32; |
+} xnvCtrlIsNvReq; |
+#define sz_xnvCtrlIsNvReq 8 |
+ |
+typedef struct { |
+ BYTE type; /* X_Reply */ |
+ CARD8 padb1; |
+ CARD16 sequenceNumber B16; |
+ CARD32 length B32; |
+ CARD32 isnv B32; |
+ CARD32 padl4 B32; |
+ CARD32 padl5 B32; |
+ CARD32 padl6 B32; |
+ CARD32 padl7 B32; |
+ CARD32 padl8 B32; |
+} xnvCtrlIsNvReply; |
+#define sz_xnvCtrlIsNvReply 32 |
+ |
+typedef struct { |
+ CARD8 reqType; |
+ CARD8 nvReqType; |
+ CARD16 length B16; |
+ CARD16 target_id B16; /* X screen number or GPU number */ |
+ CARD16 target_type B16; /* X screen or GPU */ |
+ CARD32 display_mask B32; |
+ CARD32 attribute B32; |
+} xnvCtrlQueryStringAttributeReq; |
+#define sz_xnvCtrlQueryStringAttributeReq 16 |
+ |
+typedef struct { |
+ BYTE type; |
+ BYTE pad0; |
+ CARD16 sequenceNumber B16; |
+ CARD32 length B32; |
+ CARD32 flags B32; |
+ CARD32 n B32; /* Length of string */ |
+ CARD32 pad4 B32; |
+ CARD32 pad5 B32; |
+ CARD32 pad6 B32; |
+ CARD32 pad7 B32; |
+} xnvCtrlQueryStringAttributeReply; |
+#define sz_xnvCtrlQueryStringAttributeReply 32 |
+ |
+#define NVCTRL_EXT_NEED_CHECK (XPointer)(~0) |
+#define NVCTRL_EXT_NEED_NOTHING (XPointer)(0) |
+#define NVCTRL_EXT_NEED_TARGET_SWAP (XPointer)(1) |
+ |
+static XExtensionInfo _nvctrl_ext_info_data; |
+static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data; |
+static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME; |
+ |
+#define XNVCTRLCheckExtension(dpy,i,val) \ |
+ XextCheckExtension (dpy, i, nvctrl_extension_name, val) |
+#define XNVCTRLSimpleCheckExtension(dpy,i) \ |
+ XextSimpleCheckExtension (dpy, i, nvctrl_extension_name) |
+ |
+static int close_display(); |
+static /* const */ XExtensionHooks nvctrl_extension_hooks = { |
+ NULL, /* create_gc */ |
+ NULL, /* copy_gc */ |
+ NULL, /* flush_gc */ |
+ NULL, /* free_gc */ |
+ NULL, /* create_font */ |
+ NULL, /* free_font */ |
+ close_display, /* close_display */ |
+ NULL, /* wire_to_event */ |
+ NULL, /* event_to_wire */ |
+ NULL, /* error */ |
+ NULL, /* error_string */ |
+}; |
+ |
+static XEXT_GENERATE_FIND_DISPLAY (find_display, nvctrl_ext_info, |
+ nvctrl_extension_name, |
+ &nvctrl_extension_hooks, |
+ NV_CONTROL_EVENTS, NVCTRL_EXT_NEED_CHECK) |
+ |
+static XEXT_GENERATE_CLOSE_DISPLAY (close_display, nvctrl_ext_info) |
+ |
+static Bool XNVCTRLQueryVersion (Display *dpy, int *major, int *minor); |
+ |
+/* |
+ * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id |
+ * fields in reversed order. In order to talk to one of these servers, |
+ * we need to swap these fields. |
+ */ |
+static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info, |
+ int *target_type, int *target_id) |
+{ |
+ /* Find out what the server's NV-CONTROL version is and |
+ * setup for swapping if we need to. |
+ */ |
+ if (info->data == NVCTRL_EXT_NEED_CHECK) { |
+ int major, minor; |
+ |
+ if (XNVCTRLQueryVersion(dpy, &major, &minor)) { |
+ if (major == 1 && |
+ (minor == 8 || minor == 9)) { |
+ info->data = NVCTRL_EXT_NEED_TARGET_SWAP; |
+ } else { |
+ info->data = NVCTRL_EXT_NEED_NOTHING; |
+ } |
+ } else { |
+ info->data = NVCTRL_EXT_NEED_NOTHING; |
+ } |
+ } |
+ |
+ /* We need to swap the target_type and target_id */ |
+ if (info->data == NVCTRL_EXT_NEED_TARGET_SWAP) { |
+ int tmp; |
+ tmp = *target_type; |
+ *target_type = *target_id; |
+ *target_id = tmp; |
+ } |
+} |
+ |
+ |
+static Bool XNVCTRLQueryExtension ( |
+ Display *dpy, |
+ int *event_basep, |
+ int *error_basep |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ |
+ if (XextHasExtension(info)) { |
+ if (event_basep) *event_basep = info->codes->first_event; |
+ if (error_basep) *error_basep = info->codes->first_error; |
+ return True; |
+ } else { |
+ return False; |
+ } |
+} |
+ |
+ |
+static Bool XNVCTRLQueryVersion ( |
+ Display *dpy, |
+ int *major, |
+ int *minor |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryExtensionReply rep; |
+ xnvCtrlQueryExtensionReq *req; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryExtension, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryExtension; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ if (major) *major = rep.major; |
+ if (minor) *minor = rep.minor; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return True; |
+} |
+ |
+ |
+static Bool XNVCTRLIsNvScreen ( |
+ Display *dpy, |
+ int screen |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlIsNvReply rep; |
+ xnvCtrlIsNvReq *req; |
+ Bool isnv; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlIsNv, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlIsNv; |
+ req->screen = screen; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ isnv = rep.isnv; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return isnv; |
+} |
+ |
+ |
+static Bool XNVCTRLQueryTargetStringAttribute ( |
+ Display *dpy, |
+ int target_type, |
+ int target_id, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char **ptr |
+){ |
+ XExtDisplayInfo *info = find_display (dpy); |
+ xnvCtrlQueryStringAttributeReply rep; |
+ xnvCtrlQueryStringAttributeReq *req; |
+ Bool exists; |
+ int length, numbytes, slop; |
+ |
+ if (!ptr) return False; |
+ |
+ if(!XextHasExtension(info)) |
+ return False; |
+ |
+ XNVCTRLCheckExtension (dpy, info, False); |
+ XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id); |
+ |
+ LockDisplay (dpy); |
+ GetReq (nvCtrlQueryStringAttribute, req); |
+ req->reqType = info->codes->major_opcode; |
+ req->nvReqType = X_nvCtrlQueryStringAttribute; |
+ req->target_type = target_type; |
+ req->target_id = target_id; |
+ req->display_mask = display_mask; |
+ req->attribute = attribute; |
+ if (!_XReply (dpy, (xReply *) &rep, 0, False)) { |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } |
+ length = rep.length; |
+ numbytes = rep.n; |
+ slop = numbytes & 3; |
+ *ptr = (char *) Xmalloc(numbytes); |
+ if (! *ptr) { |
+ _XEatData(dpy, length); |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return False; |
+ } else { |
+ _XRead(dpy, (char *) *ptr, numbytes); |
+ if (slop) _XEatData(dpy, 4-slop); |
+ } |
+ exists = rep.flags; |
+ UnlockDisplay (dpy); |
+ SyncHandle (); |
+ return exists; |
+} |
+ |
+static Bool XNVCTRLQueryStringAttribute ( |
+ Display *dpy, |
+ int screen, |
+ unsigned int display_mask, |
+ unsigned int attribute, |
+ char **ptr |
+){ |
+ return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN, |
+ screen, display_mask, |
+ attribute, ptr); |
+} |
+ |
+ |
+Bool VA_NVCTRLQueryDirectRenderingCapable( Display *dpy, int screen, |
+ Bool *isCapable ) |
+{ |
+ int event_base; |
+ int error_base; |
+ |
+ if (isCapable) |
+ *isCapable = False; |
+ |
+ if (!XNVCTRLQueryExtension(dpy, &event_base, &error_base)) |
+ return False; |
+ |
+ if (isCapable && XNVCTRLIsNvScreen(dpy, screen)) |
+ *isCapable = True; |
+ |
+ return True; |
+} |
+ |
+Bool VA_NVCTRLGetClientDriverName( Display *dpy, int screen, |
+ int *ddxDriverMajorVersion, int *ddxDriverMinorVersion, |
+ int *ddxDriverPatchVersion, char **clientDriverName ) |
+{ |
+ if (ddxDriverMajorVersion) |
+ *ddxDriverMajorVersion = 0; |
+ if (ddxDriverMinorVersion) |
+ *ddxDriverMinorVersion = 0; |
+ if (ddxDriverPatchVersion) |
+ *ddxDriverPatchVersion = 0; |
+ if (clientDriverName) |
+ *clientDriverName = NULL; |
+ |
+ char *nvidia_driver_version = NULL; |
+ if (!XNVCTRLQueryStringAttribute(dpy, screen, 0, NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &nvidia_driver_version)) |
+ return False; |
+ |
+ char *end, *str = nvidia_driver_version; |
+ unsigned long v = strtoul(str, &end, 10); |
+ if (end && end != str) { |
+ if (ddxDriverMajorVersion) |
+ *ddxDriverMajorVersion = v; |
+ if (*(str = end) == '.') { |
+ v = strtoul(str + 1, &end, 10); |
+ if (end && end != str && (*end == '.' || *end == '\0')) { |
+ if (ddxDriverMinorVersion) |
+ *ddxDriverMinorVersion = v; |
+ if (*(str = end) == '.') { |
+ v = strtoul(str + 1, &end, 10); |
+ if (end && end != str && *end == '\0') { |
+ if (ddxDriverPatchVersion) |
+ *ddxDriverPatchVersion = v; |
+ } |
+ } |
+ } |
+ } |
+ } |
+ Xfree(nvidia_driver_version); |
+ |
+ if (clientDriverName) |
+ *clientDriverName = strdup("nvidia"); |
+ |
+ return True; |
+} |