#include "glheader.h"
#include "context.h"
#include "matrix.h"
#include "simple_list.h"
#include "i810screen.h"
#include "i810_dri.h"
#include "i810state.h"
#include "i810tex.h"
#include "i810span.h"
#include "i810tris.h"
#include "i810ioctl.h"
static drmBufMapPtr i810_create_empty_buffers(void)
{
drmBufMapPtr retval;
retval = (drmBufMapPtr)Xmalloc(sizeof(drmBufMap));
if(retval == NULL) return NULL;
memset(retval, 0, sizeof(drmBufMap));
retval->list = (drmBufPtr)Xmalloc(sizeof(drmBuf) * I810_DMA_BUF_NR);
if(retval->list == NULL) {
Xfree(retval);
return NULL;
}
memset(retval->list, 0, sizeof(drmBuf) * I810_DMA_BUF_NR);
return retval;
}
static GLboolean
i810InitDriver(__DRIscreenPrivate *sPriv)
{
i810ScreenPrivate *i810Screen;
I810DRIPtr gDRIPriv = (I810DRIPtr)sPriv->pDevPriv;
if ( sPriv->driMajor != 4 || sPriv->driMinor < 0 ) {
__driUtilMessage( "i810 DRI driver expected DRI version 4.0.x "
"but got version %d.%d.%d",
sPriv->driMajor, sPriv->driMinor, sPriv->driPatch );
return GL_FALSE;
}
if (sPriv->ddxMajor != 1 ||
sPriv->ddxMinor < 0) {
__driUtilMessage("i810 DRI driver expected DDX driver version 1.0.x but got version %d.%d.%d", sPriv->ddxMajor, sPriv->ddxMinor, sPriv->ddxPatch);
return GL_FALSE;
}
if (sPriv->drmMajor != 1 ||
sPriv->drmMinor < 2) {
__driUtilMessage("i810 DRI driver expected DRM driver version 1.2.x but got version %d.%d.%d", sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch);
return GL_FALSE;
}
i810Screen = (i810ScreenPrivate *)Xmalloc(sizeof(i810ScreenPrivate));
if (!i810Screen) {
__driUtilMessage("i810InitDriver: alloc i810ScreenPrivate struct failed");
return GL_FALSE;
}
i810Screen->driScrnPriv = sPriv;
sPriv->private = (void *)i810Screen;
i810Screen->deviceID=gDRIPriv->deviceID;
i810Screen->width=gDRIPriv->width;
i810Screen->height=gDRIPriv->height;
i810Screen->mem=gDRIPriv->mem;
i810Screen->cpp=gDRIPriv->cpp;
i810Screen->fbStride=gDRIPriv->fbStride;
i810Screen->fbOffset=gDRIPriv->fbOffset;
if (gDRIPriv->bitsPerPixel == 15)
i810Screen->fbFormat = DV_PF_555;
else
i810Screen->fbFormat = DV_PF_565;
i810Screen->backOffset=gDRIPriv->backOffset;
i810Screen->depthOffset=gDRIPriv->depthOffset;
i810Screen->backPitch = gDRIPriv->auxPitch;
i810Screen->backPitchBits = gDRIPriv->auxPitchBits;
i810Screen->textureOffset=gDRIPriv->textureOffset;
i810Screen->textureSize=gDRIPriv->textureSize;
i810Screen->logTextureGranularity = gDRIPriv->logTextureGranularity;
i810Screen->bufs = i810_create_empty_buffers();
if (i810Screen->bufs == NULL) {
__driUtilMessage("i810InitDriver: i810_create_empty_buffers() failed");
Xfree(i810Screen);
return GL_FALSE;
}
i810Screen->back.handle = gDRIPriv->backbuffer;
i810Screen->back.size = gDRIPriv->backbufferSize;
if (drmMap(sPriv->fd,
i810Screen->back.handle,
i810Screen->back.size,
(drmAddress *)&i810Screen->back.map) != 0) {
Xfree(i810Screen);
sPriv->private = NULL;
__driUtilMessage("i810InitDriver: drmMap failed");
return GL_FALSE;
}
i810Screen->depth.handle = gDRIPriv->depthbuffer;
i810Screen->depth.size = gDRIPriv->depthbufferSize;
if (drmMap(sPriv->fd,
i810Screen->depth.handle,
i810Screen->depth.size,
(drmAddress *)&i810Screen->depth.map) != 0) {
Xfree(i810Screen);
drmUnmap(i810Screen->back.map, i810Screen->back.size);
sPriv->private = NULL;
__driUtilMessage("i810InitDriver: drmMap (2) failed");
return GL_FALSE;
}
i810Screen->tex.handle = gDRIPriv->textures;
i810Screen->tex.size = gDRIPriv->textureSize;
if (drmMap(sPriv->fd,
i810Screen->tex.handle,
i810Screen->tex.size,
(drmAddress *)&i810Screen->tex.map) != 0) {
Xfree(i810Screen);
drmUnmap(i810Screen->back.map, i810Screen->back.size);
drmUnmap(i810Screen->depth.map, i810Screen->depth.size);
sPriv->private = NULL;
__driUtilMessage("i810InitDriver: drmMap (3) failed");
return GL_FALSE;
}
i810Screen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;
return GL_TRUE;
}
static void
i810DestroyScreen(__DRIscreenPrivate *sPriv)
{
i810ScreenPrivate *i810Screen = (i810ScreenPrivate *)sPriv->private;
drmUnmap(i810Screen->back.map, i810Screen->back.size);
drmUnmap(i810Screen->depth.map, i810Screen->depth.size);
drmUnmap(i810Screen->tex.map, i810Screen->tex.size);
Xfree(i810Screen);
sPriv->private = NULL;
}
static GLboolean
i810CreateBuffer( __DRIscreenPrivate *driScrnPriv,
__DRIdrawablePrivate *driDrawPriv,
const __GLcontextModes *mesaVis,
GLboolean isPixmap )
{
if (isPixmap) {
return GL_FALSE;
}
else {
driDrawPriv->driverPrivate = (void *)
_mesa_create_framebuffer(mesaVis,
GL_FALSE,
mesaVis->stencilBits > 0,
mesaVis->accumRedBits > 0,
GL_FALSE );
return (driDrawPriv->driverPrivate != NULL);
}
}
static void
i810DestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{
_mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));
}
static GLboolean
i810OpenCloseFullScreen(__DRIcontextPrivate *driContextPriv)
{
return GL_TRUE;
}
static const struct __DriverAPIRec i810API = {
.InitDriver = i810InitDriver,
.DestroyScreen = i810DestroyScreen,
.CreateContext = i810CreateContext,
.DestroyContext = i810DestroyContext,
.CreateBuffer = i810CreateBuffer,
.DestroyBuffer = i810DestroyBuffer,
.SwapBuffers = i810SwapBuffers,
.MakeCurrent = i810MakeCurrent,
.UnbindContext = i810UnbindContext,
.OpenFullScreen = i810OpenCloseFullScreen,
.CloseFullScreen = i810OpenCloseFullScreen,
.GetSwapInfo = NULL,
.GetMSC = NULL,
.WaitForMSC = NULL,
.WaitForSBC = NULL,
.SwapBuffersMSC = NULL
};
void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
int numConfigs, __GLXvisualConfig *config)
{
__DRIscreenPrivate *psp;
psp = __driUtilCreateScreen(dpy, scrn, psc, numConfigs, config, &i810API);
return (void *) psp;
}