Blame tests/ttmtest/src/ttmtest.c

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
}