|
Packit Service |
103f6b |
/**************************************************************************
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, TX., USA
|
|
Packit Service |
103f6b |
* All Rights Reserved.
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
Packit Service |
103f6b |
* copy of this software and associated documentation files (the
|
|
Packit Service |
103f6b |
* "Software"), to deal in the Software without restriction, including
|
|
Packit Service |
103f6b |
* without limitation the rights to use, copy, modify, merge, publish,
|
|
Packit Service |
103f6b |
* distribute, sub license, and/or sell copies of the Software, and to
|
|
Packit Service |
103f6b |
* permit persons to whom the Software is furnished to do so, subject to
|
|
Packit Service |
103f6b |
* the following conditions:
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit Service |
103f6b |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit Service |
103f6b |
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
Packit Service |
103f6b |
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
|
Packit Service |
103f6b |
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
Packit Service |
103f6b |
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
Packit Service |
103f6b |
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
* The above copyright notice and this permission notice (including the
|
|
Packit Service |
103f6b |
* next paragraph) shall be included in all copies or substantial portions
|
|
Packit Service |
103f6b |
* of the Software.
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
*
|
|
Packit Service |
103f6b |
**************************************************************************/
|
|
Packit Service |
103f6b |
/*
|
|
Packit Service |
103f6b |
* Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
|
|
Packit Service |
103f6b |
*/
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
103f6b |
#include "config.h"
|
|
Packit Service |
103f6b |
#endif
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
#include <X11/Xlib.h>
|
|
Packit Service |
103f6b |
#include <X11/Xutil.h>
|
|
Packit Service |
103f6b |
#include <stdint.h>
|
|
Packit Service |
103f6b |
#include <drm/drm.h>
|
|
Packit Service |
103f6b |
#include "xf86dri.h"
|
|
Packit Service |
103f6b |
#include "xf86drm.h"
|
|
Packit Service |
103f6b |
#include "stdio.h"
|
|
Packit Service |
103f6b |
#include "sys/types.h"
|
|
Packit Service |
103f6b |
#include <unistd.h>
|
|
Packit Service |
103f6b |
#include <string.h>
|
|
Packit Service |
103f6b |
#include <errno.h>
|
|
Packit Service |
103f6b |
#include <stdlib.h>
|
|
Packit Service |
103f6b |
#include "sys/mman.h"
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
typedef struct
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
enum
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
haveNothing,
|
|
Packit Service |
103f6b |
haveDisplay,
|
|
Packit Service |
103f6b |
haveConnection,
|
|
Packit Service |
103f6b |
haveDriverName,
|
|
Packit Service |
103f6b |
haveDeviceInfo,
|
|
Packit Service |
103f6b |
haveDRM,
|
|
Packit Service |
103f6b |
haveContext
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
state;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
Display *display;
|
|
Packit Service |
103f6b |
int screen;
|
|
Packit Service |
103f6b |
drm_handle_t sAreaOffset;
|
|
Packit Service |
103f6b |
char *curBusID;
|
|
Packit Service |
103f6b |
char *driverName;
|
|
Packit Service |
103f6b |
int drmFD;
|
|
Packit Service |
103f6b |
XVisualInfo visualInfo;
|
|
Packit Service |
103f6b |
XID id;
|
|
Packit Service |
103f6b |
drm_context_t hwContext;
|
|
Packit Service |
103f6b |
void *driPriv;
|
|
Packit Service |
103f6b |
int driPrivSize;
|
|
Packit Service |
103f6b |
int fbSize;
|
|
Packit Service |
103f6b |
int fbOrigin;
|
|
Packit Service |
103f6b |
int fbStride;
|
|
Packit Service |
103f6b |
drm_handle_t fbHandle;
|
|
Packit Service |
103f6b |
int ddxDriverMajor;
|
|
Packit Service |
103f6b |
int ddxDriverMinor;
|
|
Packit Service |
103f6b |
int ddxDriverPatch;
|
|
Packit Service |
103f6b |
} TinyDRIContext;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
#ifndef __x86_64__
|
|
Packit Service |
103f6b |
static unsigned
|
|
Packit Service |
103f6b |
fastrdtsc(void)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
unsigned eax;
|
|
Packit Service |
103f6b |
__asm__ volatile ("\t"
|
|
Packit Service |
103f6b |
"pushl %%ebx\n\t"
|
|
Packit Service |
103f6b |
"cpuid\n\t" ".byte 0x0f, 0x31\n\t" "popl %%ebx\n":"=a" (eax)
|
|
Packit Service |
103f6b |
:"0"(0)
|
|
Packit Service |
103f6b |
:"ecx", "edx", "cc");
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
return eax;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
#else
|
|
Packit Service |
103f6b |
static unsigned
|
|
Packit Service |
103f6b |
fastrdtsc(void)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
unsigned eax;
|
|
Packit Service |
103f6b |
__asm__ volatile ("\t" "cpuid\n\t" ".byte 0x0f, 0x31\n\t":"=a" (eax)
|
|
Packit Service |
103f6b |
:"0"(0)
|
|
Packit Service |
103f6b |
:"ecx", "edx", "ebx", "cc");
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
return eax;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
#endif
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
void
|
|
Packit Service |
103f6b |
bmError(int val, const char *file, const char *function, int line)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
fprintf(stderr, "Fatal video memory manager error \"%s\".\n"
|
|
Packit Service |
103f6b |
"Check kernel logs or set the LIBGL_DEBUG\n"
|
|
Packit Service |
103f6b |
"environment variable to \"verbose\" for more info.\n"
|
|
Packit Service |
103f6b |
"Detected in file %s, line %d, function %s.\n",
|
|
Packit Service |
103f6b |
strerror(-val), file, line, function);
|
|
Packit Service |
103f6b |
abort();
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
#define BM_CKFATAL(val) \
|
|
Packit Service |
103f6b |
do{ \
|
|
Packit Service |
103f6b |
int tstVal = (val); \
|
|
Packit Service |
103f6b |
if (tstVal) \
|
|
Packit Service |
103f6b |
bmError(tstVal, __FILE__, __FUNCTION__, __LINE__); \
|
|
Packit Service |
103f6b |
} while(0);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
static unsigned
|
|
Packit Service |
103f6b |
time_diff(unsigned t, unsigned t2)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
return ((t < t2) ? t2 - t : 0xFFFFFFFFU - (t - t2 - 1));
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
static int
|
|
Packit Service |
103f6b |
releaseContext(TinyDRIContext * ctx)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
switch (ctx->state) {
|
|
Packit Service |
103f6b |
case haveContext:
|
|
Packit Service |
103f6b |
uniDRIDestroyContext(ctx->display, ctx->screen, ctx->id);
|
|
Packit Service |
103f6b |
case haveDRM:
|
|
Packit Service |
103f6b |
drmClose(ctx->drmFD);
|
|
Packit Service |
103f6b |
case haveDeviceInfo:
|
|
Packit Service |
103f6b |
XFree(ctx->driPriv);
|
|
Packit Service |
103f6b |
case haveDriverName:
|
|
Packit Service |
103f6b |
XFree(ctx->driverName);
|
|
Packit Service |
103f6b |
case haveConnection:
|
|
Packit Service |
103f6b |
XFree(ctx->curBusID);
|
|
Packit Service |
103f6b |
uniDRICloseConnection(ctx->display, ctx->screen);
|
|
Packit Service |
103f6b |
case haveDisplay:
|
|
Packit Service |
103f6b |
XCloseDisplay(ctx->display);
|
|
Packit Service |
103f6b |
default:
|
|
Packit Service |
103f6b |
break;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
return -1;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
static void
|
|
Packit Service |
103f6b |
readBuf(void *buf, unsigned long size)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
volatile unsigned *buf32 = (unsigned *)buf;
|
|
Packit Service |
103f6b |
unsigned *end = (unsigned *)buf32 + size / sizeof(*buf32);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
while (buf32 < end) {
|
|
Packit Service |
103f6b |
(void)*buf32++;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
static int
|
|
Packit Service |
103f6b |
benchmarkBuffer(TinyDRIContext * ctx, unsigned long size,
|
|
Packit Service |
103f6b |
unsigned long *ticks)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
unsigned long curTime, oldTime;
|
|
Packit Service |
103f6b |
int ret;
|
|
Packit Service |
103f6b |
drmBO buf;
|
|
Packit Service |
103f6b |
void *virtual;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
/*
|
|
Packit Service |
103f6b |
* Test system memory objects.
|
|
Packit Service |
103f6b |
*/
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOCreate(ctx->drmFD, size, 0, NULL,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_READ |
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_WRITE |
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_MEM_LOCAL, 0, &buf));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0xF0, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0x0F, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
readBuf(virtual, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
/*
|
|
Packit Service |
103f6b |
* Test TT bound buffer objects.
|
|
Packit Service |
103f6b |
*/
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOSetStatus(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_MEM_TT,
|
|
Packit Service |
103f6b |
DRM_BO_MASK_MEM,
|
|
Packit Service |
103f6b |
0,0,0));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0xF0, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0x0F, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
readBuf(virtual, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOSetStatus(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_MEM_LOCAL, DRM_BO_MASK_MEM, 0, 0,0));
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
/*
|
|
Packit Service |
103f6b |
* Test cached buffers objects.
|
|
Packit Service |
103f6b |
*/
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
ret = drmBOSetStatus(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_MEM_TT |
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_CACHED |
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_FORCE_CACHING,
|
|
Packit Service |
103f6b |
DRM_BO_MASK_MEMTYPE |
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_FORCE_CACHING,
|
|
Packit Service |
103f6b |
0, 0, 0);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (ret) {
|
|
Packit Service |
103f6b |
printf("Couldn't bind cached. Probably no support\n");
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOUnreference(ctx->drmFD, &buf));
|
|
Packit Service |
103f6b |
return 1;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOMap(ctx->drmFD, &buf,
|
|
Packit Service |
103f6b |
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual));
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0xF0, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
memset(virtual, 0x0F, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
oldTime = fastrdtsc();
|
|
Packit Service |
103f6b |
readBuf(virtual, buf.size);
|
|
Packit Service |
103f6b |
curTime = fastrdtsc();
|
|
Packit Service |
103f6b |
*ticks++ = time_diff(oldTime, curTime);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOUnmap(ctx->drmFD, &buf));
|
|
Packit Service |
103f6b |
BM_CKFATAL(drmBOUnreference(ctx->drmFD, &buf));
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
return 0;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
static void
|
|
Packit Service |
103f6b |
testAGP(TinyDRIContext * ctx)
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
unsigned long ticks[128], *pTicks;
|
|
Packit Service |
103f6b |
unsigned long size = 8 * 1024;
|
|
Packit Service |
103f6b |
int ret;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
ret = benchmarkBuffer(ctx, size, ticks);
|
|
Packit Service |
103f6b |
if (ret < 0) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Buffer error %s\n", strerror(-ret));
|
|
Packit Service |
103f6b |
return;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
pTicks = ticks;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
printf("Buffer size %d bytes\n", size);
|
|
Packit Service |
103f6b |
printf("System memory timings ********************************\n");
|
|
Packit Service |
103f6b |
printf("Creation took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Mapping took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Writing took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Writing Again took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Reading took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Unmapping took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
printf("\nTT Memory timings ************************************\n");
|
|
Packit Service |
103f6b |
printf("Moving to TT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Mapping in TT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Writing to TT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Writing again to TT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Reading from TT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Moving to system took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (ret == 1)
|
|
Packit Service |
103f6b |
return;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
printf("\nCached TT Memory timings *****************************\n");
|
|
Packit Service |
103f6b |
printf("Moving to CTT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Mapping in CTT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Writing to CTT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Re-writing to CTT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("Reading from CTT took %12lu ticks\n", *pTicks++);
|
|
Packit Service |
103f6b |
printf("\n\n");
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
int
|
|
Packit Service |
103f6b |
main()
|
|
Packit Service |
103f6b |
{
|
|
Packit Service |
103f6b |
int ret, screen, isCapable;
|
|
Packit Service |
103f6b |
char *displayName = ":0";
|
|
Packit Service |
103f6b |
TinyDRIContext ctx;
|
|
Packit Service |
103f6b |
unsigned magic;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
ctx.screen = 0;
|
|
Packit Service |
103f6b |
ctx.state = haveNothing;
|
|
Packit Service |
103f6b |
ctx.display = XOpenDisplay(displayName);
|
|
Packit Service |
103f6b |
if (!ctx.display) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not open display\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveDisplay;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
ret =
|
|
Packit Service |
103f6b |
uniDRIQueryDirectRenderingCapable(ctx.display, ctx.screen,
|
|
Packit Service |
103f6b |
&isCapable);
|
|
Packit Service |
103f6b |
if (!ret || !isCapable) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "No DRI on this display:sceen\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (!uniDRIOpenConnection(ctx.display, ctx.screen, &ctx.sAreaOffset,
|
|
Packit Service |
103f6b |
&ctx.curBusID)) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not open DRI connection.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveConnection;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (!uniDRIGetClientDriverName(ctx.display, ctx.screen,
|
|
Packit Service |
103f6b |
&ctx.ddxDriverMajor, &ctx.ddxDriverMinor,
|
|
Packit Service |
103f6b |
&ctx.ddxDriverPatch, &ctx.driverName)) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not get DRI driver name.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveDriverName;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (!uniDRIGetDeviceInfo(ctx.display, ctx.screen,
|
|
Packit Service |
103f6b |
&ctx.fbHandle, &ctx.fbOrigin, &ctx.fbSize,
|
|
Packit Service |
103f6b |
&ctx.fbStride, &ctx.driPrivSize, &ctx.driPriv)) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not get DRI device info.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveDriverName;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if ((ctx.drmFD = drmOpen(NULL, ctx.curBusID)) < 0) {
|
|
Packit Service |
103f6b |
perror("DRM Device could not be opened");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveDRM;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
drmGetMagic(ctx.drmFD, &magic);
|
|
Packit Service |
103f6b |
if (!uniDRIAuthConnection(ctx.display, ctx.screen, magic)) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not get X server to authenticate us.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
ret = XMatchVisualInfo(ctx.display, ctx.screen, 24, TrueColor,
|
|
Packit Service |
103f6b |
&ctx.visualInfo);
|
|
Packit Service |
103f6b |
if (!ret) {
|
|
Packit Service |
103f6b |
ret = XMatchVisualInfo(ctx.display, ctx.screen, 16, TrueColor,
|
|
Packit Service |
103f6b |
&ctx.visualInfo);
|
|
Packit Service |
103f6b |
if (!ret) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not find a matching visual.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
if (!uniDRICreateContext(ctx.display, ctx.screen, ctx.visualInfo.visual,
|
|
Packit Service |
103f6b |
&ctx.id, &ctx.hwContext)) {
|
|
Packit Service |
103f6b |
fprintf(stderr, "Could not create DRI context.\n");
|
|
Packit Service |
103f6b |
return releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
}
|
|
Packit Service |
103f6b |
ctx.state = haveContext;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
testAGP(&ctx;;
|
|
Packit Service |
103f6b |
|
|
Packit Service |
103f6b |
releaseContext(&ctx;;
|
|
Packit Service |
103f6b |
printf("Terminating normally\n");
|
|
Packit Service |
103f6b |
return 0;
|
|
Packit Service |
103f6b |
}
|