Merge branch 'master' into mpx

Conflicts:

	Xi/exevents.c
	dix/devices.c
This commit is contained in:
Peter Hutterer 2008-05-02 11:00:14 +09:30
commit 3344569529
104 changed files with 2313 additions and 3318 deletions

View File

@ -1,9 +1,4 @@
if XQUARTZ SUBDIRS = glx
XQUARTZ_SUBDIRS = apple
endif
SUBDIRS = glx mesa $(XQUARTZ_SUBDIRS)
DIST_SUBDIRS = glx mesa apple
WINDOWS_EXTRAS = \ WINDOWS_EXTRAS = \
windows/ChangeLog \ windows/ChangeLog \

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,12 @@ libglxdri_la_SOURCES = \
extension_string.c \ extension_string.c \
extension_string.h extension_string.h
#if XQUARTZ
XQUARTZ_libglx_la_SOURCES = glcontextmodes.c
#endif
libglx_la_SOURCES = \ libglx_la_SOURCES = \
$(XQUARTZ_libglx_la_SOURCES) \
g_disptab.h \ g_disptab.h \
glxbyteorder.h \ glxbyteorder.h \
glxcmds.c \ glxcmds.c \

View File

@ -37,7 +37,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#endif #endif
#include <string.h> #include <string.h>
#include <dlfcn.h>
#define _NEED_GL_CORE_IF
#include <GL/xmesa.h> #include <GL/xmesa.h>
#include <GL/internal/glcore.h> #include <GL/internal/glcore.h>
#include <glxserver.h> #include <glxserver.h>
@ -48,6 +50,22 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "os.h" #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 __GLXMESAscreen __GLXMESAscreen;
typedef struct __GLXMESAcontext __GLXMESAcontext; typedef struct __GLXMESAcontext __GLXMESAcontext;
typedef struct __GLXMESAdrawable __GLXMESAdrawable; typedef struct __GLXMESAdrawable __GLXMESAdrawable;
@ -57,6 +75,9 @@ struct __GLXMESAscreen {
int index; int index;
int num_vis; int num_vis;
XMesaVisual *xm_vis; XMesaVisual *xm_vis;
void *driver;
const __GLcoreModule *glcore;
}; };
struct __GLXMESAcontext { struct __GLXMESAcontext {
@ -67,6 +88,7 @@ struct __GLXMESAcontext {
struct __GLXMESAdrawable { struct __GLXMESAdrawable {
__GLXdrawable base; __GLXdrawable base;
XMesaBuffer xm_buf; XMesaBuffer xm_buf;
__GLXMESAscreen *screen;
}; };
static XMesaVisual find_mesa_visual(__GLXscreen *screen, XID fbconfigID); static XMesaVisual find_mesa_visual(__GLXscreen *screen, XID fbconfigID);
@ -76,6 +98,7 @@ static void
__glXMesaDrawableDestroy(__GLXdrawable *base) __glXMesaDrawableDestroy(__GLXdrawable *base)
{ {
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base; __GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
const __GLcoreModule *glcore = glxPriv->screen->glcore;
if (glxPriv->xm_buf != NULL) if (glxPriv->xm_buf != NULL)
XMesaDestroyBuffer(glxPriv->xm_buf); XMesaDestroyBuffer(glxPriv->xm_buf);
@ -86,6 +109,7 @@ static GLboolean
__glXMesaDrawableResize(__GLXdrawable *base) __glXMesaDrawableResize(__GLXdrawable *base)
{ {
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base; __GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
const __GLcoreModule *glcore = glxPriv->screen->glcore;
XMesaResizeBuffers(glxPriv->xm_buf); XMesaResizeBuffers(glxPriv->xm_buf);
@ -96,6 +120,7 @@ static GLboolean
__glXMesaDrawableSwapBuffers(__GLXdrawable *base) __glXMesaDrawableSwapBuffers(__GLXdrawable *base)
{ {
__GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base; __GLXMESAdrawable *glxPriv = (__GLXMESAdrawable *) base;
const __GLcoreModule *glcore = glxPriv->screen->glcore;
/* This is terrifying: XMesaSwapBuffers() ends up calling CopyArea /* This is terrifying: XMesaSwapBuffers() ends up calling CopyArea
* to do the buffer swap, but this assumes that the server holds * to do the buffer swap, but this assumes that the server holds
@ -121,6 +146,8 @@ __glXMesaScreenCreateDrawable(__GLXscreen *screen,
XID drawId, XID drawId,
__GLXconfig *modes) __GLXconfig *modes)
{ {
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
const __GLcoreModule *glcore = mesaScreen->glcore;
__GLXMESAdrawable *glxPriv; __GLXMESAdrawable *glxPriv;
XMesaVisual xm_vis; XMesaVisual xm_vis;
@ -130,6 +157,7 @@ __glXMesaScreenCreateDrawable(__GLXscreen *screen,
memset(glxPriv, 0, sizeof *glxPriv); memset(glxPriv, 0, sizeof *glxPriv);
glxPriv->screen = mesaScreen;
if (!__glXDrawableInit(&glxPriv->base, screen, if (!__glXDrawableInit(&glxPriv->base, screen,
pDraw, type, drawId, modes)) { pDraw, type, drawId, modes)) {
xfree(glxPriv); xfree(glxPriv);
@ -166,6 +194,8 @@ static void
__glXMesaContextDestroy(__GLXcontext *baseContext) __glXMesaContextDestroy(__GLXcontext *baseContext)
{ {
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext; __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
const __GLcoreModule *glcore = screen->glcore;
XMesaDestroyContext(context->xmesa); XMesaDestroyContext(context->xmesa);
__glXContextDestroy(&context->base); __glXContextDestroy(&context->base);
@ -179,6 +209,8 @@ __glXMesaContextMakeCurrent(__GLXcontext *baseContext)
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext; __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
__GLXMESAdrawable *drawPriv = (__GLXMESAdrawable *) context->base.drawPriv; __GLXMESAdrawable *drawPriv = (__GLXMESAdrawable *) context->base.drawPriv;
__GLXMESAdrawable *readPriv = (__GLXMESAdrawable *) context->base.readPriv; __GLXMESAdrawable *readPriv = (__GLXMESAdrawable *) context->base.readPriv;
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
const __GLcoreModule *glcore = screen->glcore;
return XMesaMakeCurrent2(context->xmesa, return XMesaMakeCurrent2(context->xmesa,
drawPriv->xm_buf, drawPriv->xm_buf,
@ -189,6 +221,8 @@ static int
__glXMesaContextLoseCurrent(__GLXcontext *baseContext) __glXMesaContextLoseCurrent(__GLXcontext *baseContext)
{ {
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext; __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
const __GLcoreModule *glcore = screen->glcore;
return XMesaLoseCurrent(context->xmesa); return XMesaLoseCurrent(context->xmesa);
} }
@ -200,6 +234,8 @@ __glXMesaContextCopy(__GLXcontext *baseDst,
{ {
__GLXMESAcontext *dst = (__GLXMESAcontext *) baseDst; __GLXMESAcontext *dst = (__GLXMESAcontext *) baseDst;
__GLXMESAcontext *src = (__GLXMESAcontext *) baseSrc; __GLXMESAcontext *src = (__GLXMESAcontext *) baseSrc;
__GLXMESAscreen *screen = (__GLXMESAscreen *) dst->base.pGlxScreen;
const __GLcoreModule *glcore = screen->glcore;
return XMesaCopyContext(src->xmesa, dst->xmesa, mask); return XMesaCopyContext(src->xmesa, dst->xmesa, mask);
} }
@ -208,6 +244,8 @@ static int
__glXMesaContextForceCurrent(__GLXcontext *baseContext) __glXMesaContextForceCurrent(__GLXcontext *baseContext)
{ {
__GLXMESAcontext *context = (__GLXMESAcontext *) baseContext; __GLXMESAcontext *context = (__GLXMESAcontext *) baseContext;
__GLXMESAscreen *screen = (__GLXMESAscreen *) context->base.pGlxScreen;
const __GLcoreModule *glcore = screen->glcore;
/* GlxSetRenderTables() call for XGL moved in XMesaForceCurrent() */ /* GlxSetRenderTables() call for XGL moved in XMesaForceCurrent() */
@ -219,6 +257,8 @@ __glXMesaScreenCreateContext(__GLXscreen *screen,
__GLXconfig *config, __GLXconfig *config,
__GLXcontext *baseShareContext) __GLXcontext *baseShareContext)
{ {
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
const __GLcoreModule *glcore = mesaScreen->glcore;
__GLXMESAcontext *context; __GLXMESAcontext *context;
__GLXMESAcontext *shareContext = (__GLXMESAcontext *) baseShareContext; __GLXMESAcontext *shareContext = (__GLXMESAcontext *) baseShareContext;
XMesaVisual xm_vis; XMesaVisual xm_vis;
@ -261,6 +301,7 @@ static void
__glXMesaScreenDestroy(__GLXscreen *screen) __glXMesaScreenDestroy(__GLXscreen *screen)
{ {
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen; __GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
const __GLcoreModule *glcore = mesaScreen->glcore;
int i; int i;
if (mesaScreen->xm_vis) { if (mesaScreen->xm_vis) {
@ -272,6 +313,8 @@ __glXMesaScreenDestroy(__GLXscreen *screen)
xfree(mesaScreen->xm_vis); xfree(mesaScreen->xm_vis);
} }
dlclose(mesaScreen->driver);
__glXScreenDestroy(screen); __glXScreenDestroy(screen);
xfree(screen); xfree(screen);
@ -373,6 +416,7 @@ createFBConfigs(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
static void static void
createMesaVisuals(__GLXMESAscreen *pMesaScreen) createMesaVisuals(__GLXMESAscreen *pMesaScreen)
{ {
const __GLcoreModule *glcore = pMesaScreen->glcore;
__GLXconfig *config; __GLXconfig *config;
ScreenPtr pScreen; ScreenPtr pScreen;
VisualPtr visual = NULL; VisualPtr visual = NULL;
@ -409,15 +453,35 @@ createMesaVisuals(__GLXMESAscreen *pMesaScreen)
} }
} }
static const char dri_driver_path[] = DRI_DRIVER_PATH;
static __GLXscreen * static __GLXscreen *
__glXMesaScreenProbe(ScreenPtr pScreen) __glXMesaScreenProbe(ScreenPtr pScreen)
{ {
__GLXMESAscreen *screen; __GLXMESAscreen *screen;
char filename[128];
screen = xalloc(sizeof *screen); screen = xalloc(sizeof *screen);
if (screen == NULL) if (screen == NULL)
return 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 * Find the GLX visuals that are supported by this screen and create
* XMesa's visuals. * XMesa's visuals.
@ -435,7 +499,20 @@ __glXMesaScreenProbe(ScreenPtr pScreen)
screen->base.swapInterval = NULL; screen->base.swapInterval = NULL;
screen->base.pScreen = pScreen; screen->base.pScreen = pScreen;
LogMessage(X_INFO, "GLX: Loaded and initialized %s\n", filename);
return &screen->base; 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 = { __GLXprovider __glXMesaProvider = {

View File

@ -437,6 +437,7 @@ initGlxVisual(VisualPtr visual, __GLXconfig *config)
typedef struct { typedef struct {
GLboolean doubleBuffer; GLboolean doubleBuffer;
GLboolean depthBuffer; GLboolean depthBuffer;
GLboolean stencilBuffer;
} FBConfigTemplateRec, *FBConfigTemplatePtr; } FBConfigTemplateRec, *FBConfigTemplatePtr;
static __GLXconfig * static __GLXconfig *
@ -453,6 +454,8 @@ pickFBConfig(__GLXscreen *pGlxScreen, FBConfigTemplatePtr template, int class)
continue; continue;
if ((config->depthBits > 0) != template->depthBuffer) if ((config->depthBits > 0) != template->depthBuffer)
continue; continue;
if ((config->stencilBits > 0) != template->stencilBuffer)
continue;
return config; return config;
} }
@ -466,8 +469,9 @@ addMinimalSet(__GLXscreen *pGlxScreen)
__GLXconfig *config; __GLXconfig *config;
VisualPtr visuals; VisualPtr visuals;
int i, j; int i, j;
FBConfigTemplateRec best = { GL_TRUE, GL_TRUE }; FBConfigTemplateRec best = { GL_TRUE, GL_TRUE, GL_TRUE };
FBConfigTemplateRec minimal = { GL_FALSE, GL_FALSE }; FBConfigTemplateRec good = { GL_TRUE, GL_TRUE, GL_FALSE };
FBConfigTemplateRec minimal = { GL_FALSE, GL_FALSE, GL_FALSE };
pGlxScreen->visuals = xcalloc(pGlxScreen->pScreen->numVisuals, pGlxScreen->visuals = xcalloc(pGlxScreen->pScreen->numVisuals,
sizeof (__GLXconfig *)); sizeof (__GLXconfig *));
@ -480,8 +484,11 @@ addMinimalSet(__GLXscreen *pGlxScreen)
for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) { for (i = 0, j = 0; i < pGlxScreen->pScreen->numVisuals; i++) {
if (visuals[i].nplanes == 32) if (visuals[i].nplanes == 32)
config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class); config = pickFBConfig(pGlxScreen, &minimal, visuals[i].class);
else else {
config = pickFBConfig(pGlxScreen, &best, visuals[i].class); config = pickFBConfig(pGlxScreen, &best, visuals[i].class);
if (config == NULL)
config = pickFBConfig(pGlxScreen, &good, visuals[i].class);
}
if (config == NULL) if (config == NULL)
config = pGlxScreen->fbconfigs; config = pGlxScreen->fbconfigs;
if (config == NULL) if (config == NULL)

View File

@ -81,8 +81,8 @@ __glXDeassociateContext(__GLXcontext *glxc)
__GLXcontext *curr, *prev; __GLXcontext *curr, *prev;
prev = NULL; prev = NULL;
for ( curr = glxc->drawPriv->drawGlxc if (glxc->drawPriv) {
; curr != NULL for ( curr = glxc->drawPriv->drawGlxc; curr != NULL
; prev = curr, curr = curr->nextDrawPriv ) { ; prev = curr, curr = curr->nextDrawPriv ) {
if (curr == glxc) { if (curr == glxc) {
/* found context. Deassociate. */ /* found context. Deassociate. */
@ -96,9 +96,10 @@ __glXDeassociateContext(__GLXcontext *glxc)
break; break;
} }
} }
}
prev = NULL; prev = NULL;
if (glxc->readPriv) {
for ( curr = glxc->readPriv->readGlxc for ( curr = glxc->readPriv->readGlxc
; curr != NULL ; curr != NULL
; prev = curr, curr = curr->nextReadPriv ) { ; prev = curr, curr = curr->nextReadPriv ) {
@ -114,6 +115,7 @@ __glXDeassociateContext(__GLXcontext *glxc)
break; break;
} }
} }
}
} }
/*****************************************************************************/ /*****************************************************************************/

32
GL/mesa/.gitignore vendored
View File

@ -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

View File

@ -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

View File

@ -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)

View File

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -58,175 +58,14 @@ main() {
## actual symlinking ## 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() { symlink_glx() {
# this is... unpleasant # this is... unpleasant
src_dir src/glx/x11 src_dir src/glx/x11
dst_dir glx dst_dir glx
action indirect_size.h action indirect_size.h
action glcontextmodes.c
action glcontextmodes.h
action indirect_dispatch.c action indirect_dispatch.c
action indirect_dispatch.h action indirect_dispatch.h
action indirect_dispatch_swap.c action indirect_dispatch_swap.c
@ -267,7 +106,6 @@ run() {
# $1 what to do # $1 what to do
# $2 explanation # $2 explanation
ACTION=$1 EXPLANATION=$2 run_module mesa
ACTION=$1 EXPLANATION=$2 run_module glx ACTION=$1 EXPLANATION=$2 run_module glx
} }

View File

@ -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 */

View File

@ -2140,6 +2140,8 @@ SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
for (i = 0; i < screenInfo.numScreens; i++) { for (i = 0; i < screenInfo.numScreens; i++) {
pWin = WindowTable[i]; pWin = WindowTable[i];
if (!pWin)
continue;
(void)DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab, dev->id); (void)DeliverEventsToWindow(dev, pWin, ev, count, mask, NullGrab, dev->id);
p1 = pWin->firstChild; p1 = pWin->firstChild;
FindInterestedChildren(dev, p1, mask, ev, count); FindInterestedChildren(dev, p1, mask, ev, count);

View File

@ -177,7 +177,7 @@ AC_CHECK_FUNC([dlopen], [],
AC_CHECK_LIB([dl], [dlopen], DLOPEN_LIBS="-ldl")) AC_CHECK_LIB([dl], [dlopen], DLOPEN_LIBS="-ldl"))
case $host_os in case $host_os in
linux*) linux*|darwin*)
AC_DEFINE(HAVE_URANDOM, 1, [Has /dev/urandom]) ;; AC_DEFINE(HAVE_URANDOM, 1, [Has /dev/urandom]) ;;
solaris*) solaris*)
# Solaris 8 with patches, or Solaris 9 or later have /dev/urandom # 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(PCVT_SUPPORT, 1, [System has PCVT console])
AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console]) AC_DEFINE(SYSCONS_SUPPORT, 1, [System has syscons console])
DRI=yes DRI=yes
DRI2=yes PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
;; ;;
*netbsd*) *netbsd*)
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like]) 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(PCVT_SUPPORT, 1, [System has PCVT console])
AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console]) AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
DRI=yes DRI=yes
DRI2=yes PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
;; ;;
*openbsd*) *openbsd*)
AC_DEFINE(CSRG_BASED, 1, [System is BSD-like]) AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
@ -396,7 +396,7 @@ case $host_os in
;; ;;
*linux*) *linux*)
DRI=yes DRI=yes
DRI2=yes PKG_CHECK_EXISTS([dri2proto >= 1.1 libdrm >= 2.3.1], DRI2=yes, DRI2=no)
KDRIVE_HW=yes KDRIVE_HW=yes
;; ;;
*solaris*) *solaris*)
@ -524,11 +524,11 @@ AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with
dnl Extensions. dnl Extensions.
AC_ARG_ENABLE(registry, AS_HELP_STRING([--disable-registry], [Build string registry module (default: enabled)]), [XREGISTRY=$enableval], [XREGISTRY=yes]) 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(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(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(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(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(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]) 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(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(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(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(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(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]) 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 dnl Handle installing libxf86config
AM_CONDITIONAL(INSTALL_LIBXF86CONFIG, [test "x$INSTALL_LIBXF86CONFIG" = xyes]) 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 ---------------------------------------------------------------------------
dnl Extension section dnl Extension section
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
@ -781,18 +814,6 @@ if test "x$XREGISTRY" = xyes; then
AC_DEFINE(XREGISTRY, 1, [Build registry module]) AC_DEFINE(XREGISTRY, 1, [Build registry module])
fi 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]) AM_CONDITIONAL(COMPOSITE, [test "x$COMPOSITE" = xyes])
if test "x$COMPOSITE" = xyes; then if test "x$COMPOSITE" = xyes; then
AC_DEFINE(COMPOSITE, 1, [Support Composite Extension]) 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]) PKG_CHECK_MODULES([GL], [glproto >= 1.4.9])
AC_SUBST(XLIB_CFLAGS) AC_SUBST(XLIB_CFLAGS)
AC_DEFINE(GLXEXT, 1, [Build GLX extension]) 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 test -d GL || mkdir GL
case $host_os in case $host_os in
solaris*) solaris*)
@ -848,6 +869,7 @@ if test "x$GLX" = xyes && ! test "x$MESA_SOURCE" = x; then
if test $? -ne 0; 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.]) AC_MSG_ERROR([Failed to link Mesa source tree. Please specify a proper path to Mesa sources, or disable GLX.])
fi fi
GLX_SYS_LIBS="$GLX_SYS_LIBS $DLOPEN_LIBS"
else else
GLX=no GLX=no
fi fi
@ -929,12 +951,6 @@ if test "x$XEVIE" = xyes; then
REQUIRED_MODULES="$REQUIRED_MODULES evieproto" REQUIRED_MODULES="$REQUIRED_MODULES evieproto"
fi 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]) AM_CONDITIONAL(MULTIBUFFER, [test "x$MULTIBUFFER" = xyes])
if test "x$MULTIBUFFER" = xyes; then if test "x$MULTIBUFFER" = xyes; then
AC_DEFINE(MULTIBUFFER, 1, [Build Multibuffer extension]) 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 # OpenSSL used for SHA1 hashing in render/glyph.c, but we don't need all of
# the OpenSSL libraries, just libcrypto # 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" LIBCRYPTO="$OPENSSL_LIB_FLAGS -lcrypto"
# Autotools has some unfortunate issues with library handling. In order to # 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]) AM_CONDITIONAL(XWIN_XV, [test "x$XWIN" = xyes && test "x$XV" = xyes])
dnl Darwin / OS X DDX 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 if test "x$XQUARTZ" = xyes; then
AC_DEFINE(XQUARTZ,1,[Have Quartz]) AC_DEFINE(XQUARTZ,1,[Have Quartz])
AC_DEFINE(ROOTLESS,1,[Build Rootless code]) AC_DEFINE(ROOTLESS,1,[Build Rootless code])
#glxAGL / glxCGL don't work yet DARWIN_GLX_LIBS='$(top_builddir)/hw/xquartz/GL/libCGLCore.la $(top_builddir)/GL/glx/libglx.la'
# AC_CACHE_CHECK([for AGL framework],xorg_cv_AGL_framework,[ 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"
# 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"
AC_SUBST([DARWIN_LIBS]) AC_SUBST([DARWIN_LIBS])
AC_CHECK_LIB([Xplugin],[xp_init],[:]) AC_CHECK_LIB([Xplugin],[xp_init],[:])
CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA" 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 fi
# Support for objc in autotools is minimal and not documented. # 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 if test "x$XV" = xyes; then
XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv" XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xv"
fi 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"]) PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
if test "x$XEPHYR" = xauto; then if test "x$XEPHYR" = xauto; then
XEPHYR=$xephyr XEPHYR=$xephyr
fi 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 # Xephyr needs nanosleep() which is in librt on Solaris
AC_CHECK_FUNC([nanosleep], [], AC_CHECK_FUNC([nanosleep], [],
AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt")) AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
if test "x$TSLIB" = xyes; then 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 if test "x$HAVE_TSLIB" = xno; then
AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/]) AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
fi fi
@ -1966,13 +1938,10 @@ if test "$KDRIVE" = yes; then
;; ;;
esac esac
KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a' 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 $FB_LIB $MI_LIB $KDRIVE_PURE_LIBS"
KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB $OS_LIB" KDRIVE_LOCAL_LIBS="$KDRIVE_LOCAL_LIBS $KDRIVE_OS_LIB $OS_LIB"
KDRIVE_LIBS="$KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS" KDRIVE_LIBS="$TSLIB_LIBS $KDRIVE_LOCAL_LIBS $XSERVER_SYS_LIBS $GLX_SYS_LIBS"
# check if we can build Xephyr
PKG_CHECK_MODULES(XEPHYR, $XEPHYR_REQUIRED_LIBS, [xephyr="yes"], [xephyr="no"])
AC_SUBST([XEPHYR_LIBS]) AC_SUBST([XEPHYR_LIBS])
AC_SUBST([XEPHYR_INCS]) AC_SUBST([XEPHYR_INCS])
@ -1993,7 +1962,6 @@ AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes]) AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = 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(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]) 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) 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([ AC_OUTPUT([
Makefile Makefile
GL/Makefile GL/Makefile
GL/apple/Makefile
GL/glx/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 include/Makefile
afb/Makefile afb/Makefile
composite/Makefile composite/Makefile
@ -2208,6 +2163,7 @@ hw/xgl/glxext/module/Makefile
hw/xnest/Makefile hw/xnest/Makefile
hw/xwin/Makefile hw/xwin/Makefile
hw/xquartz/Makefile hw/xquartz/Makefile
hw/xquartz/GL/Makefile
hw/xquartz/bundle/Makefile hw/xquartz/bundle/Makefile
hw/xquartz/xpr/Makefile hw/xquartz/xpr/Makefile
hw/kdrive/Makefile hw/kdrive/Makefile

View File

@ -474,8 +474,8 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
int num_valuators, int *valuators) { int num_valuators, int *valuators) {
int numEvents = 0; int numEvents = 0;
CARD32 ms = 0; CARD32 ms = 0;
KeySym *map = pDev->key->curKeySyms.map; KeySym *map;
KeySym sym = map[key_code * pDev->key->curKeySyms.mapWidth]; KeySym sym;
deviceKeyButtonPointer *kbp = NULL; deviceKeyButtonPointer *kbp = NULL;
DeviceIntPtr master; DeviceIntPtr master;
@ -486,8 +486,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
if (type != KeyPress && type != KeyRelease) if (type != KeyPress && type != KeyRelease)
return 0; return 0;
if (!pDev->key || !pDev->focus || !pDev->kbdfeed || if (!pDev->key || !pDev->focus || !pDev->kbdfeed)
(pDev->coreEvents && !inputInfo.keyboard->key))
return 0; return 0;
numEvents = 1; numEvents = 1;
@ -495,6 +494,9 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
if (key_code < 8 || key_code > 255) if (key_code < 8 || key_code > 255)
return 0; return 0;
map = pDev->key->curKeySyms.map;
sym = map[key_code * pDev->key->curKeySyms.mapWidth];
master = pDev->u.master; master = pDev->u.master;
if (master && master->u.lastSlave != pDev) if (master && master->u.lastSlave != pDev)
{ {

View File

@ -237,12 +237,11 @@ static int indexForScanlinePad[ 65 ] = {
#define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif #endif
#ifdef __APPLE__ #ifdef XQUARTZ
void DarwinHandleGUI(int argc, char **argv, char **envp); int dix_main(int argc, char *argv[], char *envp[])
#else
int main(int argc, char *argv[], char *envp[])
#endif #endif
int
main(int argc, char *argv[], char *envp[])
{ {
int i, j, k, error; int i, j, k, error;
char *xauthfile; char *xauthfile;
@ -256,13 +255,6 @@ main(int argc, char *argv[], char *envp[])
PrinterInitGlobals(); PrinterInitGlobals();
#endif #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); CheckUserParameters(argc, argv, envp);
CheckUserAuthorization(); CheckUserAuthorization();
@ -462,7 +454,10 @@ main(int argc, char *argv[], char *envp[])
#endif #endif
config_fini(); config_fini();
memset(WindowTable, 0, MAXSCREENS * sizeof(WindowPtr));
CloseDownDevices(); CloseDownDevices();
for (i = screenInfo.numScreens - 1; i >= 0; i--) for (i = screenInfo.numScreens - 1; i >= 0; i--)
{ {
FreeScratchPixmapsForScreen(i); FreeScratchPixmapsForScreen(i);

View File

@ -18,6 +18,7 @@ libexa_la_SOURCES = \
exa.c \ exa.c \
exa.h \ exa.h \
exa_accel.c \ exa_accel.c \
exa_glyphs.c \
exa_migration.c \ exa_migration.c \
exa_offscreen.c \ exa_offscreen.c \
exa_render.c \ exa_render.c \

View File

@ -739,6 +739,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
exaGlyphsFini(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
pScreen->GetImage = pExaScr->SavedGetImage; pScreen->GetImage = pExaScr->SavedGetImage;
@ -752,7 +754,9 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
if (ps) { if (ps) {
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
ps->Glyphs = pExaScr->SavedGlyphs;
ps->Trapezoids = pExaScr->SavedTrapezoids; ps->Trapezoids = pExaScr->SavedTrapezoids;
ps->Triangles = pExaScr->SavedTriangles;
} }
#endif #endif
@ -914,6 +918,9 @@ exaDriverInit (ScreenPtr pScreen,
pExaScr->SavedComposite = ps->Composite; pExaScr->SavedComposite = ps->Composite;
ps->Composite = exaComposite; ps->Composite = exaComposite;
pExaScr->SavedGlyphs = ps->Glyphs;
ps->Glyphs = exaGlyphs;
pExaScr->SavedTriangles = ps->Triangles; pExaScr->SavedTriangles = ps->Triangles;
ps->Triangles = exaTriangles; ps->Triangles = exaTriangles;
@ -973,6 +980,8 @@ exaDriverInit (ScreenPtr pScreen,
} }
} }
exaGlyphsInit(pScreen);
LogMessage(X_INFO, "EXA(%d): Driver registered support for the following" LogMessage(X_INFO, "EXA(%d): Driver registered support for the following"
" operations:\n", pScreen->myNum); " operations:\n", pScreen->myNum);
assert(pScreenInfo->PrepareSolid != NULL); assert(pScreenInfo->PrepareSolid != NULL);

897
exa/exa_glyphs.c Normal file
View File

@ -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);
}
}

View File

@ -61,6 +61,7 @@
#define DEBUG_MIGRATE 0 #define DEBUG_MIGRATE 0
#define DEBUG_PIXMAP 0 #define DEBUG_PIXMAP 0
#define DEBUG_OFFSCREEN 0 #define DEBUG_OFFSCREEN 0
#define DEBUG_GLYPH_CACHE 0
#if DEBUG_TRACE_FALL #if DEBUG_TRACE_FALL
#define EXA_FALLBACK(x) \ #define EXA_FALLBACK(x) \
@ -95,6 +96,38 @@ enum ExaMigrationHeuristic {
ExaMigrationSmart 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 void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct { typedef struct {
ExaDriverPtr info; ExaDriverPtr info;
@ -122,6 +155,8 @@ typedef struct {
unsigned disableFbCount; unsigned disableFbCount;
Bool optimize_migration; Bool optimize_migration;
unsigned offScreenCounter; unsigned offScreenCounter;
ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
} ExaScreenPrivRec, *ExaScreenPrivPtr; } ExaScreenPrivRec, *ExaScreenPrivPtr;
/* /*
@ -209,6 +244,15 @@ typedef struct _ExaMigrationRec {
RegionPtr pReg; RegionPtr pReg;
} ExaMigrationRec, *ExaMigrationPtr; } 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 * 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. * 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 width,
CARD16 height); CARD16 height);
void
exaCompositeRects(CARD8 op,
PicturePtr Src,
PicturePtr pDst,
int nrect,
ExaCompositeRectPtr rects);
void void
exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst, exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
@ -432,6 +483,13 @@ exaTriangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
int ntri, xTriangle *tris); int ntri, xTriangle *tris);
/* exa_glyph.c */
void
exaGlyphsInit(ScreenPtr pScreen);
void
exaGlyphsFini (ScreenPtr pScreen);
void void
exaGlyphs (CARD8 op, exaGlyphs (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,

View File

@ -331,6 +331,231 @@ exaTryDriverSolidFill(PicturePtr pSrc,
return 1; 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 (&region, pSrc, NULL, pDst,
xSrc, ySrc, 0, 0, xDst, yDst,
rects->width, rects->height))
goto next_rect;
REGION_TRANSLATE(pScreen, &region, dst_off_x, dst_off_y);
nbox = REGION_NUM_RECTS(&region);
pbox = REGION_RECTS(&region);
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, &region);
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, &region, &box, 1);
exaGetDrawableDeltas(pDst->pDrawable, pPixmap, &xoff, &yoff);
REGION_TRANSLATE(pScreen, &region, xoff, yoff);
pending_damage = DamagePendingRegion(pExaPixmap->pDamage);
REGION_UNION(pScreen, pending_damage, pending_damage, &region);
REGION_TRANSLATE(pScreen, &region, -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, &region);
REGION_UNINIT(pScreen, &region);
}
static int static int
exaTryDriverComposite(CARD8 op, exaTryDriverComposite(CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,

View File

@ -1,10 +1,10 @@
if KDRIVEVESA 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 smi via
endif endif
if BUILD_KDRIVEFBDEVLIB if BUILD_KDRIVEFBDEVLIB
FBDEV_SUBDIRS = fbdev FBDEV_SUBDIRS = fbdev epson
endif endif
if XFAKESERVER if XFAKESERVER

View File

@ -58,6 +58,10 @@ ATI_LIBS = \
$(DRI_LIBS) \ $(DRI_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xati_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xati_LDADD = \ Xati_LDADD = \
$(ATI_LIBS) \ $(ATI_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -20,6 +20,10 @@ CHIPS_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xchips_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xchips_LDADD = \ Xchips_LDADD = \
$(CHIPS_LIBS) \ $(CHIPS_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -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

View File

@ -1,82 +1,79 @@
INCLUDES = \ INCLUDES = \
@KDRIVE_INCS@ \ @KDRIVE_INCS@ \
@KDRIVE_CFLAGS@ \ @KDRIVE_CFLAGS@ \
-I$(srcdir)/../../../exa @XEPHYR_INCS@ \
@XEPHYR_CFLAGS@ \
@DRIPROTO_CFLAGS@ \
-I$(top_srcdir) \
-I$(top_srcdir)/exa
if XV if XV
LIBXEPHYR_HOSTXV=libxephyr-hostxv.a LIBXEPHYR_HOSTXV=libxephyr-hostxv.a
else
LIBXEPHYR_HOSTXV=
endif endif
if XEPHYR_HAS_DRI if DRI
LIBXEPHYR_HOSTDRI=libxephyr-hostdri.a LIBXEPHYR_HOSTDRI=libxephyr-hostdri.a
else
LIBXEPHYR_HOSTDRI=
endif endif
noinst_LIBRARIES = libxephyr-hostx.a $(LIBXEPHYR_HOSTXV) $(LIBXEPHYR_HOSTDRI) libxephyr.a noinst_LIBRARIES = libxephyr-hostx.a $(LIBXEPHYR_HOSTXV) $(LIBXEPHYR_HOSTDRI) libxephyr.a
bin_PROGRAMS = Xephyr bin_PROGRAMS = Xephyr
libxephyr_hostx_a_SOURCES = \ HOSTX_SRCS = \
hostx.c \ hostx.c \
hostx.h hostx.h
libxephyr_hostxv_a_INCLUDES = @XEPHYR_INCS@ HOSTVIDEO_SRCS = \
ephyrvideo.c \
if XV
libxephyr_hostxv_a_SOURCES= \
ephyrhostvideo.c \ ephyrhostvideo.c \
ephyrhostvideo.h ephyrhostvideo.h
endif
if XEPHYR_HAS_DRI HOSTDRI_SRCS = \
ephyrdriext.c \
ephyrdriext.h \
ephyrdri.c \
ephyrdri.h \
XF86dri.c \
xf86dri.h \
ephyrglxext.c \
ephyrglxext.h \
ephyrhostglx.c \
ephyrhostglx.h
libxephyr_hostdri_a_SOURCES= \ XEPHYR_SRCS = \
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@
endif
libxephyr_a_SOURCES = \
ephyr.c \ ephyr.c \
ephyr_draw.c \
ephyrvideo.c \
os.c \
hostx.h \
ephyr.h \ ephyr.h \
ephyrlog.h ephyrlog.h \
ephyr_draw.c \
os.c
libxephyr_a_CFLAGS = \ libxephyr_hostx_a_SOURCES = $(HOSTX_SRCS)
-I$(top_srcdir) \
@LIBDRM_CFLAGS@ if XV
libxephyr_hostxv_a_SOURCES = $(HOSTVIDEO_SRCS)
endif
if DRI
libxephyr_hostdri_a_SOURCES = $(HOSTDRI_SRCS)
endif
libxephyr_a_SOURCES = $(XEPHYR_SRCS)
Xephyr_SOURCES = \ Xephyr_SOURCES = \
ephyrinit.c ephyrinit.c
if GLX
Xephyr_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xephyr_LDADD = \ Xephyr_LDADD = \
libxephyr.a \ libxephyr.a \
libxephyr-hostx.a \ libxephyr-hostx.a \
$(LIBXEPHYR_HOSTXV) \ $(LIBXEPHYR_HOSTXV) \
$(LIBXEPHYR_HOSTDRI) \ $(LIBXEPHYR_HOSTDRI) \
../../../exa/libexa.la \ $(top_builddir)/exa/libexa.la \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XEPHYR_LIBS@ \ @XEPHYR_LIBS@
@LIBDRM_LIBS@ \
@XEPHYR_DRI_LIBS@
Xephyr_DEPENDENCIES = \ Xephyr_DEPENDENCIES = \
libxephyr.a \ libxephyr.a \
@ -87,3 +84,7 @@ Xephyr_DEPENDENCIES = \
relink: relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS) rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)
EXTRA_DIST = \
$(HOSTVIDEO_SRCS) \
$(HOSTDRI_SRCS)

View File

@ -46,8 +46,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#ifdef XEPHYR_DRI
/* THIS IS NOT AN X CONSORTIUM STANDARD */ /* THIS IS NOT AN X CONSORTIUM STANDARD */
#define NEED_REPLIES #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/Xext.h>
#include <X11/extensions/extutil.h> #include <X11/extensions/extutil.h>
#include <GL/glx.h> #include <GL/glx.h>
#include <X11/dri/xf86dri.h> #include "xf86dri.h"
#include <X11/dri/xf86dristr.h> #include <X11/dri/xf86dristr.h>
#include "GL/internal/dri_interface.h"
static XExtensionInfo _xf86dri_info_data; static XExtensionInfo _xf86dri_info_data;
static XExtensionInfo *xf86dri_info = &_xf86dri_info_data; static XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
@ -640,5 +637,3 @@ XF86DRICloseFullScreen(Display *dpy, int screen, Drawable drawable)
(void) drawable; (void) drawable;
return True; return True;
} }
#endif /*EPHYR_DRI*/

View File

@ -32,11 +32,11 @@
#include "scrnintstr.h" #include "scrnintstr.h"
#include "ephyrlog.h" #include "ephyrlog.h"
#ifdef XEPHYR_DRI #ifdef XF86DRI
#include "ephyrdri.h" #include "ephyrdri.h"
#include "ephyrdriext.h" #include "ephyrdriext.h"
#include "ephyrglxext.h" #include "ephyrglxext.h"
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */
extern int KdTsPhyScreen; extern int KdTsPhyScreen;
#ifdef GLXEXT #ifdef GLXEXT
@ -631,7 +631,7 @@ ephyrInitScreen (ScreenPtr pScreen)
} }
#endif /*XV*/ #endif /*XV*/
#ifdef XEPHYR_DRI #ifdef XF86DRI
if (!ephyrNoDRI && !hostx_has_dri ()) { if (!ephyrNoDRI && !hostx_has_dri ()) {
EPHYR_LOG ("host x does not support DRI. Disabling DRI forwarding\n") ; EPHYR_LOG ("host x does not support DRI. Disabling DRI forwarding\n") ;
ephyrNoDRI = TRUE ; ephyrNoDRI = TRUE ;
@ -841,7 +841,7 @@ miPointerScreenFuncRec ephyrPointerScreenFuncs =
ephyrWarpCursor ephyrWarpCursor
}; };
#ifdef XEPHYR_DRI #ifdef XF86DRI
/** /**
* find if the remote window denoted by a_remote * find if the remote window denoted by a_remote
* is paired with an internal Window within the Xephyr server. * is paired with an internal Window within the Xephyr server.
@ -873,7 +873,7 @@ ephyrExposePairedWindow (int a_remote)
screen->WindowExposures (pair->local, &reg, NullRegion); screen->WindowExposures (pair->local, &reg, NullRegion);
REGION_UNINIT (screen, &reg); REGION_UNINIT (screen, &reg);
} }
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */
void void
ephyrPoll(void) ephyrPoll(void)
@ -908,14 +908,14 @@ ephyrPoll(void)
else else
{ {
int x=0, y=0; int x=0, y=0;
#ifdef XEPHYR_DRI #ifdef XF86DRI
EphyrWindowPair *pair = NULL; EphyrWindowPair *pair = NULL;
#endif #endif
EPHYR_LOG ("enqueuing mouse motion:%d\n", ephyrCurScreen) ; EPHYR_LOG ("enqueuing mouse motion:%d\n", ephyrCurScreen) ;
x = ev.data.mouse_motion.x; x = ev.data.mouse_motion.x;
y = ev.data.mouse_motion.y; y = ev.data.mouse_motion.y;
EPHYR_LOG ("initial (x,y):(%d,%d)\n", x, 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") ; EPHYR_LOG ("is this window peered by a gl drawable ?\n") ;
if (findWindowPairFromRemote (ev.data.mouse_motion.window, if (findWindowPairFromRemote (ev.data.mouse_motion.window,
&pair)) &pair))
@ -972,7 +972,7 @@ ephyrPoll(void)
KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE); KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
break; break;
#ifdef XEPHYR_DRI #ifdef XF86DRI
case EPHYR_EV_EXPOSE: case EPHYR_EV_EXPOSE:
/* /*
* We only receive expose events when the expose event have * We only receive expose events when the expose event have
@ -982,7 +982,7 @@ ephyrPoll(void)
*/ */
ephyrExposePairedWindow (ev.data.expose.window); ephyrExposePairedWindow (ev.data.expose.window);
break; break;
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */
default: default:
break; break;

View File

@ -29,13 +29,10 @@
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#ifdef XEPHYR_DRI
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include <X11/Xlibint.h> #include <X11/Xlibint.h>
/*#define _XF86DRI_SERVER_*/
#include <GL/glx.h> #include <GL/glx.h>
#include <X11/dri/xf86dri.h> #include "xf86dri.h"
#include "hostx.h" #include "hostx.h"
#include "ephyrdri.h" #include "ephyrdri.h"
#define _HAVE_XALLOC_DECLS #define _HAVE_XALLOC_DECLS
@ -287,5 +284,3 @@ ephyrDRIGetDeviceInfo (int a_screen,
EPHYR_LOG ("leave:%d\n", is_ok) ; EPHYR_LOG ("leave:%d\n", is_ok) ;
return is_ok ; return is_ok ;
} }
#endif /*EPHYR_DRI*/

View File

@ -32,8 +32,6 @@
#include <kdrive-config.h> #include <kdrive-config.h>
#endif #endif
#ifdef XEPHYR_DRI
#include <string.h> #include <string.h>
#define NEED_REPLIES #define NEED_REPLIES
@ -1439,5 +1437,3 @@ SProcXF86DRIDispatch (register ClientPtr client)
} }
} }
} }
#endif /*XEPHYR_DRI*/

View File

@ -42,8 +42,6 @@
#include "hostx.h" #include "hostx.h"
#ifdef XEPHYR_DRI
#ifndef TRUE #ifndef TRUE
#define TRUE 1 #define TRUE 1
#endif #endif
@ -727,6 +725,3 @@ ephyrGLXIsDirectSwap (__GLXclientState *a_cl, GLbyte *a_pc)
{ {
return ephyrGLXIsDirectReal (a_cl, a_pc, TRUE) ; return ephyrGLXIsDirectReal (a_cl, a_pc, TRUE) ;
} }
#endif /*XEPHYR_DRI*/

View File

@ -41,7 +41,6 @@
#include "ephyrlog.h" #include "ephyrlog.h"
#include "hostx.h" #include "hostx.h"
#ifdef XEPHYR_DRI
enum VisualConfRequestType { enum VisualConfRequestType {
EPHYR_GET_FB_CONFIG, EPHYR_GET_FB_CONFIG,
EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX, EPHYR_VENDOR_PRIV_GET_FB_CONFIG_SGIX,
@ -687,6 +686,3 @@ out:
EPHYR_LOG ("leave\n") ; EPHYR_LOG ("leave\n") ;
return is_ok ; return is_ok ;
} }
#endif /*XEPHYR_DRI*/

View File

@ -45,12 +45,12 @@
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/extensions/XShm.h> #include <X11/extensions/XShm.h>
#include <X11/extensions/shape.h> #include <X11/extensions/shape.h>
#ifdef XEPHYR_DRI #ifdef XF86DRI
#include <GL/glx.h> #include <GL/glx.h>
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */
#include "ephyrlog.h" #include "ephyrlog.h"
#ifdef XEPHYR_DRI #ifdef XF86DRI
extern Bool XF86DRIQueryExtension (Display *dpy, extern Bool XF86DRIQueryExtension (Display *dpy,
int *event_basep, int *event_basep,
int *error_basep); int *error_basep);
@ -1315,7 +1315,7 @@ hostx_has_xshape (void)
return TRUE; return TRUE;
} }
#ifdef XEPHYR_DRI #ifdef XF86DRI
typedef struct { typedef struct {
int is_valid ; int is_valid ;
int local_id ; int local_id ;
@ -1418,5 +1418,4 @@ hostx_has_glx (void)
return TRUE ; return TRUE ;
} }
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */

View File

@ -244,7 +244,7 @@ int hostx_set_window_clipping_rectangles (int a_window,
int a_num_rects) ; int a_num_rects) ;
int hostx_has_xshape (void) ; int hostx_has_xshape (void) ;
#ifdef XEPHYR_DRI #ifdef XF86DRI
int hostx_lookup_peer_window (void *a_local_window, int hostx_lookup_peer_window (void *a_local_window,
int *a_host_peer /*out parameter*/) ; int *a_host_peer /*out parameter*/) ;
int int
@ -256,6 +256,6 @@ hostx_get_resource_id_peer (int a_local_resource_id,
int hostx_has_dri (void) ; int hostx_has_dri (void) ;
int hostx_has_glx (void) ; int hostx_has_glx (void) ;
#endif /*XEPHYR_DRI*/ #endif /* XF86DRI */
#endif /*_XLIBS_STUFF_H_*/ #endif /*_XLIBS_STUFF_H_*/

120
hw/kdrive/ephyr/xf86dri.h Normal file
View File

@ -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_ */

View File

@ -20,6 +20,10 @@ EPSON_LIBS = \
libepson.a \ libepson.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xepson_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xepson_LDADD = \ Xepson_LDADD = \
$(EPSON_LIBS) \ $(EPSON_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -16,6 +16,10 @@ libfake_a_SOURCES = \
Xfake_SOURCES = \ Xfake_SOURCES = \
fakeinit.c fakeinit.c
if GLX
Xfake_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xfake_LDADD = \ Xfake_LDADD = \
libfake.a \ libfake.a \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \

View File

@ -14,6 +14,10 @@ bin_PROGRAMS = Xfbdev
Xfbdev_SOURCES = \ Xfbdev_SOURCES = \
fbinit.c fbinit.c
if GLX
Xfbdev_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xfbdev_LDADD = \ Xfbdev_LDADD = \
libfbdev.a \ libfbdev.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -179,8 +179,15 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
screen->rate = 103; /* FIXME: should get proper value from fb driver */ screen->rate = 103; /* FIXME: should get proper value from fb driver */
} }
if (!screen->fb[0].depth) if (!screen->fb[0].depth)
{
if (k >= 0)
screen->fb[0].depth = var.bits_per_pixel;
else
screen->fb[0].depth = 16; screen->fb[0].depth = 16;
}
if ((screen->width != var.xres) || (screen->height != var.yres))
{
t = KdFindMode (screen, fbdevModeSupported); t = KdFindMode (screen, fbdevModeSupported);
screen->rate = t->rate; screen->rate = t->rate;
screen->width = t->horizontal; screen->width = t->horizontal;
@ -189,6 +196,7 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
/* Now try setting the mode */ /* Now try setting the mode */
if (k < 0 || (t->horizontal != var.xres || t->vertical != var.yres)) if (k < 0 || (t->horizontal != var.xres || t->vertical != var.yres))
fbdevConvertMonitorTiming (t, &var); fbdevConvertMonitorTiming (t, &var);
}
var.activate = FB_ACTIVATE_NOW; var.activate = FB_ACTIVATE_NOW;
var.bits_per_pixel = screen->fb[0].depth; var.bits_per_pixel = screen->fb[0].depth;

View File

@ -23,6 +23,10 @@ I810_LIBS = \
libi810.a \ libi810.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xi810_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xi810_LDADD = \ Xi810_LDADD = \
$(I810_LIBS) \ $(I810_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -42,6 +42,8 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
extern int LinuxConsoleFd; 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] = { static const KeySym linux_to_x[256] = {
NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
@ -701,7 +703,29 @@ LinuxKeyboardRead (int fd, void *closure)
else else
#endif #endif
scancode = b[0] & 0x7f; scancode = b[0] & 0x7f;
/* 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); 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++; b++;
} }
} }

View File

@ -114,6 +114,10 @@ TslibEnable (KdPointerInfo *pi)
private->raw_event_hook = NULL; private->raw_event_hook = NULL;
private->raw_event_closure = 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->tsDev = ts_open(pi->path, 0);
private->fd = ts_fd(private->tsDev); private->fd = ts_fd(private->tsDev);
if (!private->tsDev || ts_config(private->tsDev) || private->fd < 0) { if (!private->tsDev || ts_config(private->tsDev) || private->fd < 0) {

View File

@ -27,6 +27,10 @@ MACH64_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a $(top_builddir)/hw/kdrive/vesa/libvesa.a
if GLX
Xmach64_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xmach64_LDADD = \ Xmach64_LDADD = \
$(MACH64_LIBS) \ $(MACH64_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -22,6 +22,10 @@ MGA_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xmga_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xmga_LDADD = \ Xmga_LDADD = \
$(MGA_LIBS) \ $(MGA_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -32,6 +32,10 @@ NEOMAGIC_LIBS = \
${VESA_LIBS} \ ${VESA_LIBS} \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xneomagic_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xneomagic_LDADD = \ Xneomagic_LDADD = \
$(NEOMAGIC_LIBS) \ $(NEOMAGIC_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \

View File

@ -23,6 +23,10 @@ NVIDIA_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xnvidia_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xnvidia_LDADD = \ Xnvidia_LDADD = \
$(NVIDIA_LIBS) \ $(NVIDIA_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -21,6 +21,10 @@ PM2_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xpm2_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xpm2_LDADD = \ Xpm2_LDADD = \
$(PM2_LIBS) \ $(PM2_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -20,6 +20,10 @@ R128_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xr128_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xr128_LDADD = \ Xr128_LDADD = \
$(R128_LIBS) \ $(R128_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -7,6 +7,10 @@ bin_PROGRAMS = Xsdl
Xsdl_SOURCES = sdl.c Xsdl_SOURCES = sdl.c
if GLX
Xsdl_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xsdl_LDADD = \ Xsdl_LDADD = \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSDL_LIBS@ @XSDL_LIBS@

View File

@ -34,6 +34,10 @@ SIS_LIBS = \
$(VESA_LIBS) \ $(VESA_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xsis_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xsis_LDADD = \ Xsis_LDADD = \
$(SIS_LIBS) \ $(SIS_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \

View File

@ -25,6 +25,10 @@ SMI_LIBS = \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@
if GLX
Xsmi_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xsmi_LDADD = \ Xsmi_LDADD = \
$(SMI_LIBS) \ $(SMI_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -19,6 +19,10 @@ libvesa_a_SOURCES = \
Xvesa_SOURCES = \ Xvesa_SOURCES = \
vesainit.c vesainit.c
if GLX
Xvesa_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xvesa_LDADD = \ Xvesa_LDADD = \
libvesa.a \ libvesa.a \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -21,6 +21,10 @@ VIA_LIBS = \
libvia.a \ libvia.a \
$(top_builddir)/hw/kdrive/vesa/libvesa.a $(top_builddir)/hw/kdrive/vesa/libvesa.a
if GLX
Xvia_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
endif
Xvia_LDADD = \ Xvia_LDADD = \
$(VIA_LIBS) \ $(VIA_LIBS) \
@KDRIVE_LIBS@ @KDRIVE_LIBS@

View File

@ -1363,7 +1363,7 @@ do { \
# define write_mem_barrier() /* NOP */ # define write_mem_barrier() /* NOP */
# if !defined(__SUNPRO_C) # 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 # ifdef GCCUSESGAS
/* /*
@ -1472,7 +1472,7 @@ inl(unsigned short port)
# endif /* GCCUSESGAS */ # 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 static __inline__ void
outb(unsigned short port, unsigned char val) outb(unsigned short port, unsigned char val)

View File

@ -330,7 +330,9 @@ matchDriverFromFiles (char** matches, uint16_t match_vendor, uint16_t match_chip
int i, j; int i, j;
idsdir = opendir(PCI_TXT_IDS_PATH); idsdir = opendir(PCI_TXT_IDS_PATH);
if (idsdir) { if (!idsdir)
return;
xf86Msg(X_INFO, "Scanning %s directory for additional PCI ID's supported by the drivers\n", PCI_TXT_IDS_PATH); xf86Msg(X_INFO, "Scanning %s directory for additional PCI ID's supported by the drivers\n", PCI_TXT_IDS_PATH);
direntry = readdir(idsdir); direntry = readdir(idsdir);
/* Read the directory */ /* Read the directory */
@ -352,11 +354,11 @@ matchDriverFromFiles (char** matches, uint16_t match_vendor, uint16_t match_chip
goto end; goto end;
} }
/* Read the file */ /* Read the file */
#ifdef __GLIBC__ #ifdef __GLIBC__
while ((read = getline(&line, &len, fp)) != -1) { while ((read = getline(&line, &len, fp)) != -1) {
#else #else
while ((line = fgetln(fp, &len)) != (char *)NULL) { while ((line = fgetln(fp, &len)) != (char *)NULL) {
#endif /* __GLIBC __ */ #endif /* __GLIBC __ */
xchomp(line); xchomp(line);
if (isdigit(line[0])) { if (isdigit(line[0])) {
strncpy(vendor_str, line, 4); strncpy(vendor_str, line, 4);
@ -408,7 +410,6 @@ matchDriverFromFiles (char** matches, uint16_t match_vendor, uint16_t match_chip
} }
direntry = readdir(idsdir); direntry = readdir(idsdir);
} }
}
end: end:
xfree(line); xfree(line);
closedir(idsdir); closedir(idsdir);

View File

@ -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 "vgaHW.h"
#include "compiler.h" #include "compiler.h"
#endif #endif
@ -2785,7 +2785,7 @@ static void
CheckGenericGA() CheckGenericGA()
{ {
/* This needs to be changed for multiple domains */ /* 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(); IOADDRESS GenericIOBase = VGAHW_GET_IOBASE();
CARD8 CurrentValue, TestValue; CARD8 CurrentValue, TestValue;

View File

@ -1119,7 +1119,6 @@ InitInput(argc, argv)
xf86Info.vtRequestsPending = FALSE; xf86Info.vtRequestsPending = FALSE;
xf86Info.inputPending = FALSE; xf86Info.inputPending = FALSE;
if (serverGeneration == 1) {
/* Call the PreInit function for each input device instance. */ /* Call the PreInit function for each input device instance. */
for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) { for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) {
/* Replace obsolete keyboard driver with kbd */ /* Replace obsolete keyboard driver with kbd */
@ -1150,7 +1149,6 @@ InitInput(argc, argv)
continue; continue;
} }
} }
}
/* Initialise all input devices. */ /* Initialise all input devices. */
pInfo = xf86InputDevs; pInfo = xf86InputDevs;

View File

@ -467,6 +467,8 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate; LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate;
InputDriverPtr drv; InputDriverPtr drv;
IDevRec *idev; IDevRec *idev;
BOOL found;
IDevPtr *it;
if (pInfo) /* need to get these before RemoveDevice */ if (pInfo) /* need to get these before RemoveDevice */
{ {
@ -483,10 +485,18 @@ DeleteInputDeviceRequest(DeviceIntPtr pDev)
else else
xf86DeleteInput(pInfo, 0); xf86DeleteInput(pInfo, 0);
/* 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->driver);
xfree(idev->identifier); xfree(idev->identifier);
xf86optionListFree(idev->commonOptions); xf86optionListFree(idev->commonOptions);
xfree(idev); xfree(idev);
}
} }
/* /*

View File

@ -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;
}

View File

@ -3,7 +3,7 @@ noinst_LTLIBRARIES = libdixmods.la libxorgxkb.la
SUBDIRS = extmod SUBDIRS = extmod
if GLX if GLX
GLXMODS = libglx.la libGLcore.la GLXMODS = libglx.la
endif endif
if XTRAP if XTRAP
@ -48,10 +48,6 @@ INCLUDES = @XORG_INCS@ \
-I$(top_srcdir)/miext/shadow \ -I$(top_srcdir)/miext/shadow \
-I$(top_srcdir)/GL/glx -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_LDFLAGS = -avoid-version
libafb_la_LIBADD = $(top_builddir)/afb/libafb.la libafb_la_LIBADD = $(top_builddir)/afb/libafb.la
libafb_la_SOURCES = afbmodule.c libafb_la_SOURCES = afbmodule.c

View File

@ -72,37 +72,6 @@ static XF86ModuleVersionInfo VersRec =
_X_EXPORT XF86ModuleData glxModuleData = { &VersRec, glxSetup, NULL }; _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 static pointer
glxSetup(pointer module, pointer opts, int *errmaj, int *errmin) glxSetup(pointer module, pointer opts, int *errmaj, int *errmin)
{ {
@ -116,8 +85,10 @@ glxSetup(pointer module, pointer opts, int *errmaj, int *errmin)
setupDone = TRUE; setupDone = TRUE;
glxModule = module; provider = LoaderSymbol("__glXMesaProvider");
GlxPushProvider(&__glXMesaProxyProvider); if (provider == NULL)
return NULL;
GlxPushProvider(provider);
xf86Msg(xf86Info.aiglxFrom, "AIGLX %s\n", xf86Msg(xf86Info.aiglxFrom, "AIGLX %s\n",
xf86Info.aiglx ? "enabled" : "disabled"); xf86Info.aiglx ? "enabled" : "disabled");

View File

@ -2437,7 +2437,7 @@ static void drmSIGIOHandler(int interrupt, void *closure)
#if 0 #if 0
fprintf(stderr, "Trying %d\n", entry->fd); fprintf(stderr, "Trying %d\n", entry->fd);
#endif #endif
if ((count = read(entry->fd, buf, sizeof(buf))) > 0) { if ((count = read(entry->fd, buf, sizeof(buf) - 1)) > 0) {
buf[count] = '\0'; buf[count] = '\0';
#if 0 #if 0
fprintf(stderr, "Got %s\n", buf); fprintf(stderr, "Got %s\n", buf);

View File

@ -939,6 +939,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
SYMFUNC(xf86CrtcDestroy) SYMFUNC(xf86CrtcDestroy)
SYMFUNC(xf86CrtcInUse) SYMFUNC(xf86CrtcInUse)
SYMFUNC(xf86CrtcSetScreenSubpixelOrder) SYMFUNC(xf86CrtcSetScreenSubpixelOrder)
SYMFUNC(xf86RotateFreeShadow)
SYMFUNC(xf86RotateCloseScreen) SYMFUNC(xf86RotateCloseScreen)
SYMFUNC(xf86CrtcRotate) SYMFUNC(xf86CrtcRotate)
SYMFUNC(xf86CrtcSetMode) SYMFUNC(xf86CrtcSetMode)

View File

@ -664,6 +664,12 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation,
Bool Bool
xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation); xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation);
/*
* free shadow memory allocated for all crtcs
*/
void
xf86RotateFreeShadow(ScrnInfoPtr pScrn);
/* /*
* Clean up rotation during CloseScreen * Clean up rotation during CloseScreen
*/ */

View File

@ -457,8 +457,7 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
} }
for (c = 0; c < xf86_config->num_crtc; c++) for (c = 0; c < xf86_config->num_crtc; c++)
if (xf86_config->crtc[c]->rotatedPixmap || if (xf86_config->crtc[c]->transform_in_use)
xf86_config->crtc[c]->rotatedData)
return; 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 _X_EXPORT void
xf86RotateCloseScreen (ScreenPtr screen) xf86RotateCloseScreen (ScreenPtr screen)
{ {

View File

@ -237,6 +237,12 @@
# if defined(linux) # if defined(linux)
# define ARCH_PCI_INIT linuxPciInit # define ARCH_PCI_INIT linuxPciInit
# endif # 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) #elif defined(__sparc__) || defined(sparc)
# if defined(linux) # if defined(linux)
# define ARCH_PCI_INIT linuxPciInit # define ARCH_PCI_INIT linuxPciInit

View File

@ -65,6 +65,7 @@ xf86AccResFromOS(resPtr ret)
defined(__sparc__) || \ defined(__sparc__) || \
defined(__mips__) || \ defined(__mips__) || \
defined(__sh__) || \ defined(__sh__) || \
defined(__m32r__) || \
defined(__mc68000__) || \ defined(__mc68000__) || \
defined(__arm__) || \ defined(__arm__) || \
defined(__s390__) || \ defined(__s390__) || \

View File

@ -558,7 +558,7 @@ xf86EnableIO(void)
#endif #endif
} }
close(fd); 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 (ioperm(0, 1024, 1) || iopl(3)) {
if (errno == ENODEV) if (errno == ENODEV)
ErrorF("xf86EnableIOPorts: no I/O ports found\n"); ErrorF("xf86EnableIOPorts: no I/O ports found\n");
@ -585,7 +585,7 @@ xf86DisableIO(void)
#if defined(__powerpc__) #if defined(__powerpc__)
munmap(ioBase, 0x20000); munmap(ioBase, 0x20000);
ioBase = NULL; 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); iopl(0);
ioperm(0, 1024, 0); ioperm(0, 1024, 0);
#endif #endif

View File

@ -465,7 +465,7 @@ CreateFiles(TreeNode *files)
Widget w; Widget w;
char *value; char *value;
value = file->file_logfile ? file->file_logfile : ""; value = (file && file->file_logfile) ? file->file_logfile : "";
node = NewNode(files, NULL, NULL, files->node, node = NewNode(files, NULL, NULL, files->node,
(TreeData*)XtCalloc(1, sizeof(TreeData))); (TreeData*)XtCalloc(1, sizeof(TreeData)));
CreateFilesField(node, "LogFile", value); CreateFilesField(node, "LogFile", value);
@ -509,10 +509,14 @@ UpdateFiles(TreeNode *files)
/* LogFile */ /* LogFile */
files = files->child; files = files->child;
XtVaGetValues(files->data->files.text, XtNstring, &str, NULL); XtVaGetValues(files->data->files.text, XtNstring, &str, NULL);
if (XF86Config->conf_files && XF86Config->conf_files->file_logfile)
XtFree(XF86Config->conf_files->file_logfile); XtFree(XF86Config->conf_files->file_logfile);
if (*str) if (*str) {
if (XF86Config->conf_files == NULL)
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
XF86Config->conf_files->file_logfile = XtNewString(str); XF86Config->conf_files->file_logfile = XtNewString(str);
else }
else if (XF86Config->conf_files)
XF86Config->conf_files->file_logfile = NULL; XF86Config->conf_files->file_logfile = NULL;
} }
@ -527,11 +531,12 @@ CreateFontPath(TreeNode *fontpath, char *path)
if (path == NULL) { if (path == NULL) {
if (XF86Font_path) { if (XF86Font_path) {
path = XtNewString(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); XtFree(XF86Config->conf_files->file_fontpath);
if (XF86Config->conf_files == NULL)
XF86Config->conf_files = XtCalloc(1, sizeof(XF86ConfFilesRec));
XF86Config->conf_files->file_fontpath = XtNewString(path); XF86Config->conf_files->file_fontpath = XtNewString(path);
} }
}
else if (XF86Config->conf_files && XF86Config->conf_files->file_fontpath) else if (XF86Config->conf_files && XF86Config->conf_files->file_fontpath)
path = XtNewString(XF86Config->conf_files->file_fontpath); path = XtNewString(XF86Config->conf_files->file_fontpath);
} }
@ -629,8 +634,13 @@ FontPathChanged(TreeNode *node)
pos += len - 2; pos += len - 2;
} }
if (XF86Config->conf_files) {
if (XF86Config->conf_files->file_fontpath) if (XF86Config->conf_files->file_fontpath)
XtFree(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; XF86Config->conf_files->file_fontpath = fontpath;
} }
@ -703,11 +713,12 @@ CreateModulePath(TreeNode *modulepath, char *path)
if (path == NULL) { if (path == NULL) {
if (XF86Module_path) { if (XF86Module_path) {
path = XtNewString(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); 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) else if (XF86Config->conf_files && XF86Config->conf_files->file_modulepath)
path = XtNewString(XF86Config->conf_files->file_modulepath); path = XtNewString(XF86Config->conf_files->file_modulepath);
} }
@ -799,8 +810,13 @@ ModulePathChanged(TreeNode *node)
pos += len - 2; pos += len - 2;
} }
if (XF86Config->conf_files) {
if (XF86Config->conf_files->file_modulepath) if (XF86Config->conf_files->file_modulepath)
XtFree(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; XF86Config->conf_files->file_modulepath = modulepath;
} }
@ -921,6 +937,8 @@ NewModuleCallback(Widget unused, XtPointer user_data, XtPointer call_data)
DeleteNode(node); DeleteNode(node);
load = (XF86LoadPtr)XtCalloc(1, sizeof(XF86LoadRec)); load = (XF86LoadPtr)XtCalloc(1, sizeof(XF86LoadRec));
load->load_name = XtNewString(label); load->load_name = XtNewString(label);
if (XF86Config->conf_modules == NULL)
XF86Config->conf_modules = XtCalloc(1, sizeof(XF86ConfModuleRec));
XF86Config->conf_modules->mod_load_lst = XF86Config->conf_modules->mod_load_lst =
xf86addModule(XF86Config->conf_modules->mod_load_lst, load); xf86addModule(XF86Config->conf_modules->mod_load_lst, load);

