glx: indent -br -i3 -npcs --no-tabs drisw_glx.c

This commit is contained in:
RALOVICH, Kristóf 2008-10-13 13:47:37 +02:00 committed by Brian Paul
parent 4e88ae5639
commit 60aa0918a1
1 changed files with 274 additions and 270 deletions

View File

@ -34,395 +34,398 @@ typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate;
typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate; typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate;
typedef struct __GLXDRIdrawablePrivateRec __GLXDRIdrawablePrivate; typedef struct __GLXDRIdrawablePrivateRec __GLXDRIdrawablePrivate;
struct __GLXDRIdisplayPrivateRec { struct __GLXDRIdisplayPrivateRec
__GLXDRIdisplay base; {
__GLXDRIdisplay base;
}; };
struct __GLXDRIcontextPrivateRec { struct __GLXDRIcontextPrivateRec
__GLXDRIcontext base; {
__DRIcontext *driContext; __GLXDRIcontext base;
__GLXscreenConfigs *psc; __DRIcontext *driContext;
__GLXscreenConfigs *psc;
}; };
struct __GLXDRIdrawablePrivateRec { struct __GLXDRIdrawablePrivateRec
__GLXDRIdrawable base; {
__GLXDRIdrawable base;
GC gc; GC gc;
GC swapgc; GC swapgc;
XVisualInfo *visinfo; XVisualInfo *visinfo;
XImage *ximage; XImage *ximage;
int bpp; int bpp;
}; };
/** /**
* swrast loader functions * swrast loader functions
*/ */
static Bool XCreateDrawable(__GLXDRIdrawablePrivate *pdp, static Bool
Display *dpy, XID drawable, int visualid) XCreateDrawable(__GLXDRIdrawablePrivate * pdp,
Display * dpy, XID drawable, int visualid)
{ {
XGCValues gcvalues; XGCValues gcvalues;
long visMask; long visMask;
XVisualInfo visTemp; XVisualInfo visTemp;
int num_visuals; int num_visuals;
/* create GC's */ /* create GC's */
pdp->gc = XCreateGC(dpy, drawable, 0, NULL); pdp->gc = XCreateGC(dpy, drawable, 0, NULL);
pdp->swapgc = XCreateGC(dpy, drawable, 0, NULL); pdp->swapgc = XCreateGC(dpy, drawable, 0, NULL);
gcvalues.function = GXcopy; gcvalues.function = GXcopy;
gcvalues.graphics_exposures = False; gcvalues.graphics_exposures = False;
XChangeGC(dpy, pdp->gc, GCFunction, &gcvalues); XChangeGC(dpy, pdp->gc, GCFunction, &gcvalues);
XChangeGC(dpy, pdp->swapgc, GCFunction, &gcvalues); XChangeGC(dpy, pdp->swapgc, GCFunction, &gcvalues);
XChangeGC(dpy, pdp->swapgc, GCGraphicsExposures, &gcvalues); XChangeGC(dpy, pdp->swapgc, GCGraphicsExposures, &gcvalues);
/* create XImage */ /* create XImage */
visTemp.screen = DefaultScreen(dpy); visTemp.screen = DefaultScreen(dpy);
visTemp.visualid = visualid; visTemp.visualid = visualid;
visMask = (VisualScreenMask | VisualIDMask); visMask = (VisualScreenMask | VisualIDMask);
pdp->visinfo = XGetVisualInfo(dpy, visMask, &visTemp, &num_visuals); pdp->visinfo = XGetVisualInfo(dpy, visMask, &visTemp, &num_visuals);
pdp->ximage = XCreateImage(dpy, pdp->ximage = XCreateImage(dpy, pdp->visinfo->visual, pdp->visinfo->depth, ZPixmap, 0, /* format, offset */
pdp->visinfo->visual, NULL, /* data */
pdp->visinfo->depth, 0, 0, /* size */
ZPixmap, 0, /* format, offset */ 32, /* bitmap_pad */
NULL, /* data */ 0); /* bytes_per_line */
0, 0, /* size */
32, /* bitmap_pad */
0); /* bytes_per_line */
/* get the true number of bits per pixel */ /* get the true number of bits per pixel */
pdp->bpp = pdp->ximage->bits_per_pixel; pdp->bpp = pdp->ximage->bits_per_pixel;
return True; return True;
}
static void XDestroyDrawable(__GLXDRIdrawablePrivate *pdp,
Display *dpy, XID drawable)
{
XDestroyImage(pdp->ximage);
XFree(pdp->visinfo);
XFreeGC(dpy, pdp->gc);
XFreeGC(dpy, pdp->swapgc);
} }
static void static void
swrastGetDrawableInfo(__DRIdrawable *draw, XDestroyDrawable(__GLXDRIdrawablePrivate * pdp, Display * dpy, XID drawable)
int *x, int *y, int *w, int *h,
void *loaderPrivate)
{ {
__GLXDRIdrawablePrivate *pdp = loaderPrivate; XDestroyImage(pdp->ximage);
__GLXDRIdrawable *pdraw = &(pdp->base);; XFree(pdp->visinfo);
Display *dpy = pdraw->psc->dpy;
Drawable drawable;
Window root; XFreeGC(dpy, pdp->gc);
Status stat; XFreeGC(dpy, pdp->swapgc);
unsigned int bw, depth; }
drawable = pdraw->xDrawable; static void
swrastGetDrawableInfo(__DRIdrawable * draw,
int *x, int *y, int *w, int *h, void *loaderPrivate)
{
__GLXDRIdrawablePrivate *pdp = loaderPrivate;
__GLXDRIdrawable *pdraw = &(pdp->base);;
Display *dpy = pdraw->psc->dpy;
Drawable drawable;
stat = XGetGeometry(dpy, drawable, &root, Window root;
x, y, (unsigned int *)w, (unsigned int *)h, Status stat;
&bw, &depth); unsigned int bw, depth;
drawable = pdraw->xDrawable;
stat = XGetGeometry(dpy, drawable, &root,
x, y, (unsigned int *) w, (unsigned int *) h,
&bw, &depth);
} }
static inline int static inline int
bytes_per_line(int w, int bpp, unsigned mul) bytes_per_line(int w, int bpp, unsigned mul)
{ {
unsigned mask = mul - 1; unsigned mask = mul - 1;
return ((w * bpp + mask) & ~mask) / 8; return ((w * bpp + mask) & ~mask) / 8;
} }
static void static void
swrastPutImage(__DRIdrawable *draw, int op, swrastPutImage(__DRIdrawable * draw, int op,
int x, int y, int w, int h, char *data, int x, int y, int w, int h, char *data, void *loaderPrivate)
void *loaderPrivate)
{ {
__GLXDRIdrawablePrivate *pdp = loaderPrivate; __GLXDRIdrawablePrivate *pdp = loaderPrivate;
__GLXDRIdrawable *pdraw = &(pdp->base);; __GLXDRIdrawable *pdraw = &(pdp->base);;
Display *dpy = pdraw->psc->dpy; Display *dpy = pdraw->psc->dpy;
Drawable drawable; Drawable drawable;
XImage *ximage; XImage *ximage;
GC gc; GC gc;
switch (op) { switch (op) {
case __DRI_SWRAST_IMAGE_OP_DRAW: case __DRI_SWRAST_IMAGE_OP_DRAW:
gc = pdp->gc; gc = pdp->gc;
break; break;
case __DRI_SWRAST_IMAGE_OP_SWAP: case __DRI_SWRAST_IMAGE_OP_SWAP:
gc = pdp->swapgc; gc = pdp->swapgc;
break; break;
default: default:
return; return;
} }
drawable = pdraw->xDrawable; drawable = pdraw->xDrawable;
ximage = pdp->ximage; ximage = pdp->ximage;
ximage->data = data; ximage->data = data;
ximage->width = w; ximage->width = w;
ximage->height = h; ximage->height = h;
ximage->bytes_per_line = bytes_per_line(w, pdp->bpp, 32); ximage->bytes_per_line = bytes_per_line(w, pdp->bpp, 32);
XPutImage(dpy, drawable, gc, ximage, 0, 0, x, y, w, h); XPutImage(dpy, drawable, gc, ximage, 0, 0, x, y, w, h);
ximage->data = NULL; ximage->data = NULL;
} }
static void static void
swrastGetImage(__DRIdrawable *draw, swrastGetImage(__DRIdrawable * draw,
int x, int y, int w, int h, char *data, int x, int y, int w, int h, char *data, void *loaderPrivate)
void *loaderPrivate)
{ {
__GLXDRIdrawablePrivate *pdp = loaderPrivate; __GLXDRIdrawablePrivate *pdp = loaderPrivate;
__GLXDRIdrawable *pdraw = &(pdp->base);; __GLXDRIdrawable *pdraw = &(pdp->base);;
Display *dpy = pdraw->psc->dpy; Display *dpy = pdraw->psc->dpy;
Drawable drawable; Drawable drawable;
XImage *ximage; XImage *ximage;
drawable = pdraw->xDrawable; drawable = pdraw->xDrawable;
ximage = pdp->ximage; ximage = pdp->ximage;
ximage->data = data; ximage->data = data;
ximage->width = w; ximage->width = w;
ximage->height = h; ximage->height = h;
ximage->bytes_per_line = bytes_per_line(w, pdp->bpp, 32); ximage->bytes_per_line = bytes_per_line(w, pdp->bpp, 32);
XGetSubImage(dpy, drawable, x, y, w, h, ~0L, ZPixmap, ximage, 0, 0); XGetSubImage(dpy, drawable, x, y, w, h, ~0L, ZPixmap, ximage, 0, 0);
ximage->data = NULL; ximage->data = NULL;
} }
static const __DRIswrastLoaderExtension swrastLoaderExtension = { static const __DRIswrastLoaderExtension swrastLoaderExtension = {
{ __DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION }, {__DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION},
swrastGetDrawableInfo, swrastGetDrawableInfo,
swrastPutImage, swrastPutImage,
swrastGetImage swrastGetImage
}; };
static const __DRIextension *loader_extensions[] = { static const __DRIextension *loader_extensions[] = {
&systemTimeExtension.base, &systemTimeExtension.base,
&swrastLoaderExtension.base, &swrastLoaderExtension.base,
NULL NULL
}; };
/** /**
* GLXDRI functions * GLXDRI functions
*/ */
static void driDestroyContext(__GLXDRIcontext *context, static void
__GLXscreenConfigs *psc, Display *dpy) driDestroyContext(__GLXDRIcontext * context,
__GLXscreenConfigs * psc, Display * dpy)
{ {
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
const __DRIcoreExtension *core = pcp->psc->core; const __DRIcoreExtension *core = pcp->psc->core;
(*core->destroyContext)(pcp->driContext); (*core->destroyContext) (pcp->driContext);
Xfree(pcp); Xfree(pcp);
} }
static Bool driBindContext(__GLXDRIcontext *context, static Bool
__GLXDRIdrawable *draw, __GLXDRIdrawable *read) driBindContext(__GLXDRIcontext * context,
__GLXDRIdrawable * draw, __GLXDRIdrawable * read)
{ {
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
const __DRIcoreExtension *core = pcp->psc->core; const __DRIcoreExtension *core = pcp->psc->core;
return (*core->bindContext)(pcp->driContext, return (*core->bindContext) (pcp->driContext,
draw->driDrawable, draw->driDrawable, read->driDrawable);
read->driDrawable);
} }
static void driUnbindContext(__GLXDRIcontext *context) static void
driUnbindContext(__GLXDRIcontext * context)
{ {
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context; __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
const __DRIcoreExtension *core = pcp->psc->core; const __DRIcoreExtension *core = pcp->psc->core;
(*core->unbindContext)(pcp->driContext); (*core->unbindContext) (pcp->driContext);
} }
static __GLXDRIcontext *driCreateContext(__GLXscreenConfigs *psc, static __GLXDRIcontext *
const __GLcontextModes *mode, driCreateContext(__GLXscreenConfigs * psc,
GLXContext gc, const __GLcontextModes * mode,
GLXContext shareList, int renderType) GLXContext gc, GLXContext shareList, int renderType)
{ {
__GLXDRIcontextPrivate *pcp, *pcp_shared; __GLXDRIcontextPrivate *pcp, *pcp_shared;
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
const __DRIcoreExtension *core = psc->core; const __DRIcoreExtension *core = psc->core;
__DRIcontext *shared = NULL; __DRIcontext *shared = NULL;
if (!psc || !psc->driScreen) if (!psc || !psc->driScreen)
return NULL; return NULL;
if (shareList) { if (shareList) {
pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext; pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
shared = pcp_shared->driContext; shared = pcp_shared->driContext;
} }
pcp = Xmalloc(sizeof *pcp); pcp = Xmalloc(sizeof *pcp);
if (pcp == NULL) if (pcp == NULL)
return NULL; return NULL;
pcp->psc = psc; pcp->psc = psc;
pcp->driContext = pcp->driContext =
(*core->createNewContext)(psc->__driScreen, (*core->createNewContext) (psc->__driScreen,
config->driConfig, shared, pcp); config->driConfig, shared, pcp);
if (pcp->driContext == NULL) { if (pcp->driContext == NULL) {
Xfree(pcp); Xfree(pcp);
return NULL; return NULL;
} }
pcp->base.destroyContext = driDestroyContext; pcp->base.destroyContext = driDestroyContext;
pcp->base.bindContext = driBindContext; pcp->base.bindContext = driBindContext;
pcp->base.unbindContext = driUnbindContext; pcp->base.unbindContext = driUnbindContext;
return &pcp->base; return &pcp->base;
} }
static void driDestroyDrawable(__GLXDRIdrawable *pdraw) static void
driDestroyDrawable(__GLXDRIdrawable * pdraw)
{ {
__GLXDRIdrawablePrivate *pdp = (__GLXDRIdrawablePrivate *) pdraw; __GLXDRIdrawablePrivate *pdp = (__GLXDRIdrawablePrivate *) pdraw;
const __DRIcoreExtension *core = pdraw->psc->core; const __DRIcoreExtension *core = pdraw->psc->core;
(*core->destroyDrawable)(pdraw->driDrawable); (*core->destroyDrawable) (pdraw->driDrawable);
XDestroyDrawable(pdp, pdraw->psc->dpy, pdraw->drawable); XDestroyDrawable(pdp, pdraw->psc->dpy, pdraw->drawable);
Xfree(pdp); Xfree(pdp);
} }
static __GLXDRIdrawable *driCreateDrawable(__GLXscreenConfigs *psc, static __GLXDRIdrawable *
XID xDrawable, driCreateDrawable(__GLXscreenConfigs * psc,
GLXDrawable drawable, XID xDrawable,
const __GLcontextModes *modes) GLXDrawable drawable, const __GLcontextModes * modes)
{ {
__GLXDRIdrawable *pdraw; __GLXDRIdrawable *pdraw;
__GLXDRIdrawablePrivate *pdp; __GLXDRIdrawablePrivate *pdp;
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
const __DRIswrastExtension *swrast = psc->swrast; const __DRIswrastExtension *swrast = psc->swrast;
/* Old dri can't handle GLX 1.3+ drawable constructors. */ /* Old dri can't handle GLX 1.3+ drawable constructors. */
if (xDrawable != drawable) if (xDrawable != drawable)
return NULL; return NULL;
pdp = Xmalloc(sizeof(*pdp)); pdp = Xmalloc(sizeof(*pdp));
if (!pdp) if (!pdp)
return NULL; return NULL;
pdraw = &(pdp->base); pdraw = &(pdp->base);
pdraw->xDrawable = xDrawable; pdraw->xDrawable = xDrawable;
pdraw->drawable = drawable; pdraw->drawable = drawable;
pdraw->psc = psc; pdraw->psc = psc;
XCreateDrawable(pdp, psc->dpy, xDrawable, modes->visualID); XCreateDrawable(pdp, psc->dpy, xDrawable, modes->visualID);
/* Create a new drawable */ /* Create a new drawable */
pdraw->driDrawable = pdraw->driDrawable =
(*swrast->createNewDrawable)(psc->__driScreen, (*swrast->createNewDrawable) (psc->__driScreen, config->driConfig, pdp);
config->driConfig,
pdp);
if (!pdraw->driDrawable) { if (!pdraw->driDrawable) {
XDestroyDrawable(pdp, psc->dpy, xDrawable); XDestroyDrawable(pdp, psc->dpy, xDrawable);
Xfree(pdp); Xfree(pdp);
return NULL; return NULL;
} }
pdraw->destroyDrawable = driDestroyDrawable; pdraw->destroyDrawable = driDestroyDrawable;
return pdraw; return pdraw;
} }
static void driSwapBuffers(__GLXDRIdrawable *pdraw) static void
driSwapBuffers(__GLXDRIdrawable * pdraw)
{ {
(*pdraw->psc->core->swapBuffers)(pdraw->driDrawable); (*pdraw->psc->core->swapBuffers) (pdraw->driDrawable);
} }
static void driDestroyScreen(__GLXscreenConfigs *psc) static void
driDestroyScreen(__GLXscreenConfigs * psc)
{ {
/* Free the direct rendering per screen data */ /* Free the direct rendering per screen data */
(*psc->core->destroyScreen)(psc->__driScreen); (*psc->core->destroyScreen) (psc->__driScreen);
psc->__driScreen = NULL; psc->__driScreen = NULL;
if (psc->driver) if (psc->driver)
dlclose(psc->driver); dlclose(psc->driver);
} }
static __GLXDRIscreen *driCreateScreen(__GLXscreenConfigs *psc, int screen, static __GLXDRIscreen *
__GLXdisplayPrivate *priv) driCreateScreen(__GLXscreenConfigs * psc, int screen,
__GLXdisplayPrivate * priv)
{ {
__GLXDRIscreen *psp; __GLXDRIscreen *psp;
const __DRIconfig **driver_configs; const __DRIconfig **driver_configs;
const __DRIextension **extensions; const __DRIextension **extensions;
const char *driverName = "swrast"; const char *driverName = "swrast";
int i; int i;
psp = Xmalloc(sizeof *psp); psp = Xmalloc(sizeof *psp);
if (psp == NULL) if (psp == NULL)
return NULL; return NULL;
/* Initialize per screen dynamic client GLX extensions */ /* Initialize per screen dynamic client GLX extensions */
psc->ext_list_first_time = GL_TRUE; psc->ext_list_first_time = GL_TRUE;
psc->driver = driOpenDriver(driverName); psc->driver = driOpenDriver(driverName);
if (psc->driver == NULL) if (psc->driver == NULL)
goto handle_error; goto handle_error;
extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
if (extensions == NULL) { if (extensions == NULL) {
ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
goto handle_error; goto handle_error;
} }
for (i = 0; extensions[i]; i++) { for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CORE) == 0) if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
psc->core = (__DRIcoreExtension *) extensions[i]; psc->core = (__DRIcoreExtension *) extensions[i];
if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0) if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0)
psc->swrast = (__DRIswrastExtension *) extensions[i]; psc->swrast = (__DRIswrastExtension *) extensions[i];
} }
if (psc->core == NULL || psc->swrast == NULL) { if (psc->core == NULL || psc->swrast == NULL) {
ErrorMessageF("core dri extension not found\n"); ErrorMessageF("core dri extension not found\n");
goto handle_error; goto handle_error;
} }
psc->__driScreen = psc->__driScreen =
psc->swrast->createNewScreen(screen, psc->swrast->createNewScreen(screen,
loader_extensions, &driver_configs, psc); loader_extensions, &driver_configs, psc);
if (psc->__driScreen == NULL) { if (psc->__driScreen == NULL) {
ErrorMessageF("failed to create dri screen\n"); ErrorMessageF("failed to create dri screen\n");
goto handle_error; goto handle_error;
} }
driBindExtensions(psc, 0); driBindExtensions(psc, 0);
psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs); psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs); psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
psp->destroyScreen = driDestroyScreen; psp->destroyScreen = driDestroyScreen;
psp->createContext = driCreateContext; psp->createContext = driCreateContext;
psp->createDrawable = driCreateDrawable; psp->createDrawable = driCreateDrawable;
psp->swapBuffers = driSwapBuffers; psp->swapBuffers = driSwapBuffers;
return psp; return psp;
handle_error: handle_error:
Xfree(psp); Xfree(psp);
if (psc->driver) if (psc->driver)
dlclose(psc->driver); dlclose(psc->driver);
ErrorMessageF("reverting to indirect rendering\n"); ErrorMessageF("reverting to indirect rendering\n");
return NULL; return NULL;
} }
/* Called from __glXFreeDisplayPrivate. /* Called from __glXFreeDisplayPrivate.
*/ */
static void driDestroyDisplay(__GLXDRIdisplay *dpy) static void
driDestroyDisplay(__GLXDRIdisplay * dpy)
{ {
Xfree(dpy); Xfree(dpy);
} }
/* /*
@ -430,18 +433,19 @@ static void driDestroyDisplay(__GLXDRIdisplay *dpy)
* This is called from __glXInitialize() when we are given a new * This is called from __glXInitialize() when we are given a new
* display pointer. * display pointer.
*/ */
_X_HIDDEN __GLXDRIdisplay *driswCreateDisplay(Display *dpy) _X_HIDDEN __GLXDRIdisplay *
driswCreateDisplay(Display * dpy)
{ {
__GLXDRIdisplayPrivate *pdpyp; __GLXDRIdisplayPrivate *pdpyp;
pdpyp = Xmalloc(sizeof *pdpyp); pdpyp = Xmalloc(sizeof *pdpyp);
if (pdpyp == NULL) if (pdpyp == NULL)
return NULL; return NULL;
pdpyp->base.destroyDisplay = driDestroyDisplay; pdpyp->base.destroyDisplay = driDestroyDisplay;
pdpyp->base.createScreen = driCreateScreen; pdpyp->base.createScreen = driCreateScreen;
return &pdpyp->base; return &pdpyp->base;
} }
#endif /* GLX_DIRECT_RENDERING */ #endif /* GLX_DIRECT_RENDERING */