1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * Copyright © 2008 Red Hat, Inc.
3*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2023 Emil Velikov
4*54e60f84SAndroid Build Coastguard Worker *
5*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Soft-
7*54e60f84SAndroid Build Coastguard Worker * ware"), to deal in the Software without restriction, including without
8*54e60f84SAndroid Build Coastguard Worker * limitation the rights to use, copy, modify, merge, publish, distribute,
9*54e60f84SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*54e60f84SAndroid Build Coastguard Worker * Software is furnished to do so, provided that the above copyright
11*54e60f84SAndroid Build Coastguard Worker * notice(s) and this permission notice appear in all copies of the Soft-
12*54e60f84SAndroid Build Coastguard Worker * ware and that both the above copyright notice(s) and this permission
13*54e60f84SAndroid Build Coastguard Worker * notice appear in supporting documentation.
14*54e60f84SAndroid Build Coastguard Worker *
15*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17*54e60f84SAndroid Build Coastguard Worker * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
18*54e60f84SAndroid Build Coastguard Worker * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
19*54e60f84SAndroid Build Coastguard Worker * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
20*54e60f84SAndroid Build Coastguard Worker * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21*54e60f84SAndroid Build Coastguard Worker * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
22*54e60f84SAndroid Build Coastguard Worker * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
23*54e60f84SAndroid Build Coastguard Worker * MANCE OF THIS SOFTWARE.
24*54e60f84SAndroid Build Coastguard Worker *
25*54e60f84SAndroid Build Coastguard Worker * Except as contained in this notice, the name of a copyright holder shall
26*54e60f84SAndroid Build Coastguard Worker * not be used in advertising or otherwise to promote the sale, use or
27*54e60f84SAndroid Build Coastguard Worker * other dealings in this Software without prior written authorization of
28*54e60f84SAndroid Build Coastguard Worker * the copyright holder.
29*54e60f84SAndroid Build Coastguard Worker *
30*54e60f84SAndroid Build Coastguard Worker * Authors:
31*54e60f84SAndroid Build Coastguard Worker * Kristian Høgsberg ([email protected])
32*54e60f84SAndroid Build Coastguard Worker */
33*54e60f84SAndroid Build Coastguard Worker
34*54e60f84SAndroid Build Coastguard Worker
35*54e60f84SAndroid Build Coastguard Worker #define NEED_REPLIES
36*54e60f84SAndroid Build Coastguard Worker #include <X11/Xlibint.h>
37*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/Xext.h>
38*54e60f84SAndroid Build Coastguard Worker #include <X11/extensions/extutil.h>
39*54e60f84SAndroid Build Coastguard Worker #include "xf86drm.h"
40*54e60f84SAndroid Build Coastguard Worker #include "va_dri2.h"
41*54e60f84SAndroid Build Coastguard Worker #include "va_dri2_priv.h"
42*54e60f84SAndroid Build Coastguard Worker #include "va_dricommon.h"
43*54e60f84SAndroid Build Coastguard Worker #include "va_dri2str.h"
44*54e60f84SAndroid Build Coastguard Worker #include "va_dri2tokens.h"
45*54e60f84SAndroid Build Coastguard Worker
46*54e60f84SAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
47*54e60f84SAndroid Build Coastguard Worker
48*54e60f84SAndroid Build Coastguard Worker #ifndef DRI2DriverDRI
49*54e60f84SAndroid Build Coastguard Worker #define DRI2DriverDRI 0
50*54e60f84SAndroid Build Coastguard Worker #endif
51*54e60f84SAndroid Build Coastguard Worker
52*54e60f84SAndroid Build Coastguard Worker static int
53*54e60f84SAndroid Build Coastguard Worker VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code);
54*54e60f84SAndroid Build Coastguard Worker
55*54e60f84SAndroid Build Coastguard Worker static VA_DRI2Buffer *
56*54e60f84SAndroid Build Coastguard Worker VA_DRI2GetBuffers_internal(XExtDisplayInfo *info,
57*54e60f84SAndroid Build Coastguard Worker Display *dpy, XID drawable,
58*54e60f84SAndroid Build Coastguard Worker int *width, int *height,
59*54e60f84SAndroid Build Coastguard Worker unsigned int *attachments,
60*54e60f84SAndroid Build Coastguard Worker int count,
61*54e60f84SAndroid Build Coastguard Worker int *outCount);
62*54e60f84SAndroid Build Coastguard Worker
63*54e60f84SAndroid Build Coastguard Worker static char va_dri2ExtensionName[] = DRI2_NAME;
64*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo _va_dri2_info_data;
65*54e60f84SAndroid Build Coastguard Worker static XExtensionInfo *va_dri2Info = &_va_dri2_info_data;
66*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_CLOSE_DISPLAY(VA_DRI2CloseDisplay, va_dri2Info)
67*54e60f84SAndroid Build Coastguard Worker static /* const */ XExtensionHooks va_dri2ExtensionHooks = {
68*54e60f84SAndroid Build Coastguard Worker NULL, /* create_gc */
69*54e60f84SAndroid Build Coastguard Worker NULL, /* copy_gc */
70*54e60f84SAndroid Build Coastguard Worker NULL, /* flush_gc */
71*54e60f84SAndroid Build Coastguard Worker NULL, /* free_gc */
72*54e60f84SAndroid Build Coastguard Worker NULL, /* create_font */
73*54e60f84SAndroid Build Coastguard Worker NULL, /* free_font */
74*54e60f84SAndroid Build Coastguard Worker VA_DRI2CloseDisplay, /* close_display */
75*54e60f84SAndroid Build Coastguard Worker NULL, /* wire_to_event */
76*54e60f84SAndroid Build Coastguard Worker NULL, /* event_to_wire */
77*54e60f84SAndroid Build Coastguard Worker VA_DRI2Error, /* error */
78*54e60f84SAndroid Build Coastguard Worker NULL, /* error_string */
79*54e60f84SAndroid Build Coastguard Worker };
80*54e60f84SAndroid Build Coastguard Worker
81*54e60f84SAndroid Build Coastguard Worker static XEXT_GENERATE_FIND_DISPLAY(DRI2FindDisplay, va_dri2Info,
82*54e60f84SAndroid Build Coastguard Worker va_dri2ExtensionName,
83*54e60f84SAndroid Build Coastguard Worker &va_dri2ExtensionHooks,
84*54e60f84SAndroid Build Coastguard Worker 0, NULL)
85*54e60f84SAndroid Build Coastguard Worker
86*54e60f84SAndroid Build Coastguard Worker static CARD32 _va_resource_x_error_drawable = 0;
87*54e60f84SAndroid Build Coastguard Worker static Bool _va_resource_x_error_matched = False;
88*54e60f84SAndroid Build Coastguard Worker
89*54e60f84SAndroid Build Coastguard Worker #define VA_EnterResourceError(drawable) \
90*54e60f84SAndroid Build Coastguard Worker do { \
91*54e60f84SAndroid Build Coastguard Worker _va_resource_x_error_drawable = (drawable); \
92*54e60f84SAndroid Build Coastguard Worker _va_resource_x_error_matched = False; \
93*54e60f84SAndroid Build Coastguard Worker } while (0)
94*54e60f84SAndroid Build Coastguard Worker
95*54e60f84SAndroid Build Coastguard Worker #define VA_LeaveResourceError() \
96*54e60f84SAndroid Build Coastguard Worker do { \
97*54e60f84SAndroid Build Coastguard Worker _va_resource_x_error_drawable = 0; \
98*54e60f84SAndroid Build Coastguard Worker } while (0)
99*54e60f84SAndroid Build Coastguard Worker
100*54e60f84SAndroid Build Coastguard Worker #define VA_ResourceErrorMatched() \
101*54e60f84SAndroid Build Coastguard Worker (_va_resource_x_error_matched)
102*54e60f84SAndroid Build Coastguard Worker
103*54e60f84SAndroid Build Coastguard Worker static int
VA_DRI2Error(Display * dpy,xError * err,XExtCodes * codes,int * ret_code)104*54e60f84SAndroid Build Coastguard Worker VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code)
105*54e60f84SAndroid Build Coastguard Worker {
106*54e60f84SAndroid Build Coastguard Worker if (_va_resource_x_error_drawable == err->resourceID) {
107*54e60f84SAndroid Build Coastguard Worker _va_resource_x_error_matched = True;
108*54e60f84SAndroid Build Coastguard Worker return True;
109*54e60f84SAndroid Build Coastguard Worker }
110*54e60f84SAndroid Build Coastguard Worker
111*54e60f84SAndroid Build Coastguard Worker return False;
112*54e60f84SAndroid Build Coastguard Worker }
113*54e60f84SAndroid Build Coastguard Worker
VA_DRI2QueryExtension(Display * dpy,int * eventBase,int * errorBase)114*54e60f84SAndroid Build Coastguard Worker Bool VA_DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
115*54e60f84SAndroid Build Coastguard Worker {
116*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
117*54e60f84SAndroid Build Coastguard Worker
118*54e60f84SAndroid Build Coastguard Worker if (XextHasExtension(info)) {
119*54e60f84SAndroid Build Coastguard Worker *eventBase = info->codes->first_event;
120*54e60f84SAndroid Build Coastguard Worker *errorBase = info->codes->first_error;
121*54e60f84SAndroid Build Coastguard Worker return True;
122*54e60f84SAndroid Build Coastguard Worker }
123*54e60f84SAndroid Build Coastguard Worker
124*54e60f84SAndroid Build Coastguard Worker return False;
125*54e60f84SAndroid Build Coastguard Worker }
126*54e60f84SAndroid Build Coastguard Worker
VA_DRI2QueryVersion(Display * dpy,int * major,int * minor)127*54e60f84SAndroid Build Coastguard Worker Bool VA_DRI2QueryVersion(Display *dpy, int *major, int *minor)
128*54e60f84SAndroid Build Coastguard Worker {
129*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
130*54e60f84SAndroid Build Coastguard Worker xDRI2QueryVersionReply rep;
131*54e60f84SAndroid Build Coastguard Worker xDRI2QueryVersionReq *req;
132*54e60f84SAndroid Build Coastguard Worker
133*54e60f84SAndroid Build Coastguard Worker XextCheckExtension(dpy, info, va_dri2ExtensionName, False);
134*54e60f84SAndroid Build Coastguard Worker
135*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
136*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2QueryVersion, req);
137*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
138*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2QueryVersion;
139*54e60f84SAndroid Build Coastguard Worker req->majorVersion = DRI2_MAJOR;
140*54e60f84SAndroid Build Coastguard Worker req->minorVersion = DRI2_MINOR;
141*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
142*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
143*54e60f84SAndroid Build Coastguard Worker SyncHandle();
144*54e60f84SAndroid Build Coastguard Worker return False;
145*54e60f84SAndroid Build Coastguard Worker }
146*54e60f84SAndroid Build Coastguard Worker *major = rep.majorVersion;
147*54e60f84SAndroid Build Coastguard Worker *minor = rep.minorVersion;
148*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
149*54e60f84SAndroid Build Coastguard Worker SyncHandle();
150*54e60f84SAndroid Build Coastguard Worker
151*54e60f84SAndroid Build Coastguard Worker return True;
152*54e60f84SAndroid Build Coastguard Worker }
153*54e60f84SAndroid Build Coastguard Worker
VA_DRI2Connect(Display * dpy,XID window,char ** driverName,char ** deviceName)154*54e60f84SAndroid Build Coastguard Worker Bool VA_DRI2Connect(Display *dpy, XID window,
155*54e60f84SAndroid Build Coastguard Worker char **driverName, char **deviceName)
156*54e60f84SAndroid Build Coastguard Worker {
157*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
158*54e60f84SAndroid Build Coastguard Worker xDRI2ConnectReply rep;
159*54e60f84SAndroid Build Coastguard Worker xDRI2ConnectReq *req;
160*54e60f84SAndroid Build Coastguard Worker
161*54e60f84SAndroid Build Coastguard Worker XextCheckExtension(dpy, info, va_dri2ExtensionName, False);
162*54e60f84SAndroid Build Coastguard Worker
163*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
164*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2Connect, req);
165*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
166*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2Connect;
167*54e60f84SAndroid Build Coastguard Worker req->window = window;
168*54e60f84SAndroid Build Coastguard Worker req->driverType = DRI2DriverDRI;
169*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
170*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
171*54e60f84SAndroid Build Coastguard Worker SyncHandle();
172*54e60f84SAndroid Build Coastguard Worker return False;
173*54e60f84SAndroid Build Coastguard Worker }
174*54e60f84SAndroid Build Coastguard Worker
175*54e60f84SAndroid Build Coastguard Worker if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) {
176*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
177*54e60f84SAndroid Build Coastguard Worker SyncHandle();
178*54e60f84SAndroid Build Coastguard Worker return False;
179*54e60f84SAndroid Build Coastguard Worker }
180*54e60f84SAndroid Build Coastguard Worker
181*54e60f84SAndroid Build Coastguard Worker *driverName = Xmalloc(rep.driverNameLength + 1);
182*54e60f84SAndroid Build Coastguard Worker if (*driverName == NULL) {
183*54e60f84SAndroid Build Coastguard Worker _XEatData(dpy,
184*54e60f84SAndroid Build Coastguard Worker ((rep.driverNameLength + 3) & ~3) +
185*54e60f84SAndroid Build Coastguard Worker ((rep.deviceNameLength + 3) & ~3));
186*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
187*54e60f84SAndroid Build Coastguard Worker SyncHandle();
188*54e60f84SAndroid Build Coastguard Worker return False;
189*54e60f84SAndroid Build Coastguard Worker }
190*54e60f84SAndroid Build Coastguard Worker _XReadPad(dpy, *driverName, rep.driverNameLength);
191*54e60f84SAndroid Build Coastguard Worker (*driverName)[rep.driverNameLength] = '\0';
192*54e60f84SAndroid Build Coastguard Worker
193*54e60f84SAndroid Build Coastguard Worker *deviceName = Xmalloc(rep.deviceNameLength + 1);
194*54e60f84SAndroid Build Coastguard Worker if (*deviceName == NULL) {
195*54e60f84SAndroid Build Coastguard Worker Xfree(*driverName);
196*54e60f84SAndroid Build Coastguard Worker _XEatData(dpy, ((rep.deviceNameLength + 3) & ~3));
197*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
198*54e60f84SAndroid Build Coastguard Worker SyncHandle();
199*54e60f84SAndroid Build Coastguard Worker return False;
200*54e60f84SAndroid Build Coastguard Worker }
201*54e60f84SAndroid Build Coastguard Worker _XReadPad(dpy, *deviceName, rep.deviceNameLength);
202*54e60f84SAndroid Build Coastguard Worker (*deviceName)[rep.deviceNameLength] = '\0';
203*54e60f84SAndroid Build Coastguard Worker
204*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
205*54e60f84SAndroid Build Coastguard Worker SyncHandle();
206*54e60f84SAndroid Build Coastguard Worker
207*54e60f84SAndroid Build Coastguard Worker return True;
208*54e60f84SAndroid Build Coastguard Worker }
209*54e60f84SAndroid Build Coastguard Worker
VA_DRI2Authenticate(Display * dpy,XID window,drm_magic_t magic)210*54e60f84SAndroid Build Coastguard Worker Bool VA_DRI2Authenticate(Display *dpy, XID window, drm_magic_t magic)
211*54e60f84SAndroid Build Coastguard Worker {
212*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
213*54e60f84SAndroid Build Coastguard Worker xDRI2AuthenticateReq *req;
214*54e60f84SAndroid Build Coastguard Worker xDRI2AuthenticateReply rep;
215*54e60f84SAndroid Build Coastguard Worker
216*54e60f84SAndroid Build Coastguard Worker XextCheckExtension(dpy, info, va_dri2ExtensionName, False);
217*54e60f84SAndroid Build Coastguard Worker
218*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
219*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2Authenticate, req);
220*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
221*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2Authenticate;
222*54e60f84SAndroid Build Coastguard Worker req->window = window;
223*54e60f84SAndroid Build Coastguard Worker req->magic = magic;
224*54e60f84SAndroid Build Coastguard Worker
225*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
226*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
227*54e60f84SAndroid Build Coastguard Worker SyncHandle();
228*54e60f84SAndroid Build Coastguard Worker return False;
229*54e60f84SAndroid Build Coastguard Worker }
230*54e60f84SAndroid Build Coastguard Worker
231*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
232*54e60f84SAndroid Build Coastguard Worker SyncHandle();
233*54e60f84SAndroid Build Coastguard Worker
234*54e60f84SAndroid Build Coastguard Worker return rep.authenticated;
235*54e60f84SAndroid Build Coastguard Worker }
236*54e60f84SAndroid Build Coastguard Worker
VA_DRI2CreateDrawable(Display * dpy,XID drawable)237*54e60f84SAndroid Build Coastguard Worker void VA_DRI2CreateDrawable(Display *dpy, XID drawable)
238*54e60f84SAndroid Build Coastguard Worker {
239*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
240*54e60f84SAndroid Build Coastguard Worker xDRI2CreateDrawableReq *req;
241*54e60f84SAndroid Build Coastguard Worker
242*54e60f84SAndroid Build Coastguard Worker XextSimpleCheckExtension(dpy, info, va_dri2ExtensionName);
243*54e60f84SAndroid Build Coastguard Worker
244*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
245*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2CreateDrawable, req);
246*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
247*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2CreateDrawable;
248*54e60f84SAndroid Build Coastguard Worker req->drawable = drawable;
249*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
250*54e60f84SAndroid Build Coastguard Worker SyncHandle();
251*54e60f84SAndroid Build Coastguard Worker }
252*54e60f84SAndroid Build Coastguard Worker
VA_DRI2DestroyDrawable(Display * dpy,XID drawable)253*54e60f84SAndroid Build Coastguard Worker void VA_DRI2DestroyDrawable(Display *dpy, XID drawable)
254*54e60f84SAndroid Build Coastguard Worker {
255*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
256*54e60f84SAndroid Build Coastguard Worker xDRI2DestroyDrawableReq *req;
257*54e60f84SAndroid Build Coastguard Worker unsigned int attachement = 0; // FRONT_LEFT
258*54e60f84SAndroid Build Coastguard Worker VA_DRI2Buffer *buffers;
259*54e60f84SAndroid Build Coastguard Worker
260*54e60f84SAndroid Build Coastguard Worker XextSimpleCheckExtension(dpy, info, va_dri2ExtensionName);
261*54e60f84SAndroid Build Coastguard Worker
262*54e60f84SAndroid Build Coastguard Worker XSync(dpy, False);
263*54e60f84SAndroid Build Coastguard Worker
264*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
265*54e60f84SAndroid Build Coastguard Worker /*
266*54e60f84SAndroid Build Coastguard Worker * We have no way of catching DRI2DestroyDrawable errors because
267*54e60f84SAndroid Build Coastguard Worker * this message doesn't have a defined answer. So we test whether
268*54e60f84SAndroid Build Coastguard Worker * the drawable is still alive by sending DRIGetBuffers first and
269*54e60f84SAndroid Build Coastguard Worker * checking whether we get an error.
270*54e60f84SAndroid Build Coastguard Worker */
271*54e60f84SAndroid Build Coastguard Worker VA_EnterResourceError(drawable);
272*54e60f84SAndroid Build Coastguard Worker
273*54e60f84SAndroid Build Coastguard Worker buffers = VA_DRI2GetBuffers_internal(info, dpy, drawable,
274*54e60f84SAndroid Build Coastguard Worker NULL, NULL,
275*54e60f84SAndroid Build Coastguard Worker &attachement, 1, NULL);
276*54e60f84SAndroid Build Coastguard Worker VA_LeaveResourceError();
277*54e60f84SAndroid Build Coastguard Worker if (buffers)
278*54e60f84SAndroid Build Coastguard Worker XFree(buffers);
279*54e60f84SAndroid Build Coastguard Worker if (VA_ResourceErrorMatched()) {
280*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
281*54e60f84SAndroid Build Coastguard Worker SyncHandle();
282*54e60f84SAndroid Build Coastguard Worker return;
283*54e60f84SAndroid Build Coastguard Worker }
284*54e60f84SAndroid Build Coastguard Worker
285*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2DestroyDrawable, req);
286*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
287*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2DestroyDrawable;
288*54e60f84SAndroid Build Coastguard Worker req->drawable = drawable;
289*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
290*54e60f84SAndroid Build Coastguard Worker SyncHandle();
291*54e60f84SAndroid Build Coastguard Worker }
292*54e60f84SAndroid Build Coastguard Worker
VA_DRI2GetBuffers_internal(XExtDisplayInfo * info,Display * dpy,XID drawable,int * width,int * height,unsigned int * attachments,int count,int * outCount)293*54e60f84SAndroid Build Coastguard Worker VA_DRI2Buffer *VA_DRI2GetBuffers_internal(XExtDisplayInfo *info,
294*54e60f84SAndroid Build Coastguard Worker Display *dpy, XID drawable,
295*54e60f84SAndroid Build Coastguard Worker int *width, int *height,
296*54e60f84SAndroid Build Coastguard Worker unsigned int *attachments, int count,
297*54e60f84SAndroid Build Coastguard Worker int *outCount)
298*54e60f84SAndroid Build Coastguard Worker {
299*54e60f84SAndroid Build Coastguard Worker xDRI2GetBuffersReply rep;
300*54e60f84SAndroid Build Coastguard Worker xDRI2GetBuffersReq *req;
301*54e60f84SAndroid Build Coastguard Worker VA_DRI2Buffer *buffers;
302*54e60f84SAndroid Build Coastguard Worker xDRI2Buffer repBuffer;
303*54e60f84SAndroid Build Coastguard Worker CARD32 *p;
304*54e60f84SAndroid Build Coastguard Worker int i;
305*54e60f84SAndroid Build Coastguard Worker
306*54e60f84SAndroid Build Coastguard Worker GetReqExtra(DRI2GetBuffers, count * 4, req);
307*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
308*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2GetBuffers;
309*54e60f84SAndroid Build Coastguard Worker req->drawable = drawable;
310*54e60f84SAndroid Build Coastguard Worker req->count = count;
311*54e60f84SAndroid Build Coastguard Worker p = (CARD32 *) &req[1];
312*54e60f84SAndroid Build Coastguard Worker for (i = 0; i < count; i++)
313*54e60f84SAndroid Build Coastguard Worker p[i] = attachments[i];
314*54e60f84SAndroid Build Coastguard Worker
315*54e60f84SAndroid Build Coastguard Worker if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
316*54e60f84SAndroid Build Coastguard Worker return NULL;
317*54e60f84SAndroid Build Coastguard Worker }
318*54e60f84SAndroid Build Coastguard Worker
319*54e60f84SAndroid Build Coastguard Worker if (width)
320*54e60f84SAndroid Build Coastguard Worker *width = rep.width;
321*54e60f84SAndroid Build Coastguard Worker if (height)
322*54e60f84SAndroid Build Coastguard Worker *height = rep.height;
323*54e60f84SAndroid Build Coastguard Worker if (outCount)
324*54e60f84SAndroid Build Coastguard Worker *outCount = rep.count;
325*54e60f84SAndroid Build Coastguard Worker
326*54e60f84SAndroid Build Coastguard Worker buffers = Xmalloc(rep.count * sizeof buffers[0]);
327*54e60f84SAndroid Build Coastguard Worker if (buffers == NULL) {
328*54e60f84SAndroid Build Coastguard Worker _XEatData(dpy, rep.count * sizeof repBuffer);
329*54e60f84SAndroid Build Coastguard Worker return NULL;
330*54e60f84SAndroid Build Coastguard Worker }
331*54e60f84SAndroid Build Coastguard Worker
332*54e60f84SAndroid Build Coastguard Worker for (i = 0; i < rep.count; i++) {
333*54e60f84SAndroid Build Coastguard Worker _XReadPad(dpy, (char *) &repBuffer, sizeof repBuffer);
334*54e60f84SAndroid Build Coastguard Worker buffers[i].attachment = repBuffer.attachment;
335*54e60f84SAndroid Build Coastguard Worker buffers[i].name = repBuffer.name;
336*54e60f84SAndroid Build Coastguard Worker buffers[i].pitch = repBuffer.pitch;
337*54e60f84SAndroid Build Coastguard Worker buffers[i].cpp = repBuffer.cpp;
338*54e60f84SAndroid Build Coastguard Worker buffers[i].flags = repBuffer.flags;
339*54e60f84SAndroid Build Coastguard Worker }
340*54e60f84SAndroid Build Coastguard Worker
341*54e60f84SAndroid Build Coastguard Worker return buffers;
342*54e60f84SAndroid Build Coastguard Worker }
343*54e60f84SAndroid Build Coastguard Worker
VA_DRI2GetBuffers(Display * dpy,XID drawable,int * width,int * height,unsigned int * attachments,int count,int * outCount)344*54e60f84SAndroid Build Coastguard Worker VA_DRI2Buffer *VA_DRI2GetBuffers(Display *dpy, XID drawable,
345*54e60f84SAndroid Build Coastguard Worker int *width, int *height,
346*54e60f84SAndroid Build Coastguard Worker unsigned int *attachments, int count,
347*54e60f84SAndroid Build Coastguard Worker int *outCount)
348*54e60f84SAndroid Build Coastguard Worker {
349*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
350*54e60f84SAndroid Build Coastguard Worker VA_DRI2Buffer *buffers;
351*54e60f84SAndroid Build Coastguard Worker
352*54e60f84SAndroid Build Coastguard Worker XextCheckExtension(dpy, info, va_dri2ExtensionName, False);
353*54e60f84SAndroid Build Coastguard Worker
354*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
355*54e60f84SAndroid Build Coastguard Worker
356*54e60f84SAndroid Build Coastguard Worker buffers = VA_DRI2GetBuffers_internal(info, dpy, drawable, width, height,
357*54e60f84SAndroid Build Coastguard Worker attachments, count, outCount);
358*54e60f84SAndroid Build Coastguard Worker
359*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
360*54e60f84SAndroid Build Coastguard Worker SyncHandle();
361*54e60f84SAndroid Build Coastguard Worker
362*54e60f84SAndroid Build Coastguard Worker return buffers;
363*54e60f84SAndroid Build Coastguard Worker }
364*54e60f84SAndroid Build Coastguard Worker
VA_DRI2CopyRegion(Display * dpy,XID drawable,XserverRegion region,CARD32 dest,CARD32 src)365*54e60f84SAndroid Build Coastguard Worker void VA_DRI2CopyRegion(Display *dpy, XID drawable, XserverRegion region,
366*54e60f84SAndroid Build Coastguard Worker CARD32 dest, CARD32 src)
367*54e60f84SAndroid Build Coastguard Worker {
368*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
369*54e60f84SAndroid Build Coastguard Worker xDRI2CopyRegionReq *req;
370*54e60f84SAndroid Build Coastguard Worker xDRI2CopyRegionReply rep;
371*54e60f84SAndroid Build Coastguard Worker
372*54e60f84SAndroid Build Coastguard Worker XextSimpleCheckExtension(dpy, info, va_dri2ExtensionName);
373*54e60f84SAndroid Build Coastguard Worker
374*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
375*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2CopyRegion, req);
376*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
377*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2CopyRegion;
378*54e60f84SAndroid Build Coastguard Worker req->drawable = drawable;
379*54e60f84SAndroid Build Coastguard Worker req->region = region;
380*54e60f84SAndroid Build Coastguard Worker req->dest = dest;
381*54e60f84SAndroid Build Coastguard Worker req->src = src;
382*54e60f84SAndroid Build Coastguard Worker
383*54e60f84SAndroid Build Coastguard Worker _XReply(dpy, (xReply *)&rep, 0, xFalse);
384*54e60f84SAndroid Build Coastguard Worker
385*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
386*54e60f84SAndroid Build Coastguard Worker SyncHandle();
387*54e60f84SAndroid Build Coastguard Worker }
388*54e60f84SAndroid Build Coastguard Worker
389*54e60f84SAndroid Build Coastguard Worker static void
load_swap_req(xDRI2SwapBuffersReq * req,CARD64 target,CARD64 divisor,CARD64 remainder)390*54e60f84SAndroid Build Coastguard Worker load_swap_req(xDRI2SwapBuffersReq *req, CARD64 target, CARD64 divisor,
391*54e60f84SAndroid Build Coastguard Worker CARD64 remainder)
392*54e60f84SAndroid Build Coastguard Worker {
393*54e60f84SAndroid Build Coastguard Worker req->target_msc_hi = target >> 32;
394*54e60f84SAndroid Build Coastguard Worker req->target_msc_lo = target & 0xffffffff;
395*54e60f84SAndroid Build Coastguard Worker req->divisor_hi = divisor >> 32;
396*54e60f84SAndroid Build Coastguard Worker req->divisor_lo = divisor & 0xffffffff;
397*54e60f84SAndroid Build Coastguard Worker req->remainder_hi = remainder >> 32;
398*54e60f84SAndroid Build Coastguard Worker req->remainder_lo = remainder & 0xffffffff;
399*54e60f84SAndroid Build Coastguard Worker }
400*54e60f84SAndroid Build Coastguard Worker
401*54e60f84SAndroid Build Coastguard Worker static CARD64
vals_to_card64(CARD32 lo,CARD32 hi)402*54e60f84SAndroid Build Coastguard Worker vals_to_card64(CARD32 lo, CARD32 hi)
403*54e60f84SAndroid Build Coastguard Worker {
404*54e60f84SAndroid Build Coastguard Worker return (CARD64)hi << 32 | lo;
405*54e60f84SAndroid Build Coastguard Worker }
406*54e60f84SAndroid Build Coastguard Worker
VA_DRI2SwapBuffers(Display * dpy,XID drawable,CARD64 target_msc,CARD64 divisor,CARD64 remainder,CARD64 * count)407*54e60f84SAndroid Build Coastguard Worker void VA_DRI2SwapBuffers(Display *dpy, XID drawable, CARD64 target_msc,
408*54e60f84SAndroid Build Coastguard Worker CARD64 divisor, CARD64 remainder, CARD64 *count)
409*54e60f84SAndroid Build Coastguard Worker {
410*54e60f84SAndroid Build Coastguard Worker XExtDisplayInfo *info = DRI2FindDisplay(dpy);
411*54e60f84SAndroid Build Coastguard Worker xDRI2SwapBuffersReq *req;
412*54e60f84SAndroid Build Coastguard Worker xDRI2SwapBuffersReply rep;
413*54e60f84SAndroid Build Coastguard Worker
414*54e60f84SAndroid Build Coastguard Worker XextSimpleCheckExtension(dpy, info, va_dri2ExtensionName);
415*54e60f84SAndroid Build Coastguard Worker
416*54e60f84SAndroid Build Coastguard Worker LockDisplay(dpy);
417*54e60f84SAndroid Build Coastguard Worker GetReq(DRI2SwapBuffers, req);
418*54e60f84SAndroid Build Coastguard Worker req->reqType = info->codes->major_opcode;
419*54e60f84SAndroid Build Coastguard Worker req->dri2ReqType = X_DRI2SwapBuffers;
420*54e60f84SAndroid Build Coastguard Worker req->drawable = drawable;
421*54e60f84SAndroid Build Coastguard Worker load_swap_req(req, target_msc, divisor, remainder);
422*54e60f84SAndroid Build Coastguard Worker
423*54e60f84SAndroid Build Coastguard Worker _XReply(dpy, (xReply *)&rep, 0, xFalse);
424*54e60f84SAndroid Build Coastguard Worker
425*54e60f84SAndroid Build Coastguard Worker *count = vals_to_card64(rep.swap_lo, rep.swap_hi);
426*54e60f84SAndroid Build Coastguard Worker
427*54e60f84SAndroid Build Coastguard Worker UnlockDisplay(dpy);
428*54e60f84SAndroid Build Coastguard Worker SyncHandle();
429*54e60f84SAndroid Build Coastguard Worker }
430*54e60f84SAndroid Build Coastguard Worker
va_DRI2_GetDriverNames(VADisplayContextP pDisplayContext,char ** drivers,unsigned * num_drivers)431*54e60f84SAndroid Build Coastguard Worker VAStatus va_DRI2_GetDriverNames(
432*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext,
433*54e60f84SAndroid Build Coastguard Worker char **drivers,
434*54e60f84SAndroid Build Coastguard Worker unsigned *num_drivers
435*54e60f84SAndroid Build Coastguard Worker )
436*54e60f84SAndroid Build Coastguard Worker {
437*54e60f84SAndroid Build Coastguard Worker #define MAX_NAMES 2 // Adjust if needed
438*54e60f84SAndroid Build Coastguard Worker
439*54e60f84SAndroid Build Coastguard Worker static const struct {
440*54e60f84SAndroid Build Coastguard Worker const char * const dri_driver;
441*54e60f84SAndroid Build Coastguard Worker const char * const va_driver[MAX_NAMES];
442*54e60f84SAndroid Build Coastguard Worker } map[] = {
443*54e60f84SAndroid Build Coastguard Worker { "i965", { "iHD", "i965" } }, // Intel Media and OTC GenX
444*54e60f84SAndroid Build Coastguard Worker { "iris", { "iHD", "i965" } }, // Intel Media and OTC GenX
445*54e60f84SAndroid Build Coastguard Worker { "crocus", { "i965" } }, // OTC GenX
446*54e60f84SAndroid Build Coastguard Worker };
447*54e60f84SAndroid Build Coastguard Worker
448*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx = pDisplayContext->pDriverContext;
449*54e60f84SAndroid Build Coastguard Worker char *dri_driver;
450*54e60f84SAndroid Build Coastguard Worker unsigned count = 0;
451*54e60f84SAndroid Build Coastguard Worker
452*54e60f84SAndroid Build Coastguard Worker if (!(va_isDRI2Connected(ctx, &dri_driver) && dri_driver))
453*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNKNOWN;
454*54e60f84SAndroid Build Coastguard Worker
455*54e60f84SAndroid Build Coastguard Worker for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
456*54e60f84SAndroid Build Coastguard Worker if (strcmp(map[i].dri_driver, dri_driver) == 0) {
457*54e60f84SAndroid Build Coastguard Worker const char * const *va_drivers = map[i].va_driver;
458*54e60f84SAndroid Build Coastguard Worker
459*54e60f84SAndroid Build Coastguard Worker for (; count < MAX_NAMES && va_drivers[count] && count < *num_drivers; count++)
460*54e60f84SAndroid Build Coastguard Worker drivers[count] = strdup(va_drivers[count]);
461*54e60f84SAndroid Build Coastguard Worker
462*54e60f84SAndroid Build Coastguard Worker break;
463*54e60f84SAndroid Build Coastguard Worker }
464*54e60f84SAndroid Build Coastguard Worker }
465*54e60f84SAndroid Build Coastguard Worker
466*54e60f84SAndroid Build Coastguard Worker /* Fallback to the dri driver, if there's no va equivalent in the map. */
467*54e60f84SAndroid Build Coastguard Worker if (!count) {
468*54e60f84SAndroid Build Coastguard Worker drivers[count] = dri_driver;
469*54e60f84SAndroid Build Coastguard Worker count++;
470*54e60f84SAndroid Build Coastguard Worker } else {
471*54e60f84SAndroid Build Coastguard Worker free(dri_driver);
472*54e60f84SAndroid Build Coastguard Worker }
473*54e60f84SAndroid Build Coastguard Worker
474*54e60f84SAndroid Build Coastguard Worker *num_drivers = count;
475*54e60f84SAndroid Build Coastguard Worker
476*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
477*54e60f84SAndroid Build Coastguard Worker }
478