xref: /aosp_15_r20/external/libva/va/x11/va_nvctrl.c (revision 54e60f844a168e9a219354de272cd517ee8cd4b7)
1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker  * Copyright (c) 2008 NVIDIA, Corporation
3*54e60f84SAndroid Build Coastguard Worker  *
4*54e60f84SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
5*54e60f84SAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to deal
6*54e60f84SAndroid Build Coastguard Worker  * in the Software without restriction, including without limitation the rights
7*54e60f84SAndroid Build Coastguard Worker  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8*54e60f84SAndroid Build Coastguard Worker  * copies of the Software, and to permit persons to whom the Software is
9*54e60f84SAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
10*54e60f84SAndroid Build Coastguard Worker  *
11*54e60f84SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*54e60f84SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*54e60f84SAndroid Build Coastguard Worker  * Software.
14*54e60f84SAndroid Build Coastguard Worker  *
15*54e60f84SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*54e60f84SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*54e60f84SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18*54e60f84SAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*54e60f84SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*54e60f84SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*54e60f84SAndroid Build Coastguard Worker  * SOFTWARE.
22*54e60f84SAndroid Build Coastguard Worker  */
23*54e60f84SAndroid Build Coastguard Worker 
24*54e60f84SAndroid Build Coastguard Worker #define _GNU_SOURCE 1
25*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
26*54e60f84SAndroid Build Coastguard Worker 
27*54e60f84SAndroid Build Coastguard Worker #ifdef HAVE_NVCTRL
28*54e60f84SAndroid Build Coastguard Worker 
29*54e60f84SAndroid Build Coastguard Worker #include <string.h>
30*54e60f84SAndroid Build Coastguard Worker 
31*54e60f84SAndroid Build Coastguard Worker #define NEED_REPLIES
32*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
33*54e60f84SAndroid Build Coastguard Worker #include <X11/Xlibint.h>
34*54e60f84SAndroid Build Coastguard Worker #include <X11/Xutil.h>
35*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/Xext.h>
36*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/extutil.h>
37*54e60f84SAndroid Build Coastguard Worker #include "va_nvctrl.h"
38*54e60f84SAndroid Build Coastguard Worker 
39*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_ERRORS 0
40*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_EVENTS 5
41*54e60f84SAndroid Build Coastguard Worker #define NV_CONTROL_NAME "NV-CONTROL"
42*54e60f84SAndroid Build Coastguard Worker 
43*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_X_SCREEN   0
44*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_GPU        1
45*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_FRAMELOCK  2
46*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_TARGET_TYPE_VCSC       3 /* Visual Computing System */
47*54e60f84SAndroid Build Coastguard Worker 
48*54e60f84SAndroid Build Coastguard Worker #define NV_CTRL_STRING_NVIDIA_DRIVER_VERSION                    3  /* R--G */
49*54e60f84SAndroid Build Coastguard Worker 
50*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlQueryExtension                      0
51*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlIsNv                                1
52*54e60f84SAndroid Build Coastguard Worker #define X_nvCtrlQueryStringAttribute                4
53*54e60f84SAndroid Build Coastguard Worker 
54*54e60f84SAndroid Build Coastguard Worker typedef struct {
55*54e60f84SAndroid Build Coastguard Worker     CARD8 reqType;
56*54e60f84SAndroid Build Coastguard Worker     CARD8 nvReqType;
57*54e60f84SAndroid Build Coastguard Worker     CARD16 length B16;
58*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryExtensionReq;
59*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryExtensionReq 4
60*54e60f84SAndroid Build Coastguard Worker 
61*54e60f84SAndroid Build Coastguard Worker typedef struct {
62*54e60f84SAndroid Build Coastguard Worker     BYTE type;   /* X_Reply */
63*54e60f84SAndroid Build Coastguard Worker     CARD8 padb1;
64*54e60f84SAndroid Build Coastguard Worker     CARD16 sequenceNumber B16;
65*54e60f84SAndroid Build Coastguard Worker     CARD32 length B32;
66*54e60f84SAndroid Build Coastguard Worker     CARD16 major B16;
67*54e60f84SAndroid Build Coastguard Worker     CARD16 minor B16;
68*54e60f84SAndroid Build Coastguard Worker     CARD32 padl4 B32;
69*54e60f84SAndroid Build Coastguard Worker     CARD32 padl5 B32;
70*54e60f84SAndroid Build Coastguard Worker     CARD32 padl6 B32;
71*54e60f84SAndroid Build Coastguard Worker     CARD32 padl7 B32;
72*54e60f84SAndroid Build Coastguard Worker     CARD32 padl8 B32;
73*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryExtensionReply;
74*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryExtensionReply 32
75*54e60f84SAndroid Build Coastguard Worker 
76*54e60f84SAndroid Build Coastguard Worker typedef struct {
77*54e60f84SAndroid Build Coastguard Worker     CARD8 reqType;
78*54e60f84SAndroid Build Coastguard Worker     CARD8 nvReqType;
79*54e60f84SAndroid Build Coastguard Worker     CARD16 length B16;
80*54e60f84SAndroid Build Coastguard Worker     CARD32 screen B32;
81*54e60f84SAndroid Build Coastguard Worker } xnvCtrlIsNvReq;
82*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlIsNvReq 8
83*54e60f84SAndroid Build Coastguard Worker 
84*54e60f84SAndroid Build Coastguard Worker typedef struct {
85*54e60f84SAndroid Build Coastguard Worker     BYTE type;   /* X_Reply */
86*54e60f84SAndroid Build Coastguard Worker     CARD8 padb1;
87*54e60f84SAndroid Build Coastguard Worker     CARD16 sequenceNumber B16;
88*54e60f84SAndroid Build Coastguard Worker     CARD32 length B32;
89*54e60f84SAndroid Build Coastguard Worker     CARD32 isnv B32;
90*54e60f84SAndroid Build Coastguard Worker     CARD32 padl4 B32;
91*54e60f84SAndroid Build Coastguard Worker     CARD32 padl5 B32;
92*54e60f84SAndroid Build Coastguard Worker     CARD32 padl6 B32;
93*54e60f84SAndroid Build Coastguard Worker     CARD32 padl7 B32;
94*54e60f84SAndroid Build Coastguard Worker     CARD32 padl8 B32;
95*54e60f84SAndroid Build Coastguard Worker } xnvCtrlIsNvReply;
96*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlIsNvReply 32
97*54e60f84SAndroid Build Coastguard Worker 
98*54e60f84SAndroid Build Coastguard Worker typedef struct {
99*54e60f84SAndroid Build Coastguard Worker     CARD8 reqType;
100*54e60f84SAndroid Build Coastguard Worker     CARD8 nvReqType;
101*54e60f84SAndroid Build Coastguard Worker     CARD16 length B16;
102*54e60f84SAndroid Build Coastguard Worker     CARD16 target_id B16;    /* X screen number or GPU number */
103*54e60f84SAndroid Build Coastguard Worker     CARD16 target_type B16;  /* X screen or GPU */
104*54e60f84SAndroid Build Coastguard Worker     CARD32 display_mask B32;
105*54e60f84SAndroid Build Coastguard Worker     CARD32 attribute B32;
106*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryStringAttributeReq;
107*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryStringAttributeReq 16
108*54e60f84SAndroid Build Coastguard Worker 
109*54e60f84SAndroid Build Coastguard Worker typedef struct {
110*54e60f84SAndroid Build Coastguard Worker     BYTE type;
111*54e60f84SAndroid Build Coastguard Worker     BYTE pad0;
112*54e60f84SAndroid Build Coastguard Worker     CARD16 sequenceNumber B16;
113*54e60f84SAndroid Build Coastguard Worker     CARD32 length B32;
114*54e60f84SAndroid Build Coastguard Worker     CARD32 flags B32;
115*54e60f84SAndroid Build Coastguard Worker     CARD32 n B32;    /* Length of string */
116*54e60f84SAndroid Build Coastguard Worker     CARD32 pad4 B32;
117*54e60f84SAndroid Build Coastguard Worker     CARD32 pad5 B32;
118*54e60f84SAndroid Build Coastguard Worker     CARD32 pad6 B32;
119*54e60f84SAndroid Build Coastguard Worker     CARD32 pad7 B32;
120*54e60f84SAndroid Build Coastguard Worker } xnvCtrlQueryStringAttributeReply;
121*54e60f84SAndroid Build Coastguard Worker #define sz_xnvCtrlQueryStringAttributeReply 32
122*54e60f84SAndroid Build Coastguard Worker 
123*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_CHECK          (XPointer)(~0)
124*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_NOTHING        (XPointer)(0)
125*54e60f84SAndroid Build Coastguard Worker #define NVCTRL_EXT_NEED_TARGET_SWAP    (XPointer)(1)
126*54e60f84SAndroid Build Coastguard Worker 
127*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo _nvctrl_ext_info_data;
128*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo *nvctrl_ext_info = &_nvctrl_ext_info_data;
129*54e60f84SAndroid Build Coastguard Worker static /* const */ char *nvctrl_extension_name = NV_CONTROL_NAME;
130*54e60f84SAndroid Build Coastguard Worker 
131*54e60f84SAndroid Build Coastguard Worker #define XNVCTRLCheckExtension(dpy,i,val) \
132*54e60f84SAndroid Build Coastguard Worker   XextCheckExtension (dpy, i, nvctrl_extension_name, val)
133*54e60f84SAndroid Build Coastguard Worker #define XNVCTRLSimpleCheckExtension(dpy,i) \
134*54e60f84SAndroid Build Coastguard Worker   XextSimpleCheckExtension (dpy, i, nvctrl_extension_name)
135*54e60f84SAndroid Build Coastguard Worker 
136*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_CLOSE_DISPLAY(close_display, nvctrl_ext_info)
137*54e60f84SAndroid Build Coastguard Worker 
138*54e60f84SAndroid Build Coastguard Worker static /* const */ XExtensionHooks nvctrl_extension_hooks = {
139*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* create_gc */
140*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* copy_gc */
141*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* flush_gc */
142*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* free_gc */
143*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* create_font */
144*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* free_font */
145*54e60f84SAndroid Build Coastguard Worker     close_display,                      /* close_display */
146*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* wire_to_event */
147*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* event_to_wire */
148*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* error */
149*54e60f84SAndroid Build Coastguard Worker     NULL,                               /* error_string */
150*54e60f84SAndroid Build Coastguard Worker };
151*54e60f84SAndroid Build Coastguard Worker 
152*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_FIND_DISPLAY(find_display, nvctrl_ext_info,
153*54e60f84SAndroid Build Coastguard Worker                                   nvctrl_extension_name,
154*54e60f84SAndroid Build Coastguard Worker                                   &nvctrl_extension_hooks,
155*54e60f84SAndroid Build Coastguard Worker                                   NV_CONTROL_EVENTS, NVCTRL_EXT_NEED_CHECK)
156*54e60f84SAndroid Build Coastguard Worker 
157*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryVersion(Display *dpy, int *major, int *minor);
158*54e60f84SAndroid Build Coastguard Worker 
159*54e60f84SAndroid Build Coastguard Worker /*
160*54e60f84SAndroid Build Coastguard Worker  * NV-CONTROL versions 1.8 and 1.9 pack the target_type and target_id
161*54e60f84SAndroid Build Coastguard Worker  * fields in reversed order.  In order to talk to one of these servers,
162*54e60f84SAndroid Build Coastguard Worker  * we need to swap these fields.
163*54e60f84SAndroid Build Coastguard Worker  */
XNVCTRLCheckTargetData(Display * dpy,XExtDisplayInfo * info,int * target_type,int * target_id)164*54e60f84SAndroid Build Coastguard Worker static void XNVCTRLCheckTargetData(Display *dpy, XExtDisplayInfo *info,
165*54e60f84SAndroid Build Coastguard Worker                                    int *target_type, int *target_id)
166*54e60f84SAndroid Build Coastguard Worker {
167*54e60f84SAndroid Build Coastguard Worker     /* Find out what the server's NV-CONTROL version is and
168*54e60f84SAndroid Build Coastguard Worker      * setup for swapping if we need to.
169*54e60f84SAndroid Build Coastguard Worker      */
170*54e60f84SAndroid Build Coastguard Worker     if (info->data == NVCTRL_EXT_NEED_CHECK) {
171*54e60f84SAndroid Build Coastguard Worker         int major, minor;
172*54e60f84SAndroid Build Coastguard Worker 
173*54e60f84SAndroid Build Coastguard Worker         if (XNVCTRLQueryVersion(dpy, &major, &minor)) {
174*54e60f84SAndroid Build Coastguard Worker             if (major == 1 &&
175*54e60f84SAndroid Build Coastguard Worker                 (minor == 8 || minor == 9)) {
176*54e60f84SAndroid Build Coastguard Worker                 info->data = NVCTRL_EXT_NEED_TARGET_SWAP;
177*54e60f84SAndroid Build Coastguard Worker             } else {
178*54e60f84SAndroid Build Coastguard Worker                 info->data = NVCTRL_EXT_NEED_NOTHING;
179*54e60f84SAndroid Build Coastguard Worker             }
180*54e60f84SAndroid Build Coastguard Worker         } else {
181*54e60f84SAndroid Build Coastguard Worker             info->data = NVCTRL_EXT_NEED_NOTHING;
182*54e60f84SAndroid Build Coastguard Worker         }
183*54e60f84SAndroid Build Coastguard Worker     }
184*54e60f84SAndroid Build Coastguard Worker 
185*54e60f84SAndroid Build Coastguard Worker     /* We need to swap the target_type and target_id */
186*54e60f84SAndroid Build Coastguard Worker     if (info->data == NVCTRL_EXT_NEED_TARGET_SWAP) {
187*54e60f84SAndroid Build Coastguard Worker         int tmp;
188*54e60f84SAndroid Build Coastguard Worker         tmp = *target_type;
189*54e60f84SAndroid Build Coastguard Worker         *target_type = *target_id;
190*54e60f84SAndroid Build Coastguard Worker         *target_id = tmp;
191*54e60f84SAndroid Build Coastguard Worker     }
192*54e60f84SAndroid Build Coastguard Worker }
193*54e60f84SAndroid Build Coastguard Worker 
194*54e60f84SAndroid Build Coastguard Worker 
XNVCTRLQueryExtension(Display * dpy,int * event_basep,int * error_basep)195*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryExtension(
196*54e60f84SAndroid Build Coastguard Worker     Display *dpy,
197*54e60f84SAndroid Build Coastguard Worker     int *event_basep,
198*54e60f84SAndroid Build Coastguard Worker     int *error_basep
199*54e60f84SAndroid Build Coastguard Worker )
200*54e60f84SAndroid Build Coastguard Worker {
201*54e60f84SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
202*54e60f84SAndroid Build Coastguard Worker 
203*54e60f84SAndroid Build Coastguard Worker     if (XextHasExtension(info)) {
204*54e60f84SAndroid Build Coastguard Worker         if (event_basep) *event_basep = info->codes->first_event;
205*54e60f84SAndroid Build Coastguard Worker         if (error_basep) *error_basep = info->codes->first_error;
206*54e60f84SAndroid Build Coastguard Worker         return True;
207*54e60f84SAndroid Build Coastguard Worker     } else {
208*54e60f84SAndroid Build Coastguard Worker         return False;
209*54e60f84SAndroid Build Coastguard Worker     }
210*54e60f84SAndroid Build Coastguard Worker }
211*54e60f84SAndroid Build Coastguard Worker 
212*54e60f84SAndroid Build Coastguard Worker 
XNVCTRLQueryVersion(Display * dpy,int * major,int * minor)213*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryVersion(
214*54e60f84SAndroid Build Coastguard Worker     Display *dpy,
215*54e60f84SAndroid Build Coastguard Worker     int *major,
216*54e60f84SAndroid Build Coastguard Worker     int *minor
217*54e60f84SAndroid Build Coastguard Worker )
218*54e60f84SAndroid Build Coastguard Worker {
219*54e60f84SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
220*54e60f84SAndroid Build Coastguard Worker     xnvCtrlQueryExtensionReply rep;
221*54e60f84SAndroid Build Coastguard Worker     xnvCtrlQueryExtensionReq   *req;
222*54e60f84SAndroid Build Coastguard Worker 
223*54e60f84SAndroid Build Coastguard Worker     if (!XextHasExtension(info))
224*54e60f84SAndroid Build Coastguard Worker         return False;
225*54e60f84SAndroid Build Coastguard Worker 
226*54e60f84SAndroid Build Coastguard Worker     XNVCTRLCheckExtension(dpy, info, False);
227*54e60f84SAndroid Build Coastguard Worker 
228*54e60f84SAndroid Build Coastguard Worker     LockDisplay(dpy);
229*54e60f84SAndroid Build Coastguard Worker     GetReq(nvCtrlQueryExtension, req);
230*54e60f84SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
231*54e60f84SAndroid Build Coastguard Worker     req->nvReqType = X_nvCtrlQueryExtension;
232*54e60f84SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) &rep, 0, xTrue)) {
233*54e60f84SAndroid Build Coastguard Worker         UnlockDisplay(dpy);
234*54e60f84SAndroid Build Coastguard Worker         SyncHandle();
235*54e60f84SAndroid Build Coastguard Worker         return False;
236*54e60f84SAndroid Build Coastguard Worker     }
237*54e60f84SAndroid Build Coastguard Worker     if (major) *major = rep.major;
238*54e60f84SAndroid Build Coastguard Worker     if (minor) *minor = rep.minor;
239*54e60f84SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
240*54e60f84SAndroid Build Coastguard Worker     SyncHandle();
241*54e60f84SAndroid Build Coastguard Worker     return True;
242*54e60f84SAndroid Build Coastguard Worker }
243*54e60f84SAndroid Build Coastguard Worker 
244*54e60f84SAndroid Build Coastguard Worker 
XNVCTRLIsNvScreen(Display * dpy,int screen)245*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLIsNvScreen(
246*54e60f84SAndroid Build Coastguard Worker     Display *dpy,
247*54e60f84SAndroid Build Coastguard Worker     int screen
248*54e60f84SAndroid Build Coastguard Worker )
249*54e60f84SAndroid Build Coastguard Worker {
250*54e60f84SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
251*54e60f84SAndroid Build Coastguard Worker     xnvCtrlIsNvReply rep;
252*54e60f84SAndroid Build Coastguard Worker     xnvCtrlIsNvReq   *req;
253*54e60f84SAndroid Build Coastguard Worker     Bool isnv;
254*54e60f84SAndroid Build Coastguard Worker 
255*54e60f84SAndroid Build Coastguard Worker     if (!XextHasExtension(info))
256*54e60f84SAndroid Build Coastguard Worker         return False;
257*54e60f84SAndroid Build Coastguard Worker 
258*54e60f84SAndroid Build Coastguard Worker     XNVCTRLCheckExtension(dpy, info, False);
259*54e60f84SAndroid Build Coastguard Worker 
260*54e60f84SAndroid Build Coastguard Worker     LockDisplay(dpy);
261*54e60f84SAndroid Build Coastguard Worker     GetReq(nvCtrlIsNv, req);
262*54e60f84SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
263*54e60f84SAndroid Build Coastguard Worker     req->nvReqType = X_nvCtrlIsNv;
264*54e60f84SAndroid Build Coastguard Worker     req->screen = screen;
265*54e60f84SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) &rep, 0, xTrue)) {
266*54e60f84SAndroid Build Coastguard Worker         UnlockDisplay(dpy);
267*54e60f84SAndroid Build Coastguard Worker         SyncHandle();
268*54e60f84SAndroid Build Coastguard Worker         return False;
269*54e60f84SAndroid Build Coastguard Worker     }
270*54e60f84SAndroid Build Coastguard Worker     isnv = rep.isnv;
271*54e60f84SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
272*54e60f84SAndroid Build Coastguard Worker     SyncHandle();
273*54e60f84SAndroid Build Coastguard Worker     return isnv;
274*54e60f84SAndroid Build Coastguard Worker }
275*54e60f84SAndroid Build Coastguard Worker 
276*54e60f84SAndroid Build Coastguard Worker 
XNVCTRLQueryTargetStringAttribute(Display * dpy,int target_type,int target_id,unsigned int display_mask,unsigned int attribute,char ** ptr)277*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryTargetStringAttribute(
278*54e60f84SAndroid Build Coastguard Worker     Display *dpy,
279*54e60f84SAndroid Build Coastguard Worker     int target_type,
280*54e60f84SAndroid Build Coastguard Worker     int target_id,
281*54e60f84SAndroid Build Coastguard Worker     unsigned int display_mask,
282*54e60f84SAndroid Build Coastguard Worker     unsigned int attribute,
283*54e60f84SAndroid Build Coastguard Worker     char **ptr
284*54e60f84SAndroid Build Coastguard Worker )
285*54e60f84SAndroid Build Coastguard Worker {
286*54e60f84SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
287*54e60f84SAndroid Build Coastguard Worker     xnvCtrlQueryStringAttributeReply rep;
288*54e60f84SAndroid Build Coastguard Worker     xnvCtrlQueryStringAttributeReq   *req;
289*54e60f84SAndroid Build Coastguard Worker     Bool exists;
290*54e60f84SAndroid Build Coastguard Worker     int length, numbytes, slop;
291*54e60f84SAndroid Build Coastguard Worker 
292*54e60f84SAndroid Build Coastguard Worker     if (!ptr) return False;
293*54e60f84SAndroid Build Coastguard Worker 
294*54e60f84SAndroid Build Coastguard Worker     if (!XextHasExtension(info))
295*54e60f84SAndroid Build Coastguard Worker         return False;
296*54e60f84SAndroid Build Coastguard Worker 
297*54e60f84SAndroid Build Coastguard Worker     XNVCTRLCheckExtension(dpy, info, False);
298*54e60f84SAndroid Build Coastguard Worker     XNVCTRLCheckTargetData(dpy, info, &target_type, &target_id);
299*54e60f84SAndroid Build Coastguard Worker 
300*54e60f84SAndroid Build Coastguard Worker     LockDisplay(dpy);
301*54e60f84SAndroid Build Coastguard Worker     GetReq(nvCtrlQueryStringAttribute, req);
302*54e60f84SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
303*54e60f84SAndroid Build Coastguard Worker     req->nvReqType = X_nvCtrlQueryStringAttribute;
304*54e60f84SAndroid Build Coastguard Worker     req->target_type = target_type;
305*54e60f84SAndroid Build Coastguard Worker     req->target_id = target_id;
306*54e60f84SAndroid Build Coastguard Worker     req->display_mask = display_mask;
307*54e60f84SAndroid Build Coastguard Worker     req->attribute = attribute;
308*54e60f84SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) &rep, 0, False)) {
309*54e60f84SAndroid Build Coastguard Worker         UnlockDisplay(dpy);
310*54e60f84SAndroid Build Coastguard Worker         SyncHandle();
311*54e60f84SAndroid Build Coastguard Worker         return False;
312*54e60f84SAndroid Build Coastguard Worker     }
313*54e60f84SAndroid Build Coastguard Worker     length = rep.length;
314*54e60f84SAndroid Build Coastguard Worker     numbytes = rep.n;
315*54e60f84SAndroid Build Coastguard Worker     slop = numbytes & 3;
316*54e60f84SAndroid Build Coastguard Worker     *ptr = (char *) Xmalloc(numbytes);
317*54e60f84SAndroid Build Coastguard Worker     if (! *ptr) {
318*54e60f84SAndroid Build Coastguard Worker         _XEatData(dpy, length);
319*54e60f84SAndroid Build Coastguard Worker         UnlockDisplay(dpy);
320*54e60f84SAndroid Build Coastguard Worker         SyncHandle();
321*54e60f84SAndroid Build Coastguard Worker         return False;
322*54e60f84SAndroid Build Coastguard Worker     } else {
323*54e60f84SAndroid Build Coastguard Worker         _XRead(dpy, (char *) *ptr, numbytes);
324*54e60f84SAndroid Build Coastguard Worker         if (slop) _XEatData(dpy, 4 - slop);
325*54e60f84SAndroid Build Coastguard Worker     }
326*54e60f84SAndroid Build Coastguard Worker     exists = rep.flags;
327*54e60f84SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
328*54e60f84SAndroid Build Coastguard Worker     SyncHandle();
329*54e60f84SAndroid Build Coastguard Worker     return exists;
330*54e60f84SAndroid Build Coastguard Worker }
331*54e60f84SAndroid Build Coastguard Worker 
XNVCTRLQueryStringAttribute(Display * dpy,int screen,unsigned int display_mask,unsigned int attribute,char ** ptr)332*54e60f84SAndroid Build Coastguard Worker static Bool XNVCTRLQueryStringAttribute(
333*54e60f84SAndroid Build Coastguard Worker     Display *dpy,
334*54e60f84SAndroid Build Coastguard Worker     int screen,
335*54e60f84SAndroid Build Coastguard Worker     unsigned int display_mask,
336*54e60f84SAndroid Build Coastguard Worker     unsigned int attribute,
337*54e60f84SAndroid Build Coastguard Worker     char **ptr
338*54e60f84SAndroid Build Coastguard Worker )
339*54e60f84SAndroid Build Coastguard Worker {
340*54e60f84SAndroid Build Coastguard Worker     return XNVCTRLQueryTargetStringAttribute(dpy, NV_CTRL_TARGET_TYPE_X_SCREEN,
341*54e60f84SAndroid Build Coastguard Worker             screen, display_mask,
342*54e60f84SAndroid Build Coastguard Worker             attribute, ptr);
343*54e60f84SAndroid Build Coastguard Worker }
344*54e60f84SAndroid Build Coastguard Worker 
345*54e60f84SAndroid Build Coastguard Worker 
VA_NVCTRLQueryDirectRenderingCapable(Display * dpy,int screen,Bool * isCapable)346*54e60f84SAndroid Build Coastguard Worker static Bool VA_NVCTRLQueryDirectRenderingCapable(Display *dpy, int screen,
347*54e60f84SAndroid Build Coastguard Worker         Bool *isCapable)
348*54e60f84SAndroid Build Coastguard Worker {
349*54e60f84SAndroid Build Coastguard Worker     int event_base;
350*54e60f84SAndroid Build Coastguard Worker     int error_base;
351*54e60f84SAndroid Build Coastguard Worker 
352*54e60f84SAndroid Build Coastguard Worker     if (isCapable)
353*54e60f84SAndroid Build Coastguard Worker         *isCapable = False;
354*54e60f84SAndroid Build Coastguard Worker 
355*54e60f84SAndroid Build Coastguard Worker     if (!XNVCTRLQueryExtension(dpy, &event_base, &error_base))
356*54e60f84SAndroid Build Coastguard Worker         return False;
357*54e60f84SAndroid Build Coastguard Worker 
358*54e60f84SAndroid Build Coastguard Worker     if (isCapable && XNVCTRLIsNvScreen(dpy, screen))
359*54e60f84SAndroid Build Coastguard Worker         *isCapable = True;
360*54e60f84SAndroid Build Coastguard Worker 
361*54e60f84SAndroid Build Coastguard Worker     return True;
362*54e60f84SAndroid Build Coastguard Worker }
363*54e60f84SAndroid Build Coastguard Worker 
VA_NVCTRLGetClientDriverName(Display * dpy,int screen,char ** clientDriverName)364*54e60f84SAndroid Build Coastguard Worker static Bool VA_NVCTRLGetClientDriverName(Display *dpy, int screen,
365*54e60f84SAndroid Build Coastguard Worker         char **clientDriverName)
366*54e60f84SAndroid Build Coastguard Worker {
367*54e60f84SAndroid Build Coastguard Worker     int ddxDriverMajorVersion, ddxDriverMinorVersion, ddxDriverPatchVersion;
368*54e60f84SAndroid Build Coastguard Worker 
369*54e60f84SAndroid Build Coastguard Worker     char *nvidia_driver_version = NULL;
370*54e60f84SAndroid Build Coastguard Worker     if (!XNVCTRLQueryStringAttribute(dpy, screen, 0, NV_CTRL_STRING_NVIDIA_DRIVER_VERSION, &nvidia_driver_version))
371*54e60f84SAndroid Build Coastguard Worker         return False;
372*54e60f84SAndroid Build Coastguard Worker 
373*54e60f84SAndroid Build Coastguard Worker     char *end, *str = nvidia_driver_version;
374*54e60f84SAndroid Build Coastguard Worker     unsigned long v = strtoul(str, &end, 10);
375*54e60f84SAndroid Build Coastguard Worker     if (end && end != str) {
376*54e60f84SAndroid Build Coastguard Worker         ddxDriverMajorVersion = v;
377*54e60f84SAndroid Build Coastguard Worker         if (*(str = end) == '.') {
378*54e60f84SAndroid Build Coastguard Worker             v = strtoul(str + 1, &end, 10);
379*54e60f84SAndroid Build Coastguard Worker             if (end && end != str && (*end == '.' || *end == '\0')) {
380*54e60f84SAndroid Build Coastguard Worker                 ddxDriverMinorVersion = v;
381*54e60f84SAndroid Build Coastguard Worker                 if (*(str = end) == '.') {
382*54e60f84SAndroid Build Coastguard Worker                     v = strtoul(str + 1, &end, 10);
383*54e60f84SAndroid Build Coastguard Worker                     if (end && end != str && *end == '\0') {
384*54e60f84SAndroid Build Coastguard Worker                         ddxDriverPatchVersion = v;
385*54e60f84SAndroid Build Coastguard Worker                     }
386*54e60f84SAndroid Build Coastguard Worker                 }
387*54e60f84SAndroid Build Coastguard Worker             }
388*54e60f84SAndroid Build Coastguard Worker         }
389*54e60f84SAndroid Build Coastguard Worker     }
390*54e60f84SAndroid Build Coastguard Worker     Xfree(nvidia_driver_version);
391*54e60f84SAndroid Build Coastguard Worker     (void) ddxDriverMajorVersion;
392*54e60f84SAndroid Build Coastguard Worker     (void) ddxDriverMinorVersion;
393*54e60f84SAndroid Build Coastguard Worker     (void) ddxDriverPatchVersion;
394*54e60f84SAndroid Build Coastguard Worker 
395*54e60f84SAndroid Build Coastguard Worker     *clientDriverName = strdup("nvidia");
396*54e60f84SAndroid Build Coastguard Worker 
397*54e60f84SAndroid Build Coastguard Worker     return True;
398*54e60f84SAndroid Build Coastguard Worker }
399*54e60f84SAndroid Build Coastguard Worker 
va_NVCTRL_GetDriverNames(VADisplayContextP pDisplayContext,char ** drivers,unsigned * num_drivers)400*54e60f84SAndroid Build Coastguard Worker VAStatus va_NVCTRL_GetDriverNames(
401*54e60f84SAndroid Build Coastguard Worker     VADisplayContextP pDisplayContext,
402*54e60f84SAndroid Build Coastguard Worker     char **drivers,
403*54e60f84SAndroid Build Coastguard Worker     unsigned *num_drivers
404*54e60f84SAndroid Build Coastguard Worker )
405*54e60f84SAndroid Build Coastguard Worker {
406*54e60f84SAndroid Build Coastguard Worker     VADriverContextP ctx = pDisplayContext->pDriverContext;
407*54e60f84SAndroid Build Coastguard Worker     int direct_capable;
408*54e60f84SAndroid Build Coastguard Worker 
409*54e60f84SAndroid Build Coastguard Worker     if (!VA_NVCTRLQueryDirectRenderingCapable(ctx->native_dpy, ctx->x11_screen,
410*54e60f84SAndroid Build Coastguard Worker             &direct_capable) || !direct_capable)
411*54e60f84SAndroid Build Coastguard Worker         return VA_STATUS_ERROR_UNKNOWN;
412*54e60f84SAndroid Build Coastguard Worker 
413*54e60f84SAndroid Build Coastguard Worker     if (!VA_NVCTRLGetClientDriverName(ctx->native_dpy, ctx->x11_screen,
414*54e60f84SAndroid Build Coastguard Worker                                       drivers))
415*54e60f84SAndroid Build Coastguard Worker         return VA_STATUS_ERROR_UNKNOWN;
416*54e60f84SAndroid Build Coastguard Worker 
417*54e60f84SAndroid Build Coastguard Worker     *num_drivers = 1;
418*54e60f84SAndroid Build Coastguard Worker     return VA_STATUS_SUCCESS;
419*54e60f84SAndroid Build Coastguard Worker }
420*54e60f84SAndroid Build Coastguard Worker 
421*54e60f84SAndroid Build Coastguard Worker #endif
422