parent
							
								
									1f0e69b3a1
								
							
						
					
					
						commit
						e2f8315dae
					
				|  | @ -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 = | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
|  | @ -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; |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue