Merge branch 'master' into mpx
Conflicts: Xi/exevents.c dix/devices.c
This commit is contained in:
commit
3344569529
|
@ -1,9 +1,4 @@
|
|||
if XQUARTZ
|
||||
XQUARTZ_SUBDIRS = apple
|
||||
endif
|
||||
|
||||
SUBDIRS = glx mesa $(XQUARTZ_SUBDIRS)
|
||||
DIST_SUBDIRS = glx mesa apple
|
||||
SUBDIRS = glx
|
||||
|
||||
WINDOWS_EXTRAS = \
|
||||
windows/ChangeLog \
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
AM_CFLAGS = $(DIX_CFLAGS)
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/GL/glx \
|
||||
-I$(top_srcdir)/GL/include \
|
||||
-I$(top_srcdir)/GL/mesa/glapi \
|
||||
-I$(top_srcdir)/hw/xquartz \
|
||||
-I$(top_srcdir)/hw/xquartz/xpr \
|
||||
-I$(top_srcdir)/miext/damage
|
||||
|
||||
if HAVE_AGL_FRAMEWORK
|
||||
noinst_LIBRARIES = libAGLcore.a
|
||||
libAGLcore_a_SOURCES = aglGlx.c \
|
||||
$(top_srcdir)/hw/xquartz/xpr/x-list.c \
|
||||
$(top_srcdir)/hw/xquartz/xpr/x-list.h \
|
||||
$(top_srcdir)/hw/xquartz/xpr/x-hash.c \
|
||||
$(top_srcdir)/hw/xquartz/xpr/x-hash.h \
|
||||
$(top_srcdir)/hw/dmx/glxProxy/compsize.c
|
||||
endif
|
||||
|
||||
#noinst_LIBRARIES = libCGLcore.a
|
||||
#libCGLcore_a_SOURCES = \
|
||||
# indirect.c \
|
||||
# $(top_srcdir)/hw/dmx/glxProxy/compsize.c
|
1354
GL/apple/aglGlx.c
1354
GL/apple/aglGlx.c
File diff suppressed because it is too large
Load Diff
|
@ -47,7 +47,12 @@ libglxdri_la_SOURCES = \
|
|||
extension_string.c \
|
||||
extension_string.h
|
||||
|
||||
#if XQUARTZ
|
||||
XQUARTZ_libglx_la_SOURCES = glcontextmodes.c
|
||||
#endif
|
||||
|
||||
libglx_la_SOURCES = \
|
||||
$(XQUARTZ_libglx_la_SOURCES) \
|
||||
g_disptab.h \
|
||||
glxbyteorder.h \
|
||||
glxcmds.c \
|
||||
|
|
|
@ -37,7 +37,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#define _NEED_GL_CORE_IF
|
||||
#include <GL/xmesa.h>
|
||||
#include <GL/internal/glcore.h>
|
||||
#include <glxserver.h>
|
||||
|
@ -48,6 +50,22 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#include "os.h"
|
||||
|
||||
#define XMesaCreateVisual (*glcore->XMesaCreateVisual)
|
||||
#define XMesaDestroyVisual (*glcore->XMesaDestroyVisual)
|
||||
|
||||
#define XMesaCreateWindowBuffer (*glcore->XMesaCreateWindowBuffer)
|
||||
#define XMesaCreatePixmapBuffer (*glcore->XMesaCreatePixmapBuffer)
|
||||
#define XMesaDestroyBuffer (*glcore->XMesaDestroyBuffer)
|
||||
#define XMesaSwapBuffers (*glcore->XMesaSwapBuffers)
|
||||
#define XMesaResizeBuffers (*glcore->XMesaResizeBuffers)
|
||||
|
||||
#define XMesaCreateContext (*glcore->XMesaCreateContext)
|
||||
#define XMesaDestroyContext (*glcore->XMesaDestroyContext)
|
||||
#define XMesaCopyContext (*glcore->XMesaCopyContext)
|
||||
#define XMesaMakeCurrent2 (*glcore->XMesaMakeCurrent2)
|
||||
#define XMesaForceCurrent (*glcore->XMesaForceCurrent)
|
||||
#define XMesaLoseCurrent (*glcore->XMesaLoseCurrent)
|
||||
|
||||
typedef struct __GLXMESAscreen __GLXMESAscreen;
|
||||
typedef struct __GLXMESAcontext __GLXMESAcontext;
|
||||
typedef struct __GLXMESAdrawable __GLXMESAdrawable;
|
||||
|
@ -55,8 +73,11 @@ typedef struct __GLXMESAdrawable __GLXMESAdrawable;
|
|||
struct __GLXMESAscreen {
|
||||
__GLXscreen base;
|
||||
int index;
|
||||
int num_vis;
|
||||
int num_vis;
|
||||
XMesaVisual *xm_vis;
|
||||
void *driver;
|
||||
|
||||
const __GLcoreModule *glcore;
|
||||
};
|
||||
|
||||
struct __GLXMESAcontext {
|
||||
|
@ -65,8 +86,9 @@ struct __GLXMESAcontext {
|
|||
};
|
||||
|
||||
struct __GLXMESAdrawable {
|
||||
__GLXdrawable base;
|
||||
XMesaBuffer xm_buf;
|
||||
__GLXdrawable base;
|
||||
XMesaBuffer xm_buf;
|
||||
__GLXMESAscreen *screen;
|
||||
};
|
||||
|
||||
static XMesaVisual find_mesa_visual(__GLXscreen *screen, XID fbconfigID);
|
||||
|
@ -76,6 +98,7 @@ static void
|
|||
__glXMesaDrawableDestroy(__GLXdrawable *base)
|
||||
{
|
||||
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
|
||||
const __GLcoreModule *glcore = glxPriv->screen->glcore;
|
||||
|
||||
if (glxPriv->xm_buf != NULL)
|
||||
XMesaDestroyBuffer(glxPriv->xm_buf);
|
||||
|
@ -86,6 +109,7 @@ static GLboolean
|
|||
__glXMesaDrawableResize(__GLXdrawable *base)
|
||||
{
|
||||
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
|
||||
const __GLcoreModule *glcore = glxPriv->screen->glcore;
|
||||
|
||||
XMesaResizeBuffers(glxPriv->xm_buf);
|
||||
|
||||
|
@ -96,6 +120,7 @@ static GLboolean
|
|||
__glXMesaDrawableSwapBuffers(__GLXdrawable *base)
|
||||
{
|
||||
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
|
||||
const __GLcoreModule *glcore = glxPriv->screen->glcore;
|
||||
|
||||
/* This is terrifying: XMesaSwapBuffers() ends up calling CopyArea
|
||||
* to do the buffer swap, but this assumes that the server holds
|
||||
|
@ -121,6 +146,8 @@ __glXMesaScreenCreateDrawable(__GLXscreen *screen,
|
|||
XID drawId,
|
||||
__GLXconfig *modes)
|
||||
{
|
||||
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
|
||||
const __GLcoreModule *glcore = mesaScreen->glcore;
|
||||
__GLXMESAdrawable *glxPriv;
|
||||
XMesaVisual xm_vis;
|
||||
|
||||
|
@ -130,6 +157,7 @@ __glXMesaScreenCreateDrawable(__GLXscreen *screen,
|
|||
|
||||
memset(glxPriv, 0, sizeof *glxPriv);
|
||||
|
||||
glxPriv->screen = mesaScreen;
|
||||
if (!__glXDrawableInit(&glxPriv->base, screen,
|
||||
pDraw, type, drawId, modes)) {
|
||||
xfree(glxPriv);
|
||||
|
@ -166,6 +194,8 @@ static void
|
|||
__glXMesaContextDestroy(__GLXcontext *baseContext)
|
||||
{
|
||||
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
|
||||
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
|
||||
const __GLcoreModule *glcore = screen->glcore;
|
||||
|
||||
XMesaDestroyContext(context->xmesa);
|
||||
__glXContextDestroy(&context->base);
|
||||
|
@ -179,6 +209,8 @@ __glXMesaContextMakeCurrent(__GLXcontext *baseContext)
|
|||
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
|
||||
__GLXMESAdrawable *drawPriv = (__GLXMESAdrawable *) context->base.drawPriv;
|
||||
__GLXMESAdrawable *readPriv = (__GLXMESAdrawable *) context->base.readPriv;
|
||||
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
|
||||
const __GLcoreModule *glcore = screen->glcore;
|
||||
|
||||
return XMesaMakeCurrent2(context->xmesa,
|
||||
drawPriv->xm_buf,
|
||||
|
@ -189,6 +221,8 @@ static int
|
|||
__glXMesaContextLoseCurrent(__GLXcontext *baseContext)
|
||||
{
|
||||
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
|
||||
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
|
||||
const __GLcoreModule *glcore = screen->glcore;
|
||||
|
||||
return XMesaLoseCurrent(context->xmesa);
|
||||
}
|
||||
|
@ -200,6 +234,8 @@ __glXMesaContextCopy(__GLXcontext *baseDst,
|
|||
{
|
||||
__GLXMESAcontext *dst = (__GLXMESAcontext *) baseDst;
|
||||
__GLXMESAcontext *src = (__GLXMESAcontext *) baseSrc;
|
||||
__GLXMESAscreen *screen = (__GLXMESAscreen *) dst->base.pGlxScreen;
|
||||
const __GLcoreModule *glcore = screen->glcore;
|
||||
|
||||
return XMesaCopyContext(src->xmesa, dst->xmesa, mask);
|
||||
}
|
||||
|
@ -208,6 +244,8 @@ static int
|
|||
__glXMesaContextForceCurrent(__GLXcontext *baseContext)
|
||||
{
|
||||
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
|
||||
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
|
||||
const __GLcoreModule *glcore = screen->glcore;
|
||||
|
||||
/* GlxSetRenderTables() call for XGL moved in XMesaForceCurrent() */
|
||||
|
||||
|
@ -219,6 +257,8 @@ __glXMesaScreenCreateContext(__GLXscreen *screen,
|
|||
__GLXconfig *config,
|
||||
__GLXcontext *baseShareContext)
|
||||
{
|
||||
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
|
||||
const __GLcoreModule *glcore = mesaScreen->glcore;
|
||||
__GLXMESAcontext *context;
|
||||
__GLXMESAcontext *shareContext = (__GLXMESAcontext *) baseShareContext;
|
||||
XMesaVisual xm_vis;
|
||||
|
@ -261,6 +301,7 @@ static void
|
|||
__glXMesaScreenDestroy(__GLXscreen *screen)
|
||||
{
|
||||
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
|
||||
const __GLcoreModule *glcore = mesaScreen->glcore;
|
||||
int i;
|
||||
|
||||
if (mesaScreen->xm_vis) {
|
||||
|
@ -272,6 +313,8 @@ __glXMesaScreenDestroy(__GLXscreen *screen)
|
|||
xfree(mesaScreen->xm_vis);
|
||||
}
|
||||
|
||||
dlclose(mesaScreen->driver);
|
||||
|
||||
__glXScreenDestroy(screen);
|
||||
|
||||
xfree(screen);
|
||||
|
@ -373,6 +416,7 @@ createFBConfigs(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
|
|||
static void
|
||||
createMesaVisuals(__GLXMESAscreen *pMesaScreen)
|
||||
{
|
||||
const __GLcoreModule *glcore = pMesaScreen->glcore;
|
||||
__GLXconfig *config;
|
||||
ScreenPtr pScreen;
|
||||
VisualPtr visual = NULL;
|
||||
|
@ -409,15 +453,35 @@ createMesaVisuals(__GLXMESAscreen *pMesaScreen)
|
|||
}
|
||||
}
|
||||
|
||||
static const char dri_driver_path[] = DRI_DRIVER_PATH;
|
||||
|
||||
static __GLXscreen *
|
||||
__glXMesaScreenProbe(ScreenPtr pScreen)
|
||||
{
|
||||
__GLXMESAscreen *screen;
|
||||
char filename[128];
|
||||
|
||||
screen = xalloc(sizeof *screen);
|
||||
if (screen == NULL)
|
||||
return NULL;
|
||||
|
||||
snprintf(filename, sizeof filename, "%s/%s.so",
|
||||
dri_driver_path, "libGLcore");
|
||||
|
||||
screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
|
||||
if (screen->driver == NULL) {
|
||||
LogMessage(X_ERROR, "GLX error: dlopen of %s failed (%s)\n",
|
||||
filename, dlerror());
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
screen->glcore = dlsym(screen->driver, __GL_CORE);
|
||||
if (screen->glcore == NULL) {
|
||||
LogMessage(X_ERROR, "GLX error: dlsym for %s failed (%s)\n",
|
||||
__GL_CORE, dlerror());
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the GLX visuals that are supported by this screen and create
|
||||
* XMesa's visuals.
|
||||
|
@ -435,7 +499,20 @@ __glXMesaScreenProbe(ScreenPtr pScreen)
|
|||
screen->base.swapInterval = NULL;
|
||||
screen->base.pScreen = pScreen;
|
||||
|
||||
LogMessage(X_INFO, "GLX: Loaded and initialized %s\n", filename);
|
||||
|
||||
return &screen->base;
|
||||
|
||||
handle_error:
|
||||
|
||||
if (screen->driver)
|
||||
dlclose(screen->driver);
|
||||
|
||||
xfree(screen);
|
||||
|
||||
FatalError("GLX: could not load software renderer\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
__GLXprovider __glXMesaProvider = {
|
||||
|
|
|
@ -437,6 +437,7 @@ initGlxVisual(VisualPtr visual, __GLXconfig *config)
|
|||
typedef struct {
|
||||
GLboolean doubleBuffer;
|
||||
GLboolean depthBuffer;
|
||||
GLboolean stencilBuffer;
|
||||
} FBConfigTemplateRec, *FBConfigTemplatePtr;
|
||||
|
||||
static __GLXconfig *
|
||||
|
@ -453,6 +454,8 @@ pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class)
|
|||
continue;
|
||||
if ((config->depthBits > 0) != template->depthBuffer)
|
||||
continue;
|
||||
if ((config->stencilBits > 0) != template->stencilBuffer)
|
||||
continue;
|
||||
|
||||
return config;
|
||||
}
|
||||
|
@ -466,8 +469,9 @@ addMinimalSet(__GLXscreen *pGlxScreen)
|
|||
__GLXconfig *config;
|
||||
VisualPtr visuals;
|
||||
int i, j;
|
||||
FBConfigTemplateRec best = { GL_TRUE, GL_TRUE };
|
||||
FBConfigTemplateRec minimal = { GL_FALSE, GL_FALSE };
|
||||
FBConfigTemplateRec best = { GL_TRUE, GL_TRUE, GL_TRUE };
|
||||
FBConfigTemplateRec good = { GL_TRUE, GL_TRUE, GL_FALSE };
|
||||
FBConfigTemplateRec minimal = { GL_FALSE, GL_FALSE, GL_FALSE };
|
||||
|
||||
pGlxScreen->visuals = xcalloc(pGlxScreen->pScreen->numVisuals,
|
||||
sizeof (__GLXconfig *));
|
||||
|
@ -480,8 +484,11 @@ addMinimalSet(__GLXscreen *pGlxScreen)
|
|||
for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) {
|
||||
if (visuals[i].nplanes == 32)
|
||||
config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class);
|
||||
else
|
||||
else {
|
||||
config = pickFBConfig(pGlxScreen, &best, visuals[i].class);
|
||||
if (config == NULL)
|
||||
config = pickFBConfig(pGlxScreen, &good, visuals[i].class);
|
||||
}
|
||||
if (config == NULL)
|
||||
config = pGlxScreen->fbconfigs;
|
||||
if (config == NULL)
|
||||
|
|
|
@ -81,38 +81,40 @@ __glXDeassociateContext(__GLXcontext *glxc)
|
|||
__GLXcontext *curr, *prev;
|
||||
|
||||
prev = NULL;
|
||||
for ( curr = glxc->drawPriv->drawGlxc
|
||||
; curr != NULL
|
||||
; prev = curr, curr = curr->nextDrawPriv ) {
|
||||
if (curr == glxc) {
|
||||
/* found context. Deassociate. */
|
||||
if (prev == NULL) {
|
||||
glxc->drawPriv->drawGlxc = curr->nextDrawPriv;
|
||||
} else {
|
||||
prev->nextDrawPriv = curr->nextDrawPriv;
|
||||
if (glxc->drawPriv) {
|
||||
for ( curr = glxc->drawPriv->drawGlxc; curr != NULL
|
||||
; prev = curr, curr = curr->nextDrawPriv ) {
|
||||
if (curr == glxc) {
|
||||
/* found context. Deassociate. */
|
||||
if (prev == NULL) {
|
||||
glxc->drawPriv->drawGlxc = curr->nextDrawPriv;
|
||||
} else {
|
||||
prev->nextDrawPriv = curr->nextDrawPriv;
|
||||
}
|
||||
curr->nextDrawPriv = NULL;
|
||||
__glXUnrefDrawable(glxc->drawPriv);
|
||||
break;
|
||||
}
|
||||
curr->nextDrawPriv = NULL;
|
||||
__glXUnrefDrawable(glxc->drawPriv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
prev = NULL;
|
||||
for ( curr = glxc->readPriv->readGlxc
|
||||
; curr != NULL
|
||||
; prev = curr, curr = curr->nextReadPriv ) {
|
||||
if (curr == glxc) {
|
||||
/* found context. Deassociate. */
|
||||
if (prev == NULL) {
|
||||
glxc->readPriv->readGlxc = curr->nextReadPriv;
|
||||
} else {
|
||||
prev->nextReadPriv = curr->nextReadPriv;
|
||||
}
|
||||
curr->nextReadPriv = NULL;
|
||||
__glXUnrefDrawable(glxc->readPriv);
|
||||
break;
|
||||
}
|
||||
if (glxc->readPriv) {
|
||||
for ( curr = glxc->readPriv->readGlxc
|
||||
; curr != NULL
|
||||
; prev = curr, curr = curr->nextReadPriv ) {
|
||||
if (curr == glxc) {
|
||||
/* found context. Deassociate. */
|
||||
if (prev == NULL) {
|
||||
glxc->readPriv->readGlxc = curr->nextReadPriv;
|
||||
} else {
|
||||
prev->nextReadPriv = curr->nextReadPriv;
|
||||
}
|
||||
curr->nextReadPriv = NULL;
|
||||
__glXUnrefDrawable(glxc->readPriv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
X/drivers
|
||||
X/glxheader.h
|
||||
X/xm*.h
|
||||
X/xm*.c
|
||||
mesa/drivers
|
||||
mesa/glxheader.h
|
||||
mesa/xm*.c
|
||||
glapi/*.c
|
||||
glapi/*.h
|
||||
main/*.c
|
||||
main/*.h
|
||||
math/*.c
|
||||
math/*.h
|
||||
ppc
|
||||
shader/*.c
|
||||
shader/*.h
|
||||
shader/slang/*.c
|
||||
shader/slang/*.h
|
||||
shader/slang/library
|
||||
shader/grammar/*.c
|
||||
shader/grammar/*.h
|
||||
sparc
|
||||
swrast/*.c
|
||||
swrast/*.h
|
||||
swrast_setup/*.c
|
||||
swrast_setup/*.h
|
||||
tnl/*.c
|
||||
tnl/*.h
|
||||
x86
|
||||
x86-64
|
||||
vbo/*.c
|
||||
vbo/*.h
|
|
@ -1,18 +0,0 @@
|
|||
SUBDIRS = X
|
||||
SUBDIRS += main math swrast swrast_setup tnl shader glapi vbo
|
||||
|
||||
noinst_LTLIBRARIES = libGLcore.la
|
||||
|
||||
libGLcore_la_SOURCES = dummy.c
|
||||
MESA_LIBS = main/libmain.la \
|
||||
math/libmath.la \
|
||||
swrast/libswrast.la \
|
||||
swrast_setup/libss.la \
|
||||
tnl/libtnl.la \
|
||||
shader/libshader.la \
|
||||
shader/grammar/libgrammar.la \
|
||||
shader/slang/libslang.la \
|
||||
vbo/libvbo.la
|
||||
|
||||
libGLcore_la_LIBADD = $(MESA_LIBS) \
|
||||
X/libX.la
|
|
@ -1,27 +0,0 @@
|
|||
noinst_LTLIBRARIES = libX.la
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I. \
|
||||
-I@MESA_SOURCE@/src/mesa/glapi \
|
||||
-I@MESA_SOURCE@/src/mesa/main \
|
||||
-I@MESA_SOURCE@/src/mesa
|
||||
|
||||
# -DXFree86Server is required because the X11 driver in Mesa thinks that
|
||||
# symbol means "being built in the server"
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
XM_SOURCES = \
|
||||
xm_api.c \
|
||||
xm_buffer.c \
|
||||
xm_dd.c \
|
||||
xm_image.c \
|
||||
xm_line.c \
|
||||
xm_span.c \
|
||||
xm_tri.c
|
||||
|
||||
XM_SOURCES += drivers/common/driverfuncs.c
|
||||
|
||||
nodist_libX_la_SOURCES = $(XM_SOURCES)
|
|
@ -1,20 +0,0 @@
|
|||
noinst_LTLIBRARIES = libglapi.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libglapi_la_SOURCES = glapi.c glthread.c
|
|
@ -1,86 +0,0 @@
|
|||
noinst_LTLIBRARIES = libmain.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
if NEED_VSNPRINTF
|
||||
VSNPRINTF_SOURCES = vsnprintf.c
|
||||
endif
|
||||
|
||||
nodist_libmain_la_SOURCES = accum.c \
|
||||
api_arrayelt.c \
|
||||
api_loopback.c \
|
||||
api_noop.c \
|
||||
api_validate.c \
|
||||
arrayobj.c \
|
||||
attrib.c \
|
||||
blend.c \
|
||||
bufferobj.c \
|
||||
buffers.c \
|
||||
clip.c \
|
||||
colortab.c \
|
||||
context.c \
|
||||
convolve.c \
|
||||
debug.c \
|
||||
depth.c \
|
||||
depthstencil.c \
|
||||
dlist.c \
|
||||
drawpix.c \
|
||||
enable.c \
|
||||
enums.c \
|
||||
eval.c \
|
||||
execmem.c \
|
||||
extensions.c \
|
||||
fbobject.c \
|
||||
feedback.c \
|
||||
fog.c \
|
||||
framebuffer.c \
|
||||
get.c \
|
||||
getstring.c \
|
||||
hash.c \
|
||||
hint.c \
|
||||
histogram.c \
|
||||
image.c \
|
||||
imports.c \
|
||||
light.c \
|
||||
lines.c \
|
||||
matrix.c \
|
||||
mipmap.c \
|
||||
mm.c \
|
||||
pixel.c \
|
||||
points.c \
|
||||
polygon.c \
|
||||
queryobj.c \
|
||||
rastpos.c \
|
||||
rbadaptors.c \
|
||||
renderbuffer.c \
|
||||
shaders.c \
|
||||
state.c \
|
||||
stencil.c \
|
||||
texcompress.c \
|
||||
texcompress_fxt1.c \
|
||||
texcompress_s3tc.c \
|
||||
texenvprogram.c \
|
||||
texformat.c \
|
||||
teximage.c \
|
||||
texobj.c \
|
||||
texrender.c \
|
||||
texstate.c \
|
||||
texstore.c \
|
||||
varray.c \
|
||||
$(VSNPRINTF_SOURCES) \
|
||||
vtxfmt.c
|
|
@ -1,27 +0,0 @@
|
|||
noinst_LTLIBRARIES = libmath.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libmath_la_SOURCES = m_debug_clip.c \
|
||||
m_debug_norm.c \
|
||||
m_debug_xform.c \
|
||||
m_eval.c \
|
||||
m_matrix.c \
|
||||
m_translate.c \
|
||||
m_vector.c \
|
||||
m_xform.c
|
|
@ -1,39 +0,0 @@
|
|||
SUBDIRS = grammar slang
|
||||
|
||||
noinst_LTLIBRARIES = libshader.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../shader/grammar \
|
||||
-I../shader/slang \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libshader_la_SOURCES = \
|
||||
arbprogparse.c \
|
||||
arbprogram.c \
|
||||
atifragshader.c \
|
||||
nvfragparse.c \
|
||||
nvprogram.c \
|
||||
nvvertparse.c \
|
||||
prog_debug.c \
|
||||
prog_execute.c \
|
||||
prog_instruction.c \
|
||||
prog_parameter.c \
|
||||
prog_print.c \
|
||||
program.c \
|
||||
programopt.c \
|
||||
prog_statevars.c \
|
||||
shader_api.c
|
|
@ -1,20 +0,0 @@
|
|||
noinst_LTLIBRARIES = libgrammar.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../../X \
|
||||
-I../../glapi \
|
||||
-I../../main \
|
||||
-I../../math \
|
||||
-I../../shader \
|
||||
-I../../swrast \
|
||||
-I../../swrast_setup \
|
||||
-I../../tnl \
|
||||
-I../.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libgrammar_la_SOURCES = grammar_mesa.c
|
|
@ -1,41 +0,0 @@
|
|||
noinst_LTLIBRARIES = libslang.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../grammar \
|
||||
-I../../X \
|
||||
-I../../glapi \
|
||||
-I../../main \
|
||||
-I../../math \
|
||||
-I../../shader \
|
||||
-I../../swrast \
|
||||
-I../../swrast_setup \
|
||||
-I../../tnl \
|
||||
-I../.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libslang_la_SOURCES = slang_builtin.c \
|
||||
slang_codegen.c \
|
||||
slang_compile.c \
|
||||
slang_compile_function.c \
|
||||
slang_compile_operation.c \
|
||||
slang_compile_struct.c \
|
||||
slang_compile_variable.c \
|
||||
slang_emit.c \
|
||||
slang_ir.c \
|
||||
slang_label.c \
|
||||
slang_library_noise.c \
|
||||
slang_link.c \
|
||||
slang_log.c \
|
||||
slang_mem.c \
|
||||
slang_preprocess.c \
|
||||
slang_print.c \
|
||||
slang_simplify.c \
|
||||
slang_storage.c \
|
||||
slang_typeinfo.c \
|
||||
slang_utility.c \
|
||||
slang_vartable.c
|
|
@ -1,50 +0,0 @@
|
|||
noinst_LTLIBRARIES = libswrast.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../shader/slang \
|
||||
-I../shader/slang \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libswrast_la_SOURCES = s_aaline.c \
|
||||
s_aatriangle.c \
|
||||
s_accum.c \
|
||||
s_alpha.c \
|
||||
s_atifragshader.c \
|
||||
s_bitmap.c \
|
||||
s_blend.c \
|
||||
s_blit.c \
|
||||
s_buffers.c \
|
||||
s_context.c \
|
||||
s_copypix.c \
|
||||
s_depth.c \
|
||||
s_drawpix.c \
|
||||
s_feedback.c \
|
||||
s_fog.c \
|
||||
s_fragprog.c \
|
||||
s_imaging.c \
|
||||
s_lines.c \
|
||||
s_logic.c \
|
||||
s_masking.c \
|
||||
s_points.c \
|
||||
s_readpix.c \
|
||||
s_span.c \
|
||||
s_stencil.c \
|
||||
s_texcombine.c \
|
||||
s_texfilter.c \
|
||||
s_texstore.c \
|
||||
s_triangle.c \
|
||||
s_zoom.c
|
|
@ -1,20 +0,0 @@
|
|||
noinst_LTLIBRARIES = libss.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libss_la_SOURCES = ss_context.c ss_triangle.c
|
|
@ -1,37 +0,0 @@
|
|||
noinst_LTLIBRARIES = libtnl.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../shader/slang \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libtnl_la_SOURCES = t_context.c \
|
||||
t_draw.c \
|
||||
t_pipeline.c \
|
||||
t_vb_cull.c \
|
||||
t_vb_fog.c \
|
||||
t_vb_light.c \
|
||||
t_vb_normals.c \
|
||||
t_vb_points.c \
|
||||
t_vb_program.c \
|
||||
t_vb_render.c \
|
||||
t_vb_texgen.c \
|
||||
t_vb_texmat.c \
|
||||
t_vb_vertex.c \
|
||||
t_vertex.c \
|
||||
t_vertex_generic.c \
|
||||
t_vertex_sse.c \
|
||||
t_vp_build.c
|
|
@ -1,35 +0,0 @@
|
|||
noinst_LTLIBRARIES = libvbo.la
|
||||
|
||||
AM_CFLAGS = \
|
||||
$(DIX_CFLAGS) \
|
||||
-DXFree86Server \
|
||||
@GLX_DEFINES@
|
||||
|
||||
INCLUDES = -I@MESA_SOURCE@/include \
|
||||
-I../X \
|
||||
-I../glapi \
|
||||
-I../main \
|
||||
-I../math \
|
||||
-I../shader \
|
||||
-I../shader/slang \
|
||||
-I../shader/slang \
|
||||
-I../swrast \
|
||||
-I../swrast_setup \
|
||||
-I../tnl \
|
||||
-I.. \
|
||||
-I$(top_srcdir)/hw/xfree86/os-support
|
||||
|
||||
nodist_libvbo_la_SOURCES = vbo_context.c \
|
||||
vbo_exec_api.c \
|
||||
vbo_exec_array.c \
|
||||
vbo_exec.c \
|
||||
vbo_exec_draw.c \
|
||||
vbo_exec_eval.c \
|
||||
vbo_rebase.c \
|
||||
vbo_save_api.c \
|
||||
vbo_save.c \
|
||||
vbo_save_draw.c \
|
||||
vbo_save_loopback.c \
|
||||
vbo_split.c \
|
||||
vbo_split_copy.c \
|
||||
vbo_split_inplace.c
|
|
@ -58,175 +58,14 @@ main() {
|
|||
|
||||
## actual symlinking
|
||||
|
||||
symlink_mesa_glapi() {
|
||||
src_dir src/mesa/glapi
|
||||
dst_dir mesa/glapi
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_main() {
|
||||
src_dir src/mesa/main
|
||||
dst_dir mesa/main
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_math() {
|
||||
src_dir src/mesa/math
|
||||
dst_dir mesa/math
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_swrast() {
|
||||
src_dir src/mesa/swrast
|
||||
dst_dir mesa/swrast
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_ss() {
|
||||
src_dir src/mesa/swrast_setup
|
||||
dst_dir mesa/swrast_setup
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_tnl() {
|
||||
src_dir src/mesa/tnl
|
||||
dst_dir mesa/tnl
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_shader() {
|
||||
src_dir src/mesa/shader
|
||||
dst_dir mesa/shader
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_shader_grammar() {
|
||||
src_dir src/mesa/shader/grammar
|
||||
dst_dir mesa/shader/grammar
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_shader_slang() {
|
||||
src_dir src/mesa/shader/slang
|
||||
dst_dir mesa/shader/slang
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_shader_slang_library() {
|
||||
src_dir src/mesa/shader/slang/library
|
||||
dst_dir mesa/shader/slang/library
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_vbo() {
|
||||
src_dir src/mesa/vbo
|
||||
dst_dir mesa/vbo
|
||||
|
||||
for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
|
||||
action `basename $src`
|
||||
done
|
||||
}
|
||||
|
||||
symlink_mesa_x() {
|
||||
src_dir src/mesa/drivers/x11
|
||||
dst_dir mesa/X
|
||||
|
||||
# action glxapi.h
|
||||
action glxheader.h
|
||||
# action realglx.h
|
||||
# action xfonts.h
|
||||
action xm_api.c
|
||||
action xm_buffer.c
|
||||
action xm_dd.c
|
||||
action xm_image.c
|
||||
action xm_image.h
|
||||
action xm_line.c
|
||||
action xm_span.c
|
||||
action xm_tri.c
|
||||
action xmesaP.h
|
||||
|
||||
# another hack
|
||||
src_dir src/mesa/drivers/common
|
||||
dst_dir mesa/X/drivers/common
|
||||
action driverfuncs.c
|
||||
action driverfuncs.h
|
||||
}
|
||||
|
||||
symlink_mesa_ppc() {
|
||||
src_dir src/mesa/ppc
|
||||
dst_dir mesa/ppc
|
||||
}
|
||||
|
||||
symlink_mesa_sparc() {
|
||||
src_dir src/mesa/sparc
|
||||
dst_dir mesa/sparc
|
||||
}
|
||||
|
||||
symlink_mesa_x86() {
|
||||
src_dir src/mesa/x86
|
||||
dst_dir mesa/x86
|
||||
}
|
||||
|
||||
symlink_mesa_x8664() {
|
||||
src_dir src/mesa/x86-64
|
||||
dst_dir mesa/x86-64
|
||||
}
|
||||
|
||||
symlink_mesa() {
|
||||
symlink_mesa_main
|
||||
symlink_mesa_math
|
||||
symlink_mesa_swrast
|
||||
symlink_mesa_ss
|
||||
symlink_mesa_tnl
|
||||
symlink_mesa_shader
|
||||
symlink_mesa_shader_grammar
|
||||
symlink_mesa_shader_slang
|
||||
symlink_mesa_shader_slang_library
|
||||
symlink_mesa_x
|
||||
symlink_mesa_glapi
|
||||
symlink_mesa_ppc
|
||||
symlink_mesa_sparc
|
||||
symlink_mesa_vbo
|
||||
symlink_mesa_x86
|
||||
symlink_mesa_x8664
|
||||
}
|
||||
|
||||
symlink_glx() {
|
||||
# this is... unpleasant
|
||||
src_dir src/glx/x11
|
||||
dst_dir glx
|
||||
|
||||
action indirect_size.h
|
||||
action glcontextmodes.c
|
||||
action glcontextmodes.h
|
||||
action indirect_dispatch.c
|
||||
action indirect_dispatch.h
|
||||
action indirect_dispatch_swap.c
|
||||
|
@ -267,7 +106,6 @@ run() {
|
|||
# $1 what to do
|
||||
# $2 explanation
|
||||
|
||||
ACTION=$1 EXPLANATION=$2 run_module mesa
|
||||
ACTION=$1 EXPLANATION=$2 run_module glx
|
||||
}
|
||||
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
/************************************************************
|
||||
Copyright (c) 1997 by Silicon Graphics Computer Systems, Inc.
|
||||
Permission to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose and without
|
||||
fee is hereby granted, 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 Silicon Graphics not be
|
||||
used in advertising or publicity pertaining to distribution
|
||||
of the software without specific prior written permission.
|
||||
Silicon Graphics makes no representation about the suitability
|
||||
of this software for any purpose. It is provided "as is"
|
||||
without any express or implied warranty.
|
||||
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
||||
GRAPHICS 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.
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#ifndef EVI_STRUCT_H
|
||||
#define EVI_STRUCT_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
** Per-ddx data
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
typedef int (*GetVisualInfoProc)(
|
||||
VisualID32*,
|
||||
int,
|
||||
xExtendedVisualInfo**,
|
||||
int*,
|
||||
VisualID32**,
|
||||
int*
|
||||
);
|
||||
|
||||
typedef void (*FreeVisualInfoProc)(
|
||||
xExtendedVisualInfo*,
|
||||
VisualID32*
|
||||
);
|
||||
typedef struct _EviPrivRec {
|
||||
GetVisualInfoProc getVisualInfo;
|
||||
FreeVisualInfoProc freeVisualInfo;
|
||||
} EviPrivRec, *EviPrivPtr;
|
||||
|
||||
extern EviPrivPtr eviDDXInit(void);
|
||||
extern void eviDDXReset(void);
|
||||
|
||||
#endif /* EVI_STRUCT_H */
|
|
@ -2140,6 +2140,8 @@ SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
|
|||
|
||||
for (i = 0; i < screenInfo.numScreens; i++) {
|
||||
pWin = WindowTable[i];
|
||||
if (!pWin)
|
||||
continue;
|
||||
(void)DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab, dev->id);
|
||||
p1 = pWin->firstChild;
|
||||
FindInterestedChildren(dev, p1, mask, ev, count);
|
||||
|
|
158
configure.ac
158
configure.ac
|
@ -177,7 +177,7 @@ AC_CHECK_FUNC([dlopen], [],
|
|||
AC_CHECK_LIB([dl], [dlopen], DLOPEN_LIBS="-ldl"))
|
||||
|
||||
case $host_os in
|
||||
linux*)
|
||||
linux*|darwin*)
|
||||
AC_DEFINE(HAVE_URANDOM, 1, [Has /dev/urandom]) ;;
|
||||
solaris*)
|
||||
# Solaris 8 with patches, or Solaris 9 or later have /dev/urandom
|
||||
|
@ -379,7 +379,7 @@ case $host_os in
|
|||
AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
|
||||
AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console])
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
|
||||
;;
|
||||
*netbsd*)
|
||||
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
|
||||
|
@ -387,7 +387,7 @@ case $host_os in
|
|||
AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
|
||||
AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
|
||||
;;
|
||||
*openbsd*)
|
||||
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
|
||||
|
@ -396,7 +396,7 @@ case $host_os in
|
|||
;;
|
||||
*linux*)
|
||||
DRI=yes
|
||||
DRI2=yes
|
||||
PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
|
||||
KDRIVE_HW=yes
|
||||
;;
|
||||
*solaris*)
|
||||
|
@ -524,11 +524,11 @@ AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with
|
|||
|
||||
dnl Extensions.
|
||||
AC_ARG_ENABLE(registry, AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes])
|
||||
AC_ARG_ENABLE(composite, AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=auto])
|
||||
AC_ARG_ENABLE(composite, AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes])
|
||||
AC_ARG_ENABLE(mitshm, AS_HELP_STRING([--disable-shm], [Build SHM extension (default: enabled)]), [MITSHM=$enableval], [MITSHM=yes])
|
||||
AC_ARG_ENABLE(xres, AS_HELP_STRING([--disable-xres], [Build XRes extension (default: enabled)]), [RES=$enableval], [RES=yes])
|
||||
AC_ARG_ENABLE(xtrap, AS_HELP_STRING([--disable-xtrap], [Build XTrap extension (default: enabled)]), [XTRAP=$enableval], [XTRAP=yes])
|
||||
AC_ARG_ENABLE(record, AS_HELP_STRING([--disable-record], [Build Record extension (default: disabled)]), [RECORD=$enableval], [RECORD=no])
|
||||
AC_ARG_ENABLE(record, AS_HELP_STRING([--enable-record], [Build Record extension (default: disabled)]), [RECORD=$enableval], [RECORD=no])
|
||||
AC_ARG_ENABLE(xv, AS_HELP_STRING([--disable-xv], [Build Xv extension (default: enabled)]), [XV=$enableval], [XV=yes])
|
||||
AC_ARG_ENABLE(xvmc, AS_HELP_STRING([--disable-xvmc], [Build XvMC extension (default: enabled)]), [XVMC=$enableval], [XVMC=yes])
|
||||
AC_ARG_ENABLE(dga, AS_HELP_STRING([--disable-dga], [Build DGA extension (default: auto)]), [DGA=$enableval], [DGA=auto])
|
||||
|
@ -547,7 +547,6 @@ AC_ARG_ENABLE(xcsecurity, AS_HELP_STRING([--disable-xcsecurity], [Build Secu
|
|||
AC_ARG_ENABLE(xcalibrate, AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no])
|
||||
AC_ARG_ENABLE(tslib, AS_HELP_STRING([--enable-tslib], [Build kdrive tslib touchscreen support (default: disabled)]), [TSLIB=$enableval], [TSLIB=no])
|
||||
AC_ARG_ENABLE(xevie, AS_HELP_STRING([--disable-xevie], [Build XEvIE extension (default: enabled)]), [XEVIE=$enableval], [XEVIE=yes])
|
||||
AC_ARG_ENABLE(cup, AS_HELP_STRING([--disable-cup], [Build TOG-CUP extension (default: enabled)]), [CUP=$enableval], [CUP=yes])
|
||||
AC_ARG_ENABLE(multibuffer, AS_HELP_STRING([--enable-multibuffer], [Build Multibuffer extension (default: disabled)]), [MULTIBUFFER=$enableval], [MULTIBUFFER=no])
|
||||
AC_ARG_ENABLE(fontcache, AS_HELP_STRING([--enable-fontcache], [Build FontCache extension (default: disabled)]), [FONTCACHE=$enableval], [FONTCACHE=no])
|
||||
AC_ARG_ENABLE(dbe, AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes])
|
||||
|
@ -645,6 +644,40 @@ XORG_CHECK_LINUXDOC
|
|||
dnl Handle installing libxf86config
|
||||
AM_CONDITIONAL(INSTALL_LIBXF86CONFIG, [test "x$INSTALL_LIBXF86CONFIG" = xyes])
|
||||
|
||||
dnl XQuartz DDX Detection... Yes, it's ugly to have it here... but we need to handle this early on
|
||||
case $host_os in
|
||||
darwin*)
|
||||
if test x$XQUARTZ = xauto; then
|
||||
AC_CACHE_CHECK([whether to build Xquartz],xorg_cv_Carbon_framework,[
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -framework Carbon"
|
||||
AC_LINK_IFELSE([char FSFindFolder(); int main() { FSFindFolder(); return 0;}],
|
||||
[xorg_cv_Carbon_framework=yes],
|
||||
[xorg_cv_Carbon_framework=no])
|
||||
LDFLAGS=$save_LDFLAGS])
|
||||
|
||||
if test "X$xorg_cv_Carbon_framework" = Xyes; then
|
||||
XQUARTZ=yes
|
||||
else
|
||||
XQUARTZ=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$XQUARTZ" = xyes ; then
|
||||
XQUARTZ=yes
|
||||
XVFB=no
|
||||
XNEST=no
|
||||
|
||||
COMPOSITE=no
|
||||
DGA=no
|
||||
DPMSExtension=no
|
||||
XF86BIGFONT=no
|
||||
XF86MISC=no
|
||||
XF86VIDMODE=no
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl Extension section
|
||||
dnl ---------------------------------------------------------------------------
|
||||
|
@ -781,18 +814,6 @@ if test "x$XREGISTRY" = xyes; then
|
|||
AC_DEFINE(XREGISTRY, 1, [Build registry module])
|
||||
fi
|
||||
|
||||
dnl XQuartz DDX Detection... Yes, it's ugly to have it here... but we need to disable COMPOSITE for
|
||||
if test "x$COMPOSITE" = xauto; then
|
||||
case $host_os in
|
||||
darwin*)
|
||||
test "x$XQUARTZ" = xyes -o "x$XQUARTZ" = xauto && COMPOSITE=no
|
||||
;;
|
||||
*)
|
||||
COMPOSITE=yes
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(COMPOSITE, [test "x$COMPOSITE" = xyes])
|
||||
if test "x$COMPOSITE" = xyes; then
|
||||
AC_DEFINE(COMPOSITE, 1, [Support Composite Extension])
|
||||
|
@ -837,7 +858,7 @@ if test "x$GLX" = xyes && ! test "x$MESA_SOURCE" = x; then
|
|||
PKG_CHECK_MODULES([GL], [glproto >= 1.4.9])
|
||||
AC_SUBST(XLIB_CFLAGS)
|
||||
AC_DEFINE(GLXEXT, 1, [Build GLX extension])
|
||||
GLX_LIBS='$(top_builddir)/GL/glx/libglx.la $(top_builddir)/GL/mesa/libGLcore.la'
|
||||
GLX_LIBS='$(top_builddir)/GL/glx/libglx.la'
|
||||
test -d GL || mkdir GL
|
||||
case $host_os in
|
||||
solaris*)
|
||||
|
@ -848,6 +869,7 @@ if test "x$GLX" = xyes && ! test "x$MESA_SOURCE" = x; then
|
|||
if test $? -ne 0; then
|
||||
AC_MSG_ERROR([Failed to link Mesa source tree. Please specify a proper path to Mesa sources, or disable GLX.])
|
||||
fi
|
||||
GLX_SYS_LIBS="$GLX_SYS_LIBS $DLOPEN_LIBS"
|
||||
else
|
||||
GLX=no
|
||||
fi
|
||||
|
@ -929,12 +951,6 @@ if test "x$XEVIE" = xyes; then
|
|||
REQUIRED_MODULES="$REQUIRED_MODULES evieproto"
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(CUP, [test "x$CUP" = xyes])
|
||||
if test "x$CUP" = xyes; then
|
||||
AC_DEFINE(TOGCUP, 1, [Build TOG-CUP extension])
|
||||
# Requires xextproto which is always required
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(MULTIBUFFER, [test "x$MULTIBUFFER" = xyes])
|
||||
if test "x$MULTIBUFFER" = xyes; then
|
||||
AC_DEFINE(MULTIBUFFER, 1, [Build Multibuffer extension])
|
||||
|
@ -1124,7 +1140,9 @@ PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
|
|||
|
||||
# OpenSSL used for SHA1 hashing in render/glyph.c, but we don't need all of
|
||||
# the OpenSSL libraries, just libcrypto
|
||||
PKG_CHECK_MODULES([OPENSSL], [openssl], [OPENSSL_LIB_FLAGS=`$PKG_CONFIG --libs-only-L --libs-only-other openssl`])
|
||||
PKG_CHECK_EXISTS([openssl],
|
||||
[PKG_CHECK_MODULES([OPENSSL], [openssl],
|
||||
[OPENSSL_LIB_FLAGS=`$PKG_CONFIG --libs-only-L --libs-only-other openssl`])])
|
||||
LIBCRYPTO="$OPENSSL_LIB_FLAGS -lcrypto"
|
||||
|
||||
# Autotools has some unfortunate issues with library handling. In order to
|
||||
|
@ -1710,58 +1728,17 @@ AM_CONDITIONAL(XWIN_RANDR, [test "x$XWIN" = xyes])
|
|||
AM_CONDITIONAL(XWIN_XV, [test "x$XWIN" = xyes && test "x$XV" = xyes])
|
||||
|
||||
dnl Darwin / OS X DDX
|
||||
if test "X$XQUARTZ" = Xauto; then
|
||||
AC_CACHE_CHECK([whether to build Xquartz],xorg_cv_Carbon_framework,[
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -framework Carbon"
|
||||
AC_LINK_IFELSE([char FSFindFolder(); int main() { FSFindFolder(); return 0;}],
|
||||
[xorg_cv_Carbon_framework=yes],
|
||||
[xorg_cv_Carbon_framework=no])
|
||||
LDFLAGS=$save_LDFLAGS])
|
||||
|
||||
if test "X$xorg_cv_Carbon_framework" = Xyes; then
|
||||
XQUARTZ=yes
|
||||
else
|
||||
XQUARTZ=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$XQUARTZ" = xyes; then
|
||||
AC_DEFINE(XQUARTZ,1,[Have Quartz])
|
||||
AC_DEFINE(ROOTLESS,1,[Build Rootless code])
|
||||
|
||||
#glxAGL / glxCGL don't work yet
|
||||
# AC_CACHE_CHECK([for AGL framework],xorg_cv_AGL_framework,[
|
||||
# save_LDFLAGS=$LDFLAGS
|
||||
# LDFLAGS="$LDFLAGS -framework AGL"
|
||||
# AC_LINK_IFELSE(
|
||||
# [char aglEnable(); int main() { aglEnable(); return 0;}],
|
||||
# [xorg_cv_AGL_framework=yes],
|
||||
# [xorg_cv_AGL_framework=no])
|
||||
# LDFLAGS=$save_LDFLAGS
|
||||
# ])
|
||||
xorg_cv_AGL_framework=no
|
||||
DARWIN_GLX_LIBS='$(top_builddir)/GL/apple/indirect.o $(top_builddir)/GL/glx/libglx.la'
|
||||
DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB"
|
||||
DARWIN_GLX_LIBS='$(top_builddir)/hw/xquartz/GL/libCGLCore.la $(top_builddir)/GL/glx/libglx.la'
|
||||
DARWIN_LIBS="$MI_LIB $OS_LIB $DIX_LIB $FB_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB $DARWIN_GLX_LIBS"
|
||||
AC_SUBST([DARWIN_LIBS])
|
||||
|
||||
AC_CHECK_LIB([Xplugin],[xp_init],[:])
|
||||
|
||||
CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA"
|
||||
if test "x$XF86MISC" = xyes || test "x$XF86MISC" = xauto; then
|
||||
AC_MSG_NOTICE([Disabling XF86Misc extension])
|
||||
XF86MISC=no
|
||||
fi
|
||||
if test "x$XF86VIDMODE" = xyes || test "x$XF86VIDMODE" = xauto; then
|
||||
AC_MSG_NOTICE([Disabling XF86VidMode extension])
|
||||
XF86VIDMODE=no
|
||||
fi
|
||||
if test "x$XF86BIGFONT" = xyes || test "x$XF86BIGFONT" = xauto; then
|
||||
AC_MSG_NOTICE([Disabling XF86BigFont extension])
|
||||
XF86BIGFONT=no
|
||||
fi
|
||||
if test "x$DGA" = xyes || test "x$DGA" = xauto; then
|
||||
AC_MSG_NOTICE([Disabling DGA extension])
|
||||
DGA=no
|
||||
fi
|
||||
fi
|
||||
|
||||
# Support for objc in autotools is minimal and not documented.
|
||||
|
@ -1923,26 +1900,21 @@ if test "$KDRIVE" = yes; then
|
|||
if test "x$XV" = xyes; then
|
||||
XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv"
|
||||
fi
|
||||
if test "x$DRI" = xyes && test "x$GLX" = xyes; then
|
||||
XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS gl libdrm"
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
|
||||
if test "x$XEPHYR" = xauto; then
|
||||
XEPHYR=$xephyr
|
||||
fi
|
||||
XEPHYR_DRI=no
|
||||
if test x$XEPHYR = xyes -a x$DRI = xyes && test "x$GLX" = xyes; then
|
||||
XEPHYR_DRI=yes
|
||||
XEPHYR_DRI_LIBS=-lGL
|
||||
AC_SUBST(XEPHYR_DRI_LIBS)
|
||||
fi
|
||||
if test x$XEPHYR_DRI = xyes ; then
|
||||
AC_DEFINE(XEPHYR_DRI,1,[enable DRI extension in xephyr])
|
||||
fi
|
||||
|
||||
# Xephyr needs nanosleep() which is in librt on Solaris
|
||||
AC_CHECK_FUNC([nanosleep], [],
|
||||
AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
|
||||
|
||||
if test "x$TSLIB" = xyes; then
|
||||
PKG_CHECK_MODULES([TSLIB], [tslib-0.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
|
||||
PKG_CHECK_MODULES([TSLIB], [tslib-1.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
|
||||
if test "x$HAVE_TSLIB" = xno; then
|
||||
AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
|
||||
fi
|
||||
|
@ -1966,13 +1938,10 @@ if test "$KDRIVE" = yes; then
|
|||
;;
|
||||
esac
|
||||
KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
|
||||
KDRIVE_LOCAL_LIBS="$TSLIB_LIBS $DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
|
||||
KDRIVE_LOCAL_LIBS="$DIX_LIB $KDRIVE_LIB $KDRIVE_STUB_LIB $CONFIG_LIB"
|
||||
KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
|
||||
KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB $OS_LIB"
|
||||
KDRIVE_LIBS="$KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS"
|
||||
|
||||
# check if we can build Xephyr
|
||||
PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
|
||||
KDRIVE_LIBS="$TSLIB_LIBS $KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS"
|
||||
|
||||
AC_SUBST([XEPHYR_LIBS])
|
||||
AC_SUBST([XEPHYR_INCS])
|
||||
|
@ -1993,7 +1962,6 @@ AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
|
|||
AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
|
||||
AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
|
||||
AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
|
||||
AM_CONDITIONAL(XEPHYR_HAS_DRI, [test x$XEPHYR_DRI = xyes])
|
||||
AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
|
||||
|
||||
dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers)
|
||||
|
@ -2102,20 +2070,7 @@ XORG_MANPAGE_SECTIONS
|
|||
AC_OUTPUT([
|
||||
Makefile
|
||||
GL/Makefile
|
||||
GL/apple/Makefile
|
||||
GL/glx/Makefile
|
||||
GL/mesa/Makefile
|
||||
GL/mesa/glapi/Makefile
|
||||
GL/mesa/main/Makefile
|
||||
GL/mesa/math/Makefile
|
||||
GL/mesa/shader/Makefile
|
||||
GL/mesa/shader/grammar/Makefile
|
||||
GL/mesa/shader/slang/Makefile
|
||||
GL/mesa/swrast/Makefile
|
||||
GL/mesa/swrast_setup/Makefile
|
||||
GL/mesa/tnl/Makefile
|
||||
GL/mesa/vbo/Makefile
|
||||
GL/mesa/X/Makefile
|
||||
include/Makefile
|
||||
afb/Makefile
|
||||
composite/Makefile
|
||||
|
@ -2208,6 +2163,7 @@ hw/xgl/glxext/module/Makefile
|
|||
hw/xnest/Makefile
|
||||
hw/xwin/Makefile
|
||||
hw/xquartz/Makefile
|
||||
hw/xquartz/GL/Makefile
|
||||
hw/xquartz/bundle/Makefile
|
||||
hw/xquartz/xpr/Makefile
|
||||
hw/kdrive/Makefile
|
||||
|
|
|
@ -474,8 +474,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
|
|||
int num_valuators, int *valuators) {
|
||||
int numEvents = 0;
|
||||
CARD32 ms = 0;
|
||||
KeySym *map = pDev->key->curKeySyms.map;
|
||||
KeySym sym = map[key_code * pDev->key->curKeySyms.mapWidth];
|
||||
KeySym *map;
|
||||
KeySym sym;
|
||||
deviceKeyButtonPointer *kbp = NULL;
|
||||
DeviceIntPtr master;
|
||||
|
||||
|
@ -486,8 +486,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
|
|||
if (type != KeyPress && type != KeyRelease)
|
||||
return 0;
|
||||
|
||||
if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
|
||||
(pDev->coreEvents && !inputInfo.keyboard->key))
|
||||
if (!pDev->key || !pDev->focus || !pDev->kbdfeed)
|
||||
return 0;
|
||||
|
||||
numEvents = 1;
|
||||
|
@ -495,6 +494,9 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
|
|||
if (key_code < 8 || key_code > 255)
|
||||
return 0;
|
||||
|
||||
map = pDev->key->curKeySyms.map;
|
||||
sym = map[key_code * pDev->key->curKeySyms.mapWidth];
|
||||
|
||||
master = pDev->u.master;
|
||||
if (master && master->u.lastSlave != pDev)
|
||||
{
|
||||
|
|
19
dix/main.c
19
dix/main.c
|
@ -237,12 +237,11 @@ static int indexForScanlinePad[ 65 ] = {
|
|||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
void DarwinHandleGUI(int argc, char **argv, char **envp);
|
||||
#ifdef XQUARTZ
|
||||
int dix_main(int argc, char *argv[], char *envp[])
|
||||
#else
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
#endif
|
||||
|
||||
int
|
||||
main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
int i, j, k, error;
|
||||
char *xauthfile;
|
||||
|
@ -256,13 +255,6 @@ main(int argc, char *argv[], char *envp[])
|
|||
PrinterInitGlobals();
|
||||
#endif
|
||||
|
||||
#ifdef XQUARTZ
|
||||
/* Quartz support on Mac OS X requires that the Cocoa event loop be in
|
||||
* the main thread. This allows the X server main to be called again
|
||||
* from another thread. */
|
||||
DarwinHandleGUI(argc, argv, envp);
|
||||
#endif
|
||||
|
||||
CheckUserParameters(argc, argv, envp);
|
||||
|
||||
CheckUserAuthorization();
|
||||
|
@ -462,7 +454,10 @@ main(int argc, char *argv[], char *envp[])
|
|||
#endif
|
||||
|
||||
config_fini();
|
||||
|
||||
memset(WindowTable, 0, MAXSCREENS * sizeof(WindowPtr));
|
||||
CloseDownDevices();
|
||||
|
||||
for (i = screenInfo.numScreens - 1; i >= 0; i--)
|
||||
{
|
||||
FreeScratchPixmapsForScreen(i);
|
||||
|
|
|
@ -18,6 +18,7 @@ libexa_la_SOURCES = \
|
|||
exa.c \
|
||||
exa.h \
|
||||
exa_accel.c \
|
||||
exa_glyphs.c \
|
||||
exa_migration.c \
|
||||
exa_offscreen.c \
|
||||
exa_render.c \
|
||||
|
|
|
@ -739,6 +739,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
|
|||
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
|
||||
#endif
|
||||
|
||||
exaGlyphsFini(pScreen);
|
||||
|
||||
pScreen->CreateGC = pExaScr->SavedCreateGC;
|
||||
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
|
||||
pScreen->GetImage = pExaScr->SavedGetImage;
|
||||
|
@ -752,7 +754,9 @@ exaCloseScreen(int i, ScreenPtr pScreen)
|
|||
#ifdef RENDER
|
||||
if (ps) {
|
||||
ps->Composite = pExaScr->SavedComposite;
|
||||
ps->Glyphs = pExaScr->SavedGlyphs;
|
||||
ps->Trapezoids = pExaScr->SavedTrapezoids;
|
||||
ps->Triangles = pExaScr->SavedTriangles;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -914,6 +918,9 @@ exaDriverInit (ScreenPtr pScreen,
|
|||
pExaScr->SavedComposite = ps->Composite;
|
||||
ps->Composite = exaComposite;
|
||||
|
||||
pExaScr->SavedGlyphs = ps->Glyphs;
|
||||
ps->Glyphs = exaGlyphs;
|
||||
|
||||
pExaScr->SavedTriangles = ps->Triangles;
|
||||
ps->Triangles = exaTriangles;
|
||||
|
||||
|
@ -973,6 +980,8 @@ exaDriverInit (ScreenPtr pScreen,
|
|||
}
|
||||
}
|
||||
|
||||
exaGlyphsInit(pScreen);
|
||||
|
||||
LogMessage(X_INFO, "EXA(%d): Driver registered support for the following"
|
||||
" operations:\n", pScreen->myNum);
|
||||
assert(pScreenInfo->PrepareSolid != NULL);
|
||||
|
|
|
@ -0,0 +1,897 @@
|
|||
/*
|
||||
* Copyright © 2008 Red Hat, Inc.
|
||||
* Partly based on code Copyright © 2000 SuSE, Inc.
|
||||
*
|
||||
* 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 Red Hat not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. Red Hat makes no representations about the
|
||||
* suitability of this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*
|
||||
* Red Hat DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL Red Hat
|
||||
* 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.
|
||||
*
|
||||
* 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 SuSE not be used in advertising or
|
||||
* publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. SuSE makes no representations about the
|
||||
* suitability of this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*
|
||||
* SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
|
||||
* 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: Owen Taylor <otaylor@fishsoup.net>
|
||||
* Based on code by: Keith Packard
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "exa_priv.h"
|
||||
|
||||
#include "mipict.h"
|
||||
|
||||
#if DEBUG_GLYPH_CACHE
|
||||
#define DBG_GLYPH_CACHE(a) ErrorF a
|
||||
#else
|
||||
#define DBG_GLYPH_CACHE(a)
|
||||
#endif
|
||||
|
||||
/* Width of the pixmaps we use for the caches; this should be less than
|
||||
* max texture size of the driver; this may need to actually come from
|
||||
* the driver.
|
||||
*/
|
||||
#define CACHE_PICTURE_WIDTH 1024
|
||||
|
||||
/* Maximum number of glyphs we buffer on the stack before flushing
|
||||
* rendering to the mask or destination surface.
|
||||
*/
|
||||
#define GLYPH_BUFFER_SIZE 256
|
||||
|
||||
typedef struct {
|
||||
PicturePtr source;
|
||||
ExaCompositeRectRec rects[GLYPH_BUFFER_SIZE];
|
||||
int count;
|
||||
} ExaGlyphBuffer, *ExaGlyphBufferPtr;
|
||||
|
||||
typedef enum {
|
||||
ExaGlyphSuccess, /* Glyph added to render buffer */
|
||||
ExaGlyphFail, /* out of memory, etc */
|
||||
ExaGlyphNeedFlush, /* would evict a glyph already in the buffer */
|
||||
} ExaGlyphCacheResult;
|
||||
|
||||
void
|
||||
exaGlyphsInit(ScreenPtr pScreen)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
int i = 0;
|
||||
|
||||
memset(pExaScr->glyphCaches, 0, sizeof(pExaScr->glyphCaches));
|
||||
|
||||
pExaScr->glyphCaches[i].format = PICT_a8;
|
||||
pExaScr->glyphCaches[i].glyphWidth = pExaScr->glyphCaches[i].glyphHeight = 16;
|
||||
i++;
|
||||
pExaScr->glyphCaches[i].format = PICT_a8;
|
||||
pExaScr->glyphCaches[i].glyphWidth = pExaScr->glyphCaches[i].glyphHeight = 32;
|
||||
i++;
|
||||
pExaScr->glyphCaches[i].format = PICT_a8r8g8b8;
|
||||
pExaScr->glyphCaches[i].glyphWidth = pExaScr->glyphCaches[i].glyphHeight = 16;
|
||||
i++;
|
||||
pExaScr->glyphCaches[i].format = PICT_a8r8g8b8;
|
||||
pExaScr->glyphCaches[i].glyphWidth = pExaScr->glyphCaches[i].glyphHeight = 32;
|
||||
i++;
|
||||
|
||||
assert(i == EXA_NUM_GLYPH_CACHES);
|
||||
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
pExaScr->glyphCaches[i].columns = CACHE_PICTURE_WIDTH / pExaScr->glyphCaches[i].glyphWidth;
|
||||
pExaScr->glyphCaches[i].size = 256;
|
||||
pExaScr->glyphCaches[i].hashSize = 557;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
exaUnrealizeGlyphCaches(ScreenPtr pScreen,
|
||||
unsigned int format)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
ExaGlyphCachePtr cache = &pExaScr->glyphCaches[i];
|
||||
|
||||
if (cache->format != format)
|
||||
continue;
|
||||
|
||||
if (cache->picture) {
|
||||
FreePicture ((pointer) cache->picture, (XID) 0);
|
||||
cache->picture = NULL;
|
||||
}
|
||||
|
||||
if (cache->hashEntries) {
|
||||
xfree(cache->hashEntries);
|
||||
cache->hashEntries = NULL;
|
||||
}
|
||||
|
||||
if (cache->glyphs) {
|
||||
xfree(cache->glyphs);
|
||||
cache->glyphs = NULL;
|
||||
}
|
||||
cache->glyphCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* All caches for a single format share a single pixmap for glyph storage,
|
||||
* allowing mixing glyphs of different sizes without paying a penalty
|
||||
* for switching between source pixmaps. (Note that for a size of font
|
||||
* right at the border between two sizes, we might be switching for almost
|
||||
* every glyph.)
|
||||
*
|
||||
* This function allocates the storage pixmap, and then fills in the
|
||||
* rest of the allocated structures for all caches with the given format.
|
||||
*/
|
||||
static Bool
|
||||
exaRealizeGlyphCaches(ScreenPtr pScreen,
|
||||
unsigned int format)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
|
||||
int depth = PIXMAN_FORMAT_DEPTH(format);
|
||||
PictFormatPtr pPictFormat;
|
||||
PixmapPtr pPixmap;
|
||||
PicturePtr pPicture;
|
||||
int height;
|
||||
int i;
|
||||
int error;
|
||||
|
||||
pPictFormat = PictureMatchFormat(pScreen, depth, format);
|
||||
if (!pPictFormat)
|
||||
return FALSE;
|
||||
|
||||
/* Compute the total vertical size needed for the format */
|
||||
|
||||
height = 0;
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
ExaGlyphCachePtr cache = &pExaScr->glyphCaches[i];
|
||||
int rows;
|
||||
|
||||
if (cache->format != format)
|
||||
continue;
|
||||
|
||||
cache->yOffset = height;
|
||||
|
||||
rows = (cache->size + cache->columns - 1) / cache->columns;
|
||||
height += rows * cache->glyphHeight;
|
||||
}
|
||||
|
||||
/* Now allocate the pixmap and picture */
|
||||
|
||||
pPixmap = (*pScreen->CreatePixmap) (pScreen,
|
||||
CACHE_PICTURE_WIDTH,
|
||||
height, depth, 0);
|
||||
if (!pPixmap)
|
||||
return FALSE;
|
||||
|
||||
pPicture = CreatePicture(0, &pPixmap->drawable, pPictFormat,
|
||||
0, 0, serverClient, &error);
|
||||
|
||||
(*pScreen->DestroyPixmap) (pPixmap); /* picture holds a refcount */
|
||||
|
||||
if (!pPicture)
|
||||
return FALSE;
|
||||
|
||||
/* And store the picture in all the caches for the format */
|
||||
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
ExaGlyphCachePtr cache = &pExaScr->glyphCaches[i];
|
||||
int j;
|
||||
|
||||
if (cache->format != format)
|
||||
continue;
|
||||
|
||||
cache->picture = pPicture;
|
||||
cache->picture->refcnt++;
|
||||
cache->hashEntries = xalloc(sizeof(int) * cache->hashSize);
|
||||
cache->glyphs = xalloc(sizeof(ExaCachedGlyphRec) * cache->size);
|
||||
cache->glyphCount = 0;
|
||||
|
||||
if (!cache->hashEntries || !cache->glyphs)
|
||||
goto bail;
|
||||
|
||||
for (j = 0; j < cache->hashSize; j++)
|
||||
cache->hashEntries[j] = -1;
|
||||
|
||||
cache->evictionPosition = rand() % cache->size;
|
||||
}
|
||||
|
||||
/* Each cache references the picture individually */
|
||||
FreePicture ((pointer) pPicture, (XID) 0);
|
||||
return TRUE;
|
||||
|
||||
bail:
|
||||
exaUnrealizeGlyphCaches(pScreen, format);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
exaGlyphsFini (ScreenPtr pScreen)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
ExaGlyphCachePtr cache = &pExaScr->glyphCaches[i];
|
||||
|
||||
if (cache->picture)
|
||||
exaUnrealizeGlyphCaches(pScreen, cache->format);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
exaGlyphCacheHashLookup(ExaGlyphCachePtr cache,
|
||||
GlyphPtr pGlyph)
|
||||
{
|
||||
int slot;
|
||||
|
||||
slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
|
||||
|
||||
while (TRUE) { /* hash table can never be full */
|
||||
int entryPos = cache->hashEntries[slot];
|
||||
if (entryPos == -1)
|
||||
return -1;
|
||||
|
||||
if (memcmp(pGlyph->sha1, cache->glyphs[entryPos].sha1, sizeof(pGlyph->sha1)) == 0){
|
||||
return entryPos;
|
||||
}
|
||||
|
||||
slot--;
|
||||
if (slot < 0)
|
||||
slot = cache->hashSize - 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
exaGlyphCacheHashInsert(ExaGlyphCachePtr cache,
|
||||
GlyphPtr pGlyph,
|
||||
int pos)
|
||||
{
|
||||
int slot;
|
||||
|
||||
memcpy(cache->glyphs[pos].sha1, pGlyph->sha1, sizeof(pGlyph->sha1));
|
||||
|
||||
slot = (*(CARD32 *) pGlyph->sha1) % cache->hashSize;
|
||||
|
||||
while (TRUE) { /* hash table can never be full */
|
||||
if (cache->hashEntries[slot] == -1) {
|
||||
cache->hashEntries[slot] = pos;
|
||||
return;
|
||||
}
|
||||
|
||||
slot--;
|
||||
if (slot < 0)
|
||||
slot = cache->hashSize - 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
exaGlyphCacheHashRemove(ExaGlyphCachePtr cache,
|
||||
int pos)
|
||||
{
|
||||
int slot;
|
||||
int emptiedSlot = -1;
|
||||
|
||||
slot = (*(CARD32 *) cache->glyphs[pos].sha1) % cache->hashSize;
|
||||
|
||||
while (TRUE) { /* hash table can never be full */
|
||||
int entryPos = cache->hashEntries[slot];
|
||||
|
||||
if (entryPos == -1)
|
||||
return;
|
||||
|
||||
if (entryPos == pos) {
|
||||
cache->hashEntries[slot] = -1;
|
||||
emptiedSlot = slot;
|
||||
} else if (emptiedSlot != -1) {
|
||||
/* See if we can move this entry into the emptied slot, we can't
|
||||
* do that if if entry would have hashed between the current position
|
||||
* and the emptied slot. (taking wrapping into account). Bad positions
|
||||
* are:
|
||||
*
|
||||
* | XXXXXXXXXX |
|
||||
* i j
|
||||
*
|
||||
* |XXX XXXX|
|
||||
* j i
|
||||
*
|
||||
* i - slot, j - emptiedSlot
|
||||
*
|
||||
* (Knuth 6.4R)
|
||||
*/
|
||||
|
||||
int entrySlot = (*(CARD32 *) cache->glyphs[entryPos].sha1) % cache->hashSize;
|
||||
|
||||
if (!((entrySlot >= slot && entrySlot < emptiedSlot) ||
|
||||
(emptiedSlot < slot && (entrySlot < emptiedSlot || entrySlot >= slot))))
|
||||
{
|
||||
cache->hashEntries[emptiedSlot] = entryPos;
|
||||
cache->hashEntries[slot] = -1;
|
||||
emptiedSlot = slot;
|
||||
}
|
||||
}
|
||||
|
||||
slot--;
|
||||
if (slot < 0)
|
||||
slot = cache->hashSize - 1;
|
||||
}
|
||||
}
|
||||
|
||||
#define CACHE_X(pos) (((pos) % cache->columns) * cache->glyphWidth)
|
||||
#define CACHE_Y(pos) (cache->yOffset + ((pos) / cache->columns) * cache->glyphHeight)
|
||||
|
||||
/* The most efficient thing to way to upload the glyph to the screen
|
||||
* is to use the UploadToScreen() driver hook; this allows us to
|
||||
* pipeline glyph uploads and to avoid creating offscreen pixmaps for
|
||||
* glyphs that we'll never use again.
|
||||
*/
|
||||
static Bool
|
||||
exaGlyphCacheUploadGlyph(ScreenPtr pScreen,
|
||||
ExaGlyphCachePtr cache,
|
||||
int pos,
|
||||
GlyphPtr pGlyph)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
PicturePtr pGlyphPicture = GlyphPicture(pGlyph)[pScreen->myNum];
|
||||
PixmapPtr pGlyphPixmap = (PixmapPtr)pGlyphPicture->pDrawable;
|
||||
ExaPixmapPriv(pGlyphPixmap);
|
||||
PixmapPtr pCachePixmap = (PixmapPtr)cache->picture->pDrawable;
|
||||
ExaMigrationRec pixmaps[1];
|
||||
int cacheXoff, cacheYoff;
|
||||
|
||||
if (!pExaScr->info->UploadToScreen || pExaScr->swappedOut || pExaPixmap->accel_blocked)
|
||||
return FALSE;
|
||||
|
||||
/* If the glyph pixmap is already uploaded, no point in doing
|
||||
* things this way */
|
||||
if (exaPixmapIsOffscreen(pGlyphPixmap))
|
||||
return FALSE;
|
||||
|
||||
/* UploadToScreen only works if bpp match */
|
||||
if (pGlyphPixmap->drawable.bitsPerPixel != pCachePixmap->drawable.bitsPerPixel)
|
||||
return FALSE;
|
||||
|
||||
/* cache pixmap must be offscreen. */
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = FALSE;
|
||||
pixmaps[0].pPix = pCachePixmap;
|
||||
pixmaps[0].pReg = NULL;
|
||||
exaDoMigration (pixmaps, 1, TRUE);
|
||||
|
||||
pCachePixmap = exaGetOffscreenPixmap ((DrawablePtr)pCachePixmap, &cacheXoff, &cacheYoff);
|
||||
if (!pCachePixmap)
|
||||
return FALSE;
|
||||
|
||||
if (!pExaScr->info->UploadToScreen(pCachePixmap,
|
||||
CACHE_X(pos) + cacheXoff,
|
||||
CACHE_Y(pos) + cacheYoff,
|
||||
pGlyph->info.width,
|
||||
pGlyph->info.height,
|
||||
(char *)pExaPixmap->sys_ptr,
|
||||
pExaPixmap->sys_pitch))
|
||||
return FALSE;
|
||||
|
||||
exaPixmapDirty (pCachePixmap,
|
||||
CACHE_X(pos) + cacheXoff,
|
||||
CACHE_Y(pos) + cacheYoff,
|
||||
CACHE_X(pos) + cacheXoff + pGlyph->info.width,
|
||||
CACHE_Y(pos) + cacheYoff + pGlyph->info.height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static ExaGlyphCacheResult
|
||||
exaGlyphCacheBufferGlyph(ScreenPtr pScreen,
|
||||
ExaGlyphCachePtr cache,
|
||||
ExaGlyphBufferPtr buffer,
|
||||
GlyphPtr pGlyph,
|
||||
int xGlyph,
|
||||
int yGlyph)
|
||||
{
|
||||
ExaCompositeRectPtr rect;
|
||||
int pos;
|
||||
|
||||
if (buffer->source && buffer->source != cache->picture)
|
||||
return ExaGlyphNeedFlush;
|
||||
|
||||
if (!cache->picture) {
|
||||
if (!exaRealizeGlyphCaches(pScreen, cache->format))
|
||||
return ExaGlyphFail;
|
||||
}
|
||||
|
||||
DBG_GLYPH_CACHE(("(%d,%d,%s): buffering glyph %lx\n",
|
||||
cache->glyphWidth, cache->glyphHeight, cache->format == PICT_a8 ? "A" : "ARGB",
|
||||
(long)*(CARD32 *) pGlyph->sha1));
|
||||
|
||||
pos = exaGlyphCacheHashLookup(cache, pGlyph);
|
||||
if (pos != -1) {
|
||||
DBG_GLYPH_CACHE((" found existing glyph at %d\n", pos));
|
||||
} else {
|
||||
if (cache->glyphCount < cache->size) {
|
||||
/* Space remaining; we fill from the start */
|
||||
pos = cache->glyphCount;
|
||||
cache->glyphCount++;
|
||||
DBG_GLYPH_CACHE((" storing glyph in free space at %d\n", pos));
|
||||
|
||||
exaGlyphCacheHashInsert(cache, pGlyph, pos);
|
||||
|
||||
} else {
|
||||
/* Need to evict an entry. We have to see if any glyphs
|
||||
* already in the output buffer were at this position in
|
||||
* the cache
|
||||
*/
|
||||
|
||||
pos = cache->evictionPosition;
|
||||
DBG_GLYPH_CACHE((" evicting glyph at %d\n", pos));
|
||||
if (buffer->count) {
|
||||
int x, y;
|
||||
int i;
|
||||
|
||||
x = CACHE_X(pos);
|
||||
y = CACHE_Y(pos);
|
||||
|
||||
for (i = 0; i < buffer->count; i++) {
|
||||
if (buffer->rects[i].xSrc == x && buffer->rects[i].ySrc == y) {
|
||||
DBG_GLYPH_CACHE((" must flush buffer\n"));
|
||||
return ExaGlyphNeedFlush;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* OK, we're all set, swap in the new glyph */
|
||||
exaGlyphCacheHashRemove(cache, pos);
|
||||
exaGlyphCacheHashInsert(cache, pGlyph, pos);
|
||||
|
||||
/* And pick a new eviction position */
|
||||
cache->evictionPosition = rand() % cache->size;
|
||||
}
|
||||
|
||||
/* Now actually upload the glyph into the cache picture; if
|
||||
* we can't do it with UploadToScreen (because the glyph is
|
||||
* offscreen, etc), we fall back to CompositePicture.
|
||||
*/
|
||||
if (!exaGlyphCacheUploadGlyph(pScreen, cache, pos, pGlyph)) {
|
||||
CompositePicture (PictOpSrc,
|
||||
GlyphPicture(pGlyph)[pScreen->myNum],
|
||||
None,
|
||||
cache->picture,
|
||||
0, 0,
|
||||
0, 0,
|
||||
CACHE_X(pos),
|
||||
CACHE_Y(pos),
|
||||
pGlyph->info.width,
|
||||
pGlyph->info.height);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
buffer->source = cache->picture;
|
||||
|
||||
rect = &buffer->rects[buffer->count];
|
||||
rect->xSrc = CACHE_X(pos);
|
||||
rect->ySrc = CACHE_Y(pos);
|
||||
rect->xDst = xGlyph - pGlyph->info.x;
|
||||
rect->yDst = yGlyph - pGlyph->info.y;
|
||||
rect->width = pGlyph->info.width;
|
||||
rect->height = pGlyph->info.height;
|
||||
|
||||
buffer->count++;
|
||||
|
||||
return ExaGlyphSuccess;
|
||||
}
|
||||
|
||||
#undef CACHE_X
|
||||
#undef CACHE_Y
|
||||
|
||||
static ExaGlyphCacheResult
|
||||
exaBufferGlyph(ScreenPtr pScreen,
|
||||
ExaGlyphBufferPtr buffer,
|
||||
GlyphPtr pGlyph,
|
||||
int xGlyph,
|
||||
int yGlyph)
|
||||
{
|
||||
ExaScreenPriv(pScreen);
|
||||
unsigned int format = (GlyphPicture(pGlyph)[pScreen->myNum])->format;
|
||||
int width = pGlyph->info.width;
|
||||
int height = pGlyph->info.height;
|
||||
ExaCompositeRectPtr rect;
|
||||
PicturePtr source;
|
||||
int i;
|
||||
|
||||
if (buffer->count == GLYPH_BUFFER_SIZE)
|
||||
return ExaGlyphNeedFlush;
|
||||
|
||||
if (PICT_FORMAT_BPP(format) == 1)
|
||||
format = PICT_a8;
|
||||
|
||||
for (i = 0; i < EXA_NUM_GLYPH_CACHES; i++) {
|
||||
ExaGlyphCachePtr cache = &pExaScr->glyphCaches[i];
|
||||
|
||||
if (format == cache->format &&
|
||||
width <= cache->glyphWidth &&
|
||||
height <= cache->glyphHeight) {
|
||||
ExaGlyphCacheResult result = exaGlyphCacheBufferGlyph(pScreen, &pExaScr->glyphCaches[i],
|
||||
buffer,
|
||||
pGlyph, xGlyph, yGlyph);
|
||||
switch (result) {
|
||||
case ExaGlyphFail:
|
||||
break;
|
||||
case ExaGlyphSuccess:
|
||||
case ExaGlyphNeedFlush:
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Couldn't find the glyph in the cache, use the glyph picture directly */
|
||||
|
||||
source = GlyphPicture(pGlyph)[pScreen->myNum];
|
||||
if (buffer->source && buffer->source != source)
|
||||
return ExaGlyphNeedFlush;
|
||||
|
||||
buffer->source = source;
|
||||
|
||||
rect = &buffer->rects[buffer->count];
|
||||
rect->xSrc = 0;
|
||||
rect->ySrc = 0;
|
||||
rect->xDst = xGlyph - pGlyph->info.x;
|
||||
rect->yDst = yGlyph - pGlyph->info.y;
|
||||
rect->width = pGlyph->info.width;
|
||||
rect->height = pGlyph->info.height;
|
||||
|
||||
buffer->count++;
|
||||
|
||||
return ExaGlyphSuccess;
|
||||
}
|
||||
|
||||
static void
|
||||
exaGlyphsToMask(PicturePtr pMask,
|
||||
ExaGlyphBufferPtr buffer)
|
||||
{
|
||||
exaCompositeRects(PictOpAdd, buffer->source, pMask,
|
||||
buffer->count, buffer->rects);
|
||||
|
||||
buffer->count = 0;
|
||||
buffer->source = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
exaGlyphsToDst(CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pDst,
|
||||
ExaGlyphBufferPtr buffer,
|
||||
INT16 xSrc,
|
||||
INT16 ySrc,
|
||||
INT16 xDst,
|
||||
INT16 yDst)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < buffer->count; i++) {
|
||||
ExaCompositeRectPtr rect = &buffer->rects[i];
|
||||
|
||||
CompositePicture (op,
|
||||
pSrc,
|
||||
buffer->source,
|
||||
pDst,
|
||||
xSrc + rect->xDst - xDst,
|
||||
ySrc + rect->yDst - yDst,
|
||||
rect->xSrc,
|
||||
rect->ySrc,
|
||||
rect->xDst,
|
||||
rect->yDst,
|
||||
rect->width,
|
||||
rect->height);
|
||||
}
|
||||
|
||||
buffer->count = 0;
|
||||
buffer->source = NULL;
|
||||
}
|
||||
|
||||
/* Cut and paste from render/glyph.c - probably should export it instead */
|
||||
static void
|
||||
GlyphExtents (int nlist,
|
||||
GlyphListPtr list,
|
||||
GlyphPtr *glyphs,
|
||||
BoxPtr extents)
|
||||
{
|
||||
int x1, x2, y1, y2;
|
||||
int n;
|
||||
GlyphPtr glyph;
|
||||
int x, y;
|
||||
|
||||
x = 0;
|
||||
y = 0;
|
||||
extents->x1 = MAXSHORT;
|
||||
extents->x2 = MINSHORT;
|
||||
extents->y1 = MAXSHORT;
|
||||
extents->y2 = MINSHORT;
|
||||
while (nlist--)
|
||||
{
|
||||
x += list->xOff;
|
||||
y += list->yOff;
|
||||
n = list->len;
|
||||
list++;
|
||||
while (n--)
|
||||
{
|
||||
glyph = *glyphs++;
|
||||
x1 = x - glyph->info.x;
|
||||
if (x1 < MINSHORT)
|
||||
x1 = MINSHORT;
|
||||
y1 = y - glyph->info.y;
|
||||
if (y1 < MINSHORT)
|
||||
y1 = MINSHORT;
|
||||
x2 = x1 + glyph->info.width;
|
||||
if (x2 > MAXSHORT)
|
||||
x2 = MAXSHORT;
|
||||
y2 = y1 + glyph->info.height;
|
||||
if (y2 > MAXSHORT)
|
||||
y2 = MAXSHORT;
|
||||
if (x1 < extents->x1)
|
||||
extents->x1 = x1;
|
||||
if (x2 > extents->x2)
|
||||
extents->x2 = x2;
|
||||
if (y1 < extents->y1)
|
||||
extents->y1 = y1;
|
||||
if (y2 > extents->y2)
|
||||
extents->y2 = y2;
|
||||
x += glyph->info.xOff;
|
||||
y += glyph->info.yOff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the glyphs in the lists intersect. Only checks based on
|
||||
* bounding box, which appears to be good enough to catch most cases at least.
|
||||
*/
|
||||
static Bool
|
||||
exaGlyphsIntersect(int nlist, GlyphListPtr list, GlyphPtr *glyphs)
|
||||
{
|
||||
int x1, x2, y1, y2;
|
||||
int n;
|
||||
GlyphPtr glyph;
|
||||
int x, y;
|
||||
BoxRec extents;
|
||||
Bool first = TRUE;
|
||||
|
||||
x = 0;
|
||||
y = 0;
|
||||
while (nlist--) {
|
||||
x += list->xOff;
|
||||
y += list->yOff;
|
||||
n = list->len;
|
||||
list++;
|
||||
while (n--) {
|
||||
glyph = *glyphs++;
|
||||
|
||||
if (glyph->info.width == 0 || glyph->info.height == 0) {
|
||||
x += glyph->info.xOff;
|
||||
y += glyph->info.yOff;
|
||||
continue;
|
||||
}
|
||||
|
||||
x1 = x - glyph->info.x;
|
||||
if (x1 < MINSHORT)
|
||||
x1 = MINSHORT;
|
||||
y1 = y - glyph->info.y;
|
||||
if (y1 < MINSHORT)
|
||||
y1 = MINSHORT;
|
||||
x2 = x1 + glyph->info.width;
|
||||
if (x2 > MAXSHORT)
|
||||
x2 = MAXSHORT;
|
||||
y2 = y1 + glyph->info.height;
|
||||
if (y2 > MAXSHORT)
|
||||
y2 = MAXSHORT;
|
||||
|
||||
if (first) {
|
||||
extents.x1 = x1;
|
||||
extents.y1 = y1;
|
||||
extents.x2 = x2;
|
||||
extents.y2 = y2;
|
||||
first = FALSE;
|
||||
} else {
|
||||
if (x1 < extents.x2 && x2 > extents.x1 &&
|
||||
y1 < extents.y2 && y2 > extents.y1)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (x1 < extents.x1)
|
||||
extents.x1 = x1;
|
||||
if (x2 > extents.x2)
|
||||
extents.x2 = x2;
|
||||
if (y1 < extents.y1)
|
||||
extents.y1 = y1;
|
||||
if (y2 > extents.y2)
|
||||
extents.y2 = y2;
|
||||
}
|
||||
x += glyph->info.xOff;
|
||||
y += glyph->info.yOff;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
|
||||
|
||||
void
|
||||
exaGlyphs (CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pDst,
|
||||
PictFormatPtr maskFormat,
|
||||
INT16 xSrc,
|
||||
INT16 ySrc,
|
||||
int nlist,
|
||||
GlyphListPtr list,
|
||||
GlyphPtr *glyphs)
|
||||
{
|
||||
PicturePtr pPicture;
|
||||
PixmapPtr pMaskPixmap = 0;
|
||||
PicturePtr pMask;
|
||||
ScreenPtr pScreen = pDst->pDrawable->pScreen;
|
||||
int width = 0, height = 0;
|
||||
int x, y;
|
||||
int xDst = list->xOff, yDst = list->yOff;
|
||||
int n;
|
||||
GlyphPtr glyph;
|
||||
int error;
|
||||
BoxRec extents = {0, 0, 0, 0};
|
||||
CARD32 component_alpha;
|
||||
ExaGlyphBuffer buffer;
|
||||
|
||||
/* If we don't have a mask format but all the glyphs have the same format
|
||||
* and don't intersect, use the glyph format as mask format for the full
|
||||
* benefits of the glyph cache.
|
||||
*/
|
||||
if (!maskFormat) {
|
||||
Bool sameFormat = TRUE;
|
||||
int i;
|
||||
|
||||
maskFormat = list[0].format;
|
||||
|
||||
for (i = 0; i < nlist; i++) {
|
||||
if (maskFormat->format != list[i].format->format) {
|
||||
sameFormat = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!sameFormat || (maskFormat->depth != 1 &&
|
||||
exaGlyphsIntersect(nlist, list, glyphs))) {
|
||||
maskFormat = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (maskFormat)
|
||||
{
|
||||
GCPtr pGC;
|
||||
xRectangle rect;
|
||||
|
||||
GlyphExtents (nlist, list, glyphs, &extents);
|
||||
|
||||
if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
|
||||
return;
|
||||
width = extents.x2 - extents.x1;
|
||||
height = extents.y2 - extents.y1;
|
||||
|
||||
if (maskFormat->depth == 1) {
|
||||
PictFormatPtr a8Format = PictureMatchFormat (pScreen, 8, PICT_a8);
|
||||
|
||||
if (a8Format)
|
||||
maskFormat = a8Format;
|
||||
}
|
||||
|
||||
pMaskPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
|
||||
maskFormat->depth,
|
||||
CREATE_PIXMAP_USAGE_SCRATCH);
|
||||
if (!pMaskPixmap)
|
||||
return;
|
||||
component_alpha = NeedsComponent(maskFormat->format);
|
||||
pMask = CreatePicture (0, &pMaskPixmap->drawable,
|
||||
maskFormat, CPComponentAlpha, &component_alpha,
|
||||
serverClient, &error);
|
||||
if (!pMask)
|
||||
{
|
||||
(*pScreen->DestroyPixmap) (pMaskPixmap);
|
||||
return;
|
||||
}
|
||||
pGC = GetScratchGC (pMaskPixmap->drawable.depth, pScreen);
|
||||
ValidateGC (&pMaskPixmap->drawable, pGC);
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.width = width;
|
||||
rect.height = height;
|
||||
(*pGC->ops->PolyFillRect) (&pMaskPixmap->drawable, pGC, 1, &rect);
|
||||
FreeScratchGC (pGC);
|
||||
x = -extents.x1;
|
||||
y = -extents.y1;
|
||||
}
|
||||
else
|
||||
{
|
||||
pMask = pDst;
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
buffer.count = 0;
|
||||
buffer.source = NULL;
|
||||
while (nlist--)
|
||||
{
|
||||
x += list->xOff;
|
||||
y += list->yOff;
|
||||
n = list->len;
|
||||
while (n--)
|
||||
{
|
||||
glyph = *glyphs++;
|
||||
pPicture = GlyphPicture (glyph)[pScreen->myNum];
|
||||
|
||||
if (glyph->info.width > 0 && glyph->info.height > 0 &&
|
||||
exaBufferGlyph(pScreen, &buffer, glyph, x, y) == ExaGlyphNeedFlush)
|
||||
{
|
||||
if (maskFormat)
|
||||
exaGlyphsToMask(pMask, &buffer);
|
||||
else
|
||||
exaGlyphsToDst(op, pSrc, pDst, &buffer,
|
||||
xSrc, ySrc, xDst, yDst);
|
||||
|
||||
exaBufferGlyph(pScreen, &buffer, glyph, x, y);
|
||||
}
|
||||
|
||||
x += glyph->info.xOff;
|
||||
y += glyph->info.yOff;
|
||||
}
|
||||
list++;
|
||||
}
|
||||
|
||||
if (maskFormat)
|
||||
exaGlyphsToMask(pMask, &buffer);
|
||||
else
|
||||
exaGlyphsToDst(op, pSrc, pDst, &buffer,
|
||||
xSrc, ySrc, xDst, yDst);
|
||||
|
||||
if (maskFormat)
|
||||
{
|
||||
x = extents.x1;
|
||||
y = extents.y1;
|
||||
CompositePicture (op,
|
||||
pSrc,
|
||||
pMask,
|
||||
pDst,
|
||||
xSrc + x - xDst,
|
||||
ySrc + y - yDst,
|
||||
0, 0,
|
||||
x, y,
|
||||
width, height);
|
||||
FreePicture ((pointer) pMask, (XID) 0);
|
||||
(*pScreen->DestroyPixmap) (pMaskPixmap);
|
||||
}
|
||||
}
|
|
@ -61,6 +61,7 @@
|
|||
#define DEBUG_MIGRATE 0
|
||||
#define DEBUG_PIXMAP 0
|
||||
#define DEBUG_OFFSCREEN 0
|
||||
#define DEBUG_GLYPH_CACHE 0
|
||||
|
||||
#if DEBUG_TRACE_FALL
|
||||
#define EXA_FALLBACK(x) \
|
||||
|
@ -95,6 +96,38 @@ enum ExaMigrationHeuristic {
|
|||
ExaMigrationSmart
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned char sha1[20];
|
||||
} ExaCachedGlyphRec, *ExaCachedGlyphPtr;
|
||||
|
||||
typedef struct {
|
||||
/* The identity of the cache, statically configured at initialization */
|
||||
unsigned int format;
|
||||
int glyphWidth;
|
||||
int glyphHeight;
|
||||
|
||||
int size; /* Size of cache; eventually this should be dynamically determined */
|
||||
|
||||
/* Hash table mapping from glyph sha1 to position in the glyph; we use
|
||||
* open addressing with a hash table size determined based on size and large
|
||||
* enough so that we always have a good amount of free space, so we can
|
||||
* use linear probing. (Linear probing is preferrable to double hashing
|
||||
* here because it allows us to easily remove entries.)
|
||||
*/
|
||||
int *hashEntries;
|
||||
int hashSize;
|
||||
|
||||
ExaCachedGlyphPtr glyphs;
|
||||
int glyphCount; /* Current number of glyphs */
|
||||
|
||||
PicturePtr picture; /* Where the glyphs of the cache are stored */
|
||||
int yOffset; /* y location within the picture where the cache starts */
|
||||
int columns; /* Number of columns the glyphs are layed out in */
|
||||
int evictionPosition; /* Next random position to evict a glyph */
|
||||
} ExaGlyphCacheRec, *ExaGlyphCachePtr;
|
||||
|
||||
#define EXA_NUM_GLYPH_CACHES 4
|
||||
|
||||
typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
|
||||
typedef struct {
|
||||
ExaDriverPtr info;
|
||||
|
@ -122,6 +155,8 @@ typedef struct {
|
|||
unsigned disableFbCount;
|
||||
Bool optimize_migration;
|
||||
unsigned offScreenCounter;
|
||||
|
||||
ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
|
||||
} ExaScreenPrivRec, *ExaScreenPrivPtr;
|
||||
|
||||
/*
|
||||
|
@ -209,6 +244,15 @@ typedef struct _ExaMigrationRec {
|
|||
RegionPtr pReg;
|
||||
} ExaMigrationRec, *ExaMigrationPtr;
|
||||
|
||||
typedef struct {
|
||||
INT16 xSrc;
|
||||
INT16 ySrc;
|
||||
INT16 xDst;
|
||||
INT16 yDst;
|
||||
INT16 width;
|
||||
INT16 height;
|
||||
} ExaCompositeRectRec, *ExaCompositeRectPtr;
|
||||
|
||||
/**
|
||||
* exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
|
||||
* to set EXA options or hook in screen functions to handle using EXA as the AA.
|
||||
|
@ -422,6 +466,13 @@ exaComposite(CARD8 op,
|
|||
CARD16 width,
|
||||
CARD16 height);
|
||||
|
||||
void
|
||||
exaCompositeRects(CARD8 op,
|
||||
PicturePtr Src,
|
||||
PicturePtr pDst,
|
||||
int nrect,
|
||||
ExaCompositeRectPtr rects);
|
||||
|
||||
void
|
||||
exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
||||
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
|
||||
|
@ -432,6 +483,13 @@ exaTriangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
|
|||
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
|
||||
int ntri, xTriangle *tris);
|
||||
|
||||
/* exa_glyph.c */
|
||||
void
|
||||
exaGlyphsInit(ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
exaGlyphsFini (ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
exaGlyphs (CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
|
|
225
exa/exa_render.c
225
exa/exa_render.c
|
@ -331,6 +331,231 @@ exaTryDriverSolidFill(PicturePtr pSrc,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
exaTryDriverCompositeRects(CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pDst,
|
||||
int nrect,
|
||||
ExaCompositeRectPtr rects)
|
||||
{
|
||||
ExaScreenPriv (pDst->pDrawable->pScreen);
|
||||
int src_off_x, src_off_y, dst_off_x, dst_off_y;
|
||||
PixmapPtr pSrcPix, pDstPix;
|
||||
ExaPixmapPrivPtr pSrcExaPix, pDstExaPix;
|
||||
struct _Pixmap scratch;
|
||||
ExaMigrationRec pixmaps[2];
|
||||
|
||||
if (!pExaScr->info->PrepareComposite)
|
||||
return -1;
|
||||
|
||||
pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable);
|
||||
pSrcExaPix = ExaGetPixmapPriv(pSrcPix);
|
||||
|
||||
pDstPix = exaGetDrawablePixmap(pDst->pDrawable);
|
||||
pDstExaPix = ExaGetPixmapPriv(pDstPix);
|
||||
|
||||
/* Check whether the accelerator can use these pixmaps.
|
||||
* FIXME: If it cannot, use temporary pixmaps so that the drawing
|
||||
* happens within limits.
|
||||
*/
|
||||
if (pSrcExaPix->accel_blocked ||
|
||||
pDstExaPix->accel_blocked)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pExaScr->info->CheckComposite &&
|
||||
!(*pExaScr->info->CheckComposite) (op, pSrc, NULL, pDst))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
exaGetDrawableDeltas (pDst->pDrawable, pDstPix, &dst_off_x, &dst_off_y);
|
||||
|
||||
pixmaps[0].as_dst = TRUE;
|
||||
pixmaps[0].as_src = exaOpReadsDestination(op);
|
||||
pixmaps[0].pPix = pDstPix;
|
||||
pixmaps[0].pReg = NULL;
|
||||
pixmaps[1].as_dst = FALSE;
|
||||
pixmaps[1].as_src = TRUE;
|
||||
pixmaps[1].pPix = pSrcPix;
|
||||
pixmaps[1].pReg = NULL;
|
||||
exaDoMigration(pixmaps, 2, TRUE);
|
||||
|
||||
pSrcPix = exaGetOffscreenPixmap (pSrc->pDrawable, &src_off_x, &src_off_y);
|
||||
if (!exaPixmapIsOffscreen(pDstPix))
|
||||
return 0;
|
||||
|
||||
if (!pSrcPix && pExaScr->info->UploadToScratch)
|
||||
{
|
||||
pSrcPix = exaGetDrawablePixmap (pSrc->pDrawable);
|
||||
if ((*pExaScr->info->UploadToScratch) (pSrcPix, &scratch))
|
||||
pSrcPix = &scratch;
|
||||
}
|
||||
|
||||
if (!pSrcPix)
|
||||
return 0;
|
||||
|
||||
if (!(*pExaScr->info->PrepareComposite) (op, pSrc, NULL, pDst, pSrcPix,
|
||||
NULL, pDstPix))
|
||||
return -1;
|
||||
|
||||
while (nrect--)
|
||||
{
|
||||
INT16 xDst = rects->xDst + pDst->pDrawable->x;
|
||||
INT16 yDst = rects->yDst + pDst->pDrawable->y;
|
||||
INT16 xSrc = rects->xSrc + pSrc->pDrawable->x;
|
||||
INT16 ySrc = rects->ySrc + pSrc->pDrawable->y;
|
||||
|
||||
RegionRec region;
|
||||
BoxPtr pbox;
|
||||
int nbox;
|
||||
|
||||
if (!miComputeCompositeRegion (®ion, pSrc, NULL, pDst,
|
||||
xSrc, ySrc, 0, 0, xDst, yDst,
|
||||
rects->width, rects->height))
|
||||
goto next_rect;
|
||||
|
||||
REGION_TRANSLATE(pScreen, ®ion, dst_off_x, dst_off_y);
|
||||
|
||||
nbox = REGION_NUM_RECTS(®ion);
|
||||
pbox = REGION_RECTS(®ion);
|
||||
|
||||
xSrc = xSrc + src_off_x - xDst - dst_off_x;
|
||||
ySrc = ySrc + src_off_y - yDst - dst_off_y;
|
||||
|
||||
while (nbox--)
|
||||
{
|
||||
(*pExaScr->info->Composite) (pDstPix,
|
||||
pbox->x1 + xSrc,
|
||||
pbox->y1 + ySrc,
|
||||
0, 0,
|
||||
pbox->x1,
|
||||
pbox->y1,
|
||||
pbox->x2 - pbox->x1,
|
||||
pbox->y2 - pbox->y1);
|
||||
pbox++;
|
||||
}
|
||||
|
||||
next_rect:
|
||||
REGION_UNINIT(pDst->pDrawable->pScreen, ®ion);
|
||||
|
||||
rects++;
|
||||
}
|
||||
|
||||
(*pExaScr->info->DoneComposite) (pDstPix);
|
||||
exaMarkSync(pDst->pDrawable->pScreen);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a number of rectangles from source to destination in a single
|
||||
* operation. This is specialized for building a glyph mask: we don'y
|
||||
* have a mask argument because we don't need it for that, and we
|
||||
* don't have he special-case fallbacks found in exaComposite() - if the
|
||||
* driver can support it, we use the driver functionality, otherwise we
|
||||
* fallback straight to software.
|
||||
*/
|
||||
void
|
||||
exaCompositeRects(CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pDst,
|
||||
int nrect,
|
||||
ExaCompositeRectPtr rects)
|
||||
{
|
||||
PixmapPtr pPixmap = exaGetDrawablePixmap(pDst->pDrawable);
|
||||
ExaPixmapPriv(pPixmap);
|
||||
|
||||
int xoff, yoff;
|
||||
int x1 = MAXSHORT;
|
||||
int y1 = MAXSHORT;
|
||||
int x2 = MINSHORT;
|
||||
int y2 = MINSHORT;
|
||||
RegionRec region;
|
||||
RegionPtr pending_damage;
|
||||
BoxRec box;
|
||||
int n;
|
||||
ExaCompositeRectPtr r;
|
||||
|
||||
/* We have to manage the damage ourselves, since CompositeRects isn't
|
||||
* something in the screen that can be managed by the damage extension,
|
||||
* and EXA depends on damage to track what needs to be migrated between
|
||||
* offscreen and onscreen.
|
||||
*/
|
||||
|
||||
/* Compute the overall extents of the composited region - we're making
|
||||
* the assumption here that we are compositing a bunch of glyphs that
|
||||
* cluster closely together and damaging each glyph individually would
|
||||
* be a loss compared to damaging the bounding box.
|
||||
*/
|
||||
n = nrect;
|
||||
r = rects;
|
||||
while (n--) {
|
||||
int rect_x2 = r->xDst + r->width;
|
||||
int rect_y2 = r->yDst + r->width;
|
||||
|
||||
if (r->xDst < x1) x1 = r->xDst;
|
||||
if (r->xDst < y1) y1 = r->xDst;
|
||||
if (rect_x2 > x2) x2 = rect_x2;
|
||||
if (rect_y2 > y2) y2 = rect_y2;
|
||||
|
||||
r++;
|
||||
}
|
||||
|
||||
if (x2 <= x1 && y2 <= y1)
|
||||
return;
|
||||
|
||||
box.x1 = x1;
|
||||
box.x2 = x2 < MAXSHORT ? x2 : MAXSHORT;
|
||||
box.y1 = y1;
|
||||
box.y2 = y2 < MAXSHORT ? y2 : MAXSHORT;
|
||||
|
||||
/* The pixmap migration code relies on pendingDamage indicating
|
||||
* the bounds of the current rendering, so we need to force
|
||||
* the actual damage into that region before we do anything, and
|
||||
* (see use of DamagePendingRegion in exaCopyDirty)
|
||||
*/
|
||||
|
||||
REGION_INIT(pScreen, ®ion, &box, 1);
|
||||
|
||||
exaGetDrawableDeltas(pDst->pDrawable, pPixmap, &xoff, &yoff);
|
||||
|
||||
REGION_TRANSLATE(pScreen, ®ion, xoff, yoff);
|
||||
pending_damage = DamagePendingRegion(pExaPixmap->pDamage);
|
||||
REGION_UNION(pScreen, pending_damage, pending_damage, ®ion);
|
||||
REGION_TRANSLATE(pScreen, ®ion, -xoff, -yoff);
|
||||
|
||||
/************************************************************/
|
||||
|
||||
ValidatePicture (pSrc);
|
||||
ValidatePicture (pDst);
|
||||
|
||||
if (exaTryDriverCompositeRects(op, pSrc, pDst, nrect, rects) != 1) {
|
||||
n = nrect;
|
||||
r = rects;
|
||||
while (n--) {
|
||||
ExaCheckComposite (op, pSrc, NULL, pDst,
|
||||
r->xSrc, r->ySrc,
|
||||
0, 0,
|
||||
r->xDst, r->yDst,
|
||||
r->width, r->height);
|
||||
r++;
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************/
|
||||
|
||||
/* Now we have to flush the damage out from pendingDamage => damage
|
||||
* Calling DamageDamageRegion has that effect. (We could pass
|
||||
* in an empty region here, but we pass in the same region we
|
||||
* use above; the effect is the same.)
|
||||
*/
|
||||
|
||||
DamageDamageRegion(pDst->pDrawable, ®ion);
|
||||
REGION_UNINIT(pScreen, ®ion);
|
||||
}
|
||||
|
||||
static int
|
||||
exaTryDriverComposite(CARD8 op,
|
||||
PicturePtr pSrc,
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
if KDRIVEVESA
|
||||
VESA_SUBDIRS = vesa ati chips epson i810 mach64 mga nvidia pm2 r128 \
|
||||
VESA_SUBDIRS = vesa ati chips i810 mach64 mga nvidia pm2 r128 \
|
||||
smi via
|
||||
endif
|
||||
|
||||
if BUILD_KDRIVEFBDEVLIB
|
||||
FBDEV_SUBDIRS = fbdev
|
||||
FBDEV_SUBDIRS = fbdev epson
|
||||
endif
|
||||
|
||||
if XFAKESERVER
|
||||
|
|
|
@ -58,6 +58,10 @@ ATI_LIBS = \
|
|||
$(DRI_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xati_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xati_LDADD = \
|
||||
$(ATI_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -20,6 +20,10 @@ CHIPS_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xchips_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xchips_LDADD = \
|
||||
$(CHIPS_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -1,517 +0,0 @@
|
|||
/*
|
||||
* Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* (C) Copyright IBM Corporation 2004
|
||||
* 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
|
||||
* on 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
|
||||
* THE COPYRIGHT HOLDERS AND/OR THEIR 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file dri_interface.h
|
||||
*
|
||||
* This file contains all the types and functions that define the interface
|
||||
* between a DRI driver and driver loader. Currently, the most common driver
|
||||
* loader is the XFree86 libGL.so. However, other loaders do exist, and in
|
||||
* the future the server-side libglx.a will also be a loader.
|
||||
*
|
||||
* \author Kevin E. Martin <kevin@precisioninsight.com>
|
||||
* \author Ian Romanick <idr@us.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef DRI_INTERFACE_H
|
||||
#define DRI_INTERFACE_H
|
||||
|
||||
#include <GL/internal/glcore.h>
|
||||
#include <drm.h>
|
||||
|
||||
/**
|
||||
* \name DRI interface structures
|
||||
*
|
||||
* The following structures define the interface between the GLX client
|
||||
* side library and the DRI (direct rendering infrastructure).
|
||||
*/
|
||||
/*@{*/
|
||||
typedef struct __DRIdisplayRec __DRIdisplay;
|
||||
typedef struct __DRIscreenRec __DRIscreen;
|
||||
typedef struct __DRIcontextRec __DRIcontext;
|
||||
typedef struct __DRIdrawableRec __DRIdrawable;
|
||||
typedef struct __DRIdriverRec __DRIdriver;
|
||||
typedef struct __DRIframebufferRec __DRIframebuffer;
|
||||
typedef struct __DRIversionRec __DRIversion;
|
||||
typedef struct __DRIinterfaceMethodsRec __DRIinterfaceMethods;
|
||||
typedef unsigned long __DRIid;
|
||||
typedef void __DRInativeDisplay;
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* \name Functions provided by the driver loader.
|
||||
*/
|
||||
/*@{*/
|
||||
/**
|
||||
* Type of a pointer to \c glXGetScreenDriver, as returned by
|
||||
* \c glXGetProcAddress. This function is used to get the name of the DRI
|
||||
* driver for the specified screen of the specified display. The driver
|
||||
* name is typically used with \c glXGetDriverConfig.
|
||||
*
|
||||
* \sa glXGetScreenDriver, glXGetProcAddress, glXGetDriverConfig
|
||||
*/
|
||||
typedef const char * (* PFNGLXGETSCREENDRIVERPROC) (__DRInativeDisplay *dpy, int scrNum);
|
||||
|
||||
/**
|
||||
* Type of a pointer to \c glXGetDriverConfig, as returned by
|
||||
* \c glXGetProcAddress. This function is used to get the XML document
|
||||
* describing the configuration options available for the specified driver.
|
||||
*
|
||||
* \sa glXGetDriverConfig, glXGetProcAddress, glXGetScreenDriver
|
||||
*/
|
||||
typedef const char * (* PFNGLXGETDRIVERCONFIGPROC) (const char *driverName);
|
||||
|
||||
/**
|
||||
* Type of a pointer to \c glxEnableExtension, as returned by
|
||||
* \c __DRIinterfaceMethods::getProcAddress. This function is used to enable
|
||||
* a GLX extension on the specified screen.
|
||||
*/
|
||||
typedef void (* PFNGLXSCRENABLEEXTENSIONPROC) ( void *psc, const char * name );
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* \name Functions and data provided by the driver.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
typedef void *(CREATENEWSCREENFUNC)(__DRInativeDisplay *dpy, int scrn,
|
||||
__DRIscreen *psc, const __GLcontextModes * modes,
|
||||
const __DRIversion * ddx_version, const __DRIversion * dri_version,
|
||||
const __DRIversion * drm_version, const __DRIframebuffer * frame_buffer,
|
||||
void * pSAREA, int fd, int internal_api_version,
|
||||
const __DRIinterfaceMethods * interface,
|
||||
__GLcontextModes ** driver_modes);
|
||||
typedef CREATENEWSCREENFUNC* PFNCREATENEWSCREENFUNC;
|
||||
extern CREATENEWSCREENFUNC __driCreateNewScreen_20050727;
|
||||
|
||||
|
||||
/**
|
||||
* XML document describing the configuration options supported by the
|
||||
* driver.
|
||||
*/
|
||||
extern const char __driConfigOptions[];
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* Stored version of some component (i.e., server-side DRI module, kernel-side
|
||||
* DRM, etc.).
|
||||
*
|
||||
* \todo
|
||||
* There are several data structures that explicitly store a major version,
|
||||
* minor version, and patch level. These structures should be modified to
|
||||
* have a \c __DRIversionRec instead.
|
||||
*/
|
||||
struct __DRIversionRec {
|
||||
int major; /**< Major version number. */
|
||||
int minor; /**< Minor version number. */
|
||||
int patch; /**< Patch-level. */
|
||||
};
|
||||
|
||||
|
||||
typedef void (*__DRIfuncPtr)(void);
|
||||
|
||||
struct __DRIinterfaceMethodsRec {
|
||||
/**
|
||||
* Get pointer to named function.
|
||||
*/
|
||||
__DRIfuncPtr (*getProcAddress)( const char * proc_name );
|
||||
|
||||
/**
|
||||
* Create a list of \c __GLcontextModes structures.
|
||||
*/
|
||||
__GLcontextModes * (*createContextModes)(unsigned count,
|
||||
size_t minimum_bytes_per_struct);
|
||||
|
||||
/**
|
||||
* Destroy a list of \c __GLcontextModes structures.
|
||||
*
|
||||
* \todo
|
||||
* Determine if the drivers actually need to call this.
|
||||
*/
|
||||
void (*destroyContextModes)( __GLcontextModes * modes );
|
||||
|
||||
/**
|
||||
* Get the \c __DRIscreen for a given display and screen number.
|
||||
*/
|
||||
__DRIscreen *(*getScreen)(__DRInativeDisplay *dpy, int screenNum);
|
||||
|
||||
|
||||
/**
|
||||
* \name Client/server protocol functions.
|
||||
*
|
||||
* These functions implement the DRI client/server protocol for
|
||||
* context and drawable operations. Platforms that do not implement
|
||||
* the wire protocol (e.g., EGL) will implement glorified no-op functions.
|
||||
*/
|
||||
/*@{*/
|
||||
/**
|
||||
* Determine if the specified window ID still exists.
|
||||
*
|
||||
* \note
|
||||
* Implementations may assume that the driver will only pass an ID into
|
||||
* this function that actually corresponds to a window. On
|
||||
* implementations where windows can only be destroyed by the DRI driver
|
||||
* (e.g., EGL), this function is allowed to always return \c GL_TRUE.
|
||||
*/
|
||||
GLboolean (*windowExists)(__DRInativeDisplay *dpy, __DRIid draw);
|
||||
|
||||
/**
|
||||
* Create the server-side portion of the GL context.
|
||||
*/
|
||||
GLboolean (* createContext)( __DRInativeDisplay *dpy, int screenNum,
|
||||
int configID, void * contextID, drm_context_t * hw_context );
|
||||
|
||||
/**
|
||||
* Destroy the server-side portion of the GL context.
|
||||
*/
|
||||
GLboolean (* destroyContext)( __DRInativeDisplay *dpy, int screenNum,
|
||||
__DRIid context );
|
||||
|
||||
/**
|
||||
* Create the server-side portion of the drawable.
|
||||
*/
|
||||
GLboolean (*createDrawable)( __DRInativeDisplay * ndpy, int screen,
|
||||
__DRIid drawable, drm_drawable_t * hHWDrawable );
|
||||
|
||||
/**
|
||||
* Destroy the server-side portion of the drawable.
|
||||
*/
|
||||
GLboolean (*destroyDrawable)( __DRInativeDisplay * ndpy, int screen,
|
||||
__DRIid drawable );
|
||||
|
||||
/**
|
||||
* This function is used to get information about the position, size, and
|
||||
* clip rects of a drawable.
|
||||
*/
|
||||
GLboolean (* getDrawableInfo) ( __DRInativeDisplay *dpy, int scrn,
|
||||
__DRIid draw, unsigned int * index, unsigned int * stamp,
|
||||
int * x, int * y, int * width, int * height,
|
||||
int * numClipRects, drm_clip_rect_t ** pClipRects,
|
||||
int * backX, int * backY,
|
||||
int * numBackClipRects, drm_clip_rect_t ** pBackClipRects );
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* \name Timing related functions.
|
||||
*/
|
||||
/*@{*/
|
||||
/**
|
||||
* Get the 64-bit unadjusted system time (UST).
|
||||
*/
|
||||
int (*getUST)(int64_t * ust);
|
||||
|
||||
/**
|
||||
* Get the media stream counter (MSC) rate.
|
||||
*
|
||||
* Matching the definition in GLX_OML_sync_control, this function returns
|
||||
* the rate of the "media stream counter". In practical terms, this is
|
||||
* the frame refresh rate of the display.
|
||||
*/
|
||||
GLboolean (*getMSCRate)(__DRInativeDisplay * dpy, __DRIid drawable,
|
||||
int32_t * numerator, int32_t * denominator);
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Reports areas of the given drawable which have been modified by the
|
||||
* driver.
|
||||
*
|
||||
* \param drawable which the drawing was done to.
|
||||
* \param rects rectangles affected, with the drawable origin as the
|
||||
* origin.
|
||||
* \param x X offset of the drawable within the screen (used in the
|
||||
* front_buffer case)
|
||||
* \param y Y offset of the drawable within the screen.
|
||||
* \param front_buffer boolean flag for whether the drawing to the
|
||||
* drawable was actually done directly to the front buffer (instead
|
||||
* of backing storage, for example)
|
||||
*/
|
||||
void (*reportDamage)(__DRInativeDisplay * dpy, int screen,
|
||||
__DRIid drawable,
|
||||
int x, int y,
|
||||
drm_clip_rect_t *rects, int num_rects,
|
||||
int front_buffer);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Framebuffer information record. Used by libGL to communicate information
|
||||
* about the framebuffer to the driver's \c __driCreateNewScreen function.
|
||||
*
|
||||
* In XFree86, most of this information is derrived from data returned by
|
||||
* calling \c XF86DRIGetDeviceInfo.
|
||||
*
|
||||
* \sa XF86DRIGetDeviceInfo __DRIdisplayRec::createNewScreen
|
||||
* __driUtilCreateNewScreen CallCreateNewScreen
|
||||
*
|
||||
* \bug This structure could be better named.
|
||||
*/
|
||||
struct __DRIframebufferRec {
|
||||
unsigned char *base; /**< Framebuffer base address in the CPU's
|
||||
* address space. This value is calculated by
|
||||
* calling \c drmMap on the framebuffer handle
|
||||
* returned by \c XF86DRIGetDeviceInfo (or a
|
||||
* similar function).
|
||||
*/
|
||||
int size; /**< Framebuffer size, in bytes. */
|
||||
int stride; /**< Number of bytes from one line to the next. */
|
||||
int width; /**< Pixel width of the framebuffer. */
|
||||
int height; /**< Pixel height of the framebuffer. */
|
||||
int dev_priv_size; /**< Size of the driver's dev-priv structure. */
|
||||
void *dev_priv; /**< Pointer to the driver's dev-priv structure. */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Screen dependent methods. This structure is initialized during the
|
||||
* \c __DRIdisplayRec::createScreen call.
|
||||
*/
|
||||
struct __DRIscreenRec {
|
||||
/**
|
||||
* Method to destroy the private DRI screen data.
|
||||
*/
|
||||
void (*destroyScreen)(__DRInativeDisplay *dpy, int scrn, void *screenPrivate);
|
||||
|
||||
/**
|
||||
* Method to create the private DRI drawable data and initialize the
|
||||
* drawable dependent methods.
|
||||
*/
|
||||
void *(*createNewDrawable)(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
|
||||
__DRIid draw, __DRIdrawable *pdraw,
|
||||
int renderType, const int *attrs);
|
||||
|
||||
/**
|
||||
* Method to return a pointer to the DRI drawable data.
|
||||
*/
|
||||
__DRIdrawable *(*getDrawable)(__DRInativeDisplay *dpy, __DRIid draw,
|
||||
void *drawablePrivate);
|
||||
|
||||
/**
|
||||
* Opaque pointer to private per screen direct rendering data. \c NULL
|
||||
* if direct rendering is not supported on this screen. Never
|
||||
* dereferenced in libGL.
|
||||
*/
|
||||
void *private;
|
||||
|
||||
/**
|
||||
* Get the number of vertical refreshes since some point in time before
|
||||
* this function was first called (i.e., system start up).
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*getMSC)( void *screenPrivate, int64_t *msc );
|
||||
|
||||
/**
|
||||
* Opaque pointer that points back to the containing
|
||||
* \c __GLXscreenConfigs. This data structure is shared with DRI drivers
|
||||
* but \c __GLXscreenConfigs is not. However, they are needed by some GLX
|
||||
* functions called by DRI drivers.
|
||||
*
|
||||
* \since Internal API version 20030813.
|
||||
*/
|
||||
void *screenConfigs;
|
||||
|
||||
/**
|
||||
* Functions associated with MESA_allocate_memory.
|
||||
*
|
||||
* \since Internal API version 20030815.
|
||||
*/
|
||||
/*@{*/
|
||||
void *(*allocateMemory)(__DRInativeDisplay *dpy, int scrn, GLsizei size,
|
||||
GLfloat readfreq, GLfloat writefreq,
|
||||
GLfloat priority);
|
||||
|
||||
void (*freeMemory)(__DRInativeDisplay *dpy, int scrn, GLvoid *pointer);
|
||||
|
||||
GLuint (*memoryOffset)(__DRInativeDisplay *dpy, int scrn, const GLvoid *pointer);
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Method to create the private DRI context data and initialize the
|
||||
* context dependent methods.
|
||||
*
|
||||
* \since Internal API version 20031201.
|
||||
*/
|
||||
void * (*createNewContext)(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
|
||||
int render_type,
|
||||
void *sharedPrivate, __DRIcontext *pctx);
|
||||
|
||||
/**
|
||||
* Method to override base texture image with a driver specific 'offset'.
|
||||
* The depth passed in allows e.g. to ignore the alpha channel of texture
|
||||
* images where the non-alpha components don't occupy a whole texel.
|
||||
*
|
||||
* For GLX_EXT_texture_from_pixmap with AIGLX.
|
||||
*
|
||||
* \since Internal API version 20070121.
|
||||
*/
|
||||
void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
|
||||
unsigned long long offset, GLint depth, GLuint pitch);
|
||||
};
|
||||
|
||||
/**
|
||||
* Context dependent methods. This structure is initialized during the
|
||||
* \c __DRIscreenRec::createContext call.
|
||||
*/
|
||||
struct __DRIcontextRec {
|
||||
/**
|
||||
* Method to destroy the private DRI context data.
|
||||
*/
|
||||
void (*destroyContext)(__DRInativeDisplay *dpy, int scrn, void *contextPrivate);
|
||||
|
||||
/**
|
||||
* Opaque pointer to private per context direct rendering data.
|
||||
* \c NULL if direct rendering is not supported on the display or
|
||||
* screen used to create this context. Never dereferenced in libGL.
|
||||
*/
|
||||
void *private;
|
||||
|
||||
/**
|
||||
* Pointer to the mode used to create this context.
|
||||
*
|
||||
* \since Internal API version 20040317.
|
||||
*/
|
||||
const __GLcontextModes * mode;
|
||||
|
||||
/**
|
||||
* Method to bind a DRI drawable to a DRI graphics context.
|
||||
*
|
||||
* \since Internal API version 20050727.
|
||||
*/
|
||||
GLboolean (*bindContext)(__DRInativeDisplay *dpy, int scrn, __DRIid draw,
|
||||
__DRIid read, __DRIcontext *ctx);
|
||||
|
||||
/**
|
||||
* Method to unbind a DRI drawable from a DRI graphics context.
|
||||
*
|
||||
* \since Internal API version 20050727.
|
||||
*/
|
||||
GLboolean (*unbindContext)(__DRInativeDisplay *dpy, int scrn, __DRIid draw,
|
||||
__DRIid read, __DRIcontext *ctx);
|
||||
};
|
||||
|
||||
/**
|
||||
* Drawable dependent methods. This structure is initialized during the
|
||||
* \c __DRIscreenRec::createDrawable call. \c createDrawable is not called
|
||||
* by libGL at this time. It's currently used via the dri_util.c utility code
|
||||
* instead.
|
||||
*/
|
||||
struct __DRIdrawableRec {
|
||||
/**
|
||||
* Method to destroy the private DRI drawable data.
|
||||
*/
|
||||
void (*destroyDrawable)(__DRInativeDisplay *dpy, void *drawablePrivate);
|
||||
|
||||
/**
|
||||
* Method to swap the front and back buffers.
|
||||
*/
|
||||
void (*swapBuffers)(__DRInativeDisplay *dpy, void *drawablePrivate);
|
||||
|
||||
/**
|
||||
* Opaque pointer to private per drawable direct rendering data.
|
||||
* \c NULL if direct rendering is not supported on the display or
|
||||
* screen used to create this drawable. Never dereferenced in libGL.
|
||||
*/
|
||||
void *private;
|
||||
|
||||
/**
|
||||
* Get the number of completed swap buffers for this drawable.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*getSBC)(__DRInativeDisplay *dpy, void *drawablePrivate, int64_t *sbc );
|
||||
|
||||
/**
|
||||
* Wait for the SBC to be greater than or equal target_sbc.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*waitForSBC)( __DRInativeDisplay * dpy, void *drawablePriv,
|
||||
int64_t target_sbc,
|
||||
int64_t * msc, int64_t * sbc );
|
||||
|
||||
/**
|
||||
* Wait for the MSC to equal target_msc, or, if that has already passed,
|
||||
* the next time (MSC % divisor) is equal to remainder. If divisor is
|
||||
* zero, the function will return as soon as MSC is greater than or equal
|
||||
* to target_msc.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*waitForMSC)( __DRInativeDisplay * dpy, void *drawablePriv,
|
||||
int64_t target_msc, int64_t divisor, int64_t remainder,
|
||||
int64_t * msc, int64_t * sbc );
|
||||
|
||||
/**
|
||||
* Like \c swapBuffers, but does NOT have an implicit \c glFlush. Once
|
||||
* rendering is complete, waits until MSC is equal to target_msc, or
|
||||
* if that has already passed, waits until (MSC % divisor) is equal
|
||||
* to remainder. If divisor is zero, the swap will happen as soon as
|
||||
* MSC is greater than or equal to target_msc.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int64_t (*swapBuffersMSC)(__DRInativeDisplay *dpy, void *drawablePrivate,
|
||||
int64_t target_msc,
|
||||
int64_t divisor, int64_t remainder);
|
||||
|
||||
/**
|
||||
* Enable or disable frame usage tracking.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*frameTracking)(__DRInativeDisplay *dpy, void *drawablePrivate, GLboolean enable);
|
||||
|
||||
/**
|
||||
* Retrieve frame usage information.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
int (*queryFrameTracking)(__DRInativeDisplay *dpy, void *drawablePrivate,
|
||||
int64_t * sbc, int64_t * missedFrames,
|
||||
float * lastMissedUsage, float * usage );
|
||||
|
||||
/**
|
||||
* Used by drivers that implement the GLX_SGI_swap_control or
|
||||
* GLX_MESA_swap_control extension.
|
||||
*
|
||||
* \since Internal API version 20030317.
|
||||
*/
|
||||
unsigned swap_interval;
|
||||
|
||||
/**
|
||||
* Used by drivers that implement the GLX_MESA_copy_sub_buffer extension.
|
||||
*
|
||||
* \since Internal API version 20060314.
|
||||
*/
|
||||
void (*copySubBuffer)(__DRInativeDisplay *dpy, void *drawablePrivate,
|
||||
int x, int y, int w, int h);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,89 +1,90 @@
|
|||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
@KDRIVE_CFLAGS@ \
|
||||
-I$(srcdir)/../../../exa
|
||||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
@KDRIVE_CFLAGS@ \
|
||||
@XEPHYR_INCS@ \
|
||||
@XEPHYR_CFLAGS@ \
|
||||
@DRIPROTO_CFLAGS@ \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/exa
|
||||
|
||||
if XV
|
||||
LIBXEPHYR_HOSTXV=libxephyr-hostxv.a
|
||||
else
|
||||
LIBXEPHYR_HOSTXV=
|
||||
LIBXEPHYR_HOSTXV=libxephyr-hostxv.a
|
||||
endif
|
||||
|
||||
if XEPHYR_HAS_DRI
|
||||
LIBXEPHYR_HOSTDRI=libxephyr-hostdri.a
|
||||
else
|
||||
LIBXEPHYR_HOSTDRI=
|
||||
if DRI
|
||||
LIBXEPHYR_HOSTDRI=libxephyr-hostdri.a
|
||||
endif
|
||||
|
||||
noinst_LIBRARIES = libxephyr-hostx.a $(LIBXEPHYR_HOSTXV) $(LIBXEPHYR_HOSTDRI) libxephyr.a
|
||||
|
||||
bin_PROGRAMS = Xephyr
|
||||
|
||||
libxephyr_hostx_a_SOURCES = \
|
||||
hostx.c \
|
||||
HOSTX_SRCS = \
|
||||
hostx.c \
|
||||
hostx.h
|
||||
|
||||
libxephyr_hostxv_a_INCLUDES = @XEPHYR_INCS@
|
||||
HOSTVIDEO_SRCS = \
|
||||
ephyrvideo.c \
|
||||
ephyrhostvideo.c \
|
||||
ephyrhostvideo.h
|
||||
|
||||
HOSTDRI_SRCS = \
|
||||
ephyrdriext.c \
|
||||
ephyrdriext.h \
|
||||
ephyrdri.c \
|
||||
ephyrdri.h \
|
||||
XF86dri.c \
|
||||
xf86dri.h \
|
||||
ephyrglxext.c \
|
||||
ephyrglxext.h \
|
||||
ephyrhostglx.c \
|
||||
ephyrhostglx.h
|
||||
|
||||
XEPHYR_SRCS = \
|
||||
ephyr.c \
|
||||
ephyr.h \
|
||||
ephyrlog.h \
|
||||
ephyr_draw.c \
|
||||
os.c
|
||||
|
||||
libxephyr_hostx_a_SOURCES = $(HOSTX_SRCS)
|
||||
|
||||
if XV
|
||||
libxephyr_hostxv_a_SOURCES= \
|
||||
ephyrhostvideo.c \
|
||||
ephyrhostvideo.h
|
||||
libxephyr_hostxv_a_SOURCES = $(HOSTVIDEO_SRCS)
|
||||
endif
|
||||
|
||||
if XEPHYR_HAS_DRI
|
||||
|
||||
libxephyr_hostdri_a_SOURCES= \
|
||||
ephyrdriext.c \
|
||||
ephyrdriext.h \
|
||||
ephyrdri.c \
|
||||
ephyrdri.h \
|
||||
XF86dri.c \
|
||||
ephyrglxext.c \
|
||||
ephyrglxext.h \
|
||||
ephyrhostglx.c \
|
||||
ephyrhostglx.h
|
||||
|
||||
libxephyr_hostdri_a_CFLAGS= \
|
||||
-I$(top_srcdir) \
|
||||
@LIBDRM_CFLAGS@ \
|
||||
@DRIPROTO_CFLAGS@
|
||||
|
||||
if DRI
|
||||
libxephyr_hostdri_a_SOURCES = $(HOSTDRI_SRCS)
|
||||
endif
|
||||
|
||||
libxephyr_a_SOURCES = \
|
||||
ephyr.c \
|
||||
ephyr_draw.c \
|
||||
ephyrvideo.c \
|
||||
os.c \
|
||||
hostx.h \
|
||||
ephyr.h \
|
||||
ephyrlog.h
|
||||
|
||||
libxephyr_a_CFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
@LIBDRM_CFLAGS@
|
||||
libxephyr_a_SOURCES = $(XEPHYR_SRCS)
|
||||
|
||||
Xephyr_SOURCES = \
|
||||
ephyrinit.c
|
||||
|
||||
if GLX
|
||||
Xephyr_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xephyr_LDADD = \
|
||||
libxephyr.a \
|
||||
libxephyr-hostx.a \
|
||||
libxephyr-hostx.a \
|
||||
$(LIBXEPHYR_HOSTXV) \
|
||||
$(LIBXEPHYR_HOSTDRI) \
|
||||
../../../exa/libexa.la \
|
||||
$(top_builddir)/exa/libexa.la \
|
||||
@KDRIVE_LIBS@ \
|
||||
@XEPHYR_LIBS@ \
|
||||
@LIBDRM_LIBS@ \
|
||||
@XEPHYR_DRI_LIBS@
|
||||
@XEPHYR_LIBS@
|
||||
|
||||
Xephyr_DEPENDENCIES = \
|
||||
libxephyr.a \
|
||||
libxephyr-hostx.a \
|
||||
libxephyr-hostx.a \
|
||||
$(LIBXEPHYR_HOSTXV) \
|
||||
$(LIBXEPHYR_HOSTDRI) \
|
||||
@KDRIVE_LOCAL_LIBS@
|
||||
|
||||
relink:
|
||||
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(HOSTVIDEO_SRCS) \
|
||||
$(HOSTDRI_SRCS)
|
||||
|
|
|
@ -46,8 +46,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <kdrive-config.h>
|
||||
#endif
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
|
||||
/* THIS IS NOT AN X CONSORTIUM STANDARD */
|
||||
|
||||
#define NEED_REPLIES
|
||||
|
@ -55,9 +53,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <X11/extensions/Xext.h>
|
||||
#include <X11/extensions/extutil.h>
|
||||
#include <GL/glx.h>
|
||||
#include <X11/dri/xf86dri.h>
|
||||
#include "xf86dri.h"
|
||||
#include <X11/dri/xf86dristr.h>
|
||||
#include "GL/internal/dri_interface.h"
|
||||
|
||||
static XExtensionInfo _xf86dri_info_data;
|
||||
static XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
|
||||
|
@ -640,5 +637,3 @@ XF86DRICloseFullScreen(Display *dpy, int screen, Drawable drawable)
|
|||
(void) drawable;
|
||||
return True;
|
||||
}
|
||||
#endif /*EPHYR_DRI*/
|
||||
|
||||
|
|
|
@ -32,11 +32,11 @@
|
|||
#include "scrnintstr.h"
|
||||
#include "ephyrlog.h"
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
#include "ephyrdri.h"
|
||||
#include "ephyrdriext.h"
|
||||
#include "ephyrglxext.h"
|
||||
#endif /*XEPHYR_DRI*/
|
||||
#endif /* XF86DRI */
|
||||
|
||||
extern int KdTsPhyScreen;
|
||||
#ifdef GLXEXT
|
||||
|
@ -631,7 +631,7 @@ ephyrInitScreen (ScreenPtr pScreen)
|
|||
}
|
||||
#endif /*XV*/
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
if (!ephyrNoDRI && !hostx_has_dri ()) {
|
||||
EPHYR_LOG ("host x does not support DRI. Disabling DRI forwarding\n") ;
|
||||
ephyrNoDRI = TRUE ;
|
||||
|
@ -841,7 +841,7 @@ miPointerScreenFuncRec ephyrPointerScreenFuncs =
|
|||
ephyrWarpCursor
|
||||
};
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
/**
|
||||
* find if the remote window denoted by a_remote
|
||||
* is paired with an internal Window within the Xephyr server.
|
||||
|
@ -873,7 +873,7 @@ ephyrExposePairedWindow (int a_remote)
|
|||
screen->WindowExposures (pair->local, ®, NullRegion);
|
||||
REGION_UNINIT (screen, ®);
|
||||
}
|
||||
#endif /*XEPHYR_DRI*/
|
||||
#endif /* XF86DRI */
|
||||
|
||||
void
|
||||
ephyrPoll(void)
|
||||
|
@ -908,14 +908,14 @@ ephyrPoll(void)
|
|||
else
|
||||
{
|
||||
int x=0, y=0;
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
EphyrWindowPair *pair = NULL;
|
||||
#endif
|
||||
EPHYR_LOG ("enqueuing mouse motion:%d\n", ephyrCurScreen) ;
|
||||
x = ev.data.mouse_motion.x;
|
||||
y = ev.data.mouse_motion.y;
|
||||
EPHYR_LOG ("initial (x,y):(%d,%d)\n", x, y) ;
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
EPHYR_LOG ("is this window peered by a gl drawable ?\n") ;
|
||||
if (findWindowPairFromRemote (ev.data.mouse_motion.window,
|
||||
&pair))
|
||||
|
@ -972,7 +972,7 @@ ephyrPoll(void)
|
|||
KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
|
||||
break;
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
case EPHYR_EV_EXPOSE:
|
||||
/*
|
||||
* We only receive expose events when the expose event have
|
||||
|
@ -982,7 +982,7 @@ ephyrPoll(void)
|
|||
*/
|
||||
ephyrExposePairedWindow (ev.data.expose.window);
|
||||
break;
|
||||
#endif /*XEPHYR_DRI*/
|
||||
#endif /* XF86DRI */
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -29,13 +29,10 @@
|
|||
#include <kdrive-config.h>
|
||||
#endif
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xlibint.h>
|
||||
/*#define _XF86DRI_SERVER_*/
|
||||
#include <GL/glx.h>
|
||||
#include <X11/dri/xf86dri.h>
|
||||
#include "xf86dri.h"
|
||||
#include "hostx.h"
|
||||
#include "ephyrdri.h"
|
||||
#define _HAVE_XALLOC_DECLS
|
||||
|
@ -287,5 +284,3 @@ ephyrDRIGetDeviceInfo (int a_screen,
|
|||
EPHYR_LOG ("leave:%d\n", is_ok) ;
|
||||
return is_ok ;
|
||||
}
|
||||
#endif /*EPHYR_DRI*/
|
||||
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
#include <kdrive-config.h>
|
||||
#endif
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define NEED_REPLIES
|
||||
|
@ -1439,5 +1437,3 @@ SProcXF86DRIDispatch (register ClientPtr client)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*XEPHYR_DRI*/
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
#include "hostx.h"
|
||||
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
@ -727,6 +725,3 @@ ephyrGLXIsDirectSwap (__GLXclientState *a_cl, GLbyte *a_pc)
|
|||
{
|
||||
return ephyrGLXIsDirectReal (a_cl, a_pc, TRUE) ;
|
||||
}
|
||||
|
||||
#endif /*XEPHYR_DRI*/
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include "ephyrlog.h"
|
||||
#include "hostx.h"
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
enum VisualConfRequestType {
|
||||
EPHYR_GET_FB_CONFIG,
|
||||
EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX,
|
||||
|
@ -687,6 +686,3 @@ out:
|
|||
EPHYR_LOG ("leave\n") ;
|
||||
return is_ok ;
|
||||
}
|
||||
|
||||
#endif /*XEPHYR_DRI*/
|
||||
|
||||
|
|
|
@ -45,12 +45,12 @@
|
|||
#include <X11/keysym.h>
|
||||
#include <X11/extensions/XShm.h>
|
||||
#include <X11/extensions/shape.h>
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
#include <GL/glx.h>
|
||||
#endif /*XEPHYR_DRI*/
|
||||
#endif /* XF86DRI */
|
||||
#include "ephyrlog.h"
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
extern Bool XF86DRIQueryExtension (Display *dpy,
|
||||
int *event_basep,
|
||||
int *error_basep);
|
||||
|
@ -1315,7 +1315,7 @@ hostx_has_xshape (void)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
typedef struct {
|
||||
int is_valid ;
|
||||
int local_id ;
|
||||
|
@ -1418,5 +1418,4 @@ hostx_has_glx (void)
|
|||
return TRUE ;
|
||||
}
|
||||
|
||||
#endif /*XEPHYR_DRI*/
|
||||
|
||||
#endif /* XF86DRI */
|
||||
|
|
|
@ -244,7 +244,7 @@ int hostx_set_window_clipping_rectangles (int a_window,
|
|||
int a_num_rects) ;
|
||||
int hostx_has_xshape (void) ;
|
||||
|
||||
#ifdef XEPHYR_DRI
|
||||
#ifdef XF86DRI
|
||||
int hostx_lookup_peer_window (void *a_local_window,
|
||||
int *a_host_peer /*out parameter*/) ;
|
||||
int
|
||||
|
@ -256,6 +256,6 @@ hostx_get_resource_id_peer (int a_local_resource_id,
|
|||
int hostx_has_dri (void) ;
|
||||
|
||||
int hostx_has_glx (void) ;
|
||||
#endif /*XEPHYR_DRI*/
|
||||
#endif /* XF86DRI */
|
||||
|
||||
#endif /*_XLIBS_STUFF_H_*/
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
/* $XFree86: xc/lib/GL/dri/xf86dri.h,v 1.8 2002/10/30 12:51:25 alanh Exp $ */
|
||||
/**************************************************************************
|
||||
|
||||
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
Copyright 2000 VA Linux Systems, Inc.
|
||||
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 PRECISION INSIGHT 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.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/**
|
||||
* \file xf86dri.h
|
||||
* Protocol numbers and function prototypes for DRI X protocol.
|
||||
*
|
||||
* \author Kevin E. Martin <martin@valinux.com>
|
||||
* \author Jens Owen <jens@tungstengraphics.com>
|
||||
* \author Rickard E. (Rik) Faith <faith@valinux.com>
|
||||
*/
|
||||
|
||||
#ifndef _XF86DRI_H_
|
||||
#define _XF86DRI_H_
|
||||
|
||||
#include <X11/Xfuncproto.h>
|
||||
#include <xf86drm.h>
|
||||
|
||||
#define X_XF86DRIQueryVersion 0
|
||||
#define X_XF86DRIQueryDirectRenderingCapable 1
|
||||
#define X_XF86DRIOpenConnection 2
|
||||
#define X_XF86DRICloseConnection 3
|
||||
#define X_XF86DRIGetClientDriverName 4
|
||||
#define X_XF86DRICreateContext 5
|
||||
#define X_XF86DRIDestroyContext 6
|
||||
#define X_XF86DRICreateDrawable 7
|
||||
#define X_XF86DRIDestroyDrawable 8
|
||||
#define X_XF86DRIGetDrawableInfo 9
|
||||
#define X_XF86DRIGetDeviceInfo 10
|
||||
#define X_XF86DRIAuthConnection 11
|
||||
#define X_XF86DRIOpenFullScreen 12 /* Deprecated */
|
||||
#define X_XF86DRICloseFullScreen 13 /* Deprecated */
|
||||
|
||||
#define XF86DRINumberEvents 0
|
||||
|
||||
#define XF86DRIClientNotLocal 0
|
||||
#define XF86DRIOperationNotSupported 1
|
||||
#define XF86DRINumberErrors (XF86DRIOperationNotSupported + 1)
|
||||
|
||||
#ifndef _XF86DRI_SERVER_
|
||||
|
||||
_XFUNCPROTOBEGIN
|
||||
|
||||
Bool XF86DRIQueryExtension( Display *dpy, int *event_base, int *error_base );
|
||||
|
||||
Bool XF86DRIQueryVersion( Display *dpy, int *majorVersion, int *minorVersion,
|
||||
int *patchVersion );
|
||||
|
||||
Bool XF86DRIQueryDirectRenderingCapable( Display *dpy, int screen,
|
||||
Bool *isCapable );
|
||||
|
||||
Bool XF86DRIOpenConnection( Display *dpy, int screen, drm_handle_t *hSAREA,
|
||||
char **busIDString );
|
||||
|
||||
Bool XF86DRIAuthConnection( Display *dpy, int screen, drm_magic_t magic );
|
||||
|
||||
Bool XF86DRICloseConnection( Display *dpy, int screen );
|
||||
|
||||
Bool XF86DRIGetClientDriverName( Display *dpy, int screen,
|
||||
int *ddxDriverMajorVersion, int *ddxDriverMinorVersion,
|
||||
int *ddxDriverPatchVersion, char **clientDriverName );
|
||||
|
||||
Bool XF86DRICreateContext( Display *dpy, int screen, Visual *visual,
|
||||
XID *ptr_to_returned_context_id, drm_context_t *hHWContext );
|
||||
|
||||
Bool XF86DRICreateContextWithConfig( Display *dpy, int screen, int configID,
|
||||
XID *ptr_to_returned_context_id, drm_context_t *hHWContext );
|
||||
|
||||
extern GLboolean XF86DRIDestroyContext( Display *dpy, int screen,
|
||||
XID context_id );
|
||||
|
||||
extern GLboolean XF86DRICreateDrawable( Display *dpy, int screen,
|
||||
XID drawable, drm_drawable_t *hHWDrawable );
|
||||
|
||||
extern GLboolean XF86DRIDestroyDrawable( Display *dpy, int screen,
|
||||
XID drawable);
|
||||
|
||||
Bool XF86DRIGetDrawableInfo( Display *dpy, int screen, Drawable drawable,
|
||||
unsigned int *index, unsigned int *stamp,
|
||||
int *X, int *Y, int *W, int *H,
|
||||
int *numClipRects, drm_clip_rect_t ** pClipRects,
|
||||
int *backX, int *backY,
|
||||
int *numBackClipRects, drm_clip_rect_t **pBackClipRects );
|
||||
|
||||
Bool XF86DRIGetDeviceInfo( Display *dpy, int screen,
|
||||
drm_handle_t *hFrameBuffer, int *fbOrigin, int *fbSize,
|
||||
int *fbStride, int *devPrivateSize, void **pDevPrivate );
|
||||
|
||||
_XFUNCPROTOEND
|
||||
|
||||
#endif /* _XF86DRI_SERVER_ */
|
||||
|
||||
#endif /* _XF86DRI_H_ */
|
||||
|
|
@ -20,6 +20,10 @@ EPSON_LIBS = \
|
|||
libepson.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xepson_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xepson_LDADD = \
|
||||
$(EPSON_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -16,6 +16,10 @@ libfake_a_SOURCES = \
|
|||
Xfake_SOURCES = \
|
||||
fakeinit.c
|
||||
|
||||
if GLX
|
||||
Xfake_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xfake_LDADD = \
|
||||
libfake.a \
|
||||
@KDRIVE_LIBS@ \
|
||||
|
|
|
@ -14,6 +14,10 @@ bin_PROGRAMS = Xfbdev
|
|||
Xfbdev_SOURCES = \
|
||||
fbinit.c
|
||||
|
||||
if GLX
|
||||
Xfbdev_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xfbdev_LDADD = \
|
||||
libfbdev.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -179,16 +179,24 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
|
|||
screen->rate = 103; /* FIXME: should get proper value from fb driver */
|
||||
}
|
||||
if (!screen->fb[0].depth)
|
||||
screen->fb[0].depth = 16;
|
||||
{
|
||||
if (k >= 0)
|
||||
screen->fb[0].depth = var.bits_per_pixel;
|
||||
else
|
||||
screen->fb[0].depth = 16;
|
||||
}
|
||||
|
||||
t = KdFindMode (screen, fbdevModeSupported);
|
||||
screen->rate = t->rate;
|
||||
screen->width = t->horizontal;
|
||||
screen->height = t->vertical;
|
||||
if ((screen->width != var.xres) || (screen->height != var.yres))
|
||||
{
|
||||
t = KdFindMode (screen, fbdevModeSupported);
|
||||
screen->rate = t->rate;
|
||||
screen->width = t->horizontal;
|
||||
screen->height = t->vertical;
|
||||
|
||||
/* Now try setting the mode */
|
||||
if (k < 0 || (t->horizontal != var.xres || t->vertical != var.yres))
|
||||
fbdevConvertMonitorTiming (t, &var);
|
||||
/* Now try setting the mode */
|
||||
if (k < 0 || (t->horizontal != var.xres || t->vertical != var.yres))
|
||||
fbdevConvertMonitorTiming (t, &var);
|
||||
}
|
||||
|
||||
var.activate = FB_ACTIVATE_NOW;
|
||||
var.bits_per_pixel = screen->fb[0].depth;
|
||||
|
|
|
@ -23,6 +23,10 @@ I810_LIBS = \
|
|||
libi810.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xi810_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xi810_LDADD = \
|
||||
$(I810_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
#include <sys/ioctl.h>
|
||||
|
||||
extern int LinuxConsoleFd;
|
||||
static unsigned char mediumraw_data, mediumraw_up;
|
||||
static enum { DEFAULT, EXTBYTE1, EXTBYTE2 } mediumraw_state = DEFAULT;
|
||||
|
||||
static const KeySym linux_to_x[256] = {
|
||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||
|
@ -701,7 +703,29 @@ LinuxKeyboardRead (int fd, void *closure)
|
|||
else
|
||||
#endif
|
||||
scancode = b[0] & 0x7f;
|
||||
KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
|
||||
/* This is extended medium raw mode interpreter
|
||||
see linux/drivers/keyboard.c (kbd->kbdmode == VC_MEDIUMRAW) */
|
||||
switch (mediumraw_state)
|
||||
{
|
||||
case DEFAULT:
|
||||
if (scancode == 0)
|
||||
{
|
||||
mediumraw_state = EXTBYTE1;
|
||||
mediumraw_up = b[0] & 0x80;
|
||||
}
|
||||
else
|
||||
KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
|
||||
break;
|
||||
case EXTBYTE1:
|
||||
mediumraw_data = scancode;
|
||||
mediumraw_state = EXTBYTE2;
|
||||
break;
|
||||
case EXTBYTE2:
|
||||
/* Note: Only codes < 256 will pass correctly through KdEnqueueKeyboardEvent() */
|
||||
KdEnqueueKeyboardEvent (closure, (int)mediumraw_data << 7 | scancode, mediumraw_up);
|
||||
mediumraw_state = DEFAULT;
|
||||
break;
|
||||
}
|
||||
b++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,6 +114,10 @@ TslibEnable (KdPointerInfo *pi)
|
|||
|
||||
private->raw_event_hook = NULL;
|
||||
private->raw_event_closure = NULL;
|
||||
if (!pi->path) {
|
||||
pi->path = "/dev/input/touchscreen0";
|
||||
ErrorF("[tslib/TslibEnable] no device path given, trying %s\n", pi->path);
|
||||
}
|
||||
private->tsDev = ts_open(pi->path, 0);
|
||||
private->fd = ts_fd(private->tsDev);
|
||||
if (!private->tsDev || ts_config(private->tsDev) || private->fd < 0) {
|
||||
|
|
|
@ -27,6 +27,10 @@ MACH64_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a
|
||||
|
||||
|
||||
if GLX
|
||||
Xmach64_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xmach64_LDADD = \
|
||||
$(MACH64_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -22,6 +22,10 @@ MGA_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xmga_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xmga_LDADD = \
|
||||
$(MGA_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -32,6 +32,10 @@ NEOMAGIC_LIBS = \
|
|||
${VESA_LIBS} \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xneomagic_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xneomagic_LDADD = \
|
||||
$(NEOMAGIC_LIBS) \
|
||||
@KDRIVE_LIBS@ \
|
||||
|
|
|
@ -23,6 +23,10 @@ NVIDIA_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xnvidia_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xnvidia_LDADD = \
|
||||
$(NVIDIA_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -21,6 +21,10 @@ PM2_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xpm2_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xpm2_LDADD = \
|
||||
$(PM2_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -20,6 +20,10 @@ R128_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xr128_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xr128_LDADD = \
|
||||
$(R128_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -7,6 +7,10 @@ bin_PROGRAMS = Xsdl
|
|||
|
||||
Xsdl_SOURCES = sdl.c
|
||||
|
||||
if GLX
|
||||
Xsdl_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xsdl_LDADD = \
|
||||
@KDRIVE_LIBS@ \
|
||||
@XSDL_LIBS@
|
||||
|
|
|
@ -34,6 +34,10 @@ SIS_LIBS = \
|
|||
$(VESA_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xsis_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xsis_LDADD = \
|
||||
$(SIS_LIBS) \
|
||||
@KDRIVE_LIBS@ \
|
||||
|
|
|
@ -25,6 +25,10 @@ SMI_LIBS = \
|
|||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
||||
if GLX
|
||||
Xsmi_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xsmi_LDADD = \
|
||||
$(SMI_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -19,6 +19,10 @@ libvesa_a_SOURCES = \
|
|||
Xvesa_SOURCES = \
|
||||
vesainit.c
|
||||
|
||||
if GLX
|
||||
Xvesa_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xvesa_LDADD = \
|
||||
libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -21,6 +21,10 @@ VIA_LIBS = \
|
|||
libvia.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a
|
||||
|
||||
if GLX
|
||||
Xvia_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
|
||||
endif
|
||||
|
||||
Xvia_LDADD = \
|
||||
$(VIA_LIBS) \
|
||||
@KDRIVE_LIBS@
|
||||
|
|
|
@ -1363,7 +1363,7 @@ do { \
|
|||
# define write_mem_barrier() /* NOP */
|
||||
|
||||
# if !defined(__SUNPRO_C)
|
||||
# if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__)
|
||||
# if !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__m32r__)
|
||||
# ifdef GCCUSESGAS
|
||||
|
||||
/*
|
||||
|
@ -1472,7 +1472,7 @@ inl(unsigned short port)
|
|||
|
||||
# endif /* GCCUSESGAS */
|
||||
|
||||
# else /* !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__)*/
|
||||
# else /* !defined(FAKEIT) && !defined(__mc68000__) && !defined(__arm__) && !defined(__sh__) && !defined(__hppa__) && !defined(__m32r__) */
|
||||
|
||||
static __inline__ void
|
||||
outb(unsigned short port, unsigned char val)
|
||||
|
|
|
@ -330,86 +330,87 @@ matchDriverFromFiles (char** matches, uint16_t match_vendor, uint16_t match_chip
|
|||
int i, j;
|
||||
|
||||
idsdir = opendir(PCI_TXT_IDS_PATH);
|
||||
if (idsdir) {
|
||||
xf86Msg(X_INFO, "Scanning %s directory for additional PCI ID's supported by the drivers\n", PCI_TXT_IDS_PATH);
|
||||
direntry = readdir(idsdir);
|
||||
/* Read the directory */
|
||||
while (direntry) {
|
||||
if (direntry->d_name[0] == '.') {
|
||||
direntry = readdir(idsdir);
|
||||
continue;
|
||||
}
|
||||
len = strlen(direntry->d_name);
|
||||
/* A tiny bit of sanity checking. We should probably do better */
|
||||
if (strncmp(&(direntry->d_name[len-4]), ".ids", 4) == 0) {
|
||||
/* We need the full path name to open the file */
|
||||
strncpy(path_name, PCI_TXT_IDS_PATH, 256);
|
||||
strncat(path_name, "/", 1);
|
||||
strncat(path_name, direntry->d_name, (256 - strlen(path_name) - 1));
|
||||
fp = fopen(path_name, "r");
|
||||
if (fp == NULL) {
|
||||
xf86Msg(X_ERROR, "Could not open %s for reading. Exiting.\n", path_name);
|
||||
goto end;
|
||||
}
|
||||
/* Read the file */
|
||||
#ifdef __GLIBC__
|
||||
while ((read = getline(&line, &len, fp)) != -1) {
|
||||
#else
|
||||
while ((line = fgetln(fp, &len)) != (char *)NULL) {
|
||||
#endif /* __GLIBC __ */
|
||||
xchomp(line);
|
||||
if (isdigit(line[0])) {
|
||||
strncpy(vendor_str, line, 4);
|
||||
vendor_str[4] = '\0';
|
||||
vendor = (int)strtol(vendor_str, NULL, 16);
|
||||
if ((strlen(&line[4])) == 0) {
|
||||
chip_str[0] = '\0';
|
||||
chip = -1;
|
||||
} else {
|
||||
/* Handle trailing whitespace */
|
||||
if (isspace(line[4])) {
|
||||
chip_str[0] = '\0';
|
||||
chip = -1;
|
||||
} else {
|
||||
/* Ok, it's a real ID */
|
||||
strncpy(chip_str, &line[4], 4);
|
||||
chip_str[4] = '\0';
|
||||
chip = (int)strtol(chip_str, NULL, 16);
|
||||
}
|
||||
}
|
||||
if (vendor == match_vendor && chip == match_chip ) {
|
||||
i = 0;
|
||||
while (matches[i]) {
|
||||
i++;
|
||||
}
|
||||
matches[i] = (char*)xalloc(sizeof(char) * strlen(direntry->d_name) - 3);
|
||||
if (!matches[i]) {
|
||||
xf86Msg(X_ERROR, "Could not allocate space for the module name. Exiting.\n");
|
||||
goto end;
|
||||
}
|
||||
/* hack off the .ids suffix. This should guard
|
||||
* against other problems, but it will end up
|
||||
* taking off anything after the first '.' */
|
||||
for (j = 0; j < (strlen(direntry->d_name) - 3) ; j++) {
|
||||
if (direntry->d_name[j] == '.') {
|
||||
matches[i][j] = '\0';
|
||||
break;
|
||||
} else {
|
||||
matches[i][j] = direntry->d_name[j];
|
||||
}
|
||||
}
|
||||
xf86Msg(X_INFO, "Matched %s from file name %s\n", matches[i], direntry->d_name);
|
||||
}
|
||||
} else {
|
||||
/* TODO Handle driver overrides here */
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
if (!idsdir)
|
||||
return;
|
||||
|
||||
xf86Msg(X_INFO, "Scanning %s directory for additional PCI ID's supported by the drivers\n", PCI_TXT_IDS_PATH);
|
||||
direntry = readdir(idsdir);
|
||||
/* Read the directory */
|
||||
while (direntry) {
|
||||
if (direntry->d_name[0] == '.') {
|
||||
direntry = readdir(idsdir);
|
||||
continue;
|
||||
}
|
||||
len = strlen(direntry->d_name);
|
||||
/* A tiny bit of sanity checking. We should probably do better */
|
||||
if (strncmp(&(direntry->d_name[len-4]), ".ids", 4) == 0) {
|
||||
/* We need the full path name to open the file */
|
||||
strncpy(path_name, PCI_TXT_IDS_PATH, 256);
|
||||
strncat(path_name, "/", 1);
|
||||
strncat(path_name, direntry->d_name, (256 - strlen(path_name) - 1));
|
||||
fp = fopen(path_name, "r");
|
||||
if (fp == NULL) {
|
||||
xf86Msg(X_ERROR, "Could not open %s for reading. Exiting.\n", path_name);
|
||||
goto end;
|
||||
}
|
||||
/* Read the file */
|
||||
#ifdef __GLIBC__
|
||||
while ((read = getline(&line, &len, fp)) != -1) {
|
||||
#else
|
||||
while ((line = fgetln(fp, &len)) != (char *)NULL) {
|
||||
#endif /* __GLIBC __ */
|
||||
xchomp(line);
|
||||
if (isdigit(line[0])) {
|
||||
strncpy(vendor_str, line, 4);
|
||||
vendor_str[4] = '\0';
|
||||
vendor = (int)strtol(vendor_str, NULL, 16);
|
||||
if ((strlen(&line[4])) == 0) {
|
||||
chip_str[0] = '\0';
|
||||
chip = -1;
|
||||
} else {
|
||||
/* Handle trailing whitespace */
|
||||
if (isspace(line[4])) {
|
||||
chip_str[0] = '\0';
|
||||
chip = -1;
|
||||
} else {
|
||||
/* Ok, it's a real ID */
|
||||
strncpy(chip_str, &line[4], 4);
|
||||
chip_str[4] = '\0';
|
||||
chip = (int)strtol(chip_str, NULL, 16);
|
||||
}
|
||||
}
|
||||
if (vendor == match_vendor && chip == match_chip ) {
|
||||
i = 0;
|
||||
while (matches[i]) {
|
||||
i++;
|
||||
}
|
||||
matches[i] = (char*)xalloc(sizeof(char) * strlen(direntry->d_name) - 3);
|
||||
if (!matches[i]) {
|
||||
xf86Msg(X_ERROR, "Could not allocate space for the module name. Exiting.\n");
|
||||
goto end;
|
||||
}
|
||||
/* hack off the .ids suffix. This should guard
|
||||
* against other problems, but it will end up
|
||||
* taking off anything after the first '.' */
|
||||
for (j = 0; j < (strlen(direntry->d_name) - 3) ; j++) {
|
||||
if (direntry->d_name[j] == '.') {
|
||||
matches[i][j] = '\0';
|
||||
break;
|
||||
} else {
|
||||
matches[i][j] = direntry->d_name[j];
|
||||
}
|
||||
}
|
||||
xf86Msg(X_INFO, "Matched %s from file name %s\n", matches[i], direntry->d_name);
|
||||
}
|
||||
} else {
|
||||
/* TODO Handle driver overrides here */
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
direntry = readdir(idsdir);
|
||||
}
|
||||
end:
|
||||
end:
|
||||
xfree(line);
|
||||
closedir(idsdir);
|
||||
}
|
||||
|
|
|
@ -2773,7 +2773,7 @@ xf86FindPrimaryDevice()
|
|||
}
|
||||
}
|
||||
|
||||
#if !defined(__sparc) && !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__) && !defined(__arm__)
|
||||
#if !defined(__sparc) && !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__) && !defined(__arm__) && !defined(__m32r__)
|
||||
#include "vgaHW.h"
|
||||
#include "compiler.h"
|
||||
#endif
|
||||
|
@ -2785,7 +2785,7 @@ static void
|
|||
CheckGenericGA()
|
||||
{
|
||||
/* This needs to be changed for multiple domains */
|
||||
#if !defined(__sparc__) && !defined(__sparc) && !defined(__powerpc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__arm__) && !defined(__s390__)
|
||||
#if !defined(__sparc__) && !defined(__sparc) && !defined(__powerpc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__arm__) && !defined(__s390__) && !defined(__m32r__)
|
||||
IOADDRESS GenericIOBase = VGAHW_GET_IOBASE();
|
||||
CARD8 CurrentValue, TestValue;
|
||||
|
||||
|
|
|
@ -1119,37 +1119,35 @@ InitInput(argc, argv)
|
|||
xf86Info.vtRequestsPending = FALSE;
|
||||
xf86Info.inputPending = FALSE;
|
||||
|
||||
if (serverGeneration == 1) {
|
||||
/* Call the PreInit function for each input device instance. */
|
||||
for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
|
||||
/* Replace obsolete keyboard driver with kbd */
|
||||
if (!xf86NameCmp((*pDev)->driver, "keyboard")) {
|
||||
strcpy((*pDev)->driver, "kbd");
|
||||
}
|
||||
/* Call the PreInit function for each input device instance. */
|
||||
for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
|
||||
/* Replace obsolete keyboard driver with kbd */
|
||||
if (!xf86NameCmp((*pDev)->driver, "keyboard")) {
|
||||
strcpy((*pDev)->driver, "kbd");
|
||||
}
|
||||
|
||||
if ((pDrv = xf86LookupInputDriver((*pDev)->driver)) == NULL) {
|
||||
xf86Msg(X_ERROR, "No Input driver matching `%s'\n", (*pDev)->driver);
|
||||
/* XXX For now, just continue. */
|
||||
continue;
|
||||
}
|
||||
if (!pDrv->PreInit) {
|
||||
xf86MsgVerb(X_WARNING, 0,
|
||||
"Input driver `%s' has no PreInit function (ignoring)\n",
|
||||
pDrv->driverName);
|
||||
continue;
|
||||
}
|
||||
pInfo = pDrv->PreInit(pDrv, *pDev, 0);
|
||||
if (!pInfo) {
|
||||
xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n",
|
||||
(*pDev)->identifier);
|
||||
continue;
|
||||
} else if (!(pInfo->flags & XI86_CONFIGURED)) {
|
||||
xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n",
|
||||
(*pDev)->identifier);
|
||||
xf86DeleteInput(pInfo, 0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ((pDrv = xf86LookupInputDriver((*pDev)->driver)) == NULL) {
|
||||
xf86Msg(X_ERROR, "No Input driver matching `%s'\n", (*pDev)->driver);
|
||||
/* XXX For now, just continue. */
|
||||
continue;
|
||||
}
|
||||
if (!pDrv->PreInit) {
|
||||
xf86MsgVerb(X_WARNING, 0,
|
||||
"Input driver `%s' has no PreInit function (ignoring)\n",
|
||||
pDrv->driverName);
|
||||
continue;
|
||||
}
|
||||
pInfo = pDrv->PreInit(pDrv, *pDev, 0);
|
||||
if (!pInfo) {
|
||||
xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n",
|
||||
(*pDev)->identifier);
|
||||
continue;
|
||||
} else if (!(pInfo->flags & XI86_CONFIGURED)) {
|
||||
xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n",
|
||||
(*pDev)->identifier);
|
||||
xf86DeleteInput(pInfo, 0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialise all input devices. */
|
||||
|
|
|
@ -467,6 +467,8 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
|
|||
LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate;
|
||||
InputDriverPtr drv;
|
||||
IDevRec *idev;
|
||||
BOOL found;
|
||||
IDevPtr *it;
|
||||
|
||||
if (pInfo) /* need to get these before RemoveDevice */
|
||||
{
|
||||
|
@ -483,10 +485,18 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
|
|||
else
|
||||
xf86DeleteInput(pInfo, 0);
|
||||
|
||||
xfree(idev->driver);
|
||||
xfree(idev->identifier);
|
||||
xf86optionListFree(idev->commonOptions);
|
||||
xfree(idev);
|
||||
/* devices added through HAL aren't in the config layout */
|
||||
it = xf86ConfigLayout.inputs;
|
||||
while(*it && *it != idev)
|
||||
it++;
|
||||
|
||||
if (!(*it)) /* end of list, not in the layout */
|
||||
{
|
||||
xfree(idev->driver);
|
||||
xfree(idev->identifier);
|
||||
xf86optionListFree(idev->commonOptions);
|
||||
xfree(idev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
/**************************************************************************
|
||||
|
||||
Copyright 1998-1999 Precision Insight, 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 PRECISION INSIGHT 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.
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Authors:
|
||||
* Kevin E. Martin <kevin@precisioninsight.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_XORG_CONFIG_H
|
||||
#include <xorg-config.h>
|
||||
#endif
|
||||
|
||||
#include "xf86Module.h"
|
||||
|
||||
static MODULESETUPPROTO(GLcoreSetup);
|
||||
|
||||
static XF86ModuleVersionInfo VersRec =
|
||||
{
|
||||
"GLcore",
|
||||
MODULEVENDORSTRING,
|
||||
MODINFOSTRING1,
|
||||
MODINFOSTRING2,
|
||||
XORG_VERSION_CURRENT,
|
||||
1, 0, 0,
|
||||
ABI_CLASS_EXTENSION,
|
||||
ABI_EXTENSION_VERSION,
|
||||
MOD_CLASS_NONE,
|
||||
{0,0,0,0}
|
||||
};
|
||||
|
||||
_X_EXPORT XF86ModuleData GLcoreModuleData = { &VersRec, GLcoreSetup, NULL };
|
||||
|
||||
static pointer
|
||||
GLcoreSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
||||
{
|
||||
/* Need a non-NULL return value to indicate success */
|
||||
return (pointer)1;
|
||||
}
|
|
@ -3,7 +3,7 @@ noinst_LTLIBRARIES = libdixmods.la libxorgxkb.la
|
|||
SUBDIRS = extmod
|
||||
|
||||
if GLX
|
||||
GLXMODS = libglx.la libGLcore.la
|
||||
GLXMODS = libglx.la
|
||||
endif
|
||||
|
||||
if XTRAP
|
||||
|
@ -48,10 +48,6 @@ INCLUDES = @XORG_INCS@ \
|
|||
-I$(top_srcdir)/miext/shadow \
|
||||
-I$(top_srcdir)/GL/glx
|
||||
|
||||
libGLcore_la_LDFLAGS = -avoid-version
|
||||
libGLcore_la_LIBADD = $(top_builddir)/GL/mesa/libGLcore.la
|
||||
libGLcore_la_SOURCES = GLcoremodule.c
|
||||
|
||||
libafb_la_LDFLAGS = -avoid-version
|
||||
libafb_la_LIBADD = $(top_builddir)/afb/libafb.la
|
||||
libafb_la_SOURCES = afbmodule.c
|
||||
|
|
|
@ -72,37 +72,6 @@ static XF86ModuleVersionInfo VersRec =
|
|||
|
||||
_X_EXPORT XF86ModuleData glxModuleData = { &VersRec, glxSetup, NULL };
|
||||
|
||||
/* We do a little proxy dance here, so we can avoid loading GLcore
|
||||
* unless we really need to.*/
|
||||
|
||||
static pointer glxModule;
|
||||
|
||||
static __GLXscreen *
|
||||
__glXMesaProxyScreenProbe(ScreenPtr pScreen)
|
||||
{
|
||||
pointer GLcore;
|
||||
static __GLXprovider *provider;
|
||||
|
||||
if (provider == NULL) {
|
||||
GLcore = LoadSubModule(glxModule, "GLcore", NULL, NULL, NULL, NULL,
|
||||
NULL, NULL);
|
||||
if (GLcore == NULL)
|
||||
return NULL;
|
||||
|
||||
provider = LoaderSymbol("__glXMesaProvider");
|
||||
if (provider == NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return provider->screenProbe(pScreen);
|
||||
}
|
||||
|
||||
static __GLXprovider __glXMesaProxyProvider = {
|
||||
__glXMesaProxyScreenProbe,
|
||||
"MESA-PROXY",
|
||||
NULL
|
||||
};
|
||||
|
||||
static pointer
|
||||
glxSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
||||
{
|
||||
|
@ -116,8 +85,10 @@ glxSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
|||
|
||||
setupDone = TRUE;
|
||||
|
||||
glxModule = module;
|
||||
GlxPushProvider(&__glXMesaProxyProvider);
|
||||
provider = LoaderSymbol("__glXMesaProvider");
|
||||
if (provider == NULL)
|
||||
return NULL;
|
||||
GlxPushProvider(provider);
|
||||
|
||||
xf86Msg(xf86Info.aiglxFrom, "AIGLX %s\n",
|
||||
xf86Info.aiglx ? "enabled" : "disabled");
|
||||
|
|
|
@ -2437,7 +2437,7 @@ static void drmSIGIOHandler(int interrupt, void *closure)
|
|||
#if 0
|
||||
fprintf(stderr, "Trying %d\n", entry->fd);
|
||||
#endif
|
||||
if ((count = read(entry->fd, buf, sizeof(buf))) > 0) {
|
||||
if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
|
||||
buf[count] = '\0';
|
||||
#if 0
|
||||
fprintf(stderr, "Got %s\n", buf);
|
||||
|
|
|
@ -939,6 +939,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
|
|||
SYMFUNC(xf86CrtcDestroy)
|
||||
SYMFUNC(xf86CrtcInUse)
|
||||
SYMFUNC(xf86CrtcSetScreenSubpixelOrder)
|
||||
SYMFUNC(xf86RotateFreeShadow)
|
||||
SYMFUNC(xf86RotateCloseScreen)
|
||||
SYMFUNC(xf86CrtcRotate)
|
||||
SYMFUNC(xf86CrtcSetMode)
|
||||
|
|
|
@ -664,6 +664,12 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
|
|||
Bool
|
||||
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation);
|
||||
|
||||
/*
|
||||
* free shadow memory allocated for all crtcs
|
||||
*/
|
||||
void
|
||||
xf86RotateFreeShadow(ScrnInfoPtr pScrn);
|
||||
|
||||
/*
|
||||
* Clean up rotation during CloseScreen
|
||||
*/
|
||||
|
|
|
@ -457,8 +457,7 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
|
|||
}
|
||||
|
||||
for (c = 0; c < xf86_config->num_crtc; c++)
|
||||
if (xf86_config->crtc[c]->rotatedPixmap ||
|
||||
xf86_config->crtc[c]->rotatedData)
|
||||
if (xf86_config->crtc[c]->transform_in_use)
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -478,6 +477,24 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
|
|||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86RotateFreeShadow(ScrnInfoPtr pScrn)
|
||||
{
|
||||
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
int c;
|
||||
|
||||
for (c = 0; c < config->num_crtc; c++) {
|
||||
xf86CrtcPtr crtc = config->crtc[c];
|
||||
|
||||
if (crtc->rotatedPixmap || crtc->rotatedData) {
|
||||
crtc->funcs->shadow_destroy(crtc, crtc->rotatedPixmap,
|
||||
crtc->rotatedData);
|
||||
crtc->rotatedPixmap = NULL;
|
||||
crtc->rotatedData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_X_EXPORT void
|
||||
xf86RotateCloseScreen (ScreenPtr screen)
|
||||
{
|
||||
|
|
|
@ -237,6 +237,12 @@
|
|||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# endif
|
||||
#elif defined(__m32r__)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
# define INCLUDE_XF86_MAP_PCI_MEM
|
||||
# define INCLUDE_XF86_NO_DOMAIN
|
||||
# endif
|
||||
#elif defined(__sparc__) || defined(sparc)
|
||||
# if defined(linux)
|
||||
# define ARCH_PCI_INIT linuxPciInit
|
||||
|
|
|
@ -65,6 +65,7 @@ xf86AccResFromOS(resPtr ret)
|
|||
defined(__sparc__) || \
|
||||
defined(__mips__) || \
|
||||
defined(__sh__) || \
|
||||
defined(__m32r__) || \
|
||||
defined(__mc68000__) || \
|
||||
defined(__arm__) || \
|
||||
defined(__s390__) || \
|
||||
|
|
|
@ -558,7 +558,7 @@ xf86EnableIO(void)
|
|||
#endif
|
||||
}
|
||||
close(fd);
|
||||
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__arm__)
|
||||
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__arm__) && !defined(__m32r__)
|
||||
if (ioperm(0, 1024, 1) || iopl(3)) {
|
||||
if (errno == ENODEV)
|
||||
ErrorF("xf86EnableIOPorts: no I/O ports found\n");
|
||||
|
@ -585,7 +585,7 @@ xf86DisableIO(void)
|
|||
#if defined(__powerpc__)
|
||||
munmap(ioBase, 0x20000);
|
||||
ioBase = NULL;
|
||||
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__arm__) && !defined(__s390__)
|
||||
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__arm__) && !defined(__s390__) && !defined(__m32r__)
|
||||
iopl(0);
|
||||
ioperm(0, 1024, 0);
|
||||
#endif
|
||||
|
|
|
@ -465,7 +465,7 @@ CreateFiles(TreeNode *files)
|
|||
Widget w;
|
||||
char *value;
|
||||
|
||||
value = file->file_logfile ? file->file_logfile : "";
|
||||
value = (file && file->file_logfile) ? file->file_logfile : "";
|
||||
node = NewNode(files, NULL, NULL, files->node,
|
||||
(TreeData*)XtCalloc(1, sizeof(TreeData)));
|
||||
CreateFilesField(node, "LogFile", value);
|
||||
|
@ -509,10 +509,14 @@ UpdateFiles(TreeNode *files)
|
|||
/* LogFile */
|
||||
files = files->child;
|
||||
XtVaGetValues(files->data->files.text, XtNstring, &str, NULL);
|
||||
XtFree(XF86Config->conf_files->file_logfile);
|
||||
if (*str)
|
||||
if (XF86Config->conf_files && XF86Config->conf_files->file_logfile)
|
||||
XtFree(XF86Config->conf_files->file_logfile);
|
||||
if (*str) {
|
||||
if (XF86Config->conf_files == NULL)
|
||||
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
|
||||
XF86Config->conf_files->file_logfile = XtNewString(str);
|
||||
else
|
||||
}
|
||||
else if (XF86Config->conf_files)
|
||||
XF86Config->conf_files->file_logfile = NULL;
|
||||
}
|
||||
|
||||
|
@ -527,10 +531,11 @@ CreateFontPath(TreeNode *fontpath, char *path)
|
|||
if (path == NULL) {
|
||||
if (XF86Font_path) {
|
||||
path = XtNewString(XF86Font_path);
|
||||
if (XF86Config->conf_files && XF86Config->conf_files->file_fontpath) {
|
||||
if (XF86Config->conf_files && XF86Config->conf_files->file_fontpath)
|
||||
XtFree(XF86Config->conf_files->file_fontpath);
|
||||
XF86Config->conf_files->file_fontpath = XtNewString(path);
|
||||
}
|
||||
if (XF86Config->conf_files == NULL)
|
||||
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
|
||||
XF86Config->conf_files->file_fontpath = XtNewString(path);
|
||||
}
|
||||
else if (XF86Config->conf_files && XF86Config->conf_files->file_fontpath)
|
||||
path = XtNewString(XF86Config->conf_files->file_fontpath);
|
||||
|
@ -629,9 +634,14 @@ FontPathChanged(TreeNode *node)
|
|||
pos += len - 2;
|
||||
}
|
||||
|
||||
if (XF86Config->conf_files->file_fontpath)
|
||||
XtFree(XF86Config->conf_files->file_fontpath);
|
||||
XF86Config->conf_files->file_fontpath = fontpath;
|
||||
if (XF86Config->conf_files) {
|
||||
if (XF86Config->conf_files->file_fontpath)
|
||||
XtFree(XF86Config->conf_files->file_fontpath);
|
||||
}
|
||||
else if (fontpath)
|
||||
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
|
||||
if (XF86Config->conf_files)
|
||||
XF86Config->conf_files->file_fontpath = fontpath;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -703,10 +713,11 @@ CreateModulePath(TreeNode *modulepath, char *path)
|
|||
if (path == NULL) {
|
||||
if (XF86Module_path) {
|
||||
path = XtNewString(XF86Module_path);
|
||||
if (XF86Config->conf_files && XF86Config->conf_files->file_modulepath) {
|
||||
if (XF86Config->conf_files == NULL)
|
||||
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
|
||||
else if (XF86Config->conf_files->file_modulepath)
|
||||
XtFree(XF86Config->conf_files->file_modulepath);
|
||||
XF86Config->conf_files->file_modulepath = XtNewString(path);
|
||||
}
|
||||
XF86Config->conf_files->file_modulepath = XtNewString(path);
|
||||
}
|
||||
else if (XF86Config->conf_files && XF86Config->conf_files->file_modulepath)
|
||||
path = XtNewString(XF86Config->conf_files->file_modulepath);
|
||||
|
@ -799,9 +810,14 @@ ModulePathChanged(TreeNode *node)
|
|||
pos += len - 2;
|
||||
}
|
||||
|
||||
if (XF86Config->conf_files->file_modulepath)
|
||||
XtFree(XF86Config->conf_files->file_modulepath);
|
||||
XF86Config->conf_files->file_modulepath = modulepath;
|
||||
if (XF86Config->conf_files) {
|
||||
if (XF86Config->conf_files->file_modulepath)
|
||||
XtFree(XF86Config->conf_files->file_modulepath);
|
||||
}
|
||||
else if (modulepath)
|
||||
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
|
||||
if (XF86Config->conf_files)
|
||||
XF86Config->conf_files->file_modulepath = modulepath;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -921,6 +937,8 @@ NewModuleCallback(Widget unused, XtPointer user_data, XtPointer call_data)
|
|||
DeleteNode(node);
|
||||
load = (XF86LoadPtr)XtCalloc(1, sizeof(XF86LoadRec));
|
||||
load->load_name = XtNewString(label);
|
||||
if (XF86Config->conf_modules == NULL)
|
||||
XF86Config->conf_modules = XtCalloc(1, sizeof(XF86ConfModuleRec));
|
||||
XF86Config->conf_modules->mod_load_lst =
|
||||
xf86addModule(XF86Config->conf_modules->mod_load_lst, load);
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
noinst_LTLIBRARIES = libCGLCore.la
|
||||
AM_CFLAGS = $(XSERVER_CFLAGS) $(DIX_CFLAGS)
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/GL/glx \
|
||||
-I$(top_srcdir)/GL/include \
|
||||
-I$(top_srcdir)/GL/mesa/glapi \
|
||||
-I$(top_srcdir)/hw/xquartz \
|
||||
-I$(top_srcdir)/hw/xquartz/xpr \
|
||||
-I$(top_srcdir)/miext/damage
|
||||
|
||||
libCGLCore_la_SOURCES = \
|
||||
indirect.c
|
|
@ -102,7 +102,7 @@ void warn_func(void * p1, char *format, ...);
|
|||
|
||||
// some prototypes
|
||||
static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen);
|
||||
static __GLXdrawable * __glXAquaScreenCreateDrawable(__GLXscreen *screen, DrawablePtr pDraw, XID drawId, __GLcontextModes *modes);
|
||||
static __GLXdrawable * __glXAquaScreenCreateDrawable(__GLXscreen *screen, DrawablePtr pDraw, XID drawId, __GLXconfig *modes);
|
||||
|
||||
static Bool glAquaInitVisuals(VisualPtr *visualp, DepthPtr *depthp,
|
||||
int *nvisualp, int *ndepthp,
|
||||
|
@ -118,7 +118,7 @@ static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
|
|||
static int __glXAquaContextForceCurrent(__GLXcontext *baseContext);
|
||||
static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
|
||||
|
||||
static CGLPixelFormatObj makeFormat(__GLcontextModes *mode);
|
||||
static CGLPixelFormatObj makeFormat(__GLXconfig *mode);
|
||||
|
||||
__GLXprovider __glXMesaProvider = {
|
||||
__glXAquaScreenProbe,
|
||||
|
@ -141,7 +141,7 @@ struct __GLXAquaScreen {
|
|||
__GLXscreen base;
|
||||
int index;
|
||||
int num_vis;
|
||||
__GLcontextModes *modes;
|
||||
__GLXconfig *modes;
|
||||
};
|
||||
|
||||
static __GLXAquaScreen glAquaScreens[MAXSCREENS];
|
||||
|
@ -162,7 +162,7 @@ struct __GLXAquaDrawable {
|
|||
|
||||
static __GLXcontext *
|
||||
__glXAquaScreenCreateContext(__GLXscreen *screen,
|
||||
__GLcontextModes *modes,
|
||||
__GLXconfig *config,
|
||||
__GLXcontext *baseShareContext)
|
||||
{
|
||||
__GLXAquaContext *context;
|
||||
|
@ -177,7 +177,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
|
|||
memset(context, 0, sizeof *context);
|
||||
|
||||
context->base.pGlxScreen = screen;
|
||||
context->base.modes = modes;
|
||||
context->base.config = config;
|
||||
|
||||
context->base.destroy = __glXAquaContextDestroy;
|
||||
context->base.makeCurrent = __glXAquaContextMakeCurrent;
|
||||
|
@ -186,7 +186,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
|
|||
context->base.forceCurrent = __glXAquaContextForceCurrent;
|
||||
// context->base.createDrawable = __glXAquaContextCreateDrawable;
|
||||
|
||||
context->pixelFormat = makeFormat(modes);
|
||||
context->pixelFormat = makeFormat(config);
|
||||
if (!context->pixelFormat) {
|
||||
free(context);
|
||||
return NULL;
|
||||
|
@ -437,7 +437,7 @@ static GLboolean __glXAquaDrawableSwapBuffers(__GLXdrawable *base) {
|
|||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
|
||||
static CGLPixelFormatObj makeFormat(__GLXconfig *config) {
|
||||
int i;
|
||||
CGLPixelFormatAttribute attr[64]; // currently uses max of 30
|
||||
CGLPixelFormatObj result;
|
||||
|
@ -446,7 +446,7 @@ static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
|
|||
|
||||
GLAQUA_DEBUG_MSG("makeFormat\n");
|
||||
|
||||
if (!mode->rgbMode)
|
||||
if (!config->rgbMode)
|
||||
return NULL;
|
||||
|
||||
i = 0;
|
||||
|
@ -454,42 +454,43 @@ static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
|
|||
// attr [i++] = kCGLPFAAcelerated; // require hwaccel - BAD for multiscreen
|
||||
// attr [i++] = kCGLPFANoRecovery; // disable fallback renderers - BAD
|
||||
|
||||
if (mode->stereoMode) {
|
||||
if (config->stereoMode) {
|
||||
attr[i++] = kCGLPFAStereo;
|
||||
}
|
||||
if (mode->doubleBufferMode) {
|
||||
|
||||
if (config->doubleBufferMode) {
|
||||
attr[i++] = kCGLPFADoubleBuffer;
|
||||
}
|
||||
|
||||
if (mode->colorIndexMode) {
|
||||
if (config->colorIndexMode) {
|
||||
/* ignored */
|
||||
}
|
||||
|
||||
if (mode->rgbMode) {
|
||||
if (config->rgbMode) {
|
||||
attr[i++] = kCGLPFAColorSize;
|
||||
attr[i++] = mode->redBits + mode->greenBits + mode->blueBits;
|
||||
attr[i++] = config->redBits + config->greenBits + config->blueBits;
|
||||
attr[i++] = kCGLPFAAlphaSize;
|
||||
attr[i++] = 1; /* FIXME: ignoring mode->alphaBits which is always 0 */
|
||||
attr[i++] = 1; /* FIXME: ignoring config->alphaBits which is always 0 */
|
||||
}
|
||||
|
||||
if (mode->haveAccumBuffer) {
|
||||
if (config->haveAccumBuffer) {
|
||||
attr[i++] = kCGLPFAAccumSize;
|
||||
attr[i++] = mode->accumRedBits + mode->accumGreenBits
|
||||
+ mode->accumBlueBits + mode->accumAlphaBits;
|
||||
attr[i++] = config->accumRedBits + config->accumGreenBits
|
||||
+ config->accumBlueBits + config->accumAlphaBits;
|
||||
}
|
||||
|
||||
if (mode->haveDepthBuffer) {
|
||||
if (config->haveDepthBuffer) {
|
||||
attr[i++] = kCGLPFADepthSize;
|
||||
attr[i++] = mode->depthBits;
|
||||
attr[i++] = config->depthBits;
|
||||
}
|
||||
|
||||
if (mode->haveStencilBuffer) {
|
||||
if (config->haveStencilBuffer) {
|
||||
attr[i++] = kCGLPFAStencilSize;
|
||||
attr[i++] = mode->stencilBits;
|
||||
attr[i++] = config->stencilBits;
|
||||
}
|
||||
|
||||
attr[i++] = kCGLPFAAuxBuffers;
|
||||
attr[i++] = mode->numAuxBuffers;
|
||||
attr[i++] = config->numAuxBuffers;
|
||||
|
||||
/* mode->level ignored */
|
||||
|
||||
|
@ -670,7 +671,7 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp,
|
|||
VisualPtr pVisual = *visualp;
|
||||
VisualPtr pVisualNew = NULL;
|
||||
VisualID *orig_vid = NULL;
|
||||
__GLcontextModes *modes;
|
||||
__GLXconfig *modes;
|
||||
__GLXvisualConfig *pNewVisualConfigs = NULL;
|
||||
void **glXVisualPriv;
|
||||
void **pNewVisualPriv;
|
||||
|
@ -752,7 +753,7 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp,
|
|||
}
|
||||
|
||||
/* Alloc space for the list of glXVisuals */
|
||||
modes = _gl_context_modes_create(numNewVisuals, sizeof(__GLcontextModes));
|
||||
modes = _gl_context_modes_create(numNewVisuals, sizeof(__GLXconfig));
|
||||
if (modes == NULL) {
|
||||
free(orig_vid);
|
||||
free(pNewVisualPriv);
|
||||
|
@ -925,6 +926,7 @@ Bool enable_stereo = FALSE;
|
|||
/* based on code in i830_dri.c
|
||||
This ends calling glAquaSetVisualConfigs to set the static
|
||||
numconfigs, etc. */
|
||||
// see also glxglcore.c -- bhb
|
||||
static void
|
||||
glAquaInitVisualConfigs(void)
|
||||
{
|
||||
|
@ -1085,7 +1087,7 @@ static void __glXAquaScreenDestroy(__GLXscreen *screen) {
|
|||
static void init_screen_visuals(__GLXAquaScreen *screen) {
|
||||
ScreenPtr pScreen = screen->base.pScreen;
|
||||
|
||||
__GLcontextModes *modes;
|
||||
__GLXconfig *modes;
|
||||
int *used;
|
||||
int i, j;
|
||||
|
||||
|
@ -1101,7 +1103,7 @@ static void init_screen_visuals(__GLXAquaScreen *screen) {
|
|||
memset(used, 0, pScreen->numVisuals * sizeof(int));
|
||||
|
||||
i = 0;
|
||||
for ( modes = screen -> base.modes
|
||||
for ( modes = screen -> base.visuals
|
||||
; modes != NULL
|
||||
; modes = modes->next ) {
|
||||
const int vis_class = _gl_convert_to_x_visual_type( modes->visualType );
|
||||
|
@ -1174,7 +1176,7 @@ static __GLXdrawable *
|
|||
__glXAquaScreenCreateDrawable(__GLXscreen *screen,
|
||||
DrawablePtr pDraw,
|
||||
XID drawId,
|
||||
__GLcontextModes *modes) {
|
||||
__GLXconfig *modes) {
|
||||
__GLXAquaDrawable *glxPriv;
|
||||
|
||||
GLAQUA_DEBUG_MSG("glAquaScreenCreateDrawable(%p,%p,%d,%p)\n", context, pDraw, drawId, modes);
|
||||
|
@ -1184,7 +1186,7 @@ __glXAquaScreenCreateDrawable(__GLXscreen *screen,
|
|||
|
||||
memset(glxPriv, 0, sizeof *glxPriv);
|
||||
|
||||
if (!__glXDrawableInit(&glxPriv->base, screen, pDraw, drawId, modes)) {
|
||||
if (!__glXDrawableInit(&glxPriv->base, screen, pDraw, GLX_DRAWABLE_PIXMAP /*?*/, drawId, modes)) {
|
||||
xfree(glxPriv);
|
||||
return NULL;
|
||||
}
|
|
@ -13,13 +13,12 @@ if X11APP
|
|||
X11APP_SUBDIRS = bundle
|
||||
endif
|
||||
|
||||
SUBDIRS = . xpr $(X11APP_SUBDIRS)
|
||||
DIST_SUBDIRS = xpr bundle
|
||||
SUBDIRS = . GL xpr $(X11APP_SUBDIRS)
|
||||
DIST_SUBDIRS = GL xpr bundle
|
||||
|
||||
libXquartz_la_SOURCES = \
|
||||
$(top_srcdir)/fb/fbcmap_mi.c \
|
||||
$(top_srcdir)/mi/miinitext.c \
|
||||
$(top_srcdir)/Xext/dpmsstubs.c \
|
||||
X11Application.m \
|
||||
X11Controller.m \
|
||||
applewm.c \
|
||||
|
@ -52,4 +51,6 @@ EXTRA_DIST = \
|
|||
quartzForeground.h \
|
||||
quartzKeyboard.h \
|
||||
quartzPasteboard.h \
|
||||
sanitizedCarbon.h \
|
||||
sanitizedCocoa.h \
|
||||
threadSafety.h
|
||||
|
|
|
@ -71,7 +71,7 @@ void X11ApplicationSetCanQuit (int state);
|
|||
void X11ApplicationServerReady (void);
|
||||
void X11ApplicationShowHideMenubar (int state);
|
||||
|
||||
void X11ApplicationMain(int argc, const char **argv, void (*server_thread) (void *), void *server_arg);
|
||||
void X11ApplicationMain(int argc, char **argv, char **envp);
|
||||
|
||||
extern int X11EnableKeyEquivalents;
|
||||
extern int quartzHasRoot, quartzEnableRootless;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "quartzForeground.h"
|
||||
#include "quartzCommon.h"
|
||||
|
||||
#import "X11Application.h"
|
||||
|
||||
# include "darwin.h"
|
||||
|
@ -45,10 +46,16 @@
|
|||
# include "micmap.h"
|
||||
#include <mach/mach.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist"
|
||||
|
||||
#ifndef XSERVER_VERSION
|
||||
#define XSERVER_VERSION "?"
|
||||
#endif
|
||||
|
||||
#define ProximityIn 0
|
||||
#define ProximityOut 1
|
||||
|
||||
int X11EnableKeyEquivalents = TRUE;
|
||||
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
|
||||
|
||||
|
@ -732,19 +739,6 @@ void X11ApplicationShowHideMenubar (int state) {
|
|||
[n release];
|
||||
}
|
||||
|
||||
static pthread_t create_thread (void *func, void *arg) {
|
||||
pthread_attr_t attr;
|
||||
pthread_t tid;
|
||||
|
||||
pthread_attr_init (&attr);
|
||||
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
|
||||
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
|
||||
pthread_create (&tid, &attr, func, arg);
|
||||
pthread_attr_destroy (&attr);
|
||||
|
||||
return tid;
|
||||
}
|
||||
|
||||
static void check_xinitrc (void) {
|
||||
char *tem, buf[1024];
|
||||
NSString *msg;
|
||||
|
@ -786,7 +780,7 @@ environment?", @"Startup xinitrc dialog");
|
|||
[X11App prefs_synchronize];
|
||||
}
|
||||
|
||||
void X11ApplicationMain (int argc, const char **argv, void (*server_thread) (void *), void *server_arg) {
|
||||
void X11ApplicationMain (int argc, char **argv, char **envp) {
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -813,15 +807,8 @@ void X11ApplicationMain (int argc, const char **argv, void (*server_thread) (voi
|
|||
aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) -
|
||||
NSMaxY([[NSScreen mainScreen] visibleFrame]);
|
||||
|
||||
APPKIT_THREAD = pthread_self();
|
||||
SERVER_THREAD = create_thread (server_thread, server_arg);
|
||||
|
||||
if (!SERVER_THREAD) {
|
||||
ErrorF("can't create secondary thread\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
QuartzMoveToForeground();
|
||||
/* Tell the server thread that it can proceed */
|
||||
QuartzInitServer(argc, argv, envp);
|
||||
|
||||
[NSApp run];
|
||||
/* not reached */
|
||||
|
@ -867,34 +854,42 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
|
|||
pointer_y = (screen.origin.y + screen.size.height) - location.y;
|
||||
}
|
||||
|
||||
pointer_y -= aquaMenuBarHeight;
|
||||
|
||||
pressure = 0; // for tablets
|
||||
tilt_x = 0;
|
||||
tilt_y = 0;
|
||||
|
||||
switch (type) {
|
||||
case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse;
|
||||
case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse;
|
||||
case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto handle_mouse;
|
||||
case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto handle_mouse;
|
||||
case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto handle_mouse;
|
||||
case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto handle_mouse;
|
||||
case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto handle_mouse;
|
||||
case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto handle_mouse;
|
||||
case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto handle_mouse;
|
||||
case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto check_subtype;
|
||||
case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto check_subtype;
|
||||
case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto check_subtype;
|
||||
case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto check_subtype;
|
||||
case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto check_subtype;
|
||||
case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto check_subtype;
|
||||
case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto check_subtype;
|
||||
case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto check_subtype;
|
||||
case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto check_subtype;
|
||||
|
||||
check_subtype:
|
||||
if ([e subtype] != NSTabletPointEventSubtype) goto handle_mouse;
|
||||
// fall through to get tablet data
|
||||
case NSTabletPoint:
|
||||
pressure = [e pressure];
|
||||
tilt_x = [e tilt].x;
|
||||
tilt_y = [e tilt].y; // fall through
|
||||
case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
|
||||
handle_mouse:
|
||||
tilt_y = [e tilt].y;
|
||||
// fall through to normal mouse handling
|
||||
|
||||
// if ([e subtype] == NSTabletPointEventSubtype) pressure = [e pressure];
|
||||
case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
|
||||
|
||||
handle_mouse:
|
||||
DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y,
|
||||
pressure, tilt_x, tilt_y);
|
||||
break;
|
||||
|
||||
case NSTabletProximity:
|
||||
DarwinSendProximityEvents([e isEnteringProximity]?ProximityIn:ProximityOut,
|
||||
pointer_x, pointer_y);
|
||||
break;
|
||||
|
||||
case NSScrollWheel:
|
||||
DarwinSendScrollEvents([e deltaX], [e deltaY], pointer_x, pointer_y,
|
||||
pressure, tilt_x, tilt_y);
|
||||
|
|
|
@ -100,6 +100,6 @@
|
|||
|
||||
#endif /* __OBJC__ */
|
||||
|
||||
void X11ControllerMain(int argc, const char **argv, void (*server_thread) (void *), void *server_arg);
|
||||
void X11ControllerMain(int argc, char **argv, char **envp);
|
||||
|
||||
#endif /* X11CONTROLLER_H */
|
||||
|
|
|
@ -756,6 +756,6 @@ objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
|
|||
|
||||
@end
|
||||
|
||||
void X11ControllerMain(int argc, const char **argv, void (*server_thread) (void *), void *server_arg) {
|
||||
X11ApplicationMain (argc, argv, server_thread, server_arg);
|
||||
void X11ControllerMain(int argc, char **argv, char **envp) {
|
||||
X11ApplicationMain (argc, argv, envp);
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -1,10 +1,9 @@
|
|||
/**************************************************************
|
||||
*
|
||||
* Shared code for the Darwin X Server
|
||||
* running with Quartz or IOKit display mode
|
||||
* Xquartz initialization code
|
||||
*
|
||||
* Copyright (c) 2007-2008 Apple Inc.
|
||||
* Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved.
|
||||
* Copyright (c) 2007 Apple Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
@ -110,6 +109,7 @@ int darwinFakeMouse3Mask = NX_COMMANDMASK;
|
|||
|
||||
// devices
|
||||
DeviceIntPtr darwinPointer = NULL;
|
||||
DeviceIntPtr darwinTablet = NULL;
|
||||
DeviceIntPtr darwinKeyboard = NULL;
|
||||
|
||||
// Common pixmap formats
|
||||
|
@ -330,14 +330,13 @@ static void DarwinChangePointerControl(
|
|||
#endif
|
||||
|
||||
/*
|
||||
* DarwinMouseProc
|
||||
* Handle the initialization, etc. of a mouse
|
||||
* DarwinMouseProc: Handle the initialization, etc. of a mouse
|
||||
*/
|
||||
static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
|
||||
// 7 buttons: left, right, middle, then four scroll wheel "buttons"
|
||||
CARD8 map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||
|
||||
switch (what) {
|
||||
|
||||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
|
@ -345,15 +344,13 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
|
|||
InitPointerDeviceStruct((DevicePtr)pPointer, map, 7,
|
||||
GetMotionHistory,
|
||||
(PtrCtrlProcPtr)NoopDDA,
|
||||
GetMotionHistorySize(), 7);
|
||||
InitProximityClassDeviceStruct(pPointer);
|
||||
GetMotionHistorySize(), 2);
|
||||
pPointer->name = strdup("Quartz Pointing Device");
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
pPointer->public.on = TRUE;
|
||||
AddEnabledDevice( darwinEventReadFD );
|
||||
return Success;
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
|
@ -364,6 +361,34 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
|
|||
return Success;
|
||||
}
|
||||
|
||||
static int DarwinTabletProc(DeviceIntPtr pPointer, int what) {
|
||||
CARD8 map[4] = {0, 1, 2, 3};
|
||||
|
||||
switch (what) {
|
||||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
// Set button map.
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer, map, 3,
|
||||
GetMotionHistory,
|
||||
(PtrCtrlProcPtr)NoopDDA,
|
||||
GetMotionHistorySize(), 7);
|
||||
InitProximityClassDeviceStruct(pPointer);
|
||||
// InitAbsoluteClassDeviceStruct(pPointer);
|
||||
pPointer->name = strdup("pen");
|
||||
break;
|
||||
case DEVICE_ON:
|
||||
pPointer->public.on = TRUE;
|
||||
AddEnabledDevice( darwinEventReadFD );
|
||||
return Success;
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
RemoveEnabledDevice(darwinEventReadFD);
|
||||
return Success;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* DarwinKeybdProc
|
||||
|
@ -374,6 +399,7 @@ static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff )
|
|||
switch ( onoff ) {
|
||||
case DEVICE_INIT:
|
||||
DarwinKeyboardInit( pDev );
|
||||
pDev->name = strdup("Quartz Keyboard");
|
||||
break;
|
||||
case DEVICE_ON:
|
||||
pDev->public.on = TRUE;
|
||||
|
@ -499,10 +525,13 @@ void InitInput( int argc, char **argv )
|
|||
darwinPointer = AddInputDevice(DarwinMouseProc, TRUE);
|
||||
RegisterPointerDevice( darwinPointer );
|
||||
|
||||
darwinTablet = AddInputDevice(DarwinTabletProc, TRUE);
|
||||
RegisterPointerDevice( darwinTablet );
|
||||
|
||||
darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE);
|
||||
RegisterKeyboardDevice( darwinKeyboard );
|
||||
|
||||
DarwinEQInit( (DevicePtr)darwinKeyboard, (DevicePtr)darwinPointer );
|
||||
DarwinEQInit();
|
||||
|
||||
QuartzInitInput(argc, argv);
|
||||
}
|
||||
|
@ -533,8 +562,7 @@ DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
|
|||
/* Find leftmost screen. If there's a tie, take the topmost of the two. */
|
||||
for (i = 1; i < pScreenInfo->numScreens; i++) {
|
||||
if (dixScreenOrigins[i].x < left ||
|
||||
(dixScreenOrigins[i].x == left &&
|
||||
dixScreenOrigins[i].y < top))
|
||||
(dixScreenOrigins[i].x == left && dixScreenOrigins[i].y < top))
|
||||
{
|
||||
left = dixScreenOrigins[i].x;
|
||||
top = dixScreenOrigins[i].y;
|
||||
|
@ -544,16 +572,19 @@ DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
|
|||
darwinMainScreenX = left;
|
||||
darwinMainScreenY = top;
|
||||
|
||||
DEBUG_LOG("top = %d, left=%d\n", top, left);
|
||||
|
||||
/* Shift all screens so that there is a screen whose top left
|
||||
is at X11 (0,0) and at global screen coordinate
|
||||
(darwinMainScreenX, darwinMainScreenY). */
|
||||
* is at X11 (0,0) and at global screen coordinate
|
||||
* (darwinMainScreenX, darwinMainScreenY).
|
||||
*/
|
||||
|
||||
if (darwinMainScreenX != 0 || darwinMainScreenY != 0) {
|
||||
for (i = 0; i < pScreenInfo->numScreens; i++) {
|
||||
dixScreenOrigins[i].x -= darwinMainScreenX;
|
||||
dixScreenOrigins[i].y -= darwinMainScreenY;
|
||||
/* ErrorF("Screen %d placed at X11 coordinate (%d,%d).\n",
|
||||
i, dixScreenOrigins[i].x, dixScreenOrigins[i].y); */
|
||||
DEBUG_LOG("Screen %d placed at X11 coordinate (%d,%d).\n",
|
||||
i, dixScreenOrigins[i].x, dixScreenOrigins[i].y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,6 +71,7 @@ extern io_connect_t darwinParamConnect;
|
|||
extern int darwinEventReadFD;
|
||||
extern int darwinEventWriteFD;
|
||||
extern DeviceIntPtr darwinPointer;
|
||||
extern DeviceIntPtr darwinTablet;
|
||||
extern DeviceIntPtr darwinKeyboard;
|
||||
|
||||
// User preferences
|
||||
|
@ -88,38 +89,6 @@ extern int darwinDesiredRefresh;
|
|||
extern int darwinMainScreenX;
|
||||
extern int darwinMainScreenY;
|
||||
|
||||
|
||||
/*
|
||||
* Special ddx events understood by the X server
|
||||
*/
|
||||
enum {
|
||||
kXquartzReloadKeymap // Reload system keymap
|
||||
= LASTEvent+1, // (from X.h list of event names)
|
||||
kXquartzActivate, // restore X drawing and cursor
|
||||
kXquartzDeactivate, // clip X drawing and switch to Aqua cursor
|
||||
kXquartzSetRootClip, // enable or disable drawing to the X screen
|
||||
kXquartzQuit, // kill the X server and release the display
|
||||
kXquartzReadPasteboard, // copy Mac OS X pasteboard into X cut buffer
|
||||
kXquartzWritePasteboard, // copy X cut buffer onto Mac OS X pasteboard
|
||||
kXquartzBringAllToFront, // bring all X windows to front
|
||||
kXquartzToggleFullscreen, // Enable/Disable fullscreen mode
|
||||
kXquartzSetRootless, // Set rootless mode
|
||||
kXquartzSpaceChanged, // Spaces changed
|
||||
/*
|
||||
* AppleWM events
|
||||
*/
|
||||
kXquartzControllerNotify, // send an AppleWMControllerNotify event
|
||||
kXquartzPasteboardNotify, // notify the WM to copy or paste
|
||||
/*
|
||||
* Xplugin notification events
|
||||
*/
|
||||
kXquartzDisplayChanged, // display configuration has changed
|
||||
kXquartzWindowState, // window visibility state has changed
|
||||
kXquartzWindowMoved, // window has moved on screen
|
||||
};
|
||||
|
||||
void DarwinSendDDXEvent(int type, int argc, ...);
|
||||
|
||||
#define ENABLE_DEBUG_LOG 1
|
||||
|
||||
#ifdef ENABLE_DEBUG_LOG
|
||||
|
@ -130,4 +99,6 @@ extern FILE *debug_log_fp;
|
|||
#define DEBUG_LOG(msg, args...)
|
||||
#endif
|
||||
|
||||
#define TRACE() DEBUG_LOG("\n")
|
||||
|
||||
#endif /* _DARWIN_H */
|
||||
|
|
|
@ -65,6 +65,10 @@ in this Software without prior written authorization from The Open Group.
|
|||
#define SCROLLWHEELLEFTFAKE 6
|
||||
#define SCROLLWHEELRIGHTFAKE 7
|
||||
|
||||
/* These values were chosen to match the output of xinput under Linux */
|
||||
#define SCALEFACTOR_TILT 64.0
|
||||
#define SCALEFACTOR_PRESSURE 1000.0
|
||||
|
||||
#define _APPLEWM_SERVER_
|
||||
#include "applewmExt.h"
|
||||
#include <X11/extensions/applewm.h>
|
||||
|
@ -78,7 +82,8 @@ static int old_flags = 0; // last known modifier state
|
|||
|
||||
xEvent *darwinEvents = NULL;
|
||||
|
||||
pthread_mutex_t mieqEnqueue_mutex;
|
||||
pthread_mutex_t mieqEnqueue_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
static inline void mieqEnqueue_lock(void) {
|
||||
int err;
|
||||
if((err = pthread_mutex_lock(&mieqEnqueue_mutex))) {
|
||||
|
@ -302,18 +307,12 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in
|
|||
}
|
||||
}
|
||||
|
||||
Bool DarwinEQInit(DevicePtr pKbd, DevicePtr pPtr) {
|
||||
int err;
|
||||
|
||||
Bool DarwinEQInit(void) {
|
||||
if (!darwinEvents)
|
||||
darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
|
||||
if (!darwinEvents)
|
||||
FatalError("Couldn't allocate event buffer\n");
|
||||
|
||||
if((err = pthread_mutex_init(&mieqEnqueue_mutex, NULL))) {
|
||||
FatalError("Couldn't allocate mieqEnqueue mutex: %d.\n", err);
|
||||
}
|
||||
|
||||
mieqInit();
|
||||
mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler);
|
||||
mieqSetHandler(kXquartzActivate, DarwinEventHandler);
|
||||
|
@ -366,25 +365,23 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
|
|||
static int darwinFakeMouseButtonDown = 0;
|
||||
static int darwinFakeMouseButtonMask = 0;
|
||||
int i, num_events;
|
||||
DeviceIntPtr dev;
|
||||
|
||||
// DEBUG_LOG("x=%d, y=%d, p=%f, tx=%f, ty=%f\n", pointer_x, pointer_y, pressure, tilt_x, tilt_y);
|
||||
|
||||
if(!darwinEvents) {
|
||||
ErrorF("DarwinSendPointerEvents called before darwinEvents was initialized\n");
|
||||
return;
|
||||
}
|
||||
/* I can't find a spec for this, but at least GTK expects that tablets are
|
||||
just like mice, except they have either one or three extra valuators, in this
|
||||
order:
|
||||
|
||||
X coord, Y coord, pressure, X tilt, Y tilt
|
||||
Pressure and tilt should be represented natively as floats; unfortunately,
|
||||
we can't do that. Again, GTK seems to record the min/max of each valuator,
|
||||
and then perform scaling back to float itself using that info. Soo.... */
|
||||
int valuators[5] = {pointer_x, pointer_y, pressure * SCALEFACTOR_PRESSURE,
|
||||
tilt_x * SCALEFACTOR_TILT, tilt_y * SCALEFACTOR_TILT};
|
||||
|
||||
int valuators[5] = {pointer_x, pointer_y,
|
||||
pressure * INT32_MAX * 1.0f,
|
||||
tilt_x * INT32_MAX * 1.0f,
|
||||
tilt_y * INT32_MAX * 1.0f};
|
||||
if (pressure == 0 && tilt_x == 0 && tilt_y == 0) dev = darwinPointer;
|
||||
else dev = darwinTablet;
|
||||
|
||||
DEBUG_LOG("Valuators: {%d,%d,%d,%d,%d}\n",
|
||||
valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]);
|
||||
if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
|
||||
// Mimic multi-button mouse with modifier-clicks
|
||||
// If both sets of modifiers are pressed,
|
||||
|
@ -417,9 +414,9 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin
|
|||
}
|
||||
|
||||
mieqEnqueue_lock(); {
|
||||
num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button,
|
||||
POINTER_ABSOLUTE, 0, 5, valuators);
|
||||
for(i=0; i<num_events; i++) mieqEnqueue (darwinPointer,&darwinEvents[i]);
|
||||
num_events = GetPointerEvents(darwinEvents, dev, ev_type, ev_button,
|
||||
POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
|
||||
for(i=0; i<num_events; i++) mieqEnqueue (dev,&darwinEvents[i]);
|
||||
DarwinPokeEQ();
|
||||
|
||||
} mieqEnqueue_unlock();
|
||||
|
@ -453,23 +450,23 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) {
|
|||
} mieqEnqueue_unlock();
|
||||
}
|
||||
|
||||
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y,
|
||||
float pressure, float tilt_x, float tilt_y) {
|
||||
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) {
|
||||
int i, num_events;
|
||||
int valuators[5] = {pointer_x, pointer_y,
|
||||
pressure * INT32_MAX * 1.0f,
|
||||
tilt_x * INT32_MAX * 1.0f,
|
||||
tilt_y * INT32_MAX * 1.0f};
|
||||
|
||||
// tilt and pressure have no meaning for a Prox event
|
||||
int valuators[5] = {pointer_x, pointer_y, 0, 0, 0};
|
||||
|
||||
DEBUG_LOG("DarwinSendProximityEvents(%d, %d, %d)\n", ev_type, pointer_x, pointer_y);
|
||||
|
||||
if(!darwinEvents) {
|
||||
ErrorF("DarwinSendProximityvents called before darwinEvents was initialized\n");
|
||||
ErrorF("DarwinSendProximityEvents called before darwinEvents was initialized\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mieqEnqueue_lock(); {
|
||||
num_events = GetProximityEvents(darwinEvents, darwinPointer, ev_type,
|
||||
num_events = GetProximityEvents(darwinEvents, darwinTablet, ev_type,
|
||||
0, 5, valuators);
|
||||
for(i=0; i<num_events; i++) mieqEnqueue (darwinPointer,&darwinEvents[i]);
|
||||
for(i=0; i<num_events; i++) mieqEnqueue (darwinTablet,&darwinEvents[i]);
|
||||
DarwinPokeEQ();
|
||||
} mieqEnqueue_unlock();
|
||||
}
|
||||
|
|
|
@ -28,17 +28,48 @@
|
|||
#ifndef _DARWIN_EVENTS_H
|
||||
#define _DARWIN_EVENTS_H
|
||||
|
||||
Bool DarwinEQInit(DevicePtr pKbd, DevicePtr pPtr);
|
||||
Bool DarwinEQInit(void);
|
||||
void DarwinEQEnqueue(const xEventPtr e);
|
||||
void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e);
|
||||
void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
|
||||
void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y,
|
||||
float pressure, float tilt_x, float tilt_y);
|
||||
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y,
|
||||
float pressure, float tilt_x, float tilt_y);
|
||||
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y);
|
||||
void DarwinSendKeyboardEvents(int ev_type, int keycode);
|
||||
void DarwinSendScrollEvents(float count_x, float count_y, int pointer_x, int pointer_y,
|
||||
float pressure, float tilt_x, float tilt_y);
|
||||
void DarwinUpdateModKeys(int flags);
|
||||
|
||||
/*
|
||||
* Special ddx events understood by the X server
|
||||
*/
|
||||
enum {
|
||||
kXquartzReloadKeymap // Reload system keymap
|
||||
= LASTEvent+1, // (from X.h list of event names)
|
||||
kXquartzActivate, // restore X drawing and cursor
|
||||
kXquartzDeactivate, // clip X drawing and switch to Aqua cursor
|
||||
kXquartzSetRootClip, // enable or disable drawing to the X screen
|
||||
kXquartzQuit, // kill the X server and release the display
|
||||
kXquartzReadPasteboard, // copy Mac OS X pasteboard into X cut buffer
|
||||
kXquartzWritePasteboard, // copy X cut buffer onto Mac OS X pasteboard
|
||||
kXquartzBringAllToFront, // bring all X windows to front
|
||||
kXquartzToggleFullscreen, // Enable/Disable fullscreen mode
|
||||
kXquartzSetRootless, // Set rootless mode
|
||||
kXquartzSpaceChanged, // Spaces changed
|
||||
/*
|
||||
* AppleWM events
|
||||
*/
|
||||
kXquartzControllerNotify, // send an AppleWMControllerNotify event
|
||||
kXquartzPasteboardNotify, // notify the WM to copy or paste
|
||||
/*
|
||||
* Xplugin notification events
|
||||
*/
|
||||
kXquartzDisplayChanged, // display configuration has changed
|
||||
kXquartzWindowState, // window visibility state has changed
|
||||
kXquartzWindowMoved, // window has moved on screen
|
||||
};
|
||||
|
||||
/* Send one of the above events to the server thread. */
|
||||
void DarwinSendDDXEvent(int type, int argc, ...);
|
||||
|
||||
#endif /* _DARWIN_EVENTS_H */
|
||||
|
|
|
@ -37,6 +37,7 @@ Equipment Corporation.
|
|||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "darwin.h"
|
||||
#include "pseudoramiX.h"
|
||||
#include "extnsionst.h"
|
||||
#include "dixstruct.h"
|
||||
|
@ -99,6 +100,8 @@ PseudoramiXAddScreen(int x, int y, int w, int h)
|
|||
sizeof(PseudoramiXScreenRec));
|
||||
}
|
||||
|
||||
DEBUG_LOG("x: %d, y: %d, w: %d, h: %d\n", x, y, w, h);
|
||||
|
||||
s = &pseudoramiXScreens[pseudoramiXNumScreens++];
|
||||
s->x = x;
|
||||
s->y = y;
|
||||
|
@ -116,6 +119,8 @@ void PseudoramiXExtensionInit(int argc, char *argv[])
|
|||
|
||||
if (noPseudoramiXExtension) return;
|
||||
|
||||
TRACE();
|
||||
|
||||
/* Even with only one screen we need to enable PseudoramiX to allow
|
||||
dynamic screen configuration changes. */
|
||||
#if 0
|
||||
|
@ -153,12 +158,16 @@ void PseudoramiXExtensionInit(int argc, char *argv[])
|
|||
|
||||
void PseudoramiXResetScreens(void)
|
||||
{
|
||||
TRACE();
|
||||
|
||||
pseudoramiXNumScreens = 0;
|
||||
}
|
||||
|
||||
|
||||
static void PseudoramiXResetProc(ExtensionEntry *extEntry)
|
||||
{
|
||||
TRACE();
|
||||
|
||||
PseudoramiXResetScreens();
|
||||
}
|
||||
|
||||
|
@ -166,6 +175,8 @@ static void PseudoramiXResetProc(ExtensionEntry *extEntry)
|
|||
// was PanoramiX
|
||||
static int ProcPseudoramiXQueryVersion(ClientPtr client)
|
||||
{
|
||||
TRACE();
|
||||
|
||||
return ProcPanoramiXQueryVersion(client);
|
||||
}
|
||||
|
||||
|
@ -178,6 +189,8 @@ static int ProcPseudoramiXGetState(ClientPtr client)
|
|||
xPanoramiXGetStateReply rep;
|
||||
register int n, rc;
|
||||
|
||||
TRACE();
|
||||
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
|
@ -205,6 +218,8 @@ static int ProcPseudoramiXGetScreenCount(ClientPtr client)
|
|||
xPanoramiXGetScreenCountReply rep;
|
||||
register int n, rc;
|
||||
|
||||
TRACE();
|
||||
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
|
@ -232,6 +247,8 @@ static int ProcPseudoramiXGetScreenSize(ClientPtr client)
|
|||
xPanoramiXGetScreenSizeReply rep;
|
||||
register int n, rc;
|
||||
|
||||
TRACE();
|
||||
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
|
||||
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
|
||||
if (rc != Success)
|
||||
|
@ -262,6 +279,8 @@ static int ProcPseudoramiXIsActive(ClientPtr client)
|
|||
/* REQUEST(xXineramaIsActiveReq); */
|
||||
xXineramaIsActiveReply rep;
|
||||
|
||||
TRACE();
|
||||
|
||||
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
|
||||
|
||||
rep.type = X_Reply;
|
||||
|
@ -285,6 +304,8 @@ static int ProcPseudoramiXQueryScreens(ClientPtr client)
|
|||
/* REQUEST(xXineramaQueryScreensReq); */
|
||||
xXineramaQueryScreensReply rep;
|
||||
|
||||
DEBUG_LOG("noPseudoramiXExtension=%d, pseudoramiXNumScreens=%d\n", noPseudoramiXExtension, pseudoramiXNumScreens);
|
||||
|
||||
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
|
||||
|
||||
rep.type = X_Reply;
|
||||
|
@ -327,6 +348,7 @@ static int ProcPseudoramiXQueryScreens(ClientPtr client)
|
|||
// was PanoramiX
|
||||
static int ProcPseudoramiXDispatch (ClientPtr client)
|
||||
{ REQUEST(xReq);
|
||||
TRACE();
|
||||
switch (stuff->data)
|
||||
{
|
||||
case X_PanoramiXQueryVersion:
|
||||
|
@ -353,6 +375,8 @@ SProcPseudoramiXQueryVersion (ClientPtr client)
|
|||
REQUEST(xPanoramiXQueryVersionReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps(&stuff->length,n);
|
||||
REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
|
||||
return ProcPseudoramiXQueryVersion(client);
|
||||
|
@ -364,6 +388,8 @@ SProcPseudoramiXGetState(ClientPtr client)
|
|||
REQUEST(xPanoramiXGetStateReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
|
||||
return ProcPseudoramiXGetState(client);
|
||||
|
@ -375,6 +401,8 @@ SProcPseudoramiXGetScreenCount(ClientPtr client)
|
|||
REQUEST(xPanoramiXGetScreenCountReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
|
||||
return ProcPseudoramiXGetScreenCount(client);
|
||||
|
@ -386,6 +414,8 @@ SProcPseudoramiXGetScreenSize(ClientPtr client)
|
|||
REQUEST(xPanoramiXGetScreenSizeReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
|
||||
return ProcPseudoramiXGetScreenSize(client);
|
||||
|
@ -398,6 +428,8 @@ SProcPseudoramiXIsActive(ClientPtr client)
|
|||
REQUEST(xXineramaIsActiveReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
|
||||
return ProcPseudoramiXIsActive(client);
|
||||
|
@ -410,6 +442,8 @@ SProcPseudoramiXQueryScreens(ClientPtr client)
|
|||
REQUEST(xXineramaQueryScreensReq);
|
||||
register int n;
|
||||
|
||||
TRACE();
|
||||
|
||||
swaps (&stuff->length, n);
|
||||
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
|
||||
return ProcPseudoramiXQueryScreens(client);
|
||||
|
@ -419,6 +453,9 @@ SProcPseudoramiXQueryScreens(ClientPtr client)
|
|||
static int
|
||||
SProcPseudoramiXDispatch (ClientPtr client)
|
||||
{ REQUEST(xReq);
|
||||
|
||||
TRACE();
|
||||
|
||||
switch (stuff->data)
|
||||
{
|
||||
case X_PanoramiXQueryVersion:
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include "quartz.h"
|
||||
#include "darwin.h"
|
||||
#include "darwinEvents.h"
|
||||
#include "quartzAudio.h"
|
||||
#include "pseudoramiX.h"
|
||||
#define _APPLEWM_SERVER_
|
||||
#include "applewmExt.h"
|
||||
|
@ -156,10 +155,6 @@ void QuartzInitOutput(
|
|||
int argc,
|
||||
char **argv )
|
||||
{
|
||||
if (serverGeneration == 0) {
|
||||
QuartzAudioInit();
|
||||
}
|
||||
|
||||
if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
|
||||
QuartzWakeupHandler,
|
||||
NULL))
|
||||
|
@ -244,7 +239,7 @@ void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev,
|
|||
int x, y, width, height, sx, sy;
|
||||
xEvent e;
|
||||
|
||||
DEBUG_LOG("QuartzDisplayChangedHandler()\n");
|
||||
DEBUG_LOG("QuartzDisplayChangedHandler(): noPseudoramiXExtension=%d, screenInfo.numScreens=%d\n", noPseudoramiXExtension, screenInfo.numScreens);
|
||||
if (noPseudoramiXExtension || screenInfo.numScreens != 1)
|
||||
{
|
||||
/* FIXME: if not using Xinerama, we have multiple screens, and
|
||||
|
|
|
@ -128,6 +128,7 @@ Bool QuartzAddScreen(int index, ScreenPtr pScreen);
|
|||
Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
|
||||
void QuartzInitOutput(int argc,char **argv);
|
||||
void QuartzInitInput(int argc, char **argv);
|
||||
void QuartzInitServer(int argc, char **argv, char **envp);
|
||||
void QuartzGiveUp(void);
|
||||
void QuartzProcessEvent(xEvent *xe);
|
||||
void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents);
|
||||
|
|
|
@ -44,8 +44,6 @@
|
|||
|
||||
#include "darwin.h"
|
||||
|
||||
#include "pseudoramiX.h"
|
||||
|
||||
extern void FatalError(const char *, ...);
|
||||
extern char *display;
|
||||
extern int noPanoramiXExtension;
|
||||
|
|
|
@ -37,42 +37,72 @@
|
|||
#include <unistd.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include "quartzCommon.h"
|
||||
#include "quartzForeground.h"
|
||||
#include "X11Controller.h"
|
||||
#include "darwin.h"
|
||||
#include "darwinEvents.h"
|
||||
#include "quartzAudio.h"
|
||||
#include "quartz.h"
|
||||
#include "opaque.h"
|
||||
#include "micmap.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
char **envpGlobal; // argcGlobal and argvGlobal
|
||||
// are from dix/globals.c
|
||||
#include <pthread.h>
|
||||
|
||||
int main(int argc, char **argv, char **envp);
|
||||
void _InitHLTB(void);
|
||||
void DarwinHandleGUI(int argc, char **argv, char **envp);
|
||||
int dix_main(int argc, char **argv, char **envp);
|
||||
|
||||
struct arg {
|
||||
int argc;
|
||||
char **argv;
|
||||
char **envp;
|
||||
};
|
||||
|
||||
static void server_thread (void *arg) {
|
||||
exit (main (argcGlobal, argvGlobal, envpGlobal));
|
||||
struct arg args = *((struct arg *)arg);
|
||||
free(arg);
|
||||
exit (dix_main(args.argc, args.argv, args.envp));
|
||||
}
|
||||
|
||||
/*
|
||||
* DarwinHandleGUI
|
||||
* This function is called first from main(). The first time
|
||||
* it is called we start the Mac OS X front end. The front end
|
||||
* will call main() again from another thread to run the X
|
||||
* server. On the second call this function loads the user
|
||||
* preferences set by the Mac OS X front end.
|
||||
*/
|
||||
void DarwinHandleGUI(int argc, char **argv, char **envp) {
|
||||
static Bool been_here = FALSE;
|
||||
static pthread_t create_thread (void *func, void *arg) {
|
||||
pthread_attr_t attr;
|
||||
pthread_t tid;
|
||||
|
||||
pthread_attr_init (&attr);
|
||||
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
|
||||
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
|
||||
pthread_create (&tid, &attr, func, arg);
|
||||
pthread_attr_destroy (&attr);
|
||||
|
||||
return tid;
|
||||
}
|
||||
|
||||
void QuartzInitServer(int argc, char **argv, char **envp) {
|
||||
struct arg *args = (struct arg*)malloc(sizeof(struct arg));
|
||||
if(!args)
|
||||
FatalError("Could not allocate memory.\n");
|
||||
|
||||
args->argc = argc;
|
||||
args->argv = argv;
|
||||
args->envp = envp;
|
||||
|
||||
APPKIT_THREAD_ID = pthread_self();
|
||||
SERVER_THREAD_ID = create_thread(server_thread, args);
|
||||
|
||||
if (!SERVER_THREAD_ID) {
|
||||
FatalError("can't create secondary thread\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv, char **envp) {
|
||||
int i;
|
||||
int fd[2];
|
||||
|
||||
if (been_here) {
|
||||
return;
|
||||
}
|
||||
been_here = TRUE;
|
||||
/* Unset CFProcessPath, so our children don't inherit this kludge we need
|
||||
* to load our nib. If an xterm gets this set, then it fails to
|
||||
* 'open hi.txt' properly.
|
||||
*/
|
||||
unsetenv("CFProcessPath");
|
||||
|
||||
// Make a pipe to pass events
|
||||
assert( pipe(fd) == 0 );
|
||||
|
@ -80,11 +110,6 @@ void DarwinHandleGUI(int argc, char **argv, char **envp) {
|
|||
darwinEventWriteFD = fd[1];
|
||||
fcntl(darwinEventReadFD, F_SETFL, O_NONBLOCK);
|
||||
|
||||
// Store command line arguments to pass back to main()
|
||||
argcGlobal = argc;
|
||||
argvGlobal = argv;
|
||||
envpGlobal = envp;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
// Display version info without starting Mac OS X UI if requested
|
||||
if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) {
|
||||
|
@ -93,16 +118,10 @@ void DarwinHandleGUI(int argc, char **argv, char **envp) {
|
|||
}
|
||||
}
|
||||
|
||||
/* Initially I ran the X server on the main thread, and received
|
||||
events on the second thread. But now we may be using Carbon,
|
||||
that needs to run on the main thread. (Otherwise, when it's
|
||||
prebound, it will initialize itself on the wrong thread)
|
||||
/* Create the audio mutex */
|
||||
QuartzAudioInit();
|
||||
|
||||
grr.. but doing that means that if the X thread gets scheduled
|
||||
before the main thread when we're _not_ prebound, things fail,
|
||||
so initialize by hand. */
|
||||
|
||||
_InitHLTB();
|
||||
X11ControllerMain(argc, (const char **)argv, server_thread, NULL);
|
||||
QuartzMoveToForeground();
|
||||
X11ControllerMain(argc, argv, envp);
|
||||
exit(0);
|
||||
}
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
|
||||
#include <execinfo.h>
|
||||
|
||||
pthread_t SERVER_THREAD;
|
||||
pthread_t APPKIT_THREAD;
|
||||
pthread_t APPKIT_THREAD_ID;
|
||||
pthread_t SERVER_THREAD_ID;
|
||||
|
||||
void spewCallStack(void) {
|
||||
void* callstack[128];
|
||||
|
@ -48,7 +48,7 @@ void spewCallStack(void) {
|
|||
free(strs);
|
||||
}
|
||||
|
||||
void _threadAssert(pthread_t tid, const char *file, const char *fun, int line) {
|
||||
void _threadSafetyAssert(pthread_t tid, const char *file, const char *fun, int line) {
|
||||
if(pthread_equal(pthread_self(), tid))
|
||||
return;
|
||||
|
||||
|
@ -58,3 +58,13 @@ void _threadAssert(pthread_t tid, const char *file, const char *fun, int line) {
|
|||
file, fun, line);
|
||||
spewCallStack();
|
||||
}
|
||||
|
||||
const char *threadSafetyID(pthread_t tid) {
|
||||
if(pthread_equal(tid, APPKIT_THREAD_ID)) {
|
||||
return "Appkit Thread";
|
||||
} else if(pthread_equal(tid, SERVER_THREAD_ID)) {
|
||||
return "Xserver Thread";
|
||||
} else {
|
||||
return "Unknown Thread";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,22 +31,23 @@
|
|||
|
||||
#include <pthread.h>
|
||||
|
||||
extern pthread_t SERVER_THREAD;
|
||||
extern pthread_t APPKIT_THREAD;
|
||||
|
||||
#define threadSafetyID(tid) (pthread_equal((tid), SERVER_THREAD) ? "X Server Thread" : "Appkit Thread")
|
||||
extern pthread_t APPKIT_THREAD_ID;
|
||||
extern pthread_t SERVER_THREAD_ID;
|
||||
|
||||
/* Dump the call stack */
|
||||
void spewCallStack(void);
|
||||
|
||||
/* Print message to ErrorF if we're in the wrong thread */
|
||||
void _threadAssert(pthread_t tid, const char *file, const char *fun, int line);
|
||||
void _threadSafetyAssert(pthread_t tid, const char *file, const char *fun, int line);
|
||||
|
||||
#define threadAssert(tid) _threadAssert(tid, __FILE__, __FUNCTION__, __LINE__)
|
||||
/* Get a string that identifies our thread nicely */
|
||||
const char *threadSafetyID(pthread_t tid);
|
||||
|
||||
#define threadSafetyAssert(tid) _threadSafetyAssert(tid, __FILE__, __FUNCTION__, __LINE__)
|
||||
|
||||
#ifdef DEBUG_THREADS
|
||||
#define TA_SERVER() threadAssert(SERVER_THREAD)
|
||||
#define TA_APPKIT() threadAssert(APPKIT_THREAD)
|
||||
#define TA_APPKIT() threadSafetyAssert(APPKIT_THREAD_ID)
|
||||
#define TA_SERVER() threadSafetyAssert(SERVER_THREAD_ID)
|
||||
#else
|
||||
#define TA_SERVER()
|
||||
#define TA_APPKIT()
|
||||
|
|
|
@ -21,23 +21,6 @@ Xquartz_SOURCES = \
|
|||
Xquartz_LDADD = \
|
||||
$(top_builddir)/hw/xquartz/libXquartz.la \
|
||||
$(top_builddir)/dix/dixfonts.lo \
|
||||
$(top_builddir)/config/libconfig.a \
|
||||
$(top_builddir)/dix/libdix.la \
|
||||
$(top_builddir)/os/libos.la \
|
||||
$(top_builddir)/dix/libxpstubs.la \
|
||||
$(top_builddir)/miext/shadow/libshadow.la \
|
||||
$(top_builddir)/fb/libfb.la \
|
||||
$(top_builddir)/mi/libmi.la \
|
||||
$(top_builddir)/damageext/libdamageext.la \
|
||||
$(top_builddir)/miext/damage/libdamage.la \
|
||||
$(top_builddir)/xfixes/libxfixes.la \
|
||||
$(top_builddir)/Xext/libXext.la \
|
||||
$(top_builddir)/xkb/libxkb.la \
|
||||
$(top_builddir)/xkb/libxkbstubs.la \
|
||||
$(top_builddir)/Xi/libXi.la \
|
||||
$(top_builddir)/dbe/libdbe.la \
|
||||
$(top_builddir)/record/librecord.la \
|
||||
$(top_builddir)/XTrap/libxtrap.la \
|
||||
$(top_builddir)/miext/rootless/librootless.la \
|
||||
$(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin
|
||||
|
||||
|
@ -64,6 +47,7 @@ include $(top_srcdir)/cpprules.in
|
|||
cp $< $@
|
||||
|
||||
EXTRA_DIST = \
|
||||
Xquartz.man.pre \
|
||||
dri.h \
|
||||
dristruct.h \
|
||||
appledri.h \
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue