Remove xgloffscreen.c
This commit is contained in:
parent
f5aeaa7710
commit
f0ab6d57df
|
@ -1,293 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2004 David Reveman
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software
|
|
||||||
* and its documentation for any purpose is hereby granted without
|
|
||||||
* fee, provided that the above copyright notice appear in all copies
|
|
||||||
* and that both that copyright notice and this permission notice
|
|
||||||
* appear in supporting documentation, and that the name of
|
|
||||||
* David Reveman not be used in advertising or publicity pertaining to
|
|
||||||
* distribution of the software without specific, written prior permission.
|
|
||||||
* David Reveman makes no representations about the suitability of this
|
|
||||||
* software for any purpose. It is provided "as is" without express or
|
|
||||||
* implied warranty.
|
|
||||||
*
|
|
||||||
* DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
|
||||||
* NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
||||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
||||||
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* Author: David Reveman <davidr@novell.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "xgl.h"
|
|
||||||
|
|
||||||
static glitz_drawable_buffer_t _buffers[] = {
|
|
||||||
GLITZ_DRAWABLE_BUFFER_BACK_COLOR,
|
|
||||||
GLITZ_DRAWABLE_BUFFER_FRONT_COLOR
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_OFFSCREEN_LEVEL 8
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
xglOffscreenCreate (xglAreaPtr pArea)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
xglOffscreenMoveIn (xglAreaPtr pArea,
|
|
||||||
pointer closure)
|
|
||||||
{
|
|
||||||
xglOffscreenPtr pOffscreen = (xglOffscreenPtr) pArea->pRoot->closure;
|
|
||||||
PixmapPtr pPixmap = (PixmapPtr) closure;
|
|
||||||
|
|
||||||
XGL_PIXMAP_PRIV (pPixmap);
|
|
||||||
|
|
||||||
if (!xglSyncSurface (&pPixmap->drawable))
|
|
||||||
FatalError (XGL_SW_FAILURE_STRING);
|
|
||||||
|
|
||||||
pPixmapPriv->pArea = pArea;
|
|
||||||
pPixmapPriv->target = xglPixmapTargetIn;
|
|
||||||
|
|
||||||
glitz_surface_attach (pPixmapPriv->surface,
|
|
||||||
pOffscreen->drawable, pOffscreen->buffer,
|
|
||||||
pArea->x, pArea->y);
|
|
||||||
|
|
||||||
XGL_INCREMENT_PIXMAP_SCORE (pPixmapPriv, 100);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
xglOffscreenMoveOut (xglAreaPtr pArea,
|
|
||||||
pointer closure)
|
|
||||||
{
|
|
||||||
PixmapPtr pPixmap = (PixmapPtr) closure;
|
|
||||||
|
|
||||||
XGL_PIXMAP_PRIV (pPixmap);
|
|
||||||
|
|
||||||
glitz_surface_detach (pPixmapPriv->surface);
|
|
||||||
|
|
||||||
pPixmapPriv->pArea = NULL;
|
|
||||||
pPixmapPriv->target = xglPixmapTargetOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
xglOffscreenCompareScore (xglAreaPtr pArea,
|
|
||||||
pointer closure1,
|
|
||||||
pointer closure2)
|
|
||||||
{
|
|
||||||
int s1, s2;
|
|
||||||
|
|
||||||
XGL_PIXMAP_PRIV ((PixmapPtr) closure1);
|
|
||||||
|
|
||||||
s1 = pPixmapPriv->score;
|
|
||||||
s2 = XGL_GET_PIXMAP_PRIV ((PixmapPtr) closure2)->score;
|
|
||||||
|
|
||||||
if (s1 > s2)
|
|
||||||
XGL_DECREMENT_PIXMAP_SCORE (pPixmapPriv, 10);
|
|
||||||
|
|
||||||
if (pPixmapPriv->lock)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return s1 - s2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const xglAreaFuncsRec xglOffscreenAreaFuncs = {
|
|
||||||
xglOffscreenCreate,
|
|
||||||
xglOffscreenMoveIn,
|
|
||||||
xglOffscreenMoveOut,
|
|
||||||
xglOffscreenCompareScore
|
|
||||||
};
|
|
||||||
|
|
||||||
Bool
|
|
||||||
xglInitOffscreen (ScreenPtr pScreen,
|
|
||||||
xglScreenInfoPtr pScreenInfo)
|
|
||||||
{
|
|
||||||
xglOffscreenPtr pOffscreen;
|
|
||||||
glitz_drawable_format_t *format;
|
|
||||||
|
|
||||||
XGL_SCREEN_PRIV (pScreen);
|
|
||||||
|
|
||||||
pOffscreen = pScreenPriv->pOffscreen;
|
|
||||||
|
|
||||||
pScreenPriv->nOffscreen = 0;
|
|
||||||
|
|
||||||
format = glitz_drawable_get_format (pScreenPriv->drawable);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use back buffer as offscreen area.
|
|
||||||
*/
|
|
||||||
if (format->doublebuffer)
|
|
||||||
{
|
|
||||||
pOffscreen->drawable = pScreenPriv->drawable;
|
|
||||||
pOffscreen->format = format;
|
|
||||||
pOffscreen->buffer = GLITZ_DRAWABLE_BUFFER_BACK_COLOR;
|
|
||||||
|
|
||||||
if (xglRootAreaInit (&pOffscreen->rootArea,
|
|
||||||
MAX_OFFSCREEN_LEVEL,
|
|
||||||
pScreenInfo->width,
|
|
||||||
pScreenInfo->height, 0,
|
|
||||||
(xglAreaFuncsPtr) &xglOffscreenAreaFuncs,
|
|
||||||
(pointer) pOffscreen))
|
|
||||||
{
|
|
||||||
glitz_drawable_reference (pOffscreen->drawable);
|
|
||||||
|
|
||||||
pScreenPriv->nOffscreen++;
|
|
||||||
pOffscreen++;
|
|
||||||
ErrorF ("Initialized %dx%d back buffer offscreen area\n",
|
|
||||||
pScreenInfo->width, pScreenInfo->height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nxglPbufferVisuals)
|
|
||||||
{
|
|
||||||
glitz_drawable_t *pbuffer;
|
|
||||||
unsigned int width, height;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < nxglPbufferVisuals; i++)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This can be a bit tricky. I've noticed that when some OpenGL
|
|
||||||
* drivers can't create an accelerated pbuffer of the size we're
|
|
||||||
* requesting they create a software one with the correct
|
|
||||||
* size, but that's not what we want. So if your OpenGL driver
|
|
||||||
* supports accelerated pbuffers but offscreen drawing is really
|
|
||||||
* slow, try decrementing these values.
|
|
||||||
*/
|
|
||||||
width = 2048;
|
|
||||||
height = 2048;
|
|
||||||
|
|
||||||
do {
|
|
||||||
pbuffer =
|
|
||||||
glitz_create_pbuffer_drawable (pScreenPriv->drawable,
|
|
||||||
xglPbufferVisuals[i].format,
|
|
||||||
width, height);
|
|
||||||
width >>= 1;
|
|
||||||
height >>= 1;
|
|
||||||
} while (!pbuffer && width);
|
|
||||||
|
|
||||||
if (pbuffer)
|
|
||||||
{
|
|
||||||
int j = 0;
|
|
||||||
|
|
||||||
width = glitz_drawable_get_width (pbuffer);
|
|
||||||
height = glitz_drawable_get_height (pbuffer);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No back buffer? only add front buffer.
|
|
||||||
*/
|
|
||||||
if (!xglPbufferVisuals[i].format->doublebuffer)
|
|
||||||
j++;
|
|
||||||
|
|
||||||
while (j < 2)
|
|
||||||
{
|
|
||||||
pOffscreen->drawable = pbuffer;
|
|
||||||
pOffscreen->format = xglPbufferVisuals[i].format;
|
|
||||||
pOffscreen->buffer = _buffers[j];
|
|
||||||
|
|
||||||
if (xglRootAreaInit (&pOffscreen->rootArea,
|
|
||||||
MAX_OFFSCREEN_LEVEL,
|
|
||||||
width, height, 0,
|
|
||||||
(xglAreaFuncsPtr)
|
|
||||||
&xglOffscreenAreaFuncs,
|
|
||||||
(pointer) pOffscreen))
|
|
||||||
{
|
|
||||||
glitz_drawable_reference (pbuffer);
|
|
||||||
|
|
||||||
pScreenPriv->nOffscreen++;
|
|
||||||
pOffscreen++;
|
|
||||||
ErrorF ("Initialized %dx%d pbuffer offscreen area\n",
|
|
||||||
width, height);
|
|
||||||
}
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
glitz_drawable_destroy (pbuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
xglFiniOffscreen (ScreenPtr pScreen)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
XGL_SCREEN_PRIV (pScreen);
|
|
||||||
|
|
||||||
n = pScreenPriv->nOffscreen;
|
|
||||||
while (n--)
|
|
||||||
{
|
|
||||||
xglRootAreaFini (&pScreenPriv->pOffscreen[n].rootArea);
|
|
||||||
glitz_drawable_destroy (pScreenPriv->pOffscreen[n].drawable);
|
|
||||||
}
|
|
||||||
|
|
||||||
pScreenPriv->nOffscreen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Bool
|
|
||||||
xglFindOffscreenArea (ScreenPtr pScreen,
|
|
||||||
PixmapPtr pPixmap)
|
|
||||||
{
|
|
||||||
xglOffscreenPtr pOffscreen;
|
|
||||||
int nOffscreen;
|
|
||||||
glitz_color_format_t *pColor;
|
|
||||||
|
|
||||||
XGL_SCREEN_PRIV (pScreen);
|
|
||||||
XGL_PIXMAP_PRIV (pPixmap);
|
|
||||||
|
|
||||||
if (pPixmapPriv->score < 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
pColor = &pPixmapPriv->format->color;
|
|
||||||
|
|
||||||
pOffscreen = pScreenPriv->pOffscreen;
|
|
||||||
nOffscreen = pScreenPriv->nOffscreen;
|
|
||||||
|
|
||||||
while (nOffscreen--)
|
|
||||||
{
|
|
||||||
if (pOffscreen->format->color.red_size >= pColor->red_size &&
|
|
||||||
pOffscreen->format->color.green_size >= pColor->green_size &&
|
|
||||||
pOffscreen->format->color.blue_size >= pColor->blue_size &&
|
|
||||||
pOffscreen->format->color.alpha_size >= pColor->alpha_size)
|
|
||||||
{
|
|
||||||
/* Find available area */
|
|
||||||
if (xglFindArea (pOffscreen->rootArea.pArea,
|
|
||||||
pPixmap->drawable.width,
|
|
||||||
pPixmap->drawable.height,
|
|
||||||
FALSE,
|
|
||||||
(pointer) pPixmap))
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* Kicking out area with lower score */
|
|
||||||
if (xglFindArea (pOffscreen->rootArea.pArea,
|
|
||||||
pPixmap->drawable.width,
|
|
||||||
pPixmap->drawable.height,
|
|
||||||
TRUE,
|
|
||||||
(pointer) pPixmap))
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pOffscreen++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
xglLeaveOffscreenArea (PixmapPtr pPixmap)
|
|
||||||
{
|
|
||||||
XGL_PIXMAP_PRIV (pPixmap);
|
|
||||||
|
|
||||||
if (pPixmapPriv->pArea)
|
|
||||||
xglLeaveArea (pPixmapPriv->pArea);
|
|
||||||
|
|
||||||
pPixmapPriv->pArea = NULL;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user