13
hw/xquartz/GL/Makefile.am Normal file
View File

@ -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

View File

@ -102,7 +102,7 @@ void warn_func(void * p1, char *format, ...);
// some prototypes // some prototypes
static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen); 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, static Bool glAquaInitVisuals(VisualPtr *visualp, DepthPtr *depthp,
int *nvisualp, int *ndepthp, int *nvisualp, int *ndepthp,
@ -118,7 +118,7 @@ static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
static int __glXAquaContextForceCurrent(__GLXcontext *baseContext); static int __glXAquaContextForceCurrent(__GLXcontext *baseContext);
static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask); static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
static CGLPixelFormatObj makeFormat(__GLcontextModes *mode); static CGLPixelFormatObj makeFormat(__GLXconfig *mode);
__GLXprovider __glXMesaProvider = { __GLXprovider __glXMesaProvider = {
__glXAquaScreenProbe, __glXAquaScreenProbe,
@ -141,7 +141,7 @@ struct __GLXAquaScreen {
__GLXscreen base; __GLXscreen base;
int index; int index;
int num_vis; int num_vis;
__GLcontextModes *modes; __GLXconfig *modes;
}; };
static __GLXAquaScreen glAquaScreens[MAXSCREENS]; static __GLXAquaScreen glAquaScreens[MAXSCREENS];
@ -162,7 +162,7 @@ struct __GLXAquaDrawable {
static __GLXcontext * static __GLXcontext *
__glXAquaScreenCreateContext(__GLXscreen *screen, __glXAquaScreenCreateContext(__GLXscreen *screen,
__GLcontextModes *modes, __GLXconfig *config,
__GLXcontext *baseShareContext) __GLXcontext *baseShareContext)
{ {
__GLXAquaContext *context; __GLXAquaContext *context;
@ -177,7 +177,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
memset(context, 0, sizeof *context); memset(context, 0, sizeof *context);
context->base.pGlxScreen = screen; context->base.pGlxScreen = screen;
context->base.modes = modes; context->base.config = config;
context->base.destroy = __glXAquaContextDestroy; context->base.destroy = __glXAquaContextDestroy;
context->base.makeCurrent = __glXAquaContextMakeCurrent; context->base.makeCurrent = __glXAquaContextMakeCurrent;
@ -186,7 +186,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
context->base.forceCurrent = __glXAquaContextForceCurrent; context->base.forceCurrent = __glXAquaContextForceCurrent;
// context->base.createDrawable = __glXAquaContextCreateDrawable; // context->base.createDrawable = __glXAquaContextCreateDrawable;
context->pixelFormat = makeFormat(modes); context->pixelFormat = makeFormat(config);
if (!context->pixelFormat) { if (!context->pixelFormat) {
free(context); free(context);
return NULL; return NULL;
@ -437,7 +437,7 @@ static GLboolean __glXAquaDrawableSwapBuffers(__GLXdrawable *base) {
return GL_TRUE; return GL_TRUE;
} }
static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) { static CGLPixelFormatObj makeFormat(__GLXconfig *config) {
int i; int i;
CGLPixelFormatAttribute attr[64]; // currently uses max of 30 CGLPixelFormatAttribute attr[64]; // currently uses max of 30
CGLPixelFormatObj result; CGLPixelFormatObj result;
@ -446,7 +446,7 @@ static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
GLAQUA_DEBUG_MSG("makeFormat\n"); GLAQUA_DEBUG_MSG("makeFormat\n");
if (!mode->rgbMode) if (!config->rgbMode)
return NULL; return NULL;
i = 0; i = 0;
@ -454,42 +454,43 @@ static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
// attr [i++] = kCGLPFAAcelerated; // require hwaccel - BAD for multiscreen // attr [i++] = kCGLPFAAcelerated; // require hwaccel - BAD for multiscreen
// attr [i++] = kCGLPFANoRecovery; // disable fallback renderers - BAD // attr [i++] = kCGLPFANoRecovery; // disable fallback renderers - BAD
if (mode->stereoMode) { if (config->stereoMode) {
attr[i++] = kCGLPFAStereo; attr[i++] = kCGLPFAStereo;
} }
if (mode->doubleBufferMode) {
if (config->doubleBufferMode) {
attr[i++] = kCGLPFADoubleBuffer; attr[i++] = kCGLPFADoubleBuffer;
} }
if (mode->colorIndexMode) { if (config->colorIndexMode) {
/* ignored */ /* ignored */
} }
if (mode->rgbMode) { if (config->rgbMode) {
attr[i++] = kCGLPFAColorSize; attr[i++] = kCGLPFAColorSize;
attr[i++] = mode->redBits + mode->greenBits + mode->blueBits; attr[i++] = config->redBits + config->greenBits + config->blueBits;
attr[i++] = kCGLPFAAlphaSize; 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++] = kCGLPFAAccumSize;
attr[i++] = mode->accumRedBits + mode->accumGreenBits attr[i++] = config->accumRedBits + config->accumGreenBits
+ mode->accumBlueBits + mode->accumAlphaBits; + config->accumBlueBits + config->accumAlphaBits;
} }
if (mode->haveDepthBuffer) { if (config->haveDepthBuffer) {
attr[i++] = kCGLPFADepthSize; attr[i++] = kCGLPFADepthSize;
attr[i++] = mode->depthBits; attr[i++] = config->depthBits;
} }
if (mode->haveStencilBuffer) { if (config->haveStencilBuffer) {
attr[i++] = kCGLPFAStencilSize; attr[i++] = kCGLPFAStencilSize;
attr[i++] = mode->stencilBits; attr[i++] = config->stencilBits;
} }
attr[i++] = kCGLPFAAuxBuffers; attr[i++] = kCGLPFAAuxBuffers;
attr[i++] = mode->numAuxBuffers; attr[i++] = config->numAuxBuffers;
/* mode->level ignored */ /* mode->level ignored */
@ -670,7 +671,7 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp,
VisualPtr pVisual = *visualp; VisualPtr pVisual = *visualp;
VisualPtr pVisualNew = NULL; VisualPtr pVisualNew = NULL;
VisualID *orig_vid = NULL; VisualID *orig_vid = NULL;
__GLcontextModes *modes; __GLXconfig *modes;
__GLXvisualConfig *pNewVisualConfigs = NULL; __GLXvisualConfig *pNewVisualConfigs = NULL;
void **glXVisualPriv; void **glXVisualPriv;
void **pNewVisualPriv; void **pNewVisualPriv;
@ -752,7 +753,7 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp,
} }
/* Alloc space for the list of glXVisuals */ /* 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) { if (modes == NULL) {
free(orig_vid); free(orig_vid);
free(pNewVisualPriv); free(pNewVisualPriv);
@ -925,6 +926,7 @@ Bool enable_stereo = FALSE;
/* based on code in i830_dri.c /* based on code in i830_dri.c
This ends calling glAquaSetVisualConfigs to set the static This ends calling glAquaSetVisualConfigs to set the static
numconfigs, etc. */ numconfigs, etc. */
// see also glxglcore.c -- bhb
static void static void
glAquaInitVisualConfigs(void) glAquaInitVisualConfigs(void)
{ {
@ -1085,7 +1087,7 @@ static void __glXAquaScreenDestroy(__GLXscreen *screen) {
static void init_screen_visuals(__GLXAquaScreen *screen) { static void init_screen_visuals(__GLXAquaScreen *screen) {
ScreenPtr pScreen = screen->base.pScreen; ScreenPtr pScreen = screen->base.pScreen;
__GLcontextModes *modes; __GLXconfig *modes;
int *used; int *used;
int i, j; int i, j;
@ -1101,7 +1103,7 @@ static void init_screen_visuals(__GLXAquaScreen *screen) {
memset(used, 0, pScreen->numVisuals * sizeof(int)); memset(used, 0, pScreen->numVisuals * sizeof(int));
i = 0; i = 0;
for ( modes = screen -> base.modes for ( modes = screen -> base.visuals
; modes != NULL ; modes != NULL
; modes = modes->next ) { ; modes = modes->next ) {
const int vis_class = _gl_convert_to_x_visual_type( modes->visualType ); const int vis_class = _gl_convert_to_x_visual_type( modes->visualType );
@ -1174,7 +1176,7 @@ static __GLXdrawable *
__glXAquaScreenCreateDrawable(__GLXscreen *screen, __glXAquaScreenCreateDrawable(__GLXscreen *screen,
DrawablePtr pDraw, DrawablePtr pDraw,
XID drawId, XID drawId,
__GLcontextModes *modes) { __GLXconfig *modes) {
__GLXAquaDrawable *glxPriv; __GLXAquaDrawable *glxPriv;
GLAQUA_DEBUG_MSG("glAquaScreenCreateDrawable(%p,%p,%d,%p)\n", context, pDraw, drawId, modes); 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); 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); xfree(glxPriv);
return NULL; return NULL;
} }

View File

@ -13,13 +13,12 @@ if X11APP
X11APP_SUBDIRS = bundle X11APP_SUBDIRS = bundle
endif endif
SUBDIRS = . xpr $(X11APP_SUBDIRS) SUBDIRS = . GL xpr $(X11APP_SUBDIRS)
DIST_SUBDIRS = xpr bundle DIST_SUBDIRS = GL xpr bundle
libXquartz_la_SOURCES = \ libXquartz_la_SOURCES = \
$(top_srcdir)/fb/fbcmap_mi.c \ $(top_srcdir)/fb/fbcmap_mi.c \
$(top_srcdir)/mi/miinitext.c \ $(top_srcdir)/mi/miinitext.c \
$(top_srcdir)/Xext/dpmsstubs.c \
X11Application.m \ X11Application.m \
X11Controller.m \ X11Controller.m \
applewm.c \ applewm.c \
@ -52,4 +51,6 @@ EXTRA_DIST = \
quartzForeground.h \ quartzForeground.h \
quartzKeyboard.h \ quartzKeyboard.h \
quartzPasteboard.h \ quartzPasteboard.h \
sanitizedCarbon.h \
sanitizedCocoa.h \
threadSafety.h threadSafety.h

View File

@ -71,7 +71,7 @@ void X11ApplicationSetCanQuit (int state);
void X11ApplicationServerReady (void); void X11ApplicationServerReady (void);
void X11ApplicationShowHideMenubar (int state); 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 X11EnableKeyEquivalents;
extern int quartzHasRoot, quartzEnableRootless; extern int quartzHasRoot, quartzEnableRootless;

View File

@ -35,6 +35,7 @@
#include "quartzForeground.h" #include "quartzForeground.h"
#include "quartzCommon.h" #include "quartzCommon.h"
#import "X11Application.h" #import "X11Application.h"
# include "darwin.h" # include "darwin.h"
@ -45,10 +46,16 @@
# include "micmap.h" # include "micmap.h"
#include <mach/mach.h> #include <mach/mach.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist" #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 X11EnableKeyEquivalents = TRUE;
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE; int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
@ -732,19 +739,6 @@ void X11ApplicationShowHideMenubar (int state) {
[n release]; [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) { static void check_xinitrc (void) {
char *tem, buf[1024]; char *tem, buf[1024];
NSString *msg; NSString *msg;
@ -786,7 +780,7 @@ environment?", @"Startup xinitrc dialog");
[X11App prefs_synchronize]; [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; NSAutoreleasePool *pool;
#ifdef DEBUG #ifdef DEBUG
@ -813,15 +807,8 @@ void X11ApplicationMain (int argc, const char **argv, void (*server_thread) (voi
aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) - aquaMenuBarHeight = NSHeight([[NSScreen mainScreen] frame]) -
NSMaxY([[NSScreen mainScreen] visibleFrame]); NSMaxY([[NSScreen mainScreen] visibleFrame]);
APPKIT_THREAD = pthread_self(); /* Tell the server thread that it can proceed */
SERVER_THREAD = create_thread (server_thread, server_arg); QuartzInitServer(argc, argv, envp);
if (!SERVER_THREAD) {
ErrorF("can't create secondary thread\n");
exit (1);
}
QuartzMoveToForeground();
[NSApp run]; [NSApp run];
/* not reached */ /* 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 = (screen.origin.y + screen.size.height) - location.y;
} }
pointer_y -= aquaMenuBarHeight;
pressure = 0; // for tablets pressure = 0; // for tablets
tilt_x = 0; tilt_x = 0;
tilt_y = 0; tilt_y = 0;
switch (type) { switch (type) {
case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse; case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto check_subtype;
case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto handle_mouse; case NSOtherMouseDown: ev_button=2; ev_type=ButtonPress; goto check_subtype;
case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto handle_mouse; case NSRightMouseDown: ev_button=3; ev_type=ButtonPress; goto check_subtype;
case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto handle_mouse; case NSLeftMouseUp: ev_button=1; ev_type=ButtonRelease; goto check_subtype;
case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto handle_mouse; case NSOtherMouseUp: ev_button=2; ev_type=ButtonRelease; goto check_subtype;
case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto handle_mouse; case NSRightMouseUp: ev_button=3; ev_type=ButtonRelease; goto check_subtype;
case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto handle_mouse; case NSLeftMouseDragged: ev_button=1; ev_type=MotionNotify; goto check_subtype;
case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto handle_mouse; case NSOtherMouseDragged: ev_button=2; ev_type=MotionNotify; goto check_subtype;
case NSRightMouseDragged: ev_button=3; ev_type=MotionNotify; goto handle_mouse; 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: case NSTabletPoint:
pressure = [e pressure]; pressure = [e pressure];
tilt_x = [e tilt].x; tilt_x = [e tilt].x;
tilt_y = [e tilt].y; // fall through tilt_y = [e tilt].y;
case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse; // fall through to normal mouse handling
handle_mouse:
// 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, DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y,
pressure, tilt_x, tilt_y); pressure, tilt_x, tilt_y);
break; break;
case NSTabletProximity:
DarwinSendProximityEvents([e isEnteringProximity]?ProximityIn:ProximityOut,
pointer_x, pointer_y);
break;
case NSScrollWheel: case NSScrollWheel:
DarwinSendScrollEvents([e deltaX], [e deltaY], pointer_x, pointer_y, DarwinSendScrollEvents([e deltaX], [e deltaY], pointer_x, pointer_y,
pressure, tilt_x, tilt_y); pressure, tilt_x, tilt_y);

View File

@ -100,6 +100,6 @@
#endif /* __OBJC__ */ #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 */ #endif /* X11CONTROLLER_H */

View File

@ -756,6 +756,6 @@ objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
@end @end
void X11ControllerMain(int argc, const char **argv, void (*server_thread) (void *), void *server_arg) { void X11ControllerMain(int argc, char **argv, char **envp) {
X11ApplicationMain (argc, argv, server_thread, server_arg); X11ApplicationMain (argc, argv, envp);
} }

View File

@ -1,10 +1,9 @@
/************************************************************** /**************************************************************
* *
* Shared code for the Darwin X Server * Xquartz initialization code
* running with Quartz or IOKit display mode
* *
* Copyright (c) 2007-2008 Apple Inc.
* Copyright (c) 2001-2004 Torrey T. Lyons. All Rights Reserved. * 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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@ -110,6 +109,7 @@ int darwinFakeMouse3Mask = NX_COMMANDMASK;
// devices // devices
DeviceIntPtr darwinPointer = NULL; DeviceIntPtr darwinPointer = NULL;
DeviceIntPtr darwinTablet = NULL;
DeviceIntPtr darwinKeyboard = NULL; DeviceIntPtr darwinKeyboard = NULL;
// Common pixmap formats // Common pixmap formats
@ -330,14 +330,13 @@ static void DarwinChangePointerControl(
#endif #endif
/* /*
* DarwinMouseProc * DarwinMouseProc: Handle the initialization, etc. of a mouse
* Handle the initialization, etc. of a mouse
*/ */
static int DarwinMouseProc(DeviceIntPtr pPointer, int what) { 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}; CARD8 map[8] = {0, 1, 2, 3, 4, 5, 6, 7};
switch (what) { switch (what) {
case DEVICE_INIT: case DEVICE_INIT:
pPointer->public.on = FALSE; pPointer->public.on = FALSE;
@ -345,15 +344,13 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
InitPointerDeviceStruct((DevicePtr)pPointer, map, 7, InitPointerDeviceStruct((DevicePtr)pPointer, map, 7,
GetMotionHistory, GetMotionHistory,
(PtrCtrlProcPtr)NoopDDA, (PtrCtrlProcPtr)NoopDDA,
GetMotionHistorySize(), 7); GetMotionHistorySize(), 2);
InitProximityClassDeviceStruct(pPointer); pPointer->name = strdup("Quartz Pointing Device");
break; break;
case DEVICE_ON: case DEVICE_ON:
pPointer->public.on = TRUE; pPointer->public.on = TRUE;
AddEnabledDevice( darwinEventReadFD ); AddEnabledDevice( darwinEventReadFD );
return Success; return Success;
case DEVICE_CLOSE: case DEVICE_CLOSE:
case DEVICE_OFF: case DEVICE_OFF:
pPointer->public.on = FALSE; pPointer->public.on = FALSE;
@ -364,6 +361,34 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) {
return Success; 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 * DarwinKeybdProc
@ -374,6 +399,7 @@ static int DarwinKeybdProc( DeviceIntPtr pDev, int onoff )
switch ( onoff ) { switch ( onoff ) {
case DEVICE_INIT: case DEVICE_INIT:
DarwinKeyboardInit( pDev ); DarwinKeyboardInit( pDev );
pDev->name = strdup("Quartz Keyboard");
break; break;
case DEVICE_ON: case DEVICE_ON:
pDev->public.on = TRUE; pDev->public.on = TRUE;
@ -499,10 +525,13 @@ void InitInput( int argc, char **argv )
darwinPointer = AddInputDevice(DarwinMouseProc, TRUE); darwinPointer = AddInputDevice(DarwinMouseProc, TRUE);
RegisterPointerDevice( darwinPointer ); RegisterPointerDevice( darwinPointer );
darwinTablet = AddInputDevice(DarwinTabletProc, TRUE);
RegisterPointerDevice( darwinTablet );
darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE); darwinKeyboard = AddInputDevice(DarwinKeybdProc, TRUE);
RegisterKeyboardDevice( darwinKeyboard ); RegisterKeyboardDevice( darwinKeyboard );
DarwinEQInit( (DevicePtr)darwinKeyboard, (DevicePtr)darwinPointer ); DarwinEQInit();
QuartzInitInput(argc, argv); QuartzInitInput(argc, argv);
} }
@ -533,8 +562,7 @@ DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
/* Find leftmost screen. If there's a tie, take the topmost of the two. */ /* Find leftmost screen. If there's a tie, take the topmost of the two. */
for (i = 1; i < pScreenInfo->numScreens; i++) { for (i = 1; i < pScreenInfo->numScreens; i++) {
if (dixScreenOrigins[i].x < left || if (dixScreenOrigins[i].x < left ||
(dixScreenOrigins[i].x == left && (dixScreenOrigins[i].x == left && dixScreenOrigins[i].y < top))
dixScreenOrigins[i].y < top))
{ {
left = dixScreenOrigins[i].x; left = dixScreenOrigins[i].x;
top = dixScreenOrigins[i].y; top = dixScreenOrigins[i].y;
@ -544,16 +572,19 @@ DarwinAdjustScreenOrigins(ScreenInfo *pScreenInfo)
darwinMainScreenX = left; darwinMainScreenX = left;
darwinMainScreenY = top; darwinMainScreenY = top;
DEBUG_LOG("top = %d, left=%d\n", top, left);
/* Shift all screens so that there is a screen whose top left /* Shift all screens so that there is a screen whose top left
is at X11 (0,0) and at global screen coordinate * is at X11 (0,0) and at global screen coordinate
(darwinMainScreenX, darwinMainScreenY). */ * (darwinMainScreenX, darwinMainScreenY).
*/
if (darwinMainScreenX != 0 || darwinMainScreenY != 0) { if (darwinMainScreenX != 0 || darwinMainScreenY != 0) {
for (i = 0; i < pScreenInfo->numScreens; i++) { for (i = 0; i < pScreenInfo->numScreens; i++) {
dixScreenOrigins[i].x -= darwinMainScreenX; dixScreenOrigins[i].x -= darwinMainScreenX;
dixScreenOrigins[i].y -= darwinMainScreenY; dixScreenOrigins[i].y -= darwinMainScreenY;
/* ErrorF("Screen %d placed at X11 coordinate (%d,%d).\n", DEBUG_LOG("Screen %d placed at X11 coordinate (%d,%d).\n",
i, dixScreenOrigins[i].x, dixScreenOrigins[i].y); */ i, dixScreenOrigins[i].x, dixScreenOrigins[i].y);
} }
} }
} }

View File

@ -71,6 +71,7 @@ extern io_connect_t darwinParamConnect;
extern int darwinEventReadFD; extern int darwinEventReadFD;
extern int darwinEventWriteFD; extern int darwinEventWriteFD;
extern DeviceIntPtr darwinPointer; extern DeviceIntPtr darwinPointer;
extern DeviceIntPtr darwinTablet;
extern DeviceIntPtr darwinKeyboard; extern DeviceIntPtr darwinKeyboard;
// User preferences // User preferences
@ -88,38 +89,6 @@ extern int darwinDesiredRefresh;
extern int darwinMainScreenX; extern int darwinMainScreenX;
extern int darwinMainScreenY; 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 #define ENABLE_DEBUG_LOG 1
#ifdef ENABLE_DEBUG_LOG #ifdef ENABLE_DEBUG_LOG
@ -130,4 +99,6 @@ extern FILE *debug_log_fp;
#define DEBUG_LOG(msg, args...) #define DEBUG_LOG(msg, args...)
#endif #endif
#define TRACE() DEBUG_LOG("\n")
#endif /* _DARWIN_H */ #endif /* _DARWIN_H */

View File

@ -65,6 +65,10 @@ in this Software without prior written authorization from The Open Group.
#define SCROLLWHEELLEFTFAKE 6 #define SCROLLWHEELLEFTFAKE 6
#define SCROLLWHEELRIGHTFAKE 7 #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_ #define _APPLEWM_SERVER_
#include "applewmExt.h" #include "applewmExt.h"
#include <X11/extensions/applewm.h> #include <X11/extensions/applewm.h>
@ -78,7 +82,8 @@ static int old_flags = 0; // last known modifier state
xEvent *darwinEvents = NULL; xEvent *darwinEvents = NULL;
pthread_mutex_t mieqEnqueue_mutex; pthread_mutex_t mieqEnqueue_mutex = PTHREAD_MUTEX_INITIALIZER;
static inline void mieqEnqueue_lock(void) { static inline void mieqEnqueue_lock(void) {
int err; int err;
if((err = pthread_mutex_lock(&mieqEnqueue_mutex))) { 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) { Bool DarwinEQInit(void) {
int err;
if (!darwinEvents) if (!darwinEvents)
darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum()); darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
if (!darwinEvents) if (!darwinEvents)
FatalError("Couldn't allocate event buffer\n"); 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(); mieqInit();
mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler); mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler);
mieqSetHandler(kXquartzActivate, DarwinEventHandler); 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 darwinFakeMouseButtonDown = 0;
static int darwinFakeMouseButtonMask = 0; static int darwinFakeMouseButtonMask = 0;
int i, num_events; 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) { if(!darwinEvents) {
ErrorF("DarwinSendPointerEvents called before darwinEvents was initialized\n"); ErrorF("DarwinSendPointerEvents called before darwinEvents was initialized\n");
return; 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 int valuators[5] = {pointer_x, pointer_y, pressure * SCALEFACTOR_PRESSURE,
Pressure and tilt should be represented natively as floats; unfortunately, tilt_x * SCALEFACTOR_TILT, tilt_y * SCALEFACTOR_TILT};
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, if (pressure == 0 && tilt_x == 0 && tilt_y == 0) dev = darwinPointer;
pressure * INT32_MAX * 1.0f, else dev = darwinTablet;
tilt_x * INT32_MAX * 1.0f,
tilt_y * INT32_MAX * 1.0f};
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) { if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
// Mimic multi-button mouse with modifier-clicks // Mimic multi-button mouse with modifier-clicks
// If both sets of modifiers are pressed, // 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(); { mieqEnqueue_lock(); {
num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button, num_events = GetPointerEvents(darwinEvents, dev, ev_type, ev_button,
POINTER_ABSOLUTE, 0, 5, valuators); POINTER_ABSOLUTE, 0, dev==darwinTablet?5:2, valuators);
for(i=0; i<num_events; i++) mieqEnqueue (darwinPointer,&darwinEvents[i]); for(i=0; i<num_events; i++) mieqEnqueue (dev,&darwinEvents[i]);
DarwinPokeEQ(); DarwinPokeEQ();
} mieqEnqueue_unlock(); } mieqEnqueue_unlock();
@ -453,23 +450,23 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) {
} mieqEnqueue_unlock(); } mieqEnqueue_unlock();
} }
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y, void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y) {
float pressure, float tilt_x, float tilt_y) {
int i, num_events; int i, num_events;
int valuators[5] = {pointer_x, pointer_y,
pressure * INT32_MAX * 1.0f, // tilt and pressure have no meaning for a Prox event
tilt_x * INT32_MAX * 1.0f, int valuators[5] = {pointer_x, pointer_y, 0, 0, 0};
tilt_y * INT32_MAX * 1.0f};
DEBUG_LOG("DarwinSendProximityEvents(%d, %d, %d)\n", ev_type, pointer_x, pointer_y);
if(!darwinEvents) { if(!darwinEvents) {
ErrorF("DarwinSendProximityvents called before darwinEvents was initialized\n"); ErrorF("DarwinSendProximityEvents called before darwinEvents was initialized\n");
return; return;
} }
mieqEnqueue_lock(); { mieqEnqueue_lock(); {
num_events = GetProximityEvents(darwinEvents, darwinPointer, ev_type, num_events = GetProximityEvents(darwinEvents, darwinTablet, ev_type,
0, 5, valuators); 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(); DarwinPokeEQ();
} mieqEnqueue_unlock(); } mieqEnqueue_unlock();
} }

View File

@ -28,17 +28,48 @@
#ifndef _DARWIN_EVENTS_H #ifndef _DARWIN_EVENTS_H
#define _DARWIN_EVENTS_H #define _DARWIN_EVENTS_H
Bool DarwinEQInit(DevicePtr pKbd, DevicePtr pPtr); Bool DarwinEQInit(void);
void DarwinEQEnqueue(const xEventPtr e); void DarwinEQEnqueue(const xEventPtr e);
void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e); void DarwinEQPointerPost(DeviceIntPtr pDev, xEventPtr e);
void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX); void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y, void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y,
float pressure, float tilt_x, float tilt_y); float pressure, float tilt_x, float tilt_y);
void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y, void DarwinSendProximityEvents(int ev_type, int pointer_x, int pointer_y);
float pressure, float tilt_x, float tilt_y);
void DarwinSendKeyboardEvents(int ev_type, int keycode); void DarwinSendKeyboardEvents(int ev_type, int keycode);
void DarwinSendScrollEvents(float count_x, float count_y, int pointer_x, int pointer_y, void DarwinSendScrollEvents(float count_x, float count_y, int pointer_x, int pointer_y,
float pressure, float tilt_x, float tilt_y); float pressure, float tilt_x, float tilt_y);
void DarwinUpdateModKeys(int flags); 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 */ #endif /* _DARWIN_EVENTS_H */

View File

@ -37,6 +37,7 @@ Equipment Corporation.
#include <dix-config.h> #include <dix-config.h>
#endif #endif
#include "darwin.h"
#include "pseudoramiX.h" #include "pseudoramiX.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "dixstruct.h" #include "dixstruct.h"
@ -99,6 +100,8 @@ PseudoramiXAddScreen(int x, int y, int w, int h)
sizeof(PseudoramiXScreenRec)); sizeof(PseudoramiXScreenRec));
} }
DEBUG_LOG("x: %d, y: %d, w: %d, h: %d\n", x, y, w, h);
s = &pseudoramiXScreens[pseudoramiXNumScreens++]; s = &pseudoramiXScreens[pseudoramiXNumScreens++];
s->x = x; s->x = x;
s->y = y; s->y = y;
@ -116,6 +119,8 @@ void PseudoramiXExtensionInit(int argc, char *argv[])
if (noPseudoramiXExtension) return; if (noPseudoramiXExtension) return;
TRACE();
/* Even with only one screen we need to enable PseudoramiX to allow /* Even with only one screen we need to enable PseudoramiX to allow
dynamic screen configuration changes. */ dynamic screen configuration changes. */
#if 0 #if 0
@ -153,12 +158,16 @@ void PseudoramiXExtensionInit(int argc, char *argv[])
void PseudoramiXResetScreens(void) void PseudoramiXResetScreens(void)
{ {
TRACE();
pseudoramiXNumScreens = 0; pseudoramiXNumScreens = 0;
} }
static void PseudoramiXResetProc(ExtensionEntry *extEntry) static void PseudoramiXResetProc(ExtensionEntry *extEntry)
{ {
TRACE();
PseudoramiXResetScreens(); PseudoramiXResetScreens();
} }
@ -166,6 +175,8 @@ static void PseudoramiXResetProc(ExtensionEntry *extEntry)
// was PanoramiX // was PanoramiX
static int ProcPseudoramiXQueryVersion(ClientPtr client) static int ProcPseudoramiXQueryVersion(ClientPtr client)
{ {
TRACE();
return ProcPanoramiXQueryVersion(client); return ProcPanoramiXQueryVersion(client);
} }
@ -178,6 +189,8 @@ static int ProcPseudoramiXGetState(ClientPtr client)
xPanoramiXGetStateReply rep; xPanoramiXGetStateReply rep;
register int n, rc; register int n, rc;
TRACE();
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq); REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success) if (rc != Success)
@ -205,6 +218,8 @@ static int ProcPseudoramiXGetScreenCount(ClientPtr client)
xPanoramiXGetScreenCountReply rep; xPanoramiXGetScreenCountReply rep;
register int n, rc; register int n, rc;
TRACE();
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq); REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success) if (rc != Success)
@ -232,6 +247,8 @@ static int ProcPseudoramiXGetScreenSize(ClientPtr client)
xPanoramiXGetScreenSizeReply rep; xPanoramiXGetScreenSizeReply rep;
register int n, rc; register int n, rc;
TRACE();
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq); REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
if (rc != Success) if (rc != Success)
@ -262,6 +279,8 @@ static int ProcPseudoramiXIsActive(ClientPtr client)
/* REQUEST(xXineramaIsActiveReq); */ /* REQUEST(xXineramaIsActiveReq); */
xXineramaIsActiveReply rep; xXineramaIsActiveReply rep;
TRACE();
REQUEST_SIZE_MATCH(xXineramaIsActiveReq); REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
rep.type = X_Reply; rep.type = X_Reply;
@ -285,6 +304,8 @@ static int ProcPseudoramiXQueryScreens(ClientPtr client)
/* REQUEST(xXineramaQueryScreensReq); */ /* REQUEST(xXineramaQueryScreensReq); */
xXineramaQueryScreensReply rep; xXineramaQueryScreensReply rep;
DEBUG_LOG("noPseudoramiXExtension=%d, pseudoramiXNumScreens=%d\n", noPseudoramiXExtension, pseudoramiXNumScreens);
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq); REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
rep.type = X_Reply; rep.type = X_Reply;
@ -327,6 +348,7 @@ static int ProcPseudoramiXQueryScreens(ClientPtr client)
// was PanoramiX // was PanoramiX
static int ProcPseudoramiXDispatch (ClientPtr client) static int ProcPseudoramiXDispatch (ClientPtr client)
{ REQUEST(xReq); { REQUEST(xReq);
TRACE();
switch (stuff->data) switch (stuff->data)
{ {
case X_PanoramiXQueryVersion: case X_PanoramiXQueryVersion:
@ -353,6 +375,8 @@ SProcPseudoramiXQueryVersion (ClientPtr client)
REQUEST(xPanoramiXQueryVersionReq); REQUEST(xPanoramiXQueryVersionReq);
register int n; register int n;
TRACE();
swaps(&stuff->length,n); swaps(&stuff->length,n);
REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq); REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
return ProcPseudoramiXQueryVersion(client); return ProcPseudoramiXQueryVersion(client);
@ -364,6 +388,8 @@ SProcPseudoramiXGetState(ClientPtr client)
REQUEST(xPanoramiXGetStateReq); REQUEST(xPanoramiXGetStateReq);
register int n; register int n;
TRACE();
swaps (&stuff->length, n); swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetStateReq); REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
return ProcPseudoramiXGetState(client); return ProcPseudoramiXGetState(client);
@ -375,6 +401,8 @@ SProcPseudoramiXGetScreenCount(ClientPtr client)
REQUEST(xPanoramiXGetScreenCountReq); REQUEST(xPanoramiXGetScreenCountReq);
register int n; register int n;
TRACE();
swaps (&stuff->length, n); swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq); REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
return ProcPseudoramiXGetScreenCount(client); return ProcPseudoramiXGetScreenCount(client);
@ -386,6 +414,8 @@ SProcPseudoramiXGetScreenSize(ClientPtr client)
REQUEST(xPanoramiXGetScreenSizeReq); REQUEST(xPanoramiXGetScreenSizeReq);
register int n; register int n;
TRACE();
swaps (&stuff->length, n); swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq); REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
return ProcPseudoramiXGetScreenSize(client); return ProcPseudoramiXGetScreenSize(client);
@ -398,6 +428,8 @@ SProcPseudoramiXIsActive(ClientPtr client)
REQUEST(xXineramaIsActiveReq); REQUEST(xXineramaIsActiveReq);
register int n; register int n;
TRACE();
swaps (&stuff->length, n); swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaIsActiveReq); REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
return ProcPseudoramiXIsActive(client); return ProcPseudoramiXIsActive(client);
@ -410,6 +442,8 @@ SProcPseudoramiXQueryScreens(ClientPtr client)
REQUEST(xXineramaQueryScreensReq); REQUEST(xXineramaQueryScreensReq);
register int n; register int n;
TRACE();
swaps (&stuff->length, n); swaps (&stuff->length, n);
REQUEST_SIZE_MATCH(xXineramaQueryScreensReq); REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
return ProcPseudoramiXQueryScreens(client); return ProcPseudoramiXQueryScreens(client);
@ -419,6 +453,9 @@ SProcPseudoramiXQueryScreens(ClientPtr client)
static int static int
SProcPseudoramiXDispatch (ClientPtr client) SProcPseudoramiXDispatch (ClientPtr client)
{ REQUEST(xReq); { REQUEST(xReq);
TRACE();
switch (stuff->data) switch (stuff->data)
{ {
case X_PanoramiXQueryVersion: case X_PanoramiXQueryVersion:

View File

@ -39,7 +39,6 @@
#include "quartz.h" #include "quartz.h"
#include "darwin.h" #include "darwin.h"
#include "darwinEvents.h" #include "darwinEvents.h"
#include "quartzAudio.h"
#include "pseudoramiX.h" #include "pseudoramiX.h"
#define _APPLEWM_SERVER_ #define _APPLEWM_SERVER_
#include "applewmExt.h" #include "applewmExt.h"
@ -156,10 +155,6 @@ void QuartzInitOutput(
int argc, int argc,
char **argv ) char **argv )
{ {
if (serverGeneration == 0) {
QuartzAudioInit();
}
if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler, if (!RegisterBlockAndWakeupHandlers(QuartzBlockHandler,
QuartzWakeupHandler, QuartzWakeupHandler,
NULL)) NULL))
@ -244,7 +239,7 @@ void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev,
int x, y, width, height, sx, sy; int x, y, width, height, sx, sy;
xEvent e; xEvent e;
DEBUG_LOG("QuartzDisplayChangedHandler()\n"); DEBUG_LOG("QuartzDisplayChangedHandler(): noPseudoramiXExtension=%d, screenInfo.numScreens=%d\n", noPseudoramiXExtension, screenInfo.numScreens);
if (noPseudoramiXExtension || screenInfo.numScreens != 1) if (noPseudoramiXExtension || screenInfo.numScreens != 1)
{ {
/* FIXME: if not using Xinerama, we have multiple screens, and /* FIXME: if not using Xinerama, we have multiple screens, and

View File

@ -128,6 +128,7 @@ Bool QuartzAddScreen(int index, ScreenPtr pScreen);
Bool QuartzSetupScreen(int index, ScreenPtr pScreen); Bool QuartzSetupScreen(int index, ScreenPtr pScreen);
void QuartzInitOutput(int argc,char **argv); void QuartzInitOutput(int argc,char **argv);
void QuartzInitInput(int argc, char **argv); void QuartzInitInput(int argc, char **argv);
void QuartzInitServer(int argc, char **argv, char **envp);
void QuartzGiveUp(void); void QuartzGiveUp(void);
void QuartzProcessEvent(xEvent *xe); void QuartzProcessEvent(xEvent *xe);
void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents); void QuartzDisplayChangedHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, int nevents);

View File

@ -44,8 +44,6 @@
#include "darwin.h" #include "darwin.h"
#include "pseudoramiX.h"
extern void FatalError(const char *, ...); extern void FatalError(const char *, ...);
extern char *display; extern char *display;
extern int noPanoramiXExtension; extern int noPanoramiXExtension;

View File

@ -37,42 +37,72 @@
#include <unistd.h> #include <unistd.h>
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#include "quartzCommon.h" #include "quartzCommon.h"
#include "quartzForeground.h"
#include "X11Controller.h" #include "X11Controller.h"
#include "darwin.h" #include "darwin.h"
#include "darwinEvents.h"
#include "quartzAudio.h"
#include "quartz.h" #include "quartz.h"
#include "opaque.h" #include "opaque.h"
#include "micmap.h" #include "micmap.h"
#include <assert.h> #include <assert.h>
char **envpGlobal; // argcGlobal and argvGlobal #include <pthread.h>
// are from dix/globals.c
int main(int argc, char **argv, char **envp); int dix_main(int argc, char **argv, char **envp);
void _InitHLTB(void);
void DarwinHandleGUI(int argc, char **argv, char **envp); struct arg {
int argc;
char **argv;
char **envp;
};
static void server_thread (void *arg) { 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));
} }
/* static pthread_t create_thread (void *func, void *arg) {
* DarwinHandleGUI pthread_attr_t attr;
* This function is called first from main(). The first time pthread_t tid;
* 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 pthread_attr_init (&attr);
* server. On the second call this function loads the user pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
* preferences set by the Mac OS X front end. pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
*/ pthread_create (&tid, &attr, func, arg);
void DarwinHandleGUI(int argc, char **argv, char **envp) { pthread_attr_destroy (&attr);
static Bool been_here = FALSE;
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 i;
int fd[2]; int fd[2];
if (been_here) { /* Unset CFProcessPath, so our children don't inherit this kludge we need
return; * to load our nib. If an xterm gets this set, then it fails to
} * 'open hi.txt' properly.
been_here = TRUE; */
unsetenv("CFProcessPath");
// Make a pipe to pass events // Make a pipe to pass events
assert( pipe(fd) == 0 ); assert( pipe(fd) == 0 );
@ -80,11 +110,6 @@ void DarwinHandleGUI(int argc, char **argv, char **envp) {
darwinEventWriteFD = fd[1]; darwinEventWriteFD = fd[1];
fcntl(darwinEventReadFD, F_SETFL, O_NONBLOCK); 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++) { for (i = 1; i < argc; i++) {
// Display version info without starting Mac OS X UI if requested // Display version info without starting Mac OS X UI if requested
if (!strcmp( argv[i], "-showconfig" ) || !strcmp( argv[i], "-version" )) { 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 /* Create the audio mutex */
events on the second thread. But now we may be using Carbon, QuartzAudioInit();
that needs to run on the main thread. (Otherwise, when it's
prebound, it will initialize itself on the wrong thread)
grr.. but doing that means that if the X thread gets scheduled QuartzMoveToForeground();
before the main thread when we're _not_ prebound, things fail, X11ControllerMain(argc, argv, envp);
so initialize by hand. */
_InitHLTB();
X11ControllerMain(argc, (const char **)argv, server_thread, NULL);
exit(0); exit(0);
} }

View File

@ -33,8 +33,8 @@
#include <execinfo.h> #include <execinfo.h>
pthread_t SERVER_THREAD; pthread_t APPKIT_THREAD_ID;
pthread_t APPKIT_THREAD; pthread_t SERVER_THREAD_ID;
void spewCallStack(void) { void spewCallStack(void) {
void* callstack[128]; void* callstack[128];
@ -48,7 +48,7 @@ void spewCallStack(void) {
free(strs); 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)) if(pthread_equal(pthread_self(), tid))
return; return;
@ -58,3 +58,13 @@ void _threadAssert(pthread_t tid, const char *file, const char *fun, int line) {
file, fun, line); file, fun, line);
spewCallStack(); 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";
}
}

View File

@ -31,22 +31,23 @@
#include <pthread.h> #include <pthread.h>
extern pthread_t SERVER_THREAD; extern pthread_t APPKIT_THREAD_ID;
extern pthread_t APPKIT_THREAD; extern pthread_t SERVER_THREAD_ID;
#define threadSafetyID(tid) (pthread_equal((tid), SERVER_THREAD) ? "X Server Thread" : "Appkit Thread")
/* Dump the call stack */ /* Dump the call stack */
void spewCallStack(void); void spewCallStack(void);
/* Print message to ErrorF if we're in the wrong thread */ /* 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 #ifdef DEBUG_THREADS
#define TA_SERVER() threadAssert(SERVER_THREAD) #define TA_APPKIT() threadSafetyAssert(APPKIT_THREAD_ID)
#define TA_APPKIT() threadAssert(APPKIT_THREAD) #define TA_SERVER() threadSafetyAssert(SERVER_THREAD_ID)
#else #else
#define TA_SERVER() #define TA_SERVER()
#define TA_APPKIT() #define TA_APPKIT()

View File

@ -21,23 +21,6 @@ Xquartz_SOURCES = \
Xquartz_LDADD = \ Xquartz_LDADD = \
$(top_builddir)/hw/xquartz/libXquartz.la \ $(top_builddir)/hw/xquartz/libXquartz.la \
$(top_builddir)/dix/dixfonts.lo \ $(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 \ $(top_builddir)/miext/rootless/librootless.la \
$(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin $(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin
@ -64,6 +47,7 @@ include $(top_srcdir)/cpprules.in
cp $< $@ cp $< $@
EXTRA_DIST = \ EXTRA_DIST = \
Xquartz.man.pre \
dri.h \ dri.h \
dristruct.h \ dristruct.h \
appledri.h \ appledri.h \

Some files were not shown because too many files have changed in this diff Show More