don't provide accel in this framework
This commit is contained in:
Dave Airlie 2011-03-10 09:13:50 +10:00
parent 1f0e69b3a1
commit e2f8315dae
4 changed files with 1 additions and 880 deletions

View File

@ -38,7 +38,6 @@ modesetting_drv_la_SOURCES = \
driver.h \ driver.h \
output.c \ output.c \
crtc.c \ crtc.c \
exa.c \
dri2.c dri2.c
EXTRA_DIST = EXTRA_DIST =

View File

@ -126,16 +126,6 @@ static const OptionInfoRec Options[] = {
{-1, NULL, OPTV_NONE, {0}, FALSE} {-1, NULL, OPTV_NONE, {0}, FALSE}
}; };
static const char *exaSymbols[] = {
"exaGetVersion",
"exaDriverInit",
"exaDriverFini",
"exaOffscreenAlloc",
"exaOffscreenFree",
"exaWaitSync",
NULL
};
static const char *fbSymbols[] = { static const char *fbSymbols[] = {
"fbPictureInit", "fbPictureInit",
"fbScreenInit", "fbScreenInit",
@ -188,7 +178,7 @@ Setup(pointer module, pointer opts, int *errmaj, int *errmin)
* Tell the loader about symbols from other modules that this module * Tell the loader about symbols from other modules that this module
* might refer to. * might refer to.
*/ */
LoaderRefSymLists(exaSymbols, fbSymbols, ddcSymbols, NULL); LoaderRefSymLists(fbSymbols, ddcSymbols, NULL);
/* /*
* The return value must be non-NULL on success even though there * The return value must be non-NULL on success even though there
@ -415,14 +405,11 @@ CreateFrontBuffer(ScrnInfoPtr pScrn)
Bool fbAccessDisabled; Bool fbAccessDisabled;
int flags; int flags;
ms->noEvict = TRUE;
pScreen->ModifyPixmapHeader(rootPixmap, pScreen->ModifyPixmapHeader(rootPixmap,
pScrn->virtualX, pScrn->virtualY, pScrn->virtualX, pScrn->virtualY,
pScrn->depth, pScrn->bitsPerPixel, pScrn->depth, pScrn->bitsPerPixel,
pScrn->displayWidth * pScrn->bitsPerPixel / 8, pScrn->displayWidth * pScrn->bitsPerPixel / 8,
NULL); NULL);
ms->noEvict = FALSE;
drmModeAddFB(ms->fd, drmModeAddFB(ms->fd,
pScrn->virtualX, pScrn->virtualX,
pScrn->virtualY, pScrn->virtualY,
@ -633,8 +620,6 @@ PreInit(ScrnInfoPtr pScrn, int flags)
xf86LoaderReqSymLists(fbSymbols, NULL); xf86LoaderReqSymLists(fbSymbols, NULL);
xf86LoadSubModule(pScrn, "exa");
#ifdef DRI2 #ifdef DRI2
xf86LoadSubModule(pScrn, "dri2"); xf86LoadSubModule(pScrn, "dri2");
#endif #endif
@ -667,8 +652,6 @@ CreateScreenResources(ScreenPtr pScreen)
Bool ret; Bool ret;
int flags; int flags;
ms->noEvict = TRUE;
pScreen->CreateScreenResources = ms->createScreenResources; pScreen->CreateScreenResources = ms->createScreenResources;
ret = pScreen->CreateScreenResources(pScreen); ret = pScreen->CreateScreenResources(pScreen);
pScreen->CreateScreenResources = CreateScreenResources; pScreen->CreateScreenResources = CreateScreenResources;
@ -678,8 +661,6 @@ CreateScreenResources(ScreenPtr pScreen)
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL)) if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, NULL))
FatalError("Couldn't adjust screen pixmap\n"); FatalError("Couldn't adjust screen pixmap\n");
ms->noEvict = FALSE;
drmModeAddFB(ms->fd, drmModeAddFB(ms->fd,
pScrn->virtualX, pScrn->virtualX,
pScrn->virtualY, pScrn->virtualY,
@ -771,8 +752,6 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
xf86SetBlackWhitePixels(pScreen); xf86SetBlackWhitePixels(pScreen);
ms->exa = ExaInit(pScrn);
miInitializeBackingStore(pScreen); miInitializeBackingStore(pScreen);
xf86SetBackingStore(pScreen); xf86SetBackingStore(pScreen);
xf86SetSilkenMouse(pScreen); xf86SetSilkenMouse(pScreen);
@ -933,9 +912,6 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
pScreen->CreateScreenResources = ms->createScreenResources; pScreen->CreateScreenResources = ms->createScreenResources;
if (ms->exa)
ExaClose(pScrn);
drmClose(ms->fd); drmClose(ms->fd);
ms->fd = -1; ms->fd = -1;

View File

@ -32,7 +32,6 @@
#include <xf86drm.h> #include <xf86drm.h>
#include <xf86drmMode.h> #include <xf86drmMode.h>
#include <xf86mm.h> #include <xf86mm.h>
#include "exa.h"
#define DRV_ERROR(msg) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg); #define DRV_ERROR(msg) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg);
@ -71,10 +70,7 @@ typedef struct _modesettingRec
CreateScreenResourcesProcPtr createScreenResources; CreateScreenResourcesProcPtr createScreenResources;
/* exa */
void *exa;
void *driver; void *driver;
Bool noEvict;
/* dri2 */ /* dri2 */
drm_context_t context; drm_context_t context;

View File

@ -1,850 +0,0 @@
/*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*
* Author: Alan Hourihane <alanh@tungstengraphics.com>
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/* FIXME ! */
#define DRI_DRIVER_PATH "/ISO/X.Org/modular/i386/lib/dri"
#include "xf86.h"
#include "xf86_OSproc.h"
#include "driver.h"
#include <dlfcn.h>
#include "pipe/p_winsys.h"
#include "pipe/p_format.h"
#include "pipe/p_context.h"
#include "pipe/p_util.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
/* EXA winsys */
struct exa_context
{
};
struct exa_winsys
{
struct pipe_winsys base;
modesettingPtr ms;
};
struct exa_buffer
{
struct pipe_buffer base;
drmBO bo;
boolean userBuffer; /** Is this a user-space buffer? */
//void *data;
//void *mapped;
};
struct exa_surface
{
struct pipe_surface surface;
};
struct exa_entity
{
ExaDriverPtr pExa;
struct exa_context *c;
struct pipe_winsys *ws;
struct pipe_context *ctx;
struct pipe_screen *scrn;
};
static INLINE struct exa_winsys *
exa_get_winsys(struct pipe_winsys *ws)
{
return (struct exa_winsys *)ws;
}
static INLINE struct exa_surface *
exa_get_surface(struct pipe_surface *ps)
{
return (struct exa_surface *)ps;
}
static INLINE struct exa_buffer *
exa_get_buffer(struct pipe_buffer *buf)
{
return (struct exa_buffer *)buf;
}
static void *
exa_buffer_map(struct pipe_winsys *pws, struct pipe_buffer *buf,
unsigned flags)
{
struct exa_buffer *exa_buf = exa_get_buffer(buf);
struct exa_winsys *exa_winsys = exa_get_winsys(pws);
void *virtual;
drmBOMap(exa_winsys->ms->fd,
&exa_buf->bo, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &virtual);
return virtual;
}
static void
exa_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf)
{
struct exa_buffer *exa_buf = exa_get_buffer(buf);
struct exa_winsys *exa_winsys = exa_get_winsys(pws);
drmBOUnmap(exa_winsys->ms->fd, &exa_buf->bo);
}
static void
exa_buffer_destroy(struct pipe_winsys *pws, struct pipe_buffer *buf)
{
struct exa_winsys *exa_winsys = exa_get_winsys(pws);
struct exa_buffer *exa_buf = exa_get_buffer(buf);
drmBOUnreference(exa_winsys->ms->fd, &exa_buf->bo);
free(exa_buf);
}
static void
exa_flush_frontbuffer(struct pipe_winsys *pws,
struct pipe_surface *surf, void *context_private)
{
struct exa_buffer *exa_buf = exa_get_buffer(surf->buffer);
ErrorF("WANT TO FLUSH\n");
}
static const char *
exa_get_name(struct pipe_winsys *pws)
{
return "EXA";
}
static struct pipe_buffer *
exa_buffer_create(struct pipe_winsys *pws,
unsigned alignment, unsigned usage, unsigned size)
{
struct exa_buffer *buffer = xcalloc(1, sizeof(struct exa_buffer));
struct exa_winsys *exa_winsys = exa_get_winsys(pws);
unsigned int flags = 0;
buffer->base.refcount = 1;
buffer->base.alignment = alignment;
buffer->base.usage = usage;
buffer->base.size = size;
if (exa_winsys->ms->noEvict) {
flags = DRM_BO_FLAG_NO_EVICT;
ErrorF("DISPLAY TARGET\n");
}
ErrorF("SIZE %d %d\n", size, alignment);
if (!buffer->bo.handle) {
// buffer->data = align_malloc(size, alignment);
drmBOCreate(exa_winsys->ms->fd, size, 0, NULL,
DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE |
DRM_BO_FLAG_SHAREABLE | DRM_BO_FLAG_MEM_TT |
DRM_BO_FLAG_MAPPABLE | flags,
0, &buffer->bo);
}
return &buffer->base;
}
static struct pipe_buffer *
exa_user_buffer_create(struct pipe_winsys *pws, void *ptr, unsigned bytes)
{
struct exa_buffer *buffer = xcalloc(1, sizeof(struct exa_buffer));
buffer->base.refcount = 1;
buffer->base.size = bytes;
buffer->userBuffer = TRUE;
//buffer->data = ptr;
ErrorF("USERBUFFER\n");
return &buffer->base;
}
/**
* Round n up to next multiple.
*/
static INLINE unsigned
round_up(unsigned n, unsigned multiple)
{
return (n + multiple - 1) & ~(multiple - 1);
}
static int
exa_surface_alloc_storage(struct pipe_winsys *winsys,
struct pipe_surface *surf,
unsigned width, unsigned height,
enum pipe_format format,
unsigned flags, unsigned tex_usage)
{
const unsigned alignment = 64;
surf->width = width;
surf->height = height;
surf->format = format;
pf_get_block(format, &surf->block);
surf->stride = round_up(surf->nblocksx * surf->block.size, alignment);
assert(!surf->buffer);
surf->buffer = winsys->buffer_create(winsys, alignment,
PIPE_BUFFER_USAGE_PIXEL,
surf->stride * height);
if (!surf->buffer)
return -1;
return 0;
}
/**
* Called via winsys->surface_alloc() to create new surfaces.
*/
static struct pipe_surface *
exa_surface_alloc(struct pipe_winsys *ws)
{
struct exa_surface *wms = xcalloc(1, sizeof(struct exa_surface));
assert(ws);
wms->surface.refcount = 1;
wms->surface.winsys = ws;
return &wms->surface;
}
static void
exa_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s)
{
struct pipe_surface *surf = *s;
surf->refcount--;
if (surf->refcount == 0) {
if (surf->buffer)
pipe_buffer_reference(winsys, &surf->buffer, NULL);
free(surf);
}
*s = NULL;
}
/*
* Fence functions - basically nothing to do, as we don't create any actual
* fence objects.
*/
static void
exa_fence_reference(struct pipe_winsys *sws, struct pipe_fence_handle **ptr,
struct pipe_fence_handle *fence)
{
}
static int
exa_fence_signalled(struct pipe_winsys *sws, struct pipe_fence_handle *fence,
unsigned flag)
{
return 0;
}
static int
exa_fence_finish(struct pipe_winsys *sws, struct pipe_fence_handle *fence,
unsigned flag)
{
return 0;
}
struct pipe_winsys *
exa_get_pipe_winsys(modesettingPtr ms)
{
static struct exa_winsys *ws = NULL;
if (!ws) {
ws = xcalloc(1, sizeof(struct exa_winsys));
/* Fill in this struct with callbacks that pipe will need to
* communicate with the window system, buffer manager, etc.
*/
ws->base.buffer_create = exa_buffer_create;
ws->base.user_buffer_create = exa_user_buffer_create;
ws->base.buffer_map = exa_buffer_map;
ws->base.buffer_unmap = exa_buffer_unmap;
ws->base.buffer_destroy = exa_buffer_destroy;
ws->base.surface_alloc = exa_surface_alloc;
ws->base.surface_alloc_storage = exa_surface_alloc_storage;
ws->base.surface_release = exa_surface_release;
ws->base.fence_reference = exa_fence_reference;
ws->base.fence_signalled = exa_fence_signalled;
ws->base.fence_finish = exa_fence_finish;
ws->base.flush_frontbuffer = exa_flush_frontbuffer;
ws->base.get_name = exa_get_name;
ws->ms = ms;
}
return &ws->base;
}
/* EXA functions */
struct PixmapPriv
{
drmBO bo;
#if 0
dri_fence *fence;
#endif
int flags;
struct pipe_texture *tex;
unsigned int color;
struct pipe_surface *src_surf; /* for copies */
};
static enum pipe_format
exa_get_pipe_format(int depth)
{
switch (depth) {
case 32:
case 24:
return PIPE_FORMAT_A8R8G8B8_UNORM;
case 16:
return PIPE_FORMAT_R5G6B5_UNORM;
case 15:
return PIPE_FORMAT_A1R5G5B5_UNORM;
case 8:
case 4:
case 1:
return PIPE_FORMAT_A8R8G8B8_UNORM; /* bad bad bad */
default:
assert(0);
return 0;
}
}
/*
* EXA functions
*/
static void
ExaWaitMarker(ScreenPtr pScreen, int marker)
{
}
static int
ExaMarkSync(ScreenPtr pScreen)
{
return 1;
}
Bool
ExaPrepareAccess(PixmapPtr pPix, int index)
{
ScreenPtr pScreen = pPix->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
struct exa_entity *exa = ms->exa;
struct PixmapPriv *priv;
int ret;
priv = exaGetPixmapDriverPrivate(pPix);
if (!priv)
return FALSE;
if (!priv->tex)
return FALSE;
{
struct pipe_surface *surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_CPU_READ |
PIPE_BUFFER_USAGE_CPU_WRITE);
pPix->devPrivate.ptr =
exa->scrn->surface_map(exa->scrn, surf,
PIPE_BUFFER_USAGE_CPU_READ |
PIPE_BUFFER_USAGE_CPU_WRITE);
exa->scrn->tex_surface_release(exa->scrn, &surf);
}
return TRUE;
}
void
ExaFinishAccess(PixmapPtr pPix, int index)
{
ScreenPtr pScreen = pPix->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
struct PixmapPriv *priv;
struct exa_entity *exa = ms->exa;
int ret;
priv = exaGetPixmapDriverPrivate(pPix);
if (!priv)
return;
if (!priv->tex)
return;
{
struct pipe_surface *surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_CPU_READ |
PIPE_BUFFER_USAGE_CPU_WRITE);
exa->scrn->surface_unmap(exa->scrn, surf);
exa->scrn->tex_surface_release(exa->scrn, &surf);
pPix->devPrivate.ptr = NULL;
}
}
static void
ExaDone(PixmapPtr pPixmap)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pPixmap);
struct exa_entity *exa = ms->exa;
if (!priv)
return;
if (priv->src_surf)
exa->scrn->tex_surface_release(exa->scrn, &priv->src_surf);
priv->src_surf = NULL;
}
static void
ExaDoneComposite(PixmapPtr pPixmap)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
}
static Bool
ExaPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pPixmap);
struct exa_entity *exa = ms->exa;
if (pPixmap->drawable.depth < 15)
return FALSE;
if (!EXA_PM_IS_SOLID(&pPixmap->drawable, planeMask))
return FALSE;
if (!priv || !priv->tex)
return FALSE;
if (alu != GXcopy)
return FALSE;
if (!exa->ctx || !exa->ctx->surface_fill)
return FALSE;
priv->color = fg;
return TRUE;
}
static void
ExaSolid(PixmapPtr pPixmap, int x0, int y0, int x1, int y1)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pPixmap);
struct pipe_surface *surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_GPU_READ |
PIPE_BUFFER_USAGE_GPU_WRITE);
exa->ctx->surface_fill(exa->ctx, surf, x0, y0, x1 - x0, y1 - y0,
priv->color);
exa->scrn->tex_surface_release(exa->scrn, &surf);
}
static Bool
ExaPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir,
int ydir, int alu, Pixel planeMask)
{
ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
struct pipe_surface *src_surf;
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
struct PixmapPriv *src_priv = exaGetPixmapDriverPrivate(pSrcPixmap);
if (alu != GXcopy)
return FALSE;
if (pSrcPixmap->drawable.depth < 15 || pDstPixmap->drawable.depth < 15)
return FALSE;
if (!EXA_PM_IS_SOLID(&pSrcPixmap->drawable, planeMask))
return FALSE;
if (!priv || !src_priv)
return FALSE;
if (!priv->tex || !src_priv->tex)
return FALSE;
if (!exa->ctx || !exa->ctx->surface_copy)
return FALSE;
priv->src_surf =
exa->scrn->get_tex_surface(exa->scrn, src_priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_GPU_READ |
PIPE_BUFFER_USAGE_GPU_WRITE);
return FALSE;
}
static void
ExaCopy(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY,
int width, int height)
{
ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pDstPixmap);
struct pipe_surface *surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_GPU_READ |
PIPE_BUFFER_USAGE_GPU_WRITE);
exa->ctx->surface_copy(exa->ctx, 0, surf, dstX, dstY, priv->src_surf,
srcX, srcY, width, height);
exa->scrn->tex_surface_release(exa->scrn, &surf);
}
static Bool
ExaPrepareComposite(int op, PicturePtr pSrcPicture,
PicturePtr pMaskPicture, PicturePtr pDstPicture,
PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst)
{
ScreenPtr pScreen = pDst->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
return FALSE;
}
static Bool
ExaUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src,
int src_pitch)
{
ScreenPtr pScreen = pDst->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ErrorF("UPLOAD\n");
return FALSE;
}
static void
ExaComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
int dstX, int dstY, int width, int height)
{
ScreenPtr pScreen = pDst->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
}
static Bool
ExaCheckComposite(int op,
PicturePtr pSrcPicture, PicturePtr pMaskPicture,
PicturePtr pDstPicture)
{
DrawablePtr pDraw = pSrcPicture->pDrawable;
int w = pDraw->width;
int h = pDraw->height;
return FALSE;
}
static void *
ExaCreatePixmap(ScreenPtr pScreen, int size, int align)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct PixmapPriv *priv;
void *virtual;
priv = xcalloc(1, sizeof(struct PixmapPriv));
if (!priv)
return NULL;
return priv;
}
static void
ExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
{
struct PixmapPriv *priv = (struct PixmapPriv *)dPriv;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
if (!priv)
return;
if (priv->tex)
exa->scrn->texture_release(exa->scrn, &priv->tex);
xfree(priv);
}
static Bool
ExaPixmapIsOffscreen(PixmapPtr pPixmap)
{
struct PixmapPriv *priv;
ScreenPtr pScreen = pPixmap->drawable.pScreen;
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
priv = exaGetPixmapDriverPrivate(pPixmap);
if (!priv)
return FALSE;
if (priv->tex)
return TRUE;
return FALSE;
}
/* FIXME !! */
unsigned int
driGetPixmapHandle(PixmapPtr pPixmap, unsigned int *flags)
{
ScreenPtr pScreen = pPixmap->drawable.pScreen;
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
struct exa_buffer *exa_buf;
struct pipe_surface *surf;
struct PixmapPriv *priv;
*flags = 0;
if (!ms->exa) {
FatalError("NO MS->EXA\n");
return 0;
}
priv = exaGetPixmapDriverPrivate(pPixmap);
if (!priv) {
FatalError("NO PIXMAP PRIVATE\n");
return 0;
}
surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_CPU_READ |
PIPE_BUFFER_USAGE_CPU_WRITE);
exa_buf = exa_get_buffer(surf->buffer);
exa->scrn->tex_surface_release(exa->scrn, &surf);
if (exa_buf->bo.handle)
return exa_buf->bo.handle;
return 0;
}
static Bool
ExaModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
int depth, int bitsPerPixel, int devKind,
pointer pPixData)
{
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
struct PixmapPriv *priv = exaGetPixmapDriverPrivate(pPixmap);
modesettingPtr ms = modesettingPTR(pScrn);
PixmapPtr rootPixmap = pScreen->GetScreenPixmap(pScreen);
struct exa_entity *exa = ms->exa;
if (!priv)
return FALSE;
if (depth <= 0)
depth = pPixmap->drawable.depth;
if (bitsPerPixel <= 0)
bitsPerPixel = pPixmap->drawable.bitsPerPixel;
if (width <= 0)
width = pPixmap->drawable.width;
if (height <= 0)
height = pPixmap->drawable.height;
if (width <= 0 || height <= 0 || depth <= 0)
return FALSE;
miModifyPixmapHeader(pPixmap, width, height, depth,
bitsPerPixel, devKind, NULL);
/* Deal with screen resize */
if (priv->tex) {
struct pipe_surface *surf =
exa->scrn->get_tex_surface(exa->scrn, priv->tex, 0, 0, 0,
PIPE_BUFFER_USAGE_CPU_READ |
PIPE_BUFFER_USAGE_CPU_WRITE);
ErrorF("RESIZE %d %d to %d %d\n", surf->width, surf->height, width,
height);
if (surf->width != width || surf->height != height) {
exa->scrn->texture_release(exa->scrn, &priv->tex);
priv->tex = NULL;
}
exa->scrn->tex_surface_release(exa->scrn, &surf);
}
if (!priv->tex) {
struct pipe_texture template;
memset(&template, 0, sizeof(template));
template.target = PIPE_TEXTURE_2D;
template.compressed = 0;
template.format = exa_get_pipe_format(depth);
pf_get_block(template.format, &template.block);
template.width[0] = width;
template.height[0] = height;
template.depth[0] = 1;
template.last_level = 0;
template.tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET;
priv->tex = exa->scrn->texture_create(exa->scrn, &template);
}
return TRUE;
}
void
ExaClose(ScrnInfoPtr pScrn)
{
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa = ms->exa;
exaDriverFini(pScrn->pScreen);
dlclose(ms->driver);
}
void *
ExaInit(ScrnInfoPtr pScrn)
{
modesettingPtr ms = modesettingPTR(pScrn);
struct exa_entity *exa;
ExaDriverPtr pExa;
exa = xcalloc(1, sizeof(struct exa_entity));
if (!exa)
return NULL;
pExa = exaDriverAlloc();
if (!pExa) {
goto out_err;
}
memset(pExa, 0, sizeof(*pExa));
pExa->exa_major = 2;
pExa->exa_minor = 4;
pExa->memoryBase = 0;
pExa->memorySize = 0;
pExa->offScreenBase = 0;
pExa->pixmapOffsetAlign = 0;
pExa->pixmapPitchAlign = 1;
pExa->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
pExa->maxX = 8191; /* FIXME */
pExa->maxY = 8191; /* FIXME */
pExa->WaitMarker = ExaWaitMarker;
pExa->MarkSync = ExaMarkSync;
pExa->PrepareSolid = ExaPrepareSolid;
pExa->Solid = ExaSolid;
pExa->DoneSolid = ExaDone;
pExa->PrepareCopy = ExaPrepareCopy;
pExa->Copy = ExaCopy;
pExa->DoneCopy = ExaDone;
pExa->CheckComposite = ExaCheckComposite;
pExa->PrepareComposite = ExaPrepareComposite;
pExa->Composite = ExaComposite;
pExa->DoneComposite = ExaDoneComposite;
pExa->PixmapIsOffscreen = ExaPixmapIsOffscreen;
pExa->PrepareAccess = ExaPrepareAccess;
pExa->FinishAccess = ExaFinishAccess;
pExa->UploadToScreen = ExaUploadToScreen;
pExa->CreatePixmap = ExaCreatePixmap;
pExa->DestroyPixmap = ExaDestroyPixmap;
pExa->ModifyPixmapHeader = ExaModifyPixmapHeader;
if (!exaDriverInit(pScrn->pScreen, pExa)) {
goto out_err;
}
{
char filename[128];
char dri_driver_path[] = DRI_DRIVER_PATH;
snprintf(filename, sizeof filename,
"%s/%s_dri.so", dri_driver_path, "i915");
ms->driver = dlopen(filename, RTLD_NOW | RTLD_DEEPBIND | RTLD_GLOBAL);
if (!ms->driver)
FatalError("failed to initialize i915 - for softpipe only.\n");
exa->c = xcalloc(1, sizeof(struct exa_context));
exa->ws = exa_get_pipe_winsys(ms);
if (!exa->ws)
FatalError("BAD WINSYS\n");
exa->scrn = softpipe_create_screen(exa->ws);
if (!exa->scrn)
FatalError("BAD SCREEN\n");
exa->ctx = softpipe_create(exa->scrn, exa->ws, NULL);
if (!exa->ctx)
FatalError("BAD CTX\n");
exa->ctx->priv = exa->c;
}
return (void *)exa;
out_err:
ExaClose(pScrn);
return NULL;
}