xref: /aosp_15_r20/external/libdrm/tests/ttmtest/src/ttmtest.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
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