1*7688df22SAndroid Build Coastguard Worker /**************************************************************************
2*7688df22SAndroid Build Coastguard Worker *
3*7688df22SAndroid Build Coastguard Worker * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
4*7688df22SAndroid Build Coastguard Worker * All Rights Reserved.
5*7688df22SAndroid Build Coastguard Worker *
6*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*7688df22SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*7688df22SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*7688df22SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*7688df22SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*7688df22SAndroid Build Coastguard Worker * the following conditions:
13*7688df22SAndroid Build Coastguard Worker *
14*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18*7688df22SAndroid Build Coastguard Worker * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19*7688df22SAndroid Build Coastguard Worker * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20*7688df22SAndroid Build Coastguard Worker * USE OR OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker *
22*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
23*7688df22SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
24*7688df22SAndroid Build Coastguard Worker * of the Software.
25*7688df22SAndroid Build Coastguard Worker *
26*7688df22SAndroid Build Coastguard Worker *
27*7688df22SAndroid Build Coastguard Worker **************************************************************************/
28*7688df22SAndroid Build Coastguard Worker /*
29*7688df22SAndroid Build Coastguard Worker * Authors: Thomas Hellstr�m <thomas-at-tungstengraphics-dot-com>
30*7688df22SAndroid Build Coastguard Worker */
31*7688df22SAndroid Build Coastguard Worker
32*7688df22SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
33*7688df22SAndroid Build Coastguard Worker #include "config.h"
34*7688df22SAndroid Build Coastguard Worker #endif
35*7688df22SAndroid Build Coastguard Worker
36*7688df22SAndroid Build Coastguard Worker #include <X11/Xlib.h>
37*7688df22SAndroid Build Coastguard Worker #include <X11/Xutil.h>
38*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
39*7688df22SAndroid Build Coastguard Worker #include <drm/drm.h>
40*7688df22SAndroid Build Coastguard Worker #include "xf86dri.h"
41*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
42*7688df22SAndroid Build Coastguard Worker #include "stdio.h"
43*7688df22SAndroid Build Coastguard Worker #include "sys/types.h"
44*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
45*7688df22SAndroid Build Coastguard Worker #include <string.h>
46*7688df22SAndroid Build Coastguard Worker #include <errno.h>
47*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
48*7688df22SAndroid Build Coastguard Worker #include "sys/mman.h"
49*7688df22SAndroid Build Coastguard Worker
50*7688df22SAndroid Build Coastguard Worker typedef struct
51*7688df22SAndroid Build Coastguard Worker {
52*7688df22SAndroid Build Coastguard Worker enum
53*7688df22SAndroid Build Coastguard Worker {
54*7688df22SAndroid Build Coastguard Worker haveNothing,
55*7688df22SAndroid Build Coastguard Worker haveDisplay,
56*7688df22SAndroid Build Coastguard Worker haveConnection,
57*7688df22SAndroid Build Coastguard Worker haveDriverName,
58*7688df22SAndroid Build Coastguard Worker haveDeviceInfo,
59*7688df22SAndroid Build Coastguard Worker haveDRM,
60*7688df22SAndroid Build Coastguard Worker haveContext
61*7688df22SAndroid Build Coastguard Worker }
62*7688df22SAndroid Build Coastguard Worker state;
63*7688df22SAndroid Build Coastguard Worker
64*7688df22SAndroid Build Coastguard Worker Display *display;
65*7688df22SAndroid Build Coastguard Worker int screen;
66*7688df22SAndroid Build Coastguard Worker drm_handle_t sAreaOffset;
67*7688df22SAndroid Build Coastguard Worker char *curBusID;
68*7688df22SAndroid Build Coastguard Worker char *driverName;
69*7688df22SAndroid Build Coastguard Worker int drmFD;
70*7688df22SAndroid Build Coastguard Worker XVisualInfo visualInfo;
71*7688df22SAndroid Build Coastguard Worker XID id;
72*7688df22SAndroid Build Coastguard Worker drm_context_t hwContext;
73*7688df22SAndroid Build Coastguard Worker void *driPriv;
74*7688df22SAndroid Build Coastguard Worker int driPrivSize;
75*7688df22SAndroid Build Coastguard Worker int fbSize;
76*7688df22SAndroid Build Coastguard Worker int fbOrigin;
77*7688df22SAndroid Build Coastguard Worker int fbStride;
78*7688df22SAndroid Build Coastguard Worker drm_handle_t fbHandle;
79*7688df22SAndroid Build Coastguard Worker int ddxDriverMajor;
80*7688df22SAndroid Build Coastguard Worker int ddxDriverMinor;
81*7688df22SAndroid Build Coastguard Worker int ddxDriverPatch;
82*7688df22SAndroid Build Coastguard Worker } TinyDRIContext;
83*7688df22SAndroid Build Coastguard Worker
84*7688df22SAndroid Build Coastguard Worker #ifndef __x86_64__
85*7688df22SAndroid Build Coastguard Worker static unsigned
fastrdtsc(void)86*7688df22SAndroid Build Coastguard Worker fastrdtsc(void)
87*7688df22SAndroid Build Coastguard Worker {
88*7688df22SAndroid Build Coastguard Worker unsigned eax;
89*7688df22SAndroid Build Coastguard Worker __asm__ volatile ("\t"
90*7688df22SAndroid Build Coastguard Worker "pushl %%ebx\n\t"
91*7688df22SAndroid Build Coastguard Worker "cpuid\n\t" ".byte 0x0f, 0x31\n\t" "popl %%ebx\n":"=a" (eax)
92*7688df22SAndroid Build Coastguard Worker :"0"(0)
93*7688df22SAndroid Build Coastguard Worker :"ecx", "edx", "cc");
94*7688df22SAndroid Build Coastguard Worker
95*7688df22SAndroid Build Coastguard Worker return eax;
96*7688df22SAndroid Build Coastguard Worker }
97*7688df22SAndroid Build Coastguard Worker #else
98*7688df22SAndroid Build Coastguard Worker static unsigned
fastrdtsc(void)99*7688df22SAndroid Build Coastguard Worker fastrdtsc(void)
100*7688df22SAndroid Build Coastguard Worker {
101*7688df22SAndroid Build Coastguard Worker unsigned eax;
102*7688df22SAndroid Build Coastguard Worker __asm__ volatile ("\t" "cpuid\n\t" ".byte 0x0f, 0x31\n\t":"=a" (eax)
103*7688df22SAndroid Build Coastguard Worker :"0"(0)
104*7688df22SAndroid Build Coastguard Worker :"ecx", "edx", "ebx", "cc");
105*7688df22SAndroid Build Coastguard Worker
106*7688df22SAndroid Build Coastguard Worker return eax;
107*7688df22SAndroid Build Coastguard Worker }
108*7688df22SAndroid Build Coastguard Worker #endif
109*7688df22SAndroid Build Coastguard Worker
110*7688df22SAndroid Build Coastguard Worker void
bmError(int val,const char * file,const char * function,int line)111*7688df22SAndroid Build Coastguard Worker bmError(int val, const char *file, const char *function, int line)
112*7688df22SAndroid Build Coastguard Worker {
113*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Fatal video memory manager error \"%s\".\n"
114*7688df22SAndroid Build Coastguard Worker "Check kernel logs or set the LIBGL_DEBUG\n"
115*7688df22SAndroid Build Coastguard Worker "environment variable to \"verbose\" for more info.\n"
116*7688df22SAndroid Build Coastguard Worker "Detected in file %s, line %d, function %s.\n",
117*7688df22SAndroid Build Coastguard Worker strerror(-val), file, line, function);
118*7688df22SAndroid Build Coastguard Worker abort();
119*7688df22SAndroid Build Coastguard Worker }
120*7688df22SAndroid Build Coastguard Worker
121*7688df22SAndroid Build Coastguard Worker #define BM_CKFATAL(val) \
122*7688df22SAndroid Build Coastguard Worker do{ \
123*7688df22SAndroid Build Coastguard Worker int tstVal = (val); \
124*7688df22SAndroid Build Coastguard Worker if (tstVal) \
125*7688df22SAndroid Build Coastguard Worker bmError(tstVal, __FILE__, __FUNCTION__, __LINE__); \
126*7688df22SAndroid Build Coastguard Worker } while(0);
127*7688df22SAndroid Build Coastguard Worker
128*7688df22SAndroid Build Coastguard Worker static unsigned
time_diff(unsigned t,unsigned t2)129*7688df22SAndroid Build Coastguard Worker time_diff(unsigned t, unsigned t2)
130*7688df22SAndroid Build Coastguard Worker {
131*7688df22SAndroid Build Coastguard Worker return ((t < t2) ? t2 - t : 0xFFFFFFFFU - (t - t2 - 1));
132*7688df22SAndroid Build Coastguard Worker }
133*7688df22SAndroid Build Coastguard Worker
134*7688df22SAndroid Build Coastguard Worker static int
releaseContext(TinyDRIContext * ctx)135*7688df22SAndroid Build Coastguard Worker releaseContext(TinyDRIContext * ctx)
136*7688df22SAndroid Build Coastguard Worker {
137*7688df22SAndroid Build Coastguard Worker switch (ctx->state) {
138*7688df22SAndroid Build Coastguard Worker case haveContext:
139*7688df22SAndroid Build Coastguard Worker uniDRIDestroyContext(ctx->display, ctx->screen, ctx->id);
140*7688df22SAndroid Build Coastguard Worker case haveDRM:
141*7688df22SAndroid Build Coastguard Worker drmClose(ctx->drmFD);
142*7688df22SAndroid Build Coastguard Worker case haveDeviceInfo:
143*7688df22SAndroid Build Coastguard Worker XFree(ctx->driPriv);
144*7688df22SAndroid Build Coastguard Worker case haveDriverName:
145*7688df22SAndroid Build Coastguard Worker XFree(ctx->driverName);
146*7688df22SAndroid Build Coastguard Worker case haveConnection:
147*7688df22SAndroid Build Coastguard Worker XFree(ctx->curBusID);
148*7688df22SAndroid Build Coastguard Worker uniDRICloseConnection(ctx->display, ctx->screen);
149*7688df22SAndroid Build Coastguard Worker case haveDisplay:
150*7688df22SAndroid Build Coastguard Worker XCloseDisplay(ctx->display);
151*7688df22SAndroid Build Coastguard Worker default:
152*7688df22SAndroid Build Coastguard Worker break;
153*7688df22SAndroid Build Coastguard Worker }
154*7688df22SAndroid Build Coastguard Worker return -1;
155*7688df22SAndroid Build Coastguard Worker }
156*7688df22SAndroid Build Coastguard Worker
157*7688df22SAndroid Build Coastguard Worker static void
readBuf(void * buf,unsigned long size)158*7688df22SAndroid Build Coastguard Worker readBuf(void *buf, unsigned long size)
159*7688df22SAndroid Build Coastguard Worker {
160*7688df22SAndroid Build Coastguard Worker volatile unsigned *buf32 = (unsigned *)buf;
161*7688df22SAndroid Build Coastguard Worker unsigned *end = (unsigned *)buf32 + size / sizeof(*buf32);
162*7688df22SAndroid Build Coastguard Worker
163*7688df22SAndroid Build Coastguard Worker while (buf32 < end) {
164*7688df22SAndroid Build Coastguard Worker (void)*buf32++;
165*7688df22SAndroid Build Coastguard Worker }
166*7688df22SAndroid Build Coastguard Worker }
167*7688df22SAndroid Build Coastguard Worker
168*7688df22SAndroid Build Coastguard Worker static int
benchmarkBuffer(TinyDRIContext * ctx,unsigned long size,unsigned long * ticks)169*7688df22SAndroid Build Coastguard Worker benchmarkBuffer(TinyDRIContext * ctx, unsigned long size,
170*7688df22SAndroid Build Coastguard Worker unsigned long *ticks)
171*7688df22SAndroid Build Coastguard Worker {
172*7688df22SAndroid Build Coastguard Worker unsigned long curTime, oldTime;
173*7688df22SAndroid Build Coastguard Worker int ret;
174*7688df22SAndroid Build Coastguard Worker drmBO buf;
175*7688df22SAndroid Build Coastguard Worker void *virtual;
176*7688df22SAndroid Build Coastguard Worker
177*7688df22SAndroid Build Coastguard Worker /*
178*7688df22SAndroid Build Coastguard Worker * Test system memory objects.
179*7688df22SAndroid Build Coastguard Worker */
180*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
181*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOCreate(ctx->drmFD, size, 0, NULL,
182*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_READ |
183*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_WRITE |
184*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_MEM_LOCAL, 0, &buf));
185*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
186*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
187*7688df22SAndroid Build Coastguard Worker
188*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
189*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
190*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
191*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
192*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
193*7688df22SAndroid Build Coastguard Worker
194*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
195*7688df22SAndroid Build Coastguard Worker memset(virtual, 0xF0, buf.size);
196*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
197*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
198*7688df22SAndroid Build Coastguard Worker
199*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
200*7688df22SAndroid Build Coastguard Worker memset(virtual, 0x0F, buf.size);
201*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
202*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
203*7688df22SAndroid Build Coastguard Worker
204*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
205*7688df22SAndroid Build Coastguard Worker readBuf(virtual, buf.size);
206*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
207*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
208*7688df22SAndroid Build Coastguard Worker
209*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
210*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
211*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
212*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
213*7688df22SAndroid Build Coastguard Worker
214*7688df22SAndroid Build Coastguard Worker /*
215*7688df22SAndroid Build Coastguard Worker * Test TT bound buffer objects.
216*7688df22SAndroid Build Coastguard Worker */
217*7688df22SAndroid Build Coastguard Worker
218*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
219*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOSetStatus(ctx->drmFD, &buf,
220*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_MEM_TT,
221*7688df22SAndroid Build Coastguard Worker DRM_BO_MASK_MEM,
222*7688df22SAndroid Build Coastguard Worker 0,0,0));
223*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
224*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
225*7688df22SAndroid Build Coastguard Worker
226*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
227*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
228*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
229*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
230*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
231*7688df22SAndroid Build Coastguard Worker
232*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
233*7688df22SAndroid Build Coastguard Worker memset(virtual, 0xF0, buf.size);
234*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
235*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
236*7688df22SAndroid Build Coastguard Worker
237*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
238*7688df22SAndroid Build Coastguard Worker memset(virtual, 0x0F, buf.size);
239*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
240*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
241*7688df22SAndroid Build Coastguard Worker
242*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
243*7688df22SAndroid Build Coastguard Worker readBuf(virtual, buf.size);
244*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
245*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
246*7688df22SAndroid Build Coastguard Worker
247*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
248*7688df22SAndroid Build Coastguard Worker
249*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
250*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOSetStatus(ctx->drmFD, &buf,
251*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_MEM_LOCAL, DRM_BO_MASK_MEM, 0, 0,0));
252*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
253*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
254*7688df22SAndroid Build Coastguard Worker
255*7688df22SAndroid Build Coastguard Worker /*
256*7688df22SAndroid Build Coastguard Worker * Test cached buffers objects.
257*7688df22SAndroid Build Coastguard Worker */
258*7688df22SAndroid Build Coastguard Worker
259*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
260*7688df22SAndroid Build Coastguard Worker ret = drmBOSetStatus(ctx->drmFD, &buf,
261*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_MEM_TT |
262*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_CACHED |
263*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_FORCE_CACHING,
264*7688df22SAndroid Build Coastguard Worker DRM_BO_MASK_MEMTYPE |
265*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_FORCE_CACHING,
266*7688df22SAndroid Build Coastguard Worker 0, 0, 0);
267*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
268*7688df22SAndroid Build Coastguard Worker
269*7688df22SAndroid Build Coastguard Worker if (ret) {
270*7688df22SAndroid Build Coastguard Worker printf("Couldn't bind cached. Probably no support\n");
271*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOUnreference(ctx->drmFD, &buf));
272*7688df22SAndroid Build Coastguard Worker return 1;
273*7688df22SAndroid Build Coastguard Worker }
274*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
275*7688df22SAndroid Build Coastguard Worker
276*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
277*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
278*7688df22SAndroid Build Coastguard Worker DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
279*7688df22SAndroid Build Coastguard Worker
280*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
281*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
282*7688df22SAndroid Build Coastguard Worker
283*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
284*7688df22SAndroid Build Coastguard Worker memset(virtual, 0xF0, buf.size);
285*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
286*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
287*7688df22SAndroid Build Coastguard Worker
288*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
289*7688df22SAndroid Build Coastguard Worker memset(virtual, 0x0F, buf.size);
290*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
291*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
292*7688df22SAndroid Build Coastguard Worker
293*7688df22SAndroid Build Coastguard Worker oldTime = fastrdtsc();
294*7688df22SAndroid Build Coastguard Worker readBuf(virtual, buf.size);
295*7688df22SAndroid Build Coastguard Worker curTime = fastrdtsc();
296*7688df22SAndroid Build Coastguard Worker *ticks++ = time_diff(oldTime, curTime);
297*7688df22SAndroid Build Coastguard Worker
298*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
299*7688df22SAndroid Build Coastguard Worker BM_CKFATAL(drmBOUnreference(ctx->drmFD, &buf));
300*7688df22SAndroid Build Coastguard Worker
301*7688df22SAndroid Build Coastguard Worker return 0;
302*7688df22SAndroid Build Coastguard Worker }
303*7688df22SAndroid Build Coastguard Worker
304*7688df22SAndroid Build Coastguard Worker static void
testAGP(TinyDRIContext * ctx)305*7688df22SAndroid Build Coastguard Worker testAGP(TinyDRIContext * ctx)
306*7688df22SAndroid Build Coastguard Worker {
307*7688df22SAndroid Build Coastguard Worker unsigned long ticks[128], *pTicks;
308*7688df22SAndroid Build Coastguard Worker unsigned long size = 8 * 1024;
309*7688df22SAndroid Build Coastguard Worker int ret;
310*7688df22SAndroid Build Coastguard Worker
311*7688df22SAndroid Build Coastguard Worker ret = benchmarkBuffer(ctx, size, ticks);
312*7688df22SAndroid Build Coastguard Worker if (ret < 0) {
313*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Buffer error %s\n", strerror(-ret));
314*7688df22SAndroid Build Coastguard Worker return;
315*7688df22SAndroid Build Coastguard Worker }
316*7688df22SAndroid Build Coastguard Worker pTicks = ticks;
317*7688df22SAndroid Build Coastguard Worker
318*7688df22SAndroid Build Coastguard Worker printf("Buffer size %d bytes\n", size);
319*7688df22SAndroid Build Coastguard Worker printf("System memory timings ********************************\n");
320*7688df22SAndroid Build Coastguard Worker printf("Creation took %12lu ticks\n", *pTicks++);
321*7688df22SAndroid Build Coastguard Worker printf("Mapping took %12lu ticks\n", *pTicks++);
322*7688df22SAndroid Build Coastguard Worker printf("Writing took %12lu ticks\n", *pTicks++);
323*7688df22SAndroid Build Coastguard Worker printf("Writing Again took %12lu ticks\n", *pTicks++);
324*7688df22SAndroid Build Coastguard Worker printf("Reading took %12lu ticks\n", *pTicks++);
325*7688df22SAndroid Build Coastguard Worker printf("Unmapping took %12lu ticks\n", *pTicks++);
326*7688df22SAndroid Build Coastguard Worker
327*7688df22SAndroid Build Coastguard Worker printf("\nTT Memory timings ************************************\n");
328*7688df22SAndroid Build Coastguard Worker printf("Moving to TT took %12lu ticks\n", *pTicks++);
329*7688df22SAndroid Build Coastguard Worker printf("Mapping in TT took %12lu ticks\n", *pTicks++);
330*7688df22SAndroid Build Coastguard Worker printf("Writing to TT took %12lu ticks\n", *pTicks++);
331*7688df22SAndroid Build Coastguard Worker printf("Writing again to TT took %12lu ticks\n", *pTicks++);
332*7688df22SAndroid Build Coastguard Worker printf("Reading from TT took %12lu ticks\n", *pTicks++);
333*7688df22SAndroid Build Coastguard Worker printf("Moving to system took %12lu ticks\n", *pTicks++);
334*7688df22SAndroid Build Coastguard Worker
335*7688df22SAndroid Build Coastguard Worker if (ret == 1)
336*7688df22SAndroid Build Coastguard Worker return;
337*7688df22SAndroid Build Coastguard Worker
338*7688df22SAndroid Build Coastguard Worker printf("\nCached TT Memory timings *****************************\n");
339*7688df22SAndroid Build Coastguard Worker printf("Moving to CTT took %12lu ticks\n", *pTicks++);
340*7688df22SAndroid Build Coastguard Worker printf("Mapping in CTT took %12lu ticks\n", *pTicks++);
341*7688df22SAndroid Build Coastguard Worker printf("Writing to CTT took %12lu ticks\n", *pTicks++);
342*7688df22SAndroid Build Coastguard Worker printf("Re-writing to CTT took %12lu ticks\n", *pTicks++);
343*7688df22SAndroid Build Coastguard Worker printf("Reading from CTT took %12lu ticks\n", *pTicks++);
344*7688df22SAndroid Build Coastguard Worker printf("\n\n");
345*7688df22SAndroid Build Coastguard Worker }
346*7688df22SAndroid Build Coastguard Worker
347*7688df22SAndroid Build Coastguard Worker int
main()348*7688df22SAndroid Build Coastguard Worker main()
349*7688df22SAndroid Build Coastguard Worker {
350*7688df22SAndroid Build Coastguard Worker int ret, screen, isCapable;
351*7688df22SAndroid Build Coastguard Worker char *displayName = ":0";
352*7688df22SAndroid Build Coastguard Worker TinyDRIContext ctx;
353*7688df22SAndroid Build Coastguard Worker unsigned magic;
354*7688df22SAndroid Build Coastguard Worker
355*7688df22SAndroid Build Coastguard Worker ctx.screen = 0;
356*7688df22SAndroid Build Coastguard Worker ctx.state = haveNothing;
357*7688df22SAndroid Build Coastguard Worker ctx.display = XOpenDisplay(displayName);
358*7688df22SAndroid Build Coastguard Worker if (!ctx.display) {
359*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not open display\n");
360*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
361*7688df22SAndroid Build Coastguard Worker }
362*7688df22SAndroid Build Coastguard Worker ctx.state = haveDisplay;
363*7688df22SAndroid Build Coastguard Worker
364*7688df22SAndroid Build Coastguard Worker ret =
365*7688df22SAndroid Build Coastguard Worker uniDRIQueryDirectRenderingCapable(ctx.display, ctx.screen,
366*7688df22SAndroid Build Coastguard Worker &isCapable);
367*7688df22SAndroid Build Coastguard Worker if (!ret || !isCapable) {
368*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "No DRI on this display:sceen\n");
369*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
370*7688df22SAndroid Build Coastguard Worker }
371*7688df22SAndroid Build Coastguard Worker
372*7688df22SAndroid Build Coastguard Worker if (!uniDRIOpenConnection(ctx.display, ctx.screen, &ctx.sAreaOffset,
373*7688df22SAndroid Build Coastguard Worker &ctx.curBusID)) {
374*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not open DRI connection.\n");
375*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
376*7688df22SAndroid Build Coastguard Worker }
377*7688df22SAndroid Build Coastguard Worker ctx.state = haveConnection;
378*7688df22SAndroid Build Coastguard Worker
379*7688df22SAndroid Build Coastguard Worker if (!uniDRIGetClientDriverName(ctx.display, ctx.screen,
380*7688df22SAndroid Build Coastguard Worker &ctx.ddxDriverMajor, &ctx.ddxDriverMinor,
381*7688df22SAndroid Build Coastguard Worker &ctx.ddxDriverPatch, &ctx.driverName)) {
382*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not get DRI driver name.\n");
383*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
384*7688df22SAndroid Build Coastguard Worker }
385*7688df22SAndroid Build Coastguard Worker ctx.state = haveDriverName;
386*7688df22SAndroid Build Coastguard Worker
387*7688df22SAndroid Build Coastguard Worker if (!uniDRIGetDeviceInfo(ctx.display, ctx.screen,
388*7688df22SAndroid Build Coastguard Worker &ctx.fbHandle, &ctx.fbOrigin, &ctx.fbSize,
389*7688df22SAndroid Build Coastguard Worker &ctx.fbStride, &ctx.driPrivSize, &ctx.driPriv)) {
390*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not get DRI device info.\n");
391*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
392*7688df22SAndroid Build Coastguard Worker }
393*7688df22SAndroid Build Coastguard Worker ctx.state = haveDriverName;
394*7688df22SAndroid Build Coastguard Worker
395*7688df22SAndroid Build Coastguard Worker if ((ctx.drmFD = drmOpen(NULL, ctx.curBusID)) < 0) {
396*7688df22SAndroid Build Coastguard Worker perror("DRM Device could not be opened");
397*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
398*7688df22SAndroid Build Coastguard Worker }
399*7688df22SAndroid Build Coastguard Worker ctx.state = haveDRM;
400*7688df22SAndroid Build Coastguard Worker
401*7688df22SAndroid Build Coastguard Worker drmGetMagic(ctx.drmFD, &magic);
402*7688df22SAndroid Build Coastguard Worker if (!uniDRIAuthConnection(ctx.display, ctx.screen, magic)) {
403*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not get X server to authenticate us.\n");
404*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
405*7688df22SAndroid Build Coastguard Worker }
406*7688df22SAndroid Build Coastguard Worker
407*7688df22SAndroid Build Coastguard Worker ret = XMatchVisualInfo(ctx.display, ctx.screen, 24, TrueColor,
408*7688df22SAndroid Build Coastguard Worker &ctx.visualInfo);
409*7688df22SAndroid Build Coastguard Worker if (!ret) {
410*7688df22SAndroid Build Coastguard Worker ret = XMatchVisualInfo(ctx.display, ctx.screen, 16, TrueColor,
411*7688df22SAndroid Build Coastguard Worker &ctx.visualInfo);
412*7688df22SAndroid Build Coastguard Worker if (!ret) {
413*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not find a matching visual.\n");
414*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
415*7688df22SAndroid Build Coastguard Worker }
416*7688df22SAndroid Build Coastguard Worker }
417*7688df22SAndroid Build Coastguard Worker
418*7688df22SAndroid Build Coastguard Worker if (!uniDRICreateContext(ctx.display, ctx.screen, ctx.visualInfo.visual,
419*7688df22SAndroid Build Coastguard Worker &ctx.id, &ctx.hwContext)) {
420*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "Could not create DRI context.\n");
421*7688df22SAndroid Build Coastguard Worker return releaseContext(&ctx);
422*7688df22SAndroid Build Coastguard Worker }
423*7688df22SAndroid Build Coastguard Worker ctx.state = haveContext;
424*7688df22SAndroid Build Coastguard Worker
425*7688df22SAndroid Build Coastguard Worker testAGP(&ctx);
426*7688df22SAndroid Build Coastguard Worker
427*7688df22SAndroid Build Coastguard Worker releaseContext(&ctx);
428*7688df22SAndroid Build Coastguard Worker printf("Terminating normally\n");
429*7688df22SAndroid Build Coastguard Worker return 0;
430*7688df22SAndroid Build Coastguard Worker }
431