Blame tests/ttmtest/src/ttmtest.c

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