summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am13
-rw-r--r--configure.ac33
-rw-r--r--dix/window.c1
-rw-r--r--fb/fb.h4
-rw-r--r--fb/fbbltone.c6
-rw-r--r--fb/fbpict.c2
-rw-r--r--fb/fbpict.h44
-rw-r--r--fb/fbtile.c2
-rw-r--r--glucose/Makefile.am30
-rw-r--r--glucose/glitz_glucose.h179
-rw-r--r--glucose/glucose.c802
-rw-r--r--glucose/glucose.h58
-rw-r--r--glucose/glucose_context.c435
-rw-r--r--glucose/glucose_drawable.c181
-rw-r--r--glucose/glucose_format.c240
-rw-r--r--glucose/glucose_info.c980
-rw-r--r--hw/xfree86/Makefile.am13
-rw-r--r--hw/xfree86/dri/dri.c196
-rw-r--r--hw/xfree86/dri/dristruct.h2
-rw-r--r--hw/xfree86/glucose/Makefile.am20
-rw-r--r--hw/xfree86/glucose/glucosemodule.c94
-rw-r--r--hw/xgl/Makefile.am48
-rw-r--r--hw/xgl/egl/xeglinit.c9
-rw-r--r--hw/xgl/glx/Makefile.am13
-rw-r--r--hw/xgl/glx/module/Makefile.am10
-rw-r--r--hw/xgl/glx/xglx.c67
-rw-r--r--hw/xgl/glx/xglxinit.c2
-rw-r--r--hw/xgl/glxext/Makefile.am7
-rw-r--r--hw/xgl/glxext/module/Makefile.am19
-rw-r--r--hw/xgl/glxext/module/glcoremodule.c38
-rw-r--r--hw/xgl/glxext/xglglxext.c3326
-rw-r--r--hw/xgl/glxext/xglglxlog.c950
-rw-r--r--hw/xgl/xglglx.c156
-rw-r--r--hw/xgl/xglglx.h49
-rw-r--r--hw/xgl/xglinit.c6
-rw-r--r--hw/xgl/xglinput.c12
-rw-r--r--hw/xgl/xglparse.c63
-rw-r--r--hw/xgl/xglscreen.c59
-rw-r--r--include/xgl-config.h.in3
-rw-r--r--mi/miinitext.c18
-rw-r--r--randr/randrstr.h2
-rw-r--r--render/picture.c198
-rw-r--r--render/picture.h8
-rw-r--r--render/picturestr.h53
-rw-r--r--render/render.c13
-rw-r--r--xgl/Makefile.am40
-rw-r--r--xgl/xgl.h (renamed from hw/xgl/xgl.h)42
-rw-r--r--xgl/xglarea.c (renamed from hw/xgl/xglarea.c)0
-rw-r--r--xgl/xglcmap.c (renamed from hw/xgl/xglcmap.c)27
-rw-r--r--xgl/xglcompose.c (renamed from hw/xgl/xglcompose.c)7
-rw-r--r--xgl/xglcopy.c (renamed from hw/xgl/xglcopy.c)2
-rw-r--r--xgl/xglfill.c (renamed from hw/xgl/xglfill.c)176
-rw-r--r--xgl/xglgc.c (renamed from hw/xgl/xglgc.c)3
-rw-r--r--xgl/xglgeometry.c (renamed from hw/xgl/xglgeometry.c)0
-rw-r--r--xgl/xglget.c (renamed from hw/xgl/xglget.c)2
-rw-r--r--xgl/xglglyph.c (renamed from hw/xgl/xglglyph.c)0
-rw-r--r--xgl/xglpict.c (renamed from hw/xgl/xglpict.c)73
-rw-r--r--xgl/xglpixmap.c (renamed from hw/xgl/xglpixmap.c)14
-rw-r--r--xgl/xglshm.c (renamed from hw/xgl/xglshm.c)0
-rw-r--r--xgl/xglsolid.c (renamed from hw/xgl/xglsolid.c)2
-rw-r--r--xgl/xglsync.c (renamed from hw/xgl/xglsync.c)55
-rw-r--r--xgl/xgltile.c (renamed from hw/xgl/xgltile.c)5
-rw-r--r--xgl/xgltrap.c (renamed from hw/xgl/xgltrap.c)0
-rw-r--r--xgl/xglwindow.c (renamed from hw/xgl/xglwindow.c)0
-rw-r--r--xgl/xglxv.c (renamed from hw/xgl/xglxv.c)140
65 files changed, 6900 insertions, 2152 deletions
diff --git a/Makefile.am b/Makefile.am
index e382d58e7..53624426d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -30,6 +30,15 @@ if DBE
DBE_DIR=dbe
endif
+if XGL
+XGL_DIR=xgl
+endif
+
+if GLUCOSE
+XGL_DIR=xgl
+GLUCOSE_DIR=glucose
+endif
+
SUBDIRS = \
doc \
include \
@@ -56,6 +65,8 @@ SUBDIRS = \
$(GLX_DIR) \
exa \
config \
+ $(XGL_DIR) \
+ $(GLUCOSE_DIR) \
hw
aclocaldir = $(datadir)/aclocal
@@ -102,6 +113,8 @@ DIST_SUBDIRS = \
GL \
exa \
config \
+ xgl \
+ glucose \
hw
# gross hack
diff --git a/configure.ac b/configure.ac
index 10aa24158..bc30d57d7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -763,6 +763,14 @@ else
XVMC=no
fi
+PKG_CHECK_MODULES([GLUCOSE], [glitz >= 0.5.7], [GLUCOSE=yes], [GLUCOSE=no])
+AC_SUBST(GLUCOSE_CFLAGS)
+AC_SUBST(GLUCOSE_LIBS)
+AM_CONDITIONAL(GLUCOSE, [test "x$GLUCOSE" = xyes])
+if test "x$GLUCOSE" = xyes; then
+ AC_DEFINE(GLUCOSE, 1, [Build glucose acceleration module])
+fi
+
AM_CONDITIONAL(XVMC, [test "x$XVMC" = xyes])
if test "x$XVMC" = xyes; then
AC_DEFINE(XvMCExtension, 1, [Build XvMC extension])
@@ -1247,18 +1255,24 @@ dnl Xgl DDX
AC_MSG_CHECKING([whether to build Xgl DDX])
if test "x$XGL" != xno; then
- PKG_CHECK_MODULES([XGLMODULES], [glitz-glx >= 0.4.3], [XGL=yes], [XGL=no])
- AC_SUBST(XGLMODULES_CFLAGS)
+ PKG_CHECK_MODULES([XGLMODULES], [glitz-glx >= 0.4.3], [XGL=yes], [XGL=no])
+ AC_SUBST(XGLMODULES_CFLAGS)
+ AC_SUBST(XGLMODULES_LIBS)
fi
AC_MSG_RESULT([$XGL])
AM_CONDITIONAL(XGL, [test "x$XGL" = xyes])
+if test "x$XGL" = xyes -o "x$GLUCOSE" = xyes; then
+ XGL_LIBS="$FB_LIB $COMPOSITE_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 $MIEXT_LAYER_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB $CWRAP_LIB"
+ AC_SUBST([XGL_LIBS])
+fi
+
if test "x$XGL" = xyes; then
XGL_LIBS="$FB_LIB $COMPOSITE_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $MIEXT_LAYER_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $XPSTUBS_LIB"
XGL_SYS_LIBS="$XGLMODULES_LIBS $GLX_SYS_LIBS $DLOPEN_LIBS"
- AC_SUBST([XGL_LIBS])
AC_SUBST([XGL_SYS_LIBS])
AC_DEFINE(XGL_MODULAR, 1, [Use loadable XGL modules])
+ AC_DEFINE(XGLServer, 1, [Building XGL server])
xglmoduledir="$moduledir/xgl"
AC_SUBST([xglmoduledir])
@@ -1269,8 +1283,9 @@ dnl Xegl DDX
AC_MSG_CHECKING([whether to build Xegl DDX])
if test "x$XEGL" != xno; then
- PKG_CHECK_MODULES([XGLMODULES], [glitz-glx >= 0.4.3], [XEGL=yes], [XEGL=no])
- AC_SUBST(XEGLMODULES_CFLAGS)
+ PKG_CHECK_MODULES([XEGLMODULES], [glitz-egl >= 0.4.3], [XEGL=yes], [XEGL=no])
+ AC_SUBST(XEGLMODULES_CFLAGS)
+ AC_SUBST(XEGLMODULES_LIBS)
fi
AC_MSG_RESULT([$XEGL])
AM_CONDITIONAL(XEGL, [test "x$XEGL" = xyes])
@@ -1286,8 +1301,9 @@ dnl Xglx DDX
AC_MSG_CHECKING([whether to build Xglx DDX])
if test "x$XGLX" != xno; then
- PKG_CHECK_MODULES([XGLXMODULES], [glitz-glx >= 0.4.3 xrender], [XGLX=yes], [XGLX=no])
- AC_SUBST(XGLXMODULES_CFLAGS)
+ PKG_CHECK_MODULES([XGLXMODULES], [glitz-glx >= 0.4.3 xrender], [XGLX=yes], [XGLX=no])
+ AC_SUBST(XGLXMODULES_CFLAGS)
+ AC_SUBST(XGLXMODULES_LIBS)
fi
AC_MSG_RESULT([$XGLX])
AM_CONDITIONAL(XGLX, [test "x$XGLX" = xyes])
@@ -2130,6 +2146,8 @@ Xext/Makefile
Xi/Makefile
xfixes/Makefile
exa/Makefile
+xgl/Makefile
+glucose/Makefile
hw/Makefile
hw/xfree86/Makefile
hw/xfree86/common/Makefile
@@ -2145,6 +2163,7 @@ hw/xfree86/dri/Makefile
hw/xfree86/dri2/Makefile
hw/xfree86/dummylib/Makefile
hw/xfree86/exa/Makefile
+hw/xfree86/glucose/Makefile
hw/xfree86/fbdevhw/Makefile
hw/xfree86/i2c/Makefile
hw/xfree86/int10/Makefile
diff --git a/dix/window.c b/dix/window.c
index 9975b5eec..8d61b8e3c 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -128,6 +128,7 @@ Equipment Corporation.
#endif
#include "privates.h"
#include "xace.h"
+#include "mi.h"
/******
* Window stuff for server
diff --git a/fb/fb.h b/fb/fb.h
index 01000d79c..0182ea8b7 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -711,7 +711,7 @@ typedef struct {
} \
fbPrepareAccess(pDrawable); \
(pointer) = (FbBits *) _pPix->devPrivate.ptr; \
- (stride) = ((int) _pPix->devKind) / sizeof (FbBits); (void)(stride); \
+ (stride) = _pPix->devKind / (int) sizeof (FbBits); (void)(stride); \
(bpp) = _pPix->drawable.bitsPerPixel; (void)(bpp); \
}
@@ -728,7 +728,7 @@ typedef struct {
} \
fbPrepareAccess(pDrawable); \
(pointer) = (FbStip *) _pPix->devPrivate.ptr; \
- (stride) = ((int) _pPix->devKind) / sizeof (FbStip); (void)(stride); \
+ (stride) = _pPix->devKind / (int) sizeof (FbStip); (void)(stride); \
(bpp) = _pPix->drawable.bitsPerPixel; (void)(bpp); \
}
diff --git a/fb/fbbltone.c b/fb/fbbltone.c
index ffe69775a..ba594db5a 100644
--- a/fb/fbbltone.c
+++ b/fb/fbbltone.c
@@ -49,12 +49,12 @@
#define LoadBits {\
if (leftShift) { \
- bitsRight = (src < srcEnd ? READ(src++) : 0); \
+ bitsRight = (src != srcEnd ? READ(src++) : 0); \
bits = (FbStipLeft (bitsLeft, leftShift) | \
FbStipRight(bitsRight, rightShift)); \
bitsLeft = bitsRight; \
} else \
- bits = (src < srcEnd ? READ(src++) : 0); \
+ bits = (src != srcEnd ? READ(src++) : 0); \
}
#ifndef FBNOPIXADDR
@@ -535,7 +535,7 @@ const FbBits fbStipple24Bits[3][1 << FbStip24Len] = {
stip = FbLeftStipBits(bits, len); \
} else { \
stip = FbLeftStipBits(bits, remain); \
- bits = (src < srcEnd ? READ(src++) : 0); \
+ bits = (src != srcEnd ? READ(src++) : 0); \
__len = (len) - remain; \
stip = FbMergePartStip24Bits(stip, FbLeftStipBits(bits, __len), \
remain, __len); \
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 85b5171c5..9b360bbaf 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -297,7 +297,7 @@ create_bits_picture (PicturePtr pict,
image = pixman_image_create_bits (
pict->format,
pict->pDrawable->width, pict->pDrawable->height,
- (uint32_t *)bits, stride * sizeof (FbStride));
+ (uint32_t *)bits, stride * (int) sizeof (FbStride));
#ifdef FB_ACCESS_WRAPPER
diff --git a/fb/fbpict.h b/fb/fbpict.h
index b4c1dcf12..6bf0ac9d2 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -30,13 +30,6 @@
#include "renderedge.h"
-
-#if defined(__GNUC__)
-#define INLINE __inline__
-#else
-#define INLINE
-#endif
-
#define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
#define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b))
@@ -74,37 +67,6 @@
#define Green(x) (((x) >> 8) & 0xff)
#define Blue(x) ((x) & 0xff)
-/**
- * Returns TRUE if the fbComposeGetSolid can be used to get a single solid
- * color representing every source sampling location of the picture.
- */
-static INLINE Bool
-fbCanGetSolid(PicturePtr pict)
-{
- if (pict->pDrawable == NULL ||
- pict->pDrawable->width != 1 ||
- pict->pDrawable->height != 1)
- {
- return FALSE;
- }
- if (pict->repeat != RepeatNormal)
- return FALSE;
-
- switch (pict->format) {
- case PICT_a8r8g8b8:
- case PICT_x8r8g8b8:
- case PICT_a8b8g8r8:
- case PICT_x8b8g8r8:
- case PICT_r8g8b8:
- case PICT_b8g8r8:
- case PICT_r5g6b5:
- case PICT_b5g6r5:
- return TRUE;
- default:
- return FALSE;
- }
-}
-
#define fbComposeGetSolid(pict, bits, fmt) { \
FbBits *__bits__; \
FbStride __stride__; \
@@ -368,6 +330,12 @@ fbCanGetSolid(PicturePtr pict)
#define FASTCALL
#endif
+#if defined(__GNUC__)
+#define INLINE __inline__
+#else
+#define INLINE
+#endif
+
typedef struct _FbComposeData {
CARD8 op;
PicturePtr src;
diff --git a/fb/fbtile.c b/fb/fbtile.c
index 05a27a17b..52086dccd 100644
--- a/fb/fbtile.c
+++ b/fb/fbtile.c
@@ -81,7 +81,7 @@ fbEvenTile (FbBits *dst,
*/
bits = READ(t);
t += tileStride;
- if (t >= tileEnd) t = tile;
+ if (t == tileEnd) t = tile;
bits = FbRotLeft(bits,rot);
and = fbAnd(alu,bits,pm);
xor = fbXor(alu,bits,pm);
diff --git a/glucose/Makefile.am b/glucose/Makefile.am
new file mode 100644
index 000000000..943a3c77a
--- /dev/null
+++ b/glucose/Makefile.am
@@ -0,0 +1,30 @@
+noinst_LTLIBRARIES = libglucose.la
+
+INCLUDES = -I@MESA_SOURCE@/include \
+ -I$(top_srcdir)/GL/mesa/glapi \
+ -I$(top_srcdir)/GL/glx \
+ -I$(top_srcdir)/GL/include \
+ -I$(top_srcdir)/xgl \
+ -I$(top_srcdir)/hw/xfree86/os-support \
+ -I$(top_srcdir)/hw/xfree86/os-support/bus \
+ -I$(top_srcdir)/hw/xfree86/common
+
+# -DXFree86Server is required because the X11 driver in Mesa thinks that
+# symbol means "being built in the server"
+AM_CFLAGS = \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
+ $(GLUCOSE_CFLAGS) \
+ @GLX_DEFINES@ \
+ -DXFree86Server
+
+libglucose_la_SOURCES = \
+ glucose.c \
+ glucose.h \
+ glucose_context.c \
+ glucose_drawable.c \
+ glucose_format.c \
+ glucose_info.c
+
+libglucose_la_LIBADD = $(GLUCOSE_LIBS)
diff --git a/glucose/glitz_glucose.h b/glucose/glitz_glucose.h
new file mode 100644
index 000000000..26540b727
--- /dev/null
+++ b/glucose/glitz_glucose.h
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: David Reveman <davidr@novell.com>
+ *
+ * This file has been modified from the GLitz GLX code for use with glucose
+ * by: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ **************************************************************************/
+
+#ifndef GLITZ_GLUCOSE_H_INCLUDED
+#define GLITZ_GLUCOSE_H_INCLUDED
+
+#include "glitzint.h"
+
+typedef glitz_function_pointer_t (* glitz_glucose_get_proc_address_t)
+ (const glitz_gl_ubyte_t *);
+typedef Bool (* glitz_glucose_make_context_current_t)
+ (__GLXcontext *baseContext);
+typedef __GLXcontext (* glitz_glucose_create_new_context_t)
+ (__GLXscreen *display, int config, int render_type,
+ __GLXcontext share_list, Bool direct);
+typedef void *(* glitz_glucose_copy_sub_buffer_t)
+ (__GLXscreen *display, __GLXdrawable *draw, int x, int y, int w, int h);
+
+typedef struct _glitz_glucose_drawable glitz_glucose_drawable_t;
+typedef struct _glitz_glucose_screen_info_t glitz_glucose_screen_info_t;
+typedef struct _glitz_glucose_display_info_t glitz_glucose_display_info_t;
+
+typedef struct _glitz_glucose_static_proc_address_list_t {
+ glitz_glucose_get_proc_address_t get_proc_address;
+ glitz_glucose_make_context_current_t make_context_current;
+ glitz_glucose_create_new_context_t create_new_context;
+ glitz_glucose_copy_sub_buffer_t copy_sub_buffer;
+} glitz_glucose_static_proc_address_list_t;
+
+typedef struct _glitz_glucose_thread_info_t {
+ glitz_glucose_display_info_t **displays;
+ int n_displays;
+ glitz_context_t *cctx;
+} glitz_glucose_thread_info_t;
+
+struct _glitz_glucose_display_info_t {
+ glitz_glucose_thread_info_t *thread_info;
+ __GLXscreen *display;
+ glitz_glucose_screen_info_t **screens;
+ int n_screens;
+};
+
+typedef struct _glitz_glucose_context_info_t {
+ glitz_glucose_drawable_t *drawable;
+ glitz_surface_t *surface;
+ glitz_constraint_t constraint;
+} glitz_glucose_context_info_t;
+
+typedef struct _glitz_glucose_context_t {
+ glitz_context_t base;
+ __GLXcontext *context;
+ glitz_format_id_t id;
+ glitz_backend_t backend;
+ glitz_bool_t initialized;
+} glitz_glucose_context_t;
+
+struct _glitz_glucose_screen_info_t {
+ __GLXscreen *screen;
+ glitz_glucose_display_info_t *display_info;
+ int drawables;
+ glitz_int_drawable_format_t *formats;
+ int n_formats;
+ glitz_glucose_context_t **contexts;
+ int n_contexts;
+ glitz_glucose_context_info_t context_stack[GLITZ_CONTEXT_STACK_SIZE];
+ int context_stack_size;
+ __GLXcontext *root_context;
+ unsigned long glx_feature_mask;
+ glitz_gl_float_t glx_version;
+ glitz_glucose_static_proc_address_list_t glx;
+ glitz_program_map_t program_map;
+};
+
+struct _glitz_glucose_drawable {
+ glitz_drawable_t base;
+
+ glitz_glucose_screen_info_t *screen_info;
+ glitz_glucose_context_t *context;
+ __GLXdrawable *drawable;
+ int width;
+ int height;
+};
+
+extern void
+glitz_glucose_query_extensions (glitz_glucose_screen_info_t *screen_info,
+ glitz_gl_float_t glx_version);
+
+extern glitz_glucose_screen_info_t *
+glitz_glucose_screen_info_get (__GLXscreen *display);
+
+extern glitz_function_pointer_t
+glitz_glucose_get_proc_address (const char *name,
+ void *closure);
+
+extern glitz_glucose_context_t *
+glitz_glucose_context_get (glitz_glucose_screen_info_t *screen_info,
+ glitz_drawable_format_t *format);
+
+extern void
+glitz_glucose_context_destroy (glitz_glucose_screen_info_t *screen_info,
+ glitz_glucose_context_t *context);
+
+extern void
+glitz_glucose_query_formats (glitz_glucose_screen_info_t *screen_info);
+
+extern glitz_bool_t
+_glitz_glucose_drawable_update_size (glitz_glucose_drawable_t *drawable,
+ int width,
+ int height);
+
+extern glitz_bool_t
+glitz_glucose_push_current (void *abstract_drawable,
+ glitz_surface_t *surface,
+ glitz_constraint_t constraint,
+ glitz_bool_t *restore_state);
+
+extern glitz_surface_t *
+glitz_glucose_pop_current (void *abstract_drawable);
+
+void
+glitz_glucose_make_current (void *abstract_drawable,
+ glitz_constraint_t constraint);
+
+extern glitz_status_t
+glitz_glucose_make_current_read (void *abstract_surface);
+
+extern void
+glitz_glucose_destroy (void *abstract_drawable);
+
+extern glitz_bool_t
+glitz_glucose_swap_buffers (void *abstract_drawable);
+
+extern glitz_bool_t
+glitz_glucose_copy_sub_buffer (void *abstract_drawable,
+ int x,
+ int y,
+ int width,
+ int height);
+
+glitz_drawable_format_t *
+glitz_glucose_find_window_format (__GLXscreen *screen,
+ unsigned long mask,
+ const glitz_drawable_format_t *templ,
+ int count);
+
+glitz_drawable_t *
+glitz_glucose_create_drawable_for_window (__GLXscreen *screen,
+ glitz_drawable_format_t *format,
+ __GLXdrawable *window,
+ unsigned int width,
+ unsigned int height);
+
+#endif /* GLITZ_GLUCOSE_H_INCLUDED */
diff --git a/glucose/glucose.c b/glucose/glucose.c
new file mode 100644
index 000000000..6d6004b5c
--- /dev/null
+++ b/glucose/glucose.c
@@ -0,0 +1,802 @@
+/*
+ * Copyright 2006 Zack Rusin
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * ZACK RUSIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL ZACK RUSIN 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.
+ *
+ * Authors: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ * Re-written from original code by Zack Rusin
+ *
+ **************************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "glxserver.h"
+#include "glucose.h"
+#include "glitz_glucose.h"
+
+#include "xgl.h"
+
+#include "xf86str.h"
+#include "xf86.h"
+
+#ifdef MITSHM
+#include "shmint.h"
+static ShmFuncs shmFuncs = { NULL, xglShmPutImage };
+#endif
+
+int xglScreenGeneration;
+int xglScreenPrivateIndex;
+int xglGCPrivateIndex;
+int xglPixmapPrivateIndex;
+int xglWinPrivateIndex;
+#ifdef RENDER
+int xglGlyphPrivateIndex;
+#endif
+
+static int glucoseGeneration = -1;
+int glucoseScreenPrivateIndex;
+int glucoseCreateWindowIndex;
+
+xglScreenInfoRec xglScreenInfo = {
+ NULL, 0, 0, 0, 0, 0,
+ DEFAULT_GEOMETRY_DATA_TYPE,
+ DEFAULT_GEOMETRY_USAGE,
+ FALSE,
+ XGL_DEFAULT_PBO_MASK,
+ FALSE,
+ FALSE,
+ FilterBilinear,
+ {
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } }
+ }
+};
+
+static glitz_drawable_format_t *
+glucoseInitOutput(__GLXscreen *screen);
+
+/* Wrapped for glxext close down */
+static void glucoseDestroyGLXscreen(__GLXscreen *screen)
+{
+ ErrorF("SHUTDOWN EXTENSION\n");
+}
+
+static Bool
+glucoseCreateWindow(WindowPtr pWin)
+{
+ int ret = TRUE;
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ CreateWindowProcPtr CreateWindow =
+ (CreateWindowProcPtr)(pScreen->devPrivates[glucoseCreateWindowIndex].ptr);
+ GLucoseScreenPrivPtr pScreenPriv = GLucoseGetScreenPriv(pScreen);
+ int err;
+
+ xf86DrvMsg(pScreen->myNum, X_INFO,
+ "GLucose initializing screen %d\n",pScreen->myNum);
+
+ if ( pScreen->CreateWindow != glucoseCreateWindow ) {
+ /* Can't find hook we are hung on */
+ xf86DrvMsg(pScreen->myNum, X_WARNING /* X_ERROR */,
+ "glucoseCreateWindow %p called when not in pScreen->CreateWindow %p n",
+ (void *)glucoseCreateWindow,
+ (void *)pScreen->CreateWindow );
+ }
+
+ /* Unhook this function ... */
+ pScreen->CreateWindow = CreateWindow;
+ pScreen->devPrivates[glucoseCreateWindowIndex].ptr = NULL;
+
+ /* ... and call the previous CreateWindow fuction, if any */
+ if (NULL!=pScreen->CreateWindow) {
+ ret = (*pScreen->CreateWindow)(pWin);
+ }
+
+ xglScreenInfo.width = pScreen->width;
+ xglScreenInfo.height = pScreen->height;
+ xglScreenInfo.widthMm = pScreen->mmWidth;
+ xglScreenInfo.heightMm = pScreen->mmHeight;
+
+ pScreenPriv->screen = glxGetScreen(pScreen);
+
+ /* This stops the driver being unload and prevents a crash.
+ * But should be solved properly.
+ */
+ pScreenPriv->destroyGLXscreen = pScreenPriv->screen->destroy;
+ pScreenPriv->screen->destroy = glucoseDestroyGLXscreen;
+
+ {
+ glitz_drawable_t *drawable;
+ glitz_drawable_format_t *format;
+ __GLcontextModes *fbconfigs = pScreenPriv->screen->fbconfigs;
+ PixmapPtr pPixmap = pScreen->GetScreenPixmap(pScreen);
+ xglScreenPtr xglScreenPriv = XGL_GET_SCREEN_PRIV (pScreen);
+
+ /* track root pixmap */
+ if (pPixmap)
+ {
+ pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
+ pPixmap->drawable.id = FakeClientID(0);
+ AddResource(pPixmap->drawable.id, RT_PIXMAP, (pointer)pPixmap);
+ }
+
+ xglLeaveServer();
+
+ pScreenPriv->rootDrawable = pScreenPriv->screen->createDrawable(pScreenPriv->screen, (DrawablePtr)pPixmap, GLX_DRAWABLE_PIXMAP, pPixmap->drawable.id, fbconfigs);
+
+ if (!pScreenPriv->rootDrawable) {
+ xglEnterServer();
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "GLucose - creating root drawable failed\n");
+ return FALSE;
+ }
+
+ pScreenPriv->rootContext = pScreenPriv->screen->createContext(pScreenPriv->screen, fbconfigs, NULL);
+
+ if (!pScreenPriv->rootContext) {
+ xglEnterServer();
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "GLucose - creating root context failed\n");
+ pScreenPriv->rootDrawable->destroy(pScreenPriv->rootDrawable);
+ pScreenPriv->rootDrawable = NULL;
+ return FALSE;
+ }
+
+ pScreenPriv->rootContext->drawPriv =
+ pScreenPriv->rootContext->readPriv = pScreenPriv->rootDrawable;
+
+ err = pScreenPriv->rootContext->makeCurrent(pScreenPriv->rootContext);
+ if (!err) {
+ xglEnterServer();
+ xf86DrvMsg(pScreen->myNum, X_WARNING,
+ "GLucose makeCurrent failed, err is %d\n",err);
+ pScreenPriv->rootContext->destroy(pScreenPriv->rootContext);
+ pScreenPriv->rootContext = NULL;
+ pScreenPriv->rootDrawable->destroy(pScreenPriv->rootDrawable);
+ pScreenPriv->rootDrawable = NULL;
+ return FALSE;
+ }
+
+ format = glucoseInitOutput(pScreenPriv->screen);
+
+ drawable = glitz_glucose_create_drawable_for_window(pScreenPriv->screen,
+ format, pScreenPriv->rootDrawable,
+ pScreen->width,
+ pScreen->height);
+
+ if (!drawable) {
+ xglEnterServer();
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "GLucose could not create glitz drawable, not initializing.\n");
+
+ pScreenPriv->rootContext->destroy(pScreenPriv->rootContext);
+ pScreenPriv->rootContext = NULL;
+ pScreenPriv->rootDrawable->destroy(pScreenPriv->rootDrawable);
+ pScreenPriv->rootDrawable = NULL;
+ return FALSE;
+ }
+
+ xglScreenInfo.drawable = xglScreenPriv->drawable = drawable;
+ xglScreenPriv->features =
+ glitz_drawable_get_features (xglScreenInfo.drawable);
+
+ xf86DrvMsg(pScreen->myNum, X_INFO,
+ "GLucose reports GLitz features as 0x%lx\n",xglScreenPriv->features);
+
+ if (!glucoseFinishScreenInit(pScreen)) {
+ xglEnterServer();
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "GLucose could not initialize.\n");
+ pScreenPriv->rootContext->destroy(pScreenPriv->rootContext);
+ pScreenPriv->rootContext = NULL;
+ pScreenPriv->rootDrawable->destroy(pScreenPriv->rootDrawable);
+ pScreenPriv->rootDrawable = NULL;
+ return FALSE;
+ }
+
+ xglEnterServer();
+
+ /* now fixup root pixmap */
+ pPixmap = pScreen->GetScreenPixmap(pScreen);
+ xglPixmapPtr pPixmapPriv = XGL_GET_PIXMAP_PRIV (pPixmap);
+
+ xglPixmapSurfaceInit(pPixmap, xglScreenPriv->features, 0, 0);
+
+ REGION_UNINIT (pPixmap->drawable.pScreen, &pPixmapPriv->bitRegion);
+
+ xglPixmapSurfaceInit(pPixmap, xglScreenPriv->features, pScreen->width, pScreen->height);
+
+ if (pScreen->devPrivate && pPixmapPriv->pDamage) {
+ RegionPtr pRegion = DamageRegion (pPixmapPriv->pDamage);
+
+ REGION_UNINIT (pPixmap->drawable.pScreen, pRegion);
+ REGION_INIT (pPixmap->drawable.pScreen, pRegion, NullBox, 0);
+ REGION_SUBTRACT (pPixmap->drawable.pScreen, pRegion,
+ &pPixmapPriv->bitRegion, pRegion);
+
+ }
+
+ pPixmapPriv->pVisual = xglScreenPriv->rootVisual;
+
+ pPixmapPriv->target = xglPixmapTargetIn;
+
+ xglScreenPriv->pScreenPixmap = pPixmap;
+
+ glitz_drawable_reference (xglScreenPriv->drawable);
+ pPixmapPriv->drawable = xglScreenPriv->drawable;
+
+ glitz_surface_reference (xglScreenPriv->surface);
+ pPixmapPriv->surface = xglScreenPriv->surface;
+ }
+
+ return (ret);
+}
+
+static Bool
+glucoseAllocatePrivates(ScreenPtr pScreen)
+{
+ GLucoseScreenPrivPtr pScreenPriv;
+
+ if (glucoseGeneration != serverGeneration) {
+ glucoseScreenPrivateIndex = AllocateScreenPrivateIndex();
+ if (glucoseScreenPrivateIndex < 0)
+ return FALSE;
+ glucoseCreateWindowIndex = AllocateScreenPrivateIndex();
+ if (glucoseCreateWindowIndex < 0)
+ return FALSE;
+
+ glucoseGeneration = serverGeneration;
+ }
+
+ pScreenPriv = xalloc(sizeof(GLucoseScreenPrivRec));
+ if (!pScreenPriv) {
+ LogMessage(X_WARNING, "GLucose(%d): Failed to allocate screen private\n",
+ pScreen->myNum);
+ return FALSE;
+ }
+
+ pScreen->devPrivates[glucoseScreenPrivateIndex].ptr = (pointer) pScreenPriv;
+
+ pScreen->devPrivates[glucoseCreateWindowIndex].ptr
+ = (void*)(pScreen->CreateWindow);
+ pScreen->CreateWindow = glucoseCreateWindow;
+
+ return TRUE;
+}
+
+static glitz_drawable_format_t *
+glucoseInitOutput(__GLXscreen *screen)
+{
+ glitz_drawable_format_t *format, templ;
+ int i;
+ unsigned long mask;
+ unsigned long extraMask[] = {
+ GLITZ_FORMAT_DOUBLEBUFFER_MASK | GLITZ_FORMAT_ALPHA_SIZE_MASK,
+ GLITZ_FORMAT_DOUBLEBUFFER_MASK,
+ GLITZ_FORMAT_ALPHA_SIZE_MASK,
+ 0
+ };
+
+ templ.samples = 1;
+ templ.doublebuffer = 1;
+ templ.color.fourcc = GLITZ_FOURCC_RGB;
+ templ.color.alpha_size = 8;
+
+ mask = GLITZ_FORMAT_SAMPLES_MASK | GLITZ_FORMAT_FOURCC_MASK;
+
+ for (i = 0; i < sizeof(extraMask) / sizeof(extraMask[0]); i++)
+ {
+ format = glitz_glucose_find_window_format(screen,
+ mask | extraMask[i],
+ &templ, 0);
+ if (format)
+ break;
+ }
+
+ if (!format)
+ FatalError("no visual format found");
+
+ xglScreenInfo.depth =
+ format->color.red_size +
+ format->color.green_size +
+ format->color.blue_size;
+
+ return format;
+}
+
+/* Here to mimick the xgl counterpart */
+static Bool
+xglAllocatePrivates (ScreenPtr pScreen)
+{
+ xglScreenPtr pScreenPriv;
+
+ if (xglScreenGeneration != serverGeneration)
+ {
+ xglScreenPrivateIndex = AllocateScreenPrivateIndex ();
+ if (xglScreenPrivateIndex < 0)
+ return FALSE;
+
+ xglGCPrivateIndex = AllocateGCPrivateIndex ();
+ if (xglGCPrivateIndex < 0)
+ return FALSE;
+
+ xglPixmapPrivateIndex = AllocatePixmapPrivateIndex ();
+ if (xglPixmapPrivateIndex < 0)
+ return FALSE;
+
+ xglWinPrivateIndex = AllocateWindowPrivateIndex ();
+ if (xglWinPrivateIndex < 0)
+ return FALSE;
+
+#ifdef RENDER
+ xglGlyphPrivateIndex = AllocateGlyphPrivateIndex ();
+ if (xglGlyphPrivateIndex < 0)
+ return FALSE;
+#endif
+
+ xglScreenGeneration = serverGeneration;
+ }
+
+ if (!AllocateGCPrivate (pScreen, xglGCPrivateIndex, sizeof (xglGCRec)))
+ return FALSE;
+
+ if (!AllocatePixmapPrivate (pScreen, xglPixmapPrivateIndex,
+ sizeof (xglPixmapRec)))
+ return FALSE;
+
+ if (!AllocateWindowPrivate (pScreen, xglWinPrivateIndex,
+ sizeof (xglWinRec)))
+ return FALSE;
+
+ pScreenPriv = xalloc (sizeof (xglScreenRec));
+ if (!pScreenPriv)
+ return FALSE;
+ memset(pScreenPriv, 0, sizeof(xglScreenRec));
+
+ XGL_SET_SCREEN_PRIV (pScreen, pScreenPriv);
+
+ return TRUE;
+}
+
+static Bool
+glucoseDestroyPixmap (PixmapPtr pPixmap)
+{
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ PixmapPtr pScreenPixmap = pScreen->GetScreenPixmap(pScreen);
+
+ if (pPixmap == pScreenPixmap) {
+ ErrorF("SHUTTING DOWN\n");
+ /* we're shutting down, we'll clean this up later */
+ return TRUE;
+ }
+
+ return xglDestroyPixmap(pPixmap);
+}
+
+Bool
+glucoseScreenInit (ScreenPtr pScreen, int flags)
+{
+ xglScreenPtr pScreenPriv;
+
+#ifdef RENDER
+ PictureScreenPtr pPictureScreen;
+#endif
+
+ if (!glucoseAllocatePrivates(pScreen))
+ return FALSE;
+
+ if (!xglAllocatePrivates (pScreen))
+ return FALSE;
+
+ pScreenPriv = XGL_GET_SCREEN_PRIV (pScreen);
+
+ pScreenPriv->pScreenPixmap = NULL;
+
+ pScreenPriv->pVisual = 0;
+
+ pScreenPriv->rootVisual = 0;
+
+ GEOMETRY_INIT (pScreen, &pScreenPriv->scratchGeometry,
+ GLITZ_GEOMETRY_TYPE_VERTEX,
+ pScreenPriv->geometryUsage, 0);
+
+ pScreenPriv->geometryDataType = xglScreenInfo.geometryDataType;
+ pScreenPriv->geometryUsage = xglScreenInfo.geometryUsage;
+ pScreenPriv->yInverted = xglScreenInfo.yInverted;
+ pScreenPriv->pboMask = xglScreenInfo.pboMask;
+ pScreenPriv->lines = xglScreenInfo.lines;
+ pScreenPriv->noYuv = xglScreenInfo.noYuv;
+ pScreenPriv->xvFilter = xglScreenInfo.xvFilter;
+ pScreenPriv->accel = xglScreenInfo.accel;
+
+#if 0
+ /* add some flags to change the default xgl methods above */
+ if (flags & GLUCOSE_xxx) {
+
+ }
+#endif
+
+
+ pScreen->CreatePixmap = xglCreatePixmap;
+ pScreen->DestroyPixmap = glucoseDestroyPixmap;
+
+#ifdef MITSHM
+ ShmRegisterFuncs (pScreen, &shmFuncs);
+#endif
+
+ XGL_SCREEN_WRAP (GetImage, xglGetImage);
+ XGL_SCREEN_WRAP (GetSpans, xglGetSpans);
+
+ XGL_SCREEN_WRAP (CopyWindow, xglCopyWindow);
+ XGL_SCREEN_WRAP (CreateWindow, xglCreateWindow);
+ XGL_SCREEN_WRAP (DestroyWindow, xglDestroyWindow);
+ XGL_SCREEN_WRAP (ChangeWindowAttributes, xglChangeWindowAttributes);
+
+ XGL_SCREEN_WRAP (CreateGC, xglCreateGC);
+
+#if 0
+#define xglQueryBestSize (void *) NoopDDA
+#define xglSaveScreen (void *) NoopDDA
+
+#define xglConstrainCursor (void *) NoopDDA
+#define xglCursorLimits (void *) NoopDDA
+#define xglDisplayCursor (void *) NoopDDA
+#define xglRealizeCursor (void *) NoopDDA
+#define xglUnrealizeCursor (void *) NoopDDA
+#define xglRecolorCursor (void *) NoopDDA
+#define xglSetCursorPosition (void *) NoopDDA
+
+ /* Might be nice to provide a textured hw cursor at some point */
+ pScreen->ConstrainCursor = xglConstrainCursor;
+ pScreen->CursorLimits = xglCursorLimits;
+ pScreen->DisplayCursor = xglDisplayCursor;
+ pScreen->RealizeCursor = xglRealizeCursor;
+ pScreen->UnrealizeCursor = xglUnrealizeCursor;
+ pScreen->RecolorCursor = xglRecolorCursor;
+ pScreen->SetCursorPosition = xglSetCursorPosition;
+#endif
+
+ pScreen->ModifyPixmapHeader = xglModifyPixmapHeader;
+
+ XGL_SCREEN_WRAP (BitmapToRegion, xglPixmapToRegion);
+
+ pScreen->GetWindowPixmap = xglGetWindowPixmap;
+
+ XGL_SCREEN_WRAP (SetWindowPixmap, xglSetWindowPixmap);
+
+#ifdef RENDER
+ pPictureScreen = GetPictureScreenIfSet (pScreen);
+ if (pPictureScreen)
+ {
+ if (!AllocateGlyphPrivate (pScreen, xglGlyphPrivateIndex,
+ sizeof (xglGlyphRec)))
+ return FALSE;
+
+ XGL_PICTURE_SCREEN_WRAP (Composite, xglComposite);
+ XGL_PICTURE_SCREEN_WRAP (RealizeGlyph, xglRealizeGlyph);
+ XGL_PICTURE_SCREEN_WRAP (UnrealizeGlyph, xglUnrealizeGlyph);
+ XGL_PICTURE_SCREEN_WRAP (Glyphs, xglGlyphs);
+ XGL_PICTURE_SCREEN_WRAP (Trapezoids, xglTrapezoids);
+ XGL_PICTURE_SCREEN_WRAP (AddTraps, xglAddTraps);
+ XGL_PICTURE_SCREEN_WRAP (AddTriangles, xglAddTriangles);
+ XGL_PICTURE_SCREEN_WRAP (ChangePicture, xglChangePicture);
+ XGL_PICTURE_SCREEN_WRAP (ChangePictureTransform,
+ xglChangePictureTransform);
+ XGL_PICTURE_SCREEN_WRAP (ChangePictureFilter, xglChangePictureFilter);
+ }
+#endif
+
+#if 0
+#ifdef COMPOSITE
+#warning "composite building"
+ if (!compScreenInit (pScreen))
+ return FALSE;
+#endif
+#endif
+
+ /* Damage is required */
+ DamageSetup (pScreen);
+
+ XGL_SCREEN_WRAP (CloseScreen, glucoseCloseScreen);
+
+ return TRUE;
+}
+
+static Bool
+glucoseInitVisual (ScreenPtr pScreen,
+ xglVisualPtr pVisual,
+ xglPixelFormatPtr pPixel,
+ VisualID vid)
+{
+ glitz_format_t *format;
+
+ XGL_SCREEN_PRIV (pScreen);
+
+ format = xglFindBestSurfaceFormat (pScreen, pPixel);
+ if (format)
+ {
+ glitz_drawable_format_t templ;
+ unsigned long mask;
+
+ templ.color = format->color;
+ templ.depth_size = 0;
+ templ.stencil_size = 0;
+ templ.doublebuffer = 0;
+ templ.samples = 1;
+
+ mask =
+ GLITZ_FORMAT_FOURCC_MASK |
+ GLITZ_FORMAT_RED_SIZE_MASK |
+ GLITZ_FORMAT_GREEN_SIZE_MASK |
+ GLITZ_FORMAT_BLUE_SIZE_MASK |
+ GLITZ_FORMAT_ALPHA_SIZE_MASK |
+ GLITZ_FORMAT_DEPTH_SIZE_MASK |
+ GLITZ_FORMAT_STENCIL_SIZE_MASK |
+ GLITZ_FORMAT_DOUBLEBUFFER_MASK |
+ GLITZ_FORMAT_SAMPLES_MASK;
+
+ pVisual->next = 0;
+ pVisual->vid = vid;
+ pVisual->pPixel = pPixel;
+ pVisual->pbuffer = FALSE;
+
+ pVisual->format.surface = format;
+ pVisual->format.drawable =
+ glitz_find_drawable_format (pScreenPriv->drawable,
+ mask, &templ, 0);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+glucoseInitVisuals (ScreenPtr pScreen)
+{
+ xglVisualPtr v, new, *prev;
+ xglPixelFormatPtr pPixel = NULL;
+ int i,j;
+
+ XGL_SCREEN_PRIV (pScreen);
+
+ for (j = 0; j < pScreen->numVisuals; j++)
+ {
+ pPixel = NULL;
+ for (i = 0; i < xglNumPixelFormats(); i++)
+ {
+ if (pScreen->visuals[j].nplanes == xglPixelFormats[i].depth &&
+ BitsPerPixel(pScreen->visuals[j].nplanes) == xglPixelFormats[i].masks.bpp)
+ pPixel = &xglPixelFormats[i];
+ }
+ if (pPixel) {
+ new = xalloc (sizeof (xglVisualRec));
+ if (new)
+ {
+ if (glucoseInitVisual (pScreen, new, pPixel,
+ pScreen->visuals[j].vid))
+ {
+ new->next = 0;
+
+ prev = &pScreenPriv->pVisual;
+ while ((v = *prev)) {
+ prev = &v->next;
+ }
+
+ *prev = new;
+ }
+ else
+ {
+ xfree (new);
+ }
+ }
+ }
+ }
+}
+
+Bool
+glucoseFinishScreenInit (ScreenPtr pScreen)
+{
+ xglVisualPtr v;
+
+#ifdef RENDER
+ glitz_vertex_format_t *format;
+ static glitz_color_t clearBlack = { 0x0, 0x0, 0x0, 0x0 };
+ static glitz_color_t solidWhite = { 0xffff, 0xffff, 0xffff, 0xffff };
+ int i;
+#endif
+
+ XGL_SCREEN_PRIV (pScreen);
+
+ glucoseInitVisuals (pScreen);
+
+ for (v = pScreenPriv->pVisual; v; v = v->next)
+ {
+ if (v->vid == pScreen->rootVisual)
+ pScreenPriv->rootVisual = v;
+ }
+
+ if (!pScreenPriv->rootVisual || !pScreenPriv->rootVisual->format.surface)
+ return FALSE;
+
+ pScreenPriv->surface =
+ glitz_surface_create (pScreenPriv->drawable,
+ pScreenPriv->rootVisual->format.surface,
+ pScreen->width, pScreen->height,
+ 0, NULL);
+ if (!pScreenPriv->surface)
+ return FALSE;
+
+ glitz_surface_attach (pScreenPriv->surface,
+ pScreenPriv->drawable,
+ GLITZ_DRAWABLE_BUFFER_FRONT_COLOR);
+
+#ifdef RENDER
+ for (i = 0; i < 33; i++)
+ pScreenPriv->glyphCache[i].pScreen = NULL;
+
+ for (v = pScreenPriv->pVisual; v; v = v->next)
+ {
+ if (v->pPixel->depth == 8)
+ break;
+ }
+
+ pScreenPriv->pSolidAlpha = 0;
+ pScreenPriv->trapInfo.pMask = 0;
+
+ /* An accelerated alpha only Xgl visual is required for trapezoid
+ acceleration */
+ if (v && v->format.surface)
+ {
+ glitz_surface_t *mask;
+
+ mask = glitz_surface_create (pScreenPriv->drawable,
+ v->format.surface,
+ 2, 1, 0, NULL);
+ if (mask)
+ {
+ glitz_set_rectangle (mask, &clearBlack, 0, 0, 1, 1);
+ glitz_set_rectangle (mask, &solidWhite, 1, 0, 1, 1);
+
+ glitz_surface_set_fill (mask, GLITZ_FILL_NEAREST);
+ glitz_surface_set_filter (mask, GLITZ_FILTER_BILINEAR, NULL, 0);
+
+ pScreenPriv->trapInfo.pMask = xglCreateDevicePicture (mask);
+ if (!pScreenPriv->trapInfo.pMask)
+ return FALSE;
+ }
+ }
+
+ format = &pScreenPriv->trapInfo.format.vertex;
+ format->primitive = GLITZ_PRIMITIVE_QUADS;
+ format->attributes = GLITZ_VERTEX_ATTRIBUTE_MASK_COORD_MASK;
+
+ format->mask.type = GLITZ_DATA_TYPE_FLOAT;
+ format->mask.size = GLITZ_COORDINATE_SIZE_X;
+ format->bytes_per_vertex = sizeof (glitz_float_t);
+
+ if (pScreenPriv->geometryDataType)
+ {
+ format->type = GLITZ_DATA_TYPE_FLOAT;
+ format->bytes_per_vertex += 2 * sizeof (glitz_float_t);
+ format->mask.offset = 2 * sizeof (glitz_float_t);
+ }
+ else
+ {
+ format->type = GLITZ_DATA_TYPE_SHORT;
+ format->bytes_per_vertex += 2 * sizeof (glitz_short_t);
+ format->mask.offset = 2 * sizeof (glitz_short_t);
+ }
+#endif
+
+#if 0 /* Let the driver do this ! */
+ if (!xglXvScreenInit (pScreen))
+ return FALSE;
+#endif
+
+ return TRUE;
+}
+
+Bool
+glucoseCloseScreen (int index,
+ ScreenPtr pScreen)
+{
+ xglVisualPtr v;
+
+ XGL_SCREEN_PRIV (pScreen);
+ XGL_PIXMAP_PRIV (pScreenPriv->pScreenPixmap);
+ XGL_SCREEN_UNWRAP (CloseScreen);
+ GLucoseScreenPrivPtr pPriv = GLucoseGetScreenPriv(pScreen);
+
+ __pGlxClient = serverClient;
+
+ xglFiniPixmap (pScreenPriv->pScreenPixmap);
+
+ xglLeaveServer();
+
+#ifdef RENDER
+ int i;
+
+ for (i = 0; i < 33; i++)
+ xglFiniGlyphCache (&pScreenPriv->glyphCache[i]);
+
+ if (pScreenPriv->pSolidAlpha)
+ FreePicture ((pointer) pScreenPriv->pSolidAlpha, 0);
+
+ if (pScreenPriv->trapInfo.pMask)
+ FreePicture ((pointer) pScreenPriv->trapInfo.pMask, 0);
+#endif
+
+ if (pScreenPriv->surface)
+ glitz_surface_destroy (pScreenPriv->surface);
+ pPixmapPriv->surface = NULL;
+ pScreenPriv->surface = NULL;
+
+ GEOMETRY_UNINIT (&pScreenPriv->scratchGeometry);
+
+ if (pScreenPriv->drawable)
+ glitz_drawable_destroy(pScreenPriv->drawable);
+ pPixmapPriv->drawable = NULL;
+ pScreenPriv->drawable = NULL;
+ xglScreenInfo.drawable = NULL;
+
+ /* tear down glucose now */
+#if 0
+ /* Unfortunately, this causes some problems in hardware drivers */
+ /* Debug, them and re-enable this */
+ pPriv->rootContext->destroy(pPriv->rootContext);
+#endif
+ pPriv->rootDrawable->destroy(pPriv->rootDrawable);
+
+ xfree(pPriv);
+ pPriv = NULL;
+
+ while (pScreenPriv->pVisual)
+ {
+ v = pScreenPriv->pVisual;
+ pScreenPriv->pVisual = v->next;
+ xfree (v);
+ }
+ xfree(pScreenPriv);
+ pScreenPriv = NULL;
+
+ return (*pScreen->CloseScreen) (index, pScreen);
+}
+
+static ClientPtr pOldGlxClient = NULL;
+
+void xglLeaveServer(void) {
+ assert(pOldGlxClient == NULL);
+ __glXleaveServer(TRUE);
+ pOldGlxClient = __pGlxClient;
+ __pGlxClient = serverClient;
+}
+
+void xglEnterServer(void) {
+ assert(__pGlxClient == serverClient);
+ __pGlxClient = pOldGlxClient;
+ pOldGlxClient = NULL;
+ __glXenterServer(TRUE);
+}
diff --git a/glucose/glucose.h b/glucose/glucose.h
new file mode 100644
index 000000000..2ba607213
--- /dev/null
+++ b/glucose/glucose.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2006 Zack Rusin
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * ZACK RUSIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL ZACK RUSIN 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.
+ *
+ * Authors: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ * Re-written from original code by Zack Rusin
+ *
+ **************************************************************************/
+
+#ifndef GLUCOSE_H
+#define GLUCOSE_H
+
+Bool
+glucoseCloseScreen (int index,
+ ScreenPtr pScreen);
+
+Bool
+glucoseFinishScreenInit (ScreenPtr pScreen);
+
+Bool
+glucoseScreenInit (ScreenPtr pScreen, int flags);
+
+typedef void (*destroyGLXscreenProcPtr)(__GLXscreen *screen);
+
+typedef struct {
+ __GLXdrawable *rootDrawable;
+ __GLXcontext *rootContext;
+ CloseScreenProcPtr CloseScreen;
+ DestroyPixmapProcPtr *DestroyPixmap;
+ __GLXscreen *screen;
+ destroyGLXscreenProcPtr destroyGLXscreen;
+} GLucoseScreenPrivRec, *GLucoseScreenPrivPtr;
+
+extern int glucoseScreenPrivateIndex;
+#define GLucoseGetScreenPriv(s) ((GLucoseScreenPrivPtr)(s)->devPrivates[glucoseScreenPrivateIndex].ptr)
+#define GLucoseScreenPriv(s) GLucoseScreenPrivPtr pGLucoseScr = GLucoseGetScreenPriv(s)
+
+#endif /* GLUCOSE_H */
diff --git a/glucose/glucose_context.c b/glucose/glucose_context.c
new file mode 100644
index 000000000..dbb8a33bd
--- /dev/null
+++ b/glucose/glucose_context.c
@@ -0,0 +1,435 @@
+/*
+ * Copyright © 2004 David Reveman
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: David Reveman <davidr@novell.com>
+ *
+ * This file has been modified from the GLitz GLX code for use with glucose
+ * by: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "dix-config.h"
+#endif
+
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glcontextmodes.h"
+#include "glitz.h"
+#include "glitz_glucose.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "glapi.h"
+#include <stdlib.h>
+
+extern __GLXcontext *__glXLastContext;
+extern glitz_gl_proc_address_list_t _glitz_glucose_gl_proc_address;
+
+static void
+_glitz_glucose_context_create (glitz_glucose_screen_info_t *screen_info,
+ int visualid,
+ __GLXcontext *share_list,
+ glitz_glucose_context_t *context)
+{
+ __GLXscreen *screen = screen_info->display_info->display;
+ __GLcontextModes *mode;
+
+ mode = _gl_context_modes_find_visual(screen->fbconfigs, visualid);
+
+ context->context = screen->createContext (screen, mode, share_list);
+ context->id = visualid;
+}
+
+static glitz_context_t *
+_glitz_glucose_create_context (void *abstract_drawable,
+ glitz_drawable_format_t *format)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+ glitz_glucose_screen_info_t *screen_info = drawable->screen_info;
+ unsigned long format_id =
+ screen_info->formats[format->id].u.uval;
+ glitz_glucose_context_t *context;
+
+ context = malloc (sizeof (glitz_glucose_context_t));
+ if (!context)
+ return NULL;
+
+ _glitz_context_init (&context->base, &drawable->base);
+
+ _glitz_glucose_context_create (screen_info,
+ format_id,
+ screen_info->root_context,
+ context);
+
+ return (glitz_context_t *) context;
+}
+
+static void
+_glitz_glucose_context_destroy (void *abstract_context)
+{
+ glitz_glucose_context_t *context = (glitz_glucose_context_t *) abstract_context;
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ context->base.drawable;
+
+ if (drawable->screen_info->display_info->thread_info->cctx ==
+ &context->base)
+ {
+ __glXDeassociateContext(context->context);
+ __glXLastContext = NULL;
+
+ drawable->screen_info->display_info->thread_info->cctx = NULL;
+ }
+
+ context->context->destroy(context->context);
+
+ _glitz_context_fini (&context->base);
+
+ free (context);
+}
+
+static void
+_glitz_glucose_copy_context (void *abstract_src,
+ void *abstract_dst,
+ unsigned long mask)
+{
+ glitz_glucose_context_t *src = (glitz_glucose_context_t *) abstract_src;
+ glitz_glucose_context_t *dst = (glitz_glucose_context_t *) abstract_dst;
+
+ src->context->copy(dst->context, src->context, mask);
+}
+
+static void
+_glitz_glucose_make_current (void *abstract_drawable,
+ void *abstract_context)
+{
+ glitz_glucose_context_t *context = (glitz_glucose_context_t *) abstract_context;
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+ glitz_glucose_display_info_t *display_info =
+ drawable->screen_info->display_info;
+
+ if (drawable->base.width != drawable->width ||
+ drawable->base.height != drawable->height)
+ _glitz_glucose_drawable_update_size (drawable,
+ drawable->base.width,
+ drawable->base.height);
+
+ if ((__glXLastContext != context->context) ||
+ (__glXLastContext->drawPriv != drawable->drawable))
+ {
+ if (display_info->thread_info->cctx)
+ {
+ glitz_context_t *ctx = display_info->thread_info->cctx;
+
+ if (ctx->lose_current)
+ ctx->lose_current (ctx->closure);
+ }
+
+ context->context->drawPriv = drawable->drawable;
+ context->context->readPriv = drawable->drawable;
+ context->context->makeCurrent( context->context );
+ __glXAssociateContext(context->context);
+ __glXLastContext = context->context;
+ context->context->isCurrent = TRUE;
+ }
+
+ display_info->thread_info->cctx = &context->base;
+}
+
+static void
+_glitz_glucose_notify_dummy (void *abstract_drawable,
+ glitz_surface_t *surface) {}
+
+static glitz_function_pointer_t
+_glitz_glucose_context_get_proc_address (void *abstract_context,
+ const char *name)
+{
+ glitz_glucose_context_t *context = (glitz_glucose_context_t *) abstract_context;
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ context->base.drawable;
+
+ return glitz_glucose_get_proc_address (name, drawable->screen_info);
+}
+
+glitz_glucose_context_t *
+glitz_glucose_context_get (glitz_glucose_screen_info_t *screen_info,
+ glitz_drawable_format_t *format)
+{
+ glitz_glucose_context_t *context;
+ glitz_glucose_context_t **contexts = screen_info->contexts;
+ int index, n_contexts = screen_info->n_contexts;
+ unsigned long format_id;
+
+ for (; n_contexts; n_contexts--, contexts++)
+ if ((*contexts)->id == screen_info->formats[format->id].u.uval)
+ return *contexts;
+
+ index = screen_info->n_contexts++;
+
+ screen_info->contexts =
+ realloc (screen_info->contexts,
+ sizeof (glitz_glucose_context_t *) * screen_info->n_contexts);
+ if (!screen_info->contexts)
+ return NULL;
+
+ context = malloc (sizeof (glitz_glucose_context_t));
+ if (!context)
+ return NULL;
+
+ screen_info->contexts[index] = context;
+
+ format_id = screen_info->formats[format->id].u.uval;
+
+ _glitz_glucose_context_create (screen_info,
+ format_id,
+ screen_info->root_context,
+ context);
+
+ if (!screen_info->root_context)
+ screen_info->root_context = context->context;
+
+ context->backend.gl = &_glitz_glucose_gl_proc_address;
+
+ context->backend.create_pbuffer = NULL;
+ context->backend.destroy = glitz_glucose_destroy;
+ context->backend.push_current = glitz_glucose_push_current;
+ context->backend.pop_current = glitz_glucose_pop_current;
+ context->backend.attach_notify = _glitz_glucose_notify_dummy;
+ context->backend.detach_notify = _glitz_glucose_notify_dummy;
+ context->backend.swap_buffers = glitz_glucose_swap_buffers;
+ context->backend.copy_sub_buffer = glitz_glucose_copy_sub_buffer;
+
+ context->backend.create_context = _glitz_glucose_create_context;
+ context->backend.destroy_context = _glitz_glucose_context_destroy;
+ context->backend.copy_context = _glitz_glucose_copy_context;
+ context->backend.make_current = _glitz_glucose_make_current;
+ context->backend.get_proc_address = _glitz_glucose_context_get_proc_address;
+
+ context->backend.draw_buffer = _glitz_drawable_draw_buffer;
+ context->backend.read_buffer = _glitz_drawable_read_buffer;
+
+ context->backend.drawable_formats = NULL;
+ context->backend.n_drawable_formats = 0;
+
+ if (screen_info->n_formats)
+ {
+ int size;
+
+ size = sizeof (glitz_int_drawable_format_t) * screen_info->n_formats;
+ context->backend.drawable_formats = malloc (size);
+ if (context->backend.drawable_formats)
+ {
+ memcpy (context->backend.drawable_formats, screen_info->formats,
+ size);
+ context->backend.n_drawable_formats = screen_info->n_formats;
+ }
+ }
+
+ context->backend.texture_formats = NULL;
+ context->backend.formats = NULL;
+ context->backend.n_formats = 0;
+
+ context->backend.program_map = &screen_info->program_map;
+ context->backend.feature_mask = 0;
+
+ context->initialized = 0;
+
+ return context;
+}
+
+void
+glitz_glucose_context_destroy (glitz_glucose_screen_info_t *screen_info,
+ glitz_glucose_context_t *context)
+{
+ if (context->backend.drawable_formats)
+ free (context->backend.drawable_formats);
+
+ if (context->backend.formats)
+ free (context->backend.formats);
+
+ if (context->backend.texture_formats)
+ free (context->backend.texture_formats);
+
+ context->context->destroy (context->context);
+
+ free(context);
+}
+
+static void
+_glitz_glucose_context_initialize (glitz_glucose_screen_info_t *screen_info,
+ glitz_glucose_context_t *context)
+{
+ glitz_backend_init (&context->backend,
+ glitz_glucose_get_proc_address,
+ (void *) screen_info);
+
+ glitz_initiate_state (&_glitz_glucose_gl_proc_address);
+
+ context->initialized = 1;
+}
+
+static void
+_glitz_glucose_context_make_current (glitz_glucose_drawable_t *drawable,
+ glitz_bool_t finish)
+{
+ glitz_glucose_display_info_t *display_info =
+ drawable->screen_info->display_info;
+ GLenum err;
+
+ if (finish)
+ {
+ CALL_Finish ( GET_DISPATCH(), () );
+ drawable->base.finished = 1;
+ }
+
+ if (display_info->thread_info->cctx)
+ {
+ glitz_context_t *ctx = display_info->thread_info->cctx;
+
+ if (ctx->lose_current)
+ ctx->lose_current (ctx->closure);
+
+ display_info->thread_info->cctx = NULL;
+ }
+
+ drawable->context->context->drawPriv = drawable->drawable;
+ drawable->context->context->readPriv = drawable->drawable;
+ err = drawable->context->context->makeCurrent(drawable->context->context);
+ __glXAssociateContext(drawable->context->context);
+ __glXLastContext = drawable->context->context;
+ drawable->context->context->isCurrent = TRUE;
+
+ drawable->base.update_all = 1;
+
+ if (!drawable->context->initialized)
+ _glitz_glucose_context_initialize (drawable->screen_info,
+ drawable->context);
+}
+
+static void
+_glitz_glucose_context_update (glitz_glucose_drawable_t *drawable,
+ glitz_constraint_t constraint,
+ glitz_bool_t *restore_state)
+{
+ glitz_glucose_display_info_t *dinfo = drawable->screen_info->display_info;
+ __GLXcontext *context = NULL;
+
+ if (restore_state && constraint == GLITZ_ANY_CONTEXT_CURRENT)
+ {
+ if (dinfo->thread_info->cctx)
+ {
+ *restore_state = 1;
+ return;
+ }
+ }
+
+ drawable->base.flushed = drawable->base.finished = 0;
+
+ switch (constraint) {
+ case GLITZ_NONE:
+ break;
+ case GLITZ_ANY_CONTEXT_CURRENT:
+ if (!dinfo->thread_info->cctx)
+ context = __glXLastContext;
+
+ if (!context)
+ _glitz_glucose_context_make_current (drawable, 0);
+ break;
+ case GLITZ_CONTEXT_CURRENT:
+ if (!dinfo->thread_info->cctx)
+ context = __glXLastContext;
+
+ if (context != drawable->context->context)
+ _glitz_glucose_context_make_current (drawable, (context)? 1: 0);
+ break;
+ case GLITZ_DRAWABLE_CURRENT:
+ if (drawable->base.width != drawable->width ||
+ drawable->base.height != drawable->height)
+ _glitz_glucose_drawable_update_size (drawable,
+ drawable->base.width,
+ drawable->base.height);
+
+ if (!dinfo->thread_info->cctx)
+ context = __glXLastContext;
+
+ if ((context != drawable->context->context) ||
+ (__glXLastContext->drawPriv != drawable->drawable))
+ _glitz_glucose_context_make_current (drawable, (context)? 1: 0);
+ break;
+ }
+}
+
+glitz_bool_t
+glitz_glucose_push_current (void *abstract_drawable,
+ glitz_surface_t *surface,
+ glitz_constraint_t constraint,
+ glitz_bool_t *restore_state)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+ glitz_glucose_context_info_t *context_info;
+ int index;
+
+ if (restore_state)
+ *restore_state = 0;
+
+ index = drawable->screen_info->context_stack_size++;
+
+ if (index > GLITZ_CONTEXT_STACK_SIZE)
+ FatalError("glitz context stack failure\n");
+
+ context_info = &drawable->screen_info->context_stack[index];
+ context_info->drawable = drawable;
+ context_info->surface = surface;
+ context_info->constraint = constraint;
+
+ _glitz_glucose_context_update (context_info->drawable, constraint,
+ restore_state);
+
+ return 1;
+}
+
+glitz_surface_t *
+glitz_glucose_pop_current (void *abstract_drawable)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+ glitz_glucose_context_info_t *context_info = NULL;
+ int index;
+
+ drawable->screen_info->context_stack_size--;
+ index = drawable->screen_info->context_stack_size - 1;
+
+ context_info = &drawable->screen_info->context_stack[index];
+
+ if (context_info->drawable)
+ _glitz_glucose_context_update (context_info->drawable,
+ context_info->constraint,
+ NULL);
+
+ if (context_info->constraint == GLITZ_DRAWABLE_CURRENT)
+ return context_info->surface;
+
+ return NULL;
+}
diff --git a/glucose/glucose_drawable.c b/glucose/glucose_drawable.c
new file mode 100644
index 000000000..01194c426
--- /dev/null
+++ b/glucose/glucose_drawable.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright © 2004 David Reveman
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: David Reveman <davidr@novell.com>
+ *
+ * This file has been modified from the GLitz GLX code for use with glucose
+ * by: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "dix-config.h"
+#endif
+
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glitz_glucose.h"
+
+extern __GLXcontext *__glXLastContext;
+
+static glitz_glucose_drawable_t *
+_glitz_glucose_create_drawable (glitz_glucose_screen_info_t *screen_info,
+ glitz_glucose_context_t *context,
+ glitz_drawable_format_t *format,
+ __GLXdrawable *glx_drawable,
+ int width,
+ int height)
+{
+ glitz_glucose_drawable_t *drawable;
+
+ drawable = (glitz_glucose_drawable_t *) malloc (sizeof (glitz_glucose_drawable_t));
+ if (drawable == NULL)
+ return NULL;
+
+ drawable->screen_info = screen_info;
+ drawable->context = context;
+ drawable->drawable = glx_drawable;
+ drawable->width = width;
+ drawable->height = height;
+
+ _glitz_drawable_init (&drawable->base,
+ &screen_info->formats[format->id],
+ &context->backend,
+ width, height);
+
+ if (!context->initialized) {
+ glitz_glucose_push_current (drawable, NULL, GLITZ_CONTEXT_CURRENT, NULL);
+ glitz_glucose_pop_current (drawable);
+ }
+
+ if (width > context->backend.max_viewport_dims[0] ||
+ height > context->backend.max_viewport_dims[1]) {
+ free (drawable);
+ return NULL;
+ }
+
+ screen_info->drawables++;
+
+ return drawable;
+}
+
+glitz_bool_t
+_glitz_glucose_drawable_update_size (glitz_glucose_drawable_t *drawable,
+ int width,
+ int height)
+{
+ drawable->width = width;
+ drawable->height = height;
+
+ return 1;
+}
+
+glitz_drawable_t *
+glitz_glucose_create_drawable_for_window (__GLXscreen *screen,
+ glitz_drawable_format_t *format,
+ __GLXdrawable *window,
+ unsigned int width,
+ unsigned int height)
+{
+ glitz_glucose_drawable_t *drawable;
+ glitz_glucose_screen_info_t *screen_info;
+ glitz_glucose_context_t *context;
+ glitz_int_drawable_format_t *iformat;
+
+ screen_info = glitz_glucose_screen_info_get (screen);
+ if (!screen_info)
+ return NULL;
+
+ if (format->id >= screen_info->n_formats)
+ return NULL;
+
+ iformat = &screen_info->formats[format->id];
+ if (!(iformat->types & GLITZ_DRAWABLE_TYPE_WINDOW_MASK))
+ return NULL;
+
+ context = glitz_glucose_context_get (screen_info, format);
+ if (!context)
+ return NULL;
+
+ drawable = _glitz_glucose_create_drawable (screen_info, context, format,
+ window,
+ width, height);
+ if (!drawable)
+ return NULL;
+
+ return &drawable->base;
+}
+
+void
+glitz_glucose_destroy (void *abstract_drawable)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+
+ drawable->screen_info->drawables--;
+ if (drawable->screen_info->drawables == 0) {
+ /*
+ * Last drawable? We have to destroy all fragment programs as this may
+ * be our last chance to have a context current.
+ */
+ glitz_glucose_push_current (abstract_drawable, NULL,
+ GLITZ_CONTEXT_CURRENT, NULL);
+ glitz_program_map_fini (drawable->base.backend->gl,
+ &drawable->screen_info->program_map);
+ glitz_program_map_init (&drawable->screen_info->program_map);
+ glitz_glucose_pop_current (abstract_drawable);
+ }
+
+ if (__glXLastContext->drawPriv == drawable->drawable) {
+ __glXDeassociateContext(drawable->context->context);
+ __glXLastContext = NULL;
+ }
+
+ free (drawable);
+}
+
+glitz_bool_t
+glitz_glucose_swap_buffers (void *abstract_drawable)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+
+ drawable->drawable->swapBuffers (drawable->drawable);
+
+ return 1;
+}
+
+glitz_bool_t
+glitz_glucose_copy_sub_buffer (void *abstract_drawable,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ glitz_glucose_drawable_t *drawable = (glitz_glucose_drawable_t *)
+ abstract_drawable;
+
+ drawable->drawable->copySubBuffer (drawable->drawable, x, y, width, height);
+
+ return 1;
+}
diff --git a/glucose/glucose_format.c b/glucose/glucose_format.c
new file mode 100644
index 000000000..fb94a630e
--- /dev/null
+++ b/glucose/glucose_format.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright © 2004 David Reveman
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: David Reveman <davidr@novell.com>
+ *
+ * This file has been modified from the GLitz GLX code for use with glucose
+ * by: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "dix-config.h"
+#endif
+
+#if 0
+#include "glxserver.h"
+#else
+#include "scrnintstr.h"
+#include "window.h"
+#include "pixmap.h"
+#include <GL/glx.h>
+#include <GL/glxint.h>
+/* For glxscreens.h */
+typedef struct __GLXdrawable __GLXdrawable;
+typedef struct __GLXcontext __GLXcontext;
+
+#include "glxscreens.h"
+#include "glxdrawable.h"
+#include "glxcontext.h"
+#endif
+#include "glcontextmodes.h"
+#include "glitz_glucose.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+static int
+_glitz_glucose_format_compare (const void *elem1,
+ const void *elem2)
+{
+ glitz_int_drawable_format_t *format[2];
+ int i, score[2];
+
+ format[0] = (glitz_int_drawable_format_t *) elem1;
+ format[1] = (glitz_int_drawable_format_t *) elem2;
+ i = score[0] = score[1] = 0;
+
+ for (; i < 2; i++)
+ {
+ if (format[i]->d.color.fourcc != GLITZ_FOURCC_RGB)
+ score[i] -= 1000;
+
+ if (format[i]->d.color.red_size)
+ {
+ if (format[i]->d.color.red_size >= 8)
+ score[i] += 5;
+
+ score[i] += 10;
+ }
+
+ if (format[i]->d.color.alpha_size)
+ {
+ if (format[i]->d.color.alpha_size >= 8)
+ score[i] += 5;
+
+ score[i] += 10;
+ }
+
+ if (format[i]->d.stencil_size)
+ score[i] += 5;
+
+ if (format[i]->d.depth_size)
+ score[i] += 5;
+
+ if (format[i]->d.doublebuffer)
+ score[i] += 10;
+
+ if (format[i]->d.samples > 1)
+ score[i] -= (20 - format[i]->d.samples);
+
+ if (format[i]->types & GLITZ_DRAWABLE_TYPE_WINDOW_MASK)
+ score[i] += 10;
+
+ if (format[i]->types & GLITZ_DRAWABLE_TYPE_PBUFFER_MASK)
+ score[i] += 10;
+
+ if (format[i]->caveat)
+ score[i] -= 1000;
+ }
+
+ return score[1] - score[0];
+}
+
+static void
+_glitz_add_format (glitz_glucose_screen_info_t *screen_info,
+ glitz_int_drawable_format_t *format)
+{
+ int n = screen_info->n_formats;
+
+ screen_info->formats =
+ realloc (screen_info->formats,
+ sizeof (glitz_int_drawable_format_t) * (n + 1));
+ if (screen_info->formats)
+ {
+ screen_info->formats[n] = *format;
+ screen_info->formats[n].d.id = n;
+ screen_info->n_formats++;
+ }
+}
+
+static void
+_glitz_glucose_query_formats (glitz_glucose_screen_info_t *screen_info)
+{
+ __GLXscreen *screen = screen_info->display_info->display;
+ __GLcontextModes *mode;
+ glitz_int_drawable_format_t format;
+ int i;
+
+ format.types = GLITZ_DRAWABLE_TYPE_WINDOW_MASK;
+ format.d.id = 0;
+ format.d.color.fourcc = GLITZ_FOURCC_RGB;
+
+ mode = screen->fbconfigs;
+
+ for (i = 0; i < screen->numVisuals; i++)
+ {
+ int value;
+
+ if ((_gl_get_context_mode_data(mode, GLX_USE_GL, &value) != 0) ||
+ (value == 0))
+ continue;
+
+ _gl_get_context_mode_data(mode, GLX_RGBA, &value);
+ if (value == 0)
+ continue;
+
+ /* Stereo is not supported yet */
+ _gl_get_context_mode_data(mode, GLX_STEREO, &value);
+ if (value != 0)
+ continue;
+
+ _gl_get_context_mode_data(mode, GLX_RED_SIZE, &value);
+ format.d.color.red_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_GREEN_SIZE, &value);
+ format.d.color.green_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_BLUE_SIZE, &value);
+ format.d.color.blue_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_ALPHA_SIZE, &value);
+ format.d.color.alpha_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_DEPTH_SIZE, &value);
+ format.d.depth_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_STENCIL_SIZE, &value);
+ format.d.stencil_size = (unsigned short) value;
+ _gl_get_context_mode_data(mode, GLX_DOUBLEBUFFER, &value);
+ format.d.doublebuffer = (value) ? 1: 0;
+
+ _gl_get_context_mode_data(mode, GLX_VISUAL_CAVEAT_EXT, &value);
+ switch (value) {
+ case GLX_SLOW_VISUAL_EXT:
+ case GLX_NON_CONFORMANT_VISUAL_EXT:
+ format.caveat = 1;
+ break;
+ default:
+ format.caveat = 0;
+ break;
+ }
+
+ _gl_get_context_mode_data(mode, GLX_SAMPLE_BUFFERS_ARB, &value);
+ if (value)
+ {
+ _gl_get_context_mode_data(mode, GLX_SAMPLES_ARB, &value);
+ format.d.samples = (unsigned short) (value > 1)? value: 1;
+ }
+ else
+ format.d.samples = 1;
+
+ format.u.uval = mode->visualID;
+
+ _glitz_add_format (screen_info, &format);
+
+ mode = mode->next;
+ }
+}
+
+void
+glitz_glucose_query_formats (glitz_glucose_screen_info_t *screen_info)
+{
+ int i;
+
+ _glitz_glucose_query_formats (screen_info);
+
+ if (!screen_info->n_formats)
+ return;
+
+ qsort (screen_info->formats, screen_info->n_formats,
+ sizeof (glitz_int_drawable_format_t), _glitz_glucose_format_compare);
+
+ for (i = 0; i < screen_info->n_formats; i++)
+ screen_info->formats[i].d.id = i;
+}
+
+glitz_drawable_format_t *
+glitz_glucose_find_window_format (__GLXscreen *screen,
+ unsigned long mask,
+ const glitz_drawable_format_t *templ,
+ int count)
+{
+ glitz_int_drawable_format_t itempl;
+ glitz_glucose_screen_info_t *screen_info =
+ glitz_glucose_screen_info_get (screen);
+
+ glitz_drawable_format_copy (templ, &itempl.d, mask);
+
+ itempl.types = GLITZ_DRAWABLE_TYPE_WINDOW_MASK;
+ mask |= GLITZ_INT_FORMAT_WINDOW_MASK;
+
+ return glitz_drawable_format_find (screen_info->formats,
+ screen_info->n_formats,
+ mask, &itempl, count);
+}
diff --git a/glucose/glucose_info.c b/glucose/glucose_info.c
new file mode 100644
index 000000000..096dfdada
--- /dev/null
+++ b/glucose/glucose_info.c
@@ -0,0 +1,980 @@
+/*
+ * Copyright © 2004 David Reveman
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: David Reveman <davidr@novell.com>
+ *
+ * This file has been modified from the GLitz GLX code for use with glucose
+ * by: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "dix-config.h"
+#endif
+
+#include "glxserver.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "glitz_glucose.h"
+
+#include <string.h>
+#include <dlfcn.h>
+
+#if DEBUG
+#define glucoseFailure(n) \
+ { \
+ int err = CALL_GetError( GET_DISPATCH(), () ); \
+ if (err) \
+ ErrorF("GL operation (" n ",%d) failed\n",err); \
+ }
+#else
+#define glucoseFailure(n)
+#endif
+
+static void glucoseEnable( GLenum cap )
+{
+ CALL_Enable( GET_DISPATCH(), (cap) );
+ glucoseFailure("Enable");
+}
+
+static void glucoseDisable( GLenum cap )
+{
+ CALL_Disable( GET_DISPATCH(), (cap) );
+ glucoseFailure("Disable");
+}
+
+static GLenum glucoseGetError( void )
+{
+ return CALL_GetError( GET_DISPATCH(), () );
+}
+
+static const GLubyte * glucoseGetString( GLenum name )
+{
+ return CALL_GetString( GET_DISPATCH(), (name) );
+}
+
+static void glucoseEnableClientState( GLenum cap )
+{
+ CALL_EnableClientState( GET_DISPATCH(), (cap) );
+ glucoseFailure("EnableClientState");
+}
+
+static void glucoseDisableClientState( GLenum cap )
+{
+ CALL_DisableClientState( GET_DISPATCH(), (cap) );
+ glucoseFailure("DisableClientState");
+}
+
+static void
+glucoseVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *p)
+{
+ CALL_VertexPointer( GET_DISPATCH(), (size, type, stride, p) );
+ glucoseFailure("VertexPointer");
+}
+
+static void
+glucoseTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *p)
+{
+ CALL_TexCoordPointer( GET_DISPATCH(), (size, type, stride, p) );
+ glucoseFailure("TexCoordPointer");
+}
+
+static void
+glucoseDrawArrays( GLenum mode, GLint first, GLsizei count )
+{
+ CALL_DrawArrays( GET_DISPATCH(), (mode, first, count) );
+ glucoseFailure("DrawArrays");
+}
+
+static void
+glucoseTexEnvf( GLenum target, GLenum pname, GLfloat param )
+{
+ CALL_TexEnvf( GET_DISPATCH(), (target, pname, param) );
+ glucoseFailure("TexEnvf");
+}
+
+static void
+glucoseTexEnvfv( GLenum target, GLenum pname, const GLfloat *params)
+{
+ CALL_TexEnvfv( GET_DISPATCH(), (target, pname, params) );
+ glucoseFailure("TexEnvfv");
+}
+
+static void
+glucoseTexGeni( GLenum coord, GLenum pname, GLint param )
+{
+ CALL_TexGeni( GET_DISPATCH(), (coord, pname, param) );
+ glucoseFailure("TexGeni");
+}
+
+static void
+glucoseTexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
+{
+ CALL_TexGenfv( GET_DISPATCH(), (coord, pname, params) );
+ glucoseFailure("TexGenfv");
+}
+
+static void
+glucoseColor4us( GLushort red, GLushort green, GLushort blue, GLushort alpha )
+{
+ CALL_Color4us( GET_DISPATCH(), (red, green, blue, alpha) );
+ glucoseFailure("Color4us");
+}
+
+static void
+glucoseColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
+{
+ CALL_Color4f( GET_DISPATCH(), (red, green, blue, alpha) );
+ glucoseFailure("Color4f");
+}
+
+static void
+glucoseScissor( GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ CALL_Scissor( GET_DISPATCH(), (x, y, width, height) );
+ glucoseFailure("Scissor");
+}
+
+static void
+glucoseBlendFunc( GLenum sfactor, GLenum dfactor )
+{
+ CALL_BlendFunc( GET_DISPATCH(), (sfactor, dfactor) );
+ glucoseFailure("BlendFunc");
+}
+
+static void
+glucoseClear( GLbitfield mask )
+{
+ CALL_Clear( GET_DISPATCH(), (mask) );
+ glucoseFailure("Clear");
+}
+
+static void
+glucoseClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
+{
+ CALL_ClearColor( GET_DISPATCH(), (red, green, blue, alpha) );
+ glucoseFailure("ClearColor");
+}
+
+static void
+glucoseClearStencil( GLint s )
+{
+ CALL_ClearStencil( GET_DISPATCH(), (s) );
+ glucoseFailure("ClearStencil");
+}
+
+static void
+glucoseStencilFunc( GLenum func, GLint ref, GLuint mask )
+{
+ CALL_StencilFunc( GET_DISPATCH(), (func, ref, mask) );
+ glucoseFailure("StencilFunc");
+}
+
+static void
+glucoseStencilOp( GLenum fail, GLenum zfail, GLenum zpass )
+{
+ CALL_StencilOp( GET_DISPATCH(), (fail, zfail, zpass) );
+ glucoseFailure("StencilOp");
+}
+
+static void
+glucosePushAttrib( GLbitfield mask )
+{
+ CALL_PushAttrib( GET_DISPATCH(), (mask) );
+ glucoseFailure("PushAttrib");
+}
+
+static void
+glucosePopAttrib( void )
+{
+ CALL_PopAttrib( GET_DISPATCH(), () );
+ glucoseFailure("PopAttrib");
+}
+
+static void
+glucoseMatrixMode( GLenum mode )
+{
+ CALL_MatrixMode( GET_DISPATCH(), (mode) );
+ glucoseFailure("MatrixMode");
+}
+
+static void
+glucosePushMatrix( void )
+{
+ CALL_PushMatrix( GET_DISPATCH(), () );
+ glucoseFailure("PushMatrix");
+}
+
+static void
+glucosePopMatrix( void )
+{
+ CALL_PopMatrix( GET_DISPATCH(), () );
+ glucoseFailure("PopMatrix");
+}
+
+static void
+glucoseLoadIdentity( void )
+{
+ CALL_LoadIdentity( GET_DISPATCH(), () );
+ glucoseFailure("LoadIdentity");
+}
+
+static void
+glucoseLoadMatrixf( const GLfloat *m )
+{
+ CALL_LoadMatrixf( GET_DISPATCH(), (m) );
+ glucoseFailure("LoadMatrixf");
+}
+
+static void
+glucoseDepthRange( GLclampd near_val, GLclampd far_val )
+{
+ CALL_DepthRange( GET_DISPATCH(), (near_val, far_val) );
+ glucoseFailure("DepthRange");
+}
+
+static void
+glucoseViewport( GLint x, GLint y, GLsizei width, GLsizei height)
+{
+ CALL_Viewport( GET_DISPATCH(), (x, y, width, height) );
+ glucoseFailure("Viewport");
+}
+
+static void
+glucoseRasterPos2f( GLfloat x, GLfloat y )
+{
+ CALL_RasterPos2f( GET_DISPATCH(), (x, y) );
+ glucoseFailure("RasterPos2f");
+}
+
+static void
+glucoseBitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap )
+{
+ CALL_Bitmap( GET_DISPATCH(), (width, height, xorig, yorig, xmove, ymove, bitmap) );
+ glucoseFailure("Bitmap");
+}
+
+static void
+glucoseReadBuffer( GLenum mode )
+{
+ CALL_ReadBuffer( GET_DISPATCH(), (mode) );
+ glucoseFailure("ReadBuffer");
+}
+
+static void
+glucoseDrawBuffer( GLenum mode )
+{
+ CALL_DrawBuffer( GET_DISPATCH(), (mode) );
+ glucoseFailure("DrawBuffer");
+}
+
+static void
+glucoseCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type )
+{
+ CALL_CopyPixels( GET_DISPATCH(), (x, y, width, height, type) );
+ glucoseFailure("CopyPixels");
+}
+
+static void
+glucoseFlush( void )
+{
+ CALL_Flush( GET_DISPATCH(), () );
+ glucoseFailure("Flush");
+}
+
+static void
+glucoseFinish( void )
+{
+ CALL_Finish( GET_DISPATCH(), () );
+ glucoseFailure("Finish");
+}
+
+static void
+glucosePixelStorei( GLenum pname, GLint param )
+{
+ CALL_PixelStorei( GET_DISPATCH(), (pname, param) );
+ glucoseFailure("PixelStorei");
+}
+
+static void
+glucoseOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val)
+{
+ CALL_Ortho( GET_DISPATCH(), (left, right, bottom, top, near_val, far_val) );
+ glucoseFailure("Ortho");
+}
+
+static void
+glucoseScalef( GLfloat x, GLfloat y, GLfloat z )
+{
+ CALL_Scalef( GET_DISPATCH(), (x, y, z) );
+ glucoseFailure("Scalef");
+}
+
+static void
+glucoseTranslatef( GLfloat x, GLfloat y, GLfloat z )
+{
+ CALL_Translatef( GET_DISPATCH(), (x, y, z) );
+ glucoseFailure("Translatef");
+}
+
+static void
+glucoseHint( GLenum target, GLenum mode )
+{
+ CALL_Hint( GET_DISPATCH(), (target, mode) );
+ glucoseFailure("Hint");
+}
+
+static void
+glucoseDepthMask( GLboolean flag )
+{
+ CALL_DepthMask( GET_DISPATCH(), (flag) );
+ glucoseFailure("DepthMask");
+}
+
+static void
+glucosePolygonMode( GLenum face, GLenum mode )
+{
+ CALL_PolygonMode( GET_DISPATCH(), (face, mode) );
+ glucoseFailure("PolygonMode");
+}
+
+static void
+glucoseShadeModel( GLenum mode )
+{
+ CALL_ShadeModel( GET_DISPATCH(), (mode) );
+ glucoseFailure("ShadeModel");
+}
+
+static void
+glucoseColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha )
+{
+ CALL_ColorMask( GET_DISPATCH(), (red, green, blue, alpha) );
+ glucoseFailure("ColorMask");
+}
+
+static void
+glucoseReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels )
+{
+ CALL_ReadPixels( GET_DISPATCH(), (x, y, width, height, format, type, pixels) );
+ glucoseFailure("ReadPixels");
+}
+
+static void
+glucoseGetTexImage( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels )
+{
+ CALL_GetTexImage( GET_DISPATCH(), (target, level, format, type, pixels) );
+ glucoseFailure("GetTexImage");
+}
+
+static void
+glucoseTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels )
+{
+ CALL_TexSubImage2D( GET_DISPATCH(), (target, level, xoffset, yoffset, width, height, format, type, pixels) );
+ glucoseFailure("TexSubImage2D");
+}
+
+static void
+glucoseGenTextures( GLsizei n, GLuint *textures )
+{
+ CALL_GenTextures( GET_DISPATCH(), (n, textures) );
+ glucoseFailure("GenTextures");
+}
+
+static void
+glucoseDeleteTextures( GLsizei n, const GLuint *textures)
+{
+ CALL_DeleteTextures( GET_DISPATCH(), (n, textures) );
+ glucoseFailure("DeleteTextures");
+}
+
+static void
+glucoseBindTexture( GLenum target, GLuint texture )
+{
+ CALL_BindTexture( GET_DISPATCH(), (target, texture) );
+ glucoseFailure("BindTexture");
+}
+
+static void
+glucoseTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
+{
+ CALL_TexImage2D( GET_DISPATCH(), (target, level, internalFormat, width, height, border, format, type, pixels) );
+ glucoseFailure("TexImage2D");
+}
+
+static void
+glucoseTexParameteri( GLenum target, GLenum pname, GLint param )
+{
+ CALL_TexParameteri( GET_DISPATCH(), (target, pname, param) );
+ glucoseFailure("TexParameteri");
+}
+
+static void
+glucoseTexParameterfv( GLenum target, GLenum pname, const GLfloat *params )
+{
+ CALL_TexParameterfv( GET_DISPATCH(), (target, pname, params) );
+ glucoseFailure("TexParameterfv");
+}
+
+static void
+glucoseGetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params )
+{
+ CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, pname, params) );
+ glucoseFailure("GetTexLevelParameteriv");
+}
+
+static void
+glucoseCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height )
+{
+ CALL_CopyTexSubImage2D( GET_DISPATCH(), (target, level, xoffset, yoffset, x, y, width, height) );
+ glucoseFailure("CopyTexSubImage2D");
+}
+
+static void
+glucoseGetIntegerv( GLenum pname, GLint *params )
+{
+ CALL_GetIntegerv( GET_DISPATCH(), (pname, params) );
+ glucoseFailure("GetIntegerv");
+}
+
+static void
+glucoseBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
+{
+ CALL_BlendColor( GET_DISPATCH(), (red, green, blue, alpha) );
+ glucoseFailure("BlendColor");
+}
+
+static void
+glucoseActiveTexture( GLenum texture )
+{
+ CALL_ActiveTextureARB( GET_DISPATCH(), (texture) );
+ glucoseFailure("ActiveTexture");
+}
+
+static void
+glucoseClientActiveTexture( GLenum texture )
+{
+ CALL_ClientActiveTextureARB( GET_DISPATCH(), (texture) );
+ glucoseFailure("ClientActiveTexture");
+}
+
+static void
+glucoseMultiDrawArrays( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount )
+{
+ CALL_MultiDrawArraysEXT( GET_DISPATCH(), (mode, first, count, primcount) );
+ glucoseFailure("MultiDrawArrays");
+}
+
+static void
+glucoseGenPrograms( GLsizei n, GLuint *ids )
+{
+ CALL_GenProgramsNV( GET_DISPATCH(), (n, ids) );
+ glucoseFailure("GenProgramsNV");
+}
+
+static void
+glucoseDeletePrograms( GLsizei n, const GLuint *ids )
+{
+ CALL_DeleteProgramsNV( GET_DISPATCH(), (n, ids) );
+ glucoseFailure("DeleteProgramsNV");
+}
+
+static void
+glucoseProgramString( GLenum target, GLenum format, GLsizei len, const GLubyte *program )
+{
+ CALL_ProgramStringARB( GET_DISPATCH(), (target, format, len, program) );
+ glucoseFailure("ProgramStringARB");
+}
+
+static void
+glucoseBindProgram( GLenum target, GLuint id )
+{
+ CALL_BindProgramNV( GET_DISPATCH(), (target, id) );
+ glucoseFailure("BindProgramNV");
+}
+
+static void
+glucoseProgramLocalParameter4fv( GLenum target, GLuint id, const GLfloat *params )
+{
+ CALL_ProgramLocalParameter4fvARB( GET_DISPATCH(), (target, id, params) );
+ glucoseFailure("BindProgramNV");
+}
+
+static void
+glucoseGetProgramiv( GLuint program, GLenum pname, GLint *params )
+{
+ CALL_GetProgramiv( GET_DISPATCH(), (program, pname, params) );
+ glucoseFailure("GetProgramiv");
+}
+
+static void
+glucoseGenBuffers( GLsizei n, GLuint *buffers )
+{
+ CALL_GenBuffersARB( GET_DISPATCH(), (n, buffers) );
+ glucoseFailure("GenBuffersARB");
+}
+
+static void
+glucoseDeleteBuffers( GLsizei n, const GLuint *buffers )
+{
+ CALL_DeleteBuffersARB( GET_DISPATCH(), (n, buffers) );
+ glucoseFailure("DeleteBuffersARB");
+}
+
+static void
+glucoseBindBuffer( GLenum target, GLuint buffer )
+{
+ CALL_BindBufferARB( GET_DISPATCH(), (target, buffer) );
+ glucoseFailure("BindBuffer");
+}
+
+static void
+glucoseBufferData( GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
+{
+ CALL_BufferDataARB( GET_DISPATCH(), (target, size, data, usage) );
+ glucoseFailure("BufferDataARB");
+}
+
+static void
+glucoseBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data )
+{
+ CALL_BufferSubDataARB( GET_DISPATCH(), (target, offset, size, data) );
+ glucoseFailure("BufferSubDataARB");
+}
+
+static void
+glucoseGetBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)
+{
+ CALL_GetBufferSubDataARB( GET_DISPATCH(), (target, offset, size, data) );
+ glucoseFailure("GetBufferSubDataARB");
+}
+
+static void
+glucoseMapBuffer(GLenum target, GLenum access)
+{
+ CALL_MapBufferARB( GET_DISPATCH(), (target, access) );
+ glucoseFailure("MapBuffer");
+}
+
+static void
+glucoseUnmapBuffer(GLenum target)
+{
+ CALL_UnmapBufferARB( GET_DISPATCH(), (target) );
+ glucoseFailure("UnmapBuffer");
+}
+
+static void
+glucoseGenFramebuffers(GLsizei n, GLuint *framebuffers)
+{
+ CALL_GenFramebuffersEXT( GET_DISPATCH(), (n, framebuffers) );
+ glucoseFailure("GenFramebuffersEXT");
+}
+
+static void
+glucoseDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
+{
+ CALL_DeleteFramebuffersEXT( GET_DISPATCH(), (n, framebuffers) );
+ glucoseFailure("DeleteFramebuffersEXT");
+}
+
+static void
+glucoseBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+ CALL_BindFramebufferEXT( GET_DISPATCH(), (target, framebuffer) );
+ glucoseFailure("BindFramebufferEXT");
+}
+
+static void
+glucoseFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+{
+ CALL_FramebufferRenderbufferEXT( GET_DISPATCH(), (target, attachment, renderbuffertarget, renderbuffer) );
+ glucoseFailure("FramebufferRenderbufferEXT");
+}
+
+static void
+glucoseFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+{
+ CALL_FramebufferTexture2DEXT( GET_DISPATCH(), (target, attachment, textarget, texture, level) );
+ glucoseFailure("FramebufferTexture2DEXT");
+}
+
+static void
+glucoseCheckFramebufferStatus(GLenum target)
+{
+ CALL_CheckFramebufferStatusEXT( GET_DISPATCH(), (target) );
+ glucoseFailure("CheckFramebufferStatusEXT");
+}
+
+static void
+glucoseGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
+{
+ CALL_GenRenderbuffersEXT( GET_DISPATCH(), (n, renderbuffers) );
+ glucoseFailure("GenRenderbuffersEXT");
+}
+
+static void
+glucoseDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
+{
+ CALL_DeleteRenderbuffersEXT( GET_DISPATCH(), (n, renderbuffers) );
+ glucoseFailure("DeleteRenderbuffersEXT");
+}
+
+static void
+glucoseBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+ CALL_BindRenderbufferEXT( GET_DISPATCH(), (target, renderbuffer) );
+ glucoseFailure("BindRenderbufferEXT");
+}
+
+static void
+glucoseRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+{
+ CALL_RenderbufferStorageEXT( GET_DISPATCH(), (target, internalformat, width, height) );
+ glucoseFailure("RenderbufferStorageEXT");
+}
+
+static void
+glucoseGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint *params)
+{
+ CALL_GetRenderbufferParameterivEXT( GET_DISPATCH(), (target, pname, params) );
+ glucoseFailure("GetRenderbufferParameterivEXT");
+}
+
+glitz_gl_proc_address_list_t _glitz_glucose_gl_proc_address = {
+
+ /* core */
+ (glitz_gl_enable_t) glucoseEnable,
+ (glitz_gl_disable_t) glucoseDisable,
+ (glitz_gl_get_error_t) glucoseGetError,
+ (glitz_gl_get_string_t) glucoseGetString,
+ (glitz_gl_enable_client_state_t) glucoseEnableClientState,
+ (glitz_gl_disable_client_state_t) glucoseDisableClientState,
+ (glitz_gl_vertex_pointer_t) glucoseVertexPointer,
+ (glitz_gl_tex_coord_pointer_t) glucoseTexCoordPointer,
+ (glitz_gl_draw_arrays_t) glucoseDrawArrays,
+ (glitz_gl_tex_env_f_t) glucoseTexEnvf,
+ (glitz_gl_tex_env_fv_t) glucoseTexEnvfv,
+ (glitz_gl_tex_gen_i_t) glucoseTexGeni,
+ (glitz_gl_tex_gen_fv_t) glucoseTexGenfv,
+ (glitz_gl_color_4us_t) glucoseColor4us,
+ (glitz_gl_color_4f_t) glucoseColor4f,
+ (glitz_gl_scissor_t) glucoseScissor,
+ (glitz_gl_blend_func_t) glucoseBlendFunc,
+ (glitz_gl_clear_t) glucoseClear,
+ (glitz_gl_clear_color_t) glucoseClearColor,
+ (glitz_gl_clear_stencil_t) glucoseClearStencil,
+ (glitz_gl_stencil_func_t) glucoseStencilFunc,
+ (glitz_gl_stencil_op_t) glucoseStencilOp,
+ (glitz_gl_push_attrib_t) glucosePushAttrib,
+ (glitz_gl_pop_attrib_t) glucosePopAttrib,
+ (glitz_gl_matrix_mode_t) glucoseMatrixMode,
+ (glitz_gl_push_matrix_t) glucosePushMatrix,
+ (glitz_gl_pop_matrix_t) glucosePopMatrix,
+ (glitz_gl_load_identity_t) glucoseLoadIdentity,
+ (glitz_gl_load_matrix_f_t) glucoseLoadMatrixf,
+ (glitz_gl_depth_range_t) glucoseDepthRange,
+ (glitz_gl_viewport_t) glucoseViewport,
+ (glitz_gl_raster_pos_2f_t) glucoseRasterPos2f,
+ (glitz_gl_bitmap_t) glucoseBitmap,
+ (glitz_gl_read_buffer_t) glucoseReadBuffer,
+ (glitz_gl_draw_buffer_t) glucoseDrawBuffer,
+ (glitz_gl_copy_pixels_t) glucoseCopyPixels,
+ (glitz_gl_flush_t) glucoseFlush,
+ (glitz_gl_finish_t) glucoseFinish,
+ (glitz_gl_pixel_store_i_t) glucosePixelStorei,
+ (glitz_gl_ortho_t) glucoseOrtho,
+ (glitz_gl_scale_f_t) glucoseScalef,
+ (glitz_gl_translate_f_t) glucoseTranslatef,
+ (glitz_gl_hint_t) glucoseHint,
+ (glitz_gl_depth_mask_t) glucoseDepthMask,
+ (glitz_gl_polygon_mode_t) glucosePolygonMode,
+ (glitz_gl_shade_model_t) glucoseShadeModel,
+ (glitz_gl_color_mask_t) glucoseColorMask,
+ (glitz_gl_read_pixels_t) glucoseReadPixels,
+ (glitz_gl_get_tex_image_t) glucoseGetTexImage,
+ (glitz_gl_tex_sub_image_2d_t) glucoseTexSubImage2D,
+ (glitz_gl_gen_textures_t) glucoseGenTextures,
+ (glitz_gl_delete_textures_t) glucoseDeleteTextures,
+ (glitz_gl_bind_texture_t) glucoseBindTexture,
+ (glitz_gl_tex_image_2d_t) glucoseTexImage2D,
+ (glitz_gl_tex_parameter_i_t) glucoseTexParameteri,
+ (glitz_gl_tex_parameter_fv_t) glucoseTexParameterfv,
+ (glitz_gl_get_tex_level_parameter_iv_t) glucoseGetTexLevelParameteriv,
+ (glitz_gl_copy_tex_sub_image_2d_t) glucoseCopyTexSubImage2D,
+ (glitz_gl_get_integer_v_t) glucoseGetIntegerv,
+
+ /* extensions */
+ (glitz_gl_blend_color_t) 0,
+ (glitz_gl_active_texture_t) 0,
+ (glitz_gl_client_active_texture_t) 0,
+ (glitz_gl_multi_draw_arrays_t) 0,
+ (glitz_gl_gen_programs_t) 0,
+ (glitz_gl_delete_programs_t) 0,
+ (glitz_gl_program_string_t) 0,
+ (glitz_gl_bind_program_t) 0,
+ (glitz_gl_program_local_param_4fv_t) 0,
+ (glitz_gl_get_program_iv_t) 0,
+ (glitz_gl_gen_buffers_t) 0,
+ (glitz_gl_delete_buffers_t) 0,
+ (glitz_gl_bind_buffer_t) 0,
+ (glitz_gl_buffer_data_t) 0,
+ (glitz_gl_buffer_sub_data_t) 0,
+ (glitz_gl_get_buffer_sub_data_t) 0,
+ (glitz_gl_map_buffer_t) 0,
+ (glitz_gl_unmap_buffer_t) 0,
+ (glitz_gl_gen_framebuffers_t) 0,
+ (glitz_gl_delete_framebuffers_t) 0,
+ (glitz_gl_bind_framebuffer_t) 0,
+ (glitz_gl_framebuffer_renderbuffer_t) 0,
+ (glitz_gl_framebuffer_texture_2d_t) 0,
+ (glitz_gl_check_framebuffer_status_t) 0,
+ (glitz_gl_gen_renderbuffers_t) 0,
+ (glitz_gl_delete_renderbuffers_t) 0,
+ (glitz_gl_bind_renderbuffer_t) 0,
+ (glitz_gl_renderbuffer_storage_t) 0,
+ (glitz_gl_get_renderbuffer_parameter_iv_t) 0
+};
+
+
+glitz_function_pointer_t
+glitz_glucose_get_proc_address (const char *name,
+ void *closure)
+{
+ glitz_function_pointer_t address = NULL;
+#if 0
+ /* Unfortunately this doesn't work for us because glapi.c doesn't get
+ * compiled with USE_X86_ASM, or appropriate, so never gets a generated
+ * function pointer. Further investigation required.....
+ */
+ address = _glapi_get_proc_address(name);
+#else
+
+ if (!strncmp(name, "glBlendColor", 12))
+ address = (glitz_function_pointer_t) glucoseBlendColor;
+ else if (!strncmp(name, "glActiveTexture", 15))
+ address = (glitz_function_pointer_t) glucoseActiveTexture;
+ else if (!strncmp(name, "glClientActiveTexture", 21))
+ address = (glitz_function_pointer_t) glucoseClientActiveTexture;
+ else if (!strncmp(name, "glMultiDrawArraysEXT", 20))
+ address = (glitz_function_pointer_t) glucoseMultiDrawArrays;
+ else if (!strncmp(name, "glGenProgramsARB", 16))
+ address = (glitz_function_pointer_t) glucoseGenPrograms;
+ else if (!strncmp(name, "glDeleteProgramsARB", 19))
+ address = (glitz_function_pointer_t) glucoseDeletePrograms;
+ else if (!strncmp(name, "glProgramStringARB", 18))
+ address = (glitz_function_pointer_t) glucoseProgramString;
+ else if (!strncmp(name, "glBindProgramARB", 16))
+ address = (glitz_function_pointer_t) glucoseBindProgram;
+ else if (!strncmp(name, "glProgramLocalParameter4fvARB", 29))
+ address = (glitz_function_pointer_t) glucoseProgramLocalParameter4fv;
+ else if (!strncmp(name, "glGetProgramivARB", 17))
+ address = (glitz_function_pointer_t) glucoseGetProgramiv;
+ else if (!strncmp(name, "glGenBuffers", 12))
+ address = (glitz_function_pointer_t) glucoseGenBuffers;
+ else if (!strncmp(name, "glDeleteBuffers", 15))
+ address = (glitz_function_pointer_t) glucoseDeleteBuffers;
+ else if (!strncmp(name, "glBindBuffer", 12))
+ address = (glitz_function_pointer_t) glucoseBindBuffer;
+ else if (!strncmp(name, "glBufferData", 12))
+ address = (glitz_function_pointer_t) glucoseBufferData;
+ else if (!strncmp(name, "glBufferSubData", 15))
+ address = (glitz_function_pointer_t) glucoseBufferSubData;
+ else if (!strncmp(name, "glGetBufferSubData", 18))
+ address = (glitz_function_pointer_t) glucoseGetBufferSubData;
+ else if (!strncmp(name, "glMapBuffer", 11))
+ address = (glitz_function_pointer_t) glucoseMapBuffer;
+ else if (!strncmp(name, "glUnmapBuffer", 13))
+ address = (glitz_function_pointer_t) glucoseUnmapBuffer;
+ else if (!strncmp(name, "glGenFramebuffersEXT", 20))
+ address = (glitz_function_pointer_t) glucoseGenFramebuffers;
+ else if (!strncmp(name, "glDeleteFramebuffersEXT", 23))
+ address = (glitz_function_pointer_t) glucoseDeleteFramebuffers;
+ else if (!strncmp(name, "glBindFramebufferEXT", 20))
+ address = (glitz_function_pointer_t) glucoseBindFramebuffer;
+ else if (!strncmp(name, "glFramebufferRenderbufferEXT", 28))
+ address = (glitz_function_pointer_t) glucoseFramebufferRenderbuffer;
+ else if (!strncmp(name, "glFramebufferTexture2DEXT", 25))
+ address = (glitz_function_pointer_t) glucoseFramebufferTexture2D;
+ else if (!strncmp(name, "glCheckFramebufferStatusEXT", 27))
+ address = (glitz_function_pointer_t) glucoseCheckFramebufferStatus;
+ else if (!strncmp(name, "glGenRenderbuffersEXT", 21))
+ address = (glitz_function_pointer_t) glucoseGenRenderbuffers;
+ else if (!strncmp(name, "glDeleteRenderbuffersEXT", 24))
+ address = (glitz_function_pointer_t) glucoseDeleteRenderbuffers;
+ else if (!strncmp(name, "glBindRenderbufferEXT", 21))
+ address = (glitz_function_pointer_t) glucoseBindRenderbuffer;
+ else if (!strncmp(name, "glRenderbufferStorageEXT", 24))
+ address = (glitz_function_pointer_t) glucoseRenderbufferStorage;
+ else if (!strncmp(name, "glGetRenderbufferParameterivEXT", 31))
+ address = (glitz_function_pointer_t) glucoseGetRenderbufferParameteriv;
+#endif
+
+#if 0
+ ErrorF("FUNCTION %s = %p\n",name,address);
+#endif
+
+ return address;
+}
+
+static void
+_glitz_glucose_display_destroy (glitz_glucose_display_info_t *display_info);
+
+static void
+_glitz_glucose_screen_destroy (glitz_glucose_screen_info_t *screen_info);
+
+static void
+_glitz_glucose_thread_info_fini (glitz_glucose_thread_info_t *thread_info)
+{
+ int i;
+
+ for (i = 0; i < thread_info->n_displays; i++)
+ _glitz_glucose_display_destroy (thread_info->displays[i]);
+
+ free (thread_info->displays);
+
+ thread_info->displays = NULL;
+ thread_info->n_displays = 0;
+
+ thread_info->cctx = NULL;
+}
+
+static glitz_glucose_thread_info_t thread_info = {
+ NULL,
+ 0,
+ NULL
+};
+
+static glitz_glucose_thread_info_t *
+_glitz_glucose_thread_info_get (const char *gl_library)
+{
+ return &thread_info;
+}
+
+static glitz_glucose_display_info_t *
+_glitz_glucose_display_info_get (__GLXscreen *display)
+{
+ glitz_glucose_display_info_t *display_info;
+ glitz_glucose_thread_info_t *thread_info = _glitz_glucose_thread_info_get (NULL);
+ glitz_glucose_display_info_t **displays = thread_info->displays;
+ int index, n_displays = thread_info->n_displays;
+
+ for (; n_displays; n_displays--, displays++)
+ if ((*displays)->display == display)
+ return *displays;
+
+ index = thread_info->n_displays++;
+
+ thread_info->displays =
+ realloc (thread_info->displays,
+ sizeof (glitz_glucose_display_info_t *) *
+ thread_info->n_displays);
+
+ display_info = malloc (sizeof (glitz_glucose_display_info_t));
+ thread_info->displays[index] = display_info;
+
+ display_info->thread_info = thread_info;
+ display_info->display = display;
+ display_info->screens = NULL;
+ display_info->n_screens = 0;
+
+ return display_info;
+}
+
+static void
+_glitz_glucose_display_destroy (glitz_glucose_display_info_t *display_info)
+{
+ int i;
+
+ for (i = 0; i < display_info->n_screens; i++)
+ _glitz_glucose_screen_destroy (display_info->screens[i]);
+
+ if (display_info->screens)
+ free (display_info->screens);
+
+ free (display_info);
+}
+
+glitz_glucose_screen_info_t *
+glitz_glucose_screen_info_get (__GLXscreen *display)
+{
+ glitz_glucose_screen_info_t *screen_info;
+ glitz_glucose_display_info_t *display_info =
+ _glitz_glucose_display_info_get (display);
+ glitz_glucose_screen_info_t **screens = display_info->screens;
+ int index, n_screens = display_info->n_screens;
+
+ for (; n_screens; n_screens--, screens++)
+ if ((*screens)->screen == display)
+ return *screens;
+
+ index = display_info->n_screens++;
+
+ display_info->screens =
+ realloc (display_info->screens,
+ sizeof (glitz_glucose_screen_info_t *) * display_info->n_screens);
+
+ screen_info = malloc (sizeof (glitz_glucose_screen_info_t));
+ display_info->screens[index] = screen_info;
+
+ screen_info->display_info = display_info;
+ screen_info->drawables = 0;
+ screen_info->formats = NULL;
+ screen_info->n_formats = 0;
+
+ screen_info->contexts = NULL;
+ screen_info->n_contexts = 0;
+
+ glitz_program_map_init (&screen_info->program_map);
+
+ screen_info->root_context = (__GLXcontext *)NULL;
+ screen_info->glx_feature_mask = 0;
+
+ glitz_glucose_query_formats (screen_info);
+
+ screen_info->context_stack_size = 1;
+ screen_info->context_stack->drawable = NULL;
+ screen_info->context_stack->surface = NULL;
+ screen_info->context_stack->constraint = GLITZ_NONE;
+
+ return screen_info;
+}
+
+static void
+_glitz_glucose_screen_destroy (glitz_glucose_screen_info_t *screen_info)
+{
+ int i;
+
+ if (screen_info->root_context)
+ screen_info->root_context->makeCurrent (NULL);
+
+ for (i = 0; i < screen_info->n_contexts; i++)
+ glitz_glucose_context_destroy (screen_info, screen_info->contexts[i]);
+
+ if (screen_info->contexts)
+ free (screen_info->contexts);
+
+ if (screen_info->formats)
+ free (screen_info->formats);
+
+ free (screen_info);
+}
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 03c2c3a3f..7200dc7f5 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -4,6 +4,10 @@ if DRI
DRI_SUBDIR = dri
endif
+if GLUCOSE
+GLUCOSE_DIR=glucose
+endif
+
if DRI2
DRI2_SUBDIR = dri2
endif
@@ -25,12 +29,21 @@ DOC_SUBDIR = doc
SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support parser rac \
ramdac shadowfb vbe vgahw xaa $(MFB_SUBDIR) $(CFB_SUBDIR) \
xf8_16bpp loader dixmods exa modes \
+<<<<<<< HEAD:hw/xfree86/Makefile.am
+ $(DRI_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR) $(GLUCOSE_DIR)
+=======
$(DRI_SUBDIR) $(DRI2_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR)
+>>>>>>> 41aea6194bd29ab34cc166b3fd90eee64299ddf8:hw/xfree86/Makefile.am
DIST_SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support \
parser rac ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp \
+<<<<<<< HEAD:hw/xfree86/Makefile.am
+ xf8_16bpp xf8_32bpp loader dixmods dri exa modes \
+ utils doc glucose
+=======
xf8_16bpp xf8_32bpp loader dixmods dri dri2 exa modes \
utils doc
+>>>>>>> 41aea6194bd29ab34cc166b3fd90eee64299ddf8:hw/xfree86/Makefile.am
bin_PROGRAMS = Xorg
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index b736c6ae0..9ec48c9b3 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -80,6 +80,7 @@ extern Bool noPanoramiXExtension;
static int DRIEntPrivIndex = -1;
static DevPrivateKey DRIScreenPrivKey = &DRIScreenPrivKey;
static DevPrivateKey DRIWindowPrivKey = &DRIWindowPrivKey;
+static DevPrivateKey DRIPixmapPrivKey = &DRIPixmapPrivKey;
static unsigned long DRIGeneration = 0;
static unsigned int DRIDrawableValidationStamp = 0;
@@ -1220,10 +1221,9 @@ DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv;
- WindowPtr pWin;
if (pDrawable->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr)pDrawable;
+ WindowPtr pWin = (WindowPtr)pDrawable;
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
pDRIDrawablePriv->refCount++;
@@ -1272,9 +1272,48 @@ DRICreateDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable,
*hHWDrawable = pDRIDrawablePriv->hwDrawable;
}
}
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
- /* NOT_DONE */
- return FALSE;
+ else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ PixmapPtr pPixmap = (PixmapPtr)pDrawable;
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPixmap))) {
+ pDRIDrawablePriv->refCount++;
+
+ if (!pDRIDrawablePriv->hwDrawable) {
+ drmCreateDrawable(pDRIPriv->drmFD, &pDRIDrawablePriv->hwDrawable);
+ }
+ }
+ else {
+ /* allocate a DRI Window Private record */
+ if (!(pDRIDrawablePriv = xalloc(sizeof(DRIDrawablePrivRec)))) {
+ return FALSE;
+ }
+
+ /* Only create a drm_drawable_t once */
+ if (drmCreateDrawable(pDRIPriv->drmFD,
+ &pDRIDrawablePriv->hwDrawable)) {
+ xfree(pDRIDrawablePriv);
+ return FALSE;
+ }
+
+ /* add it to the list of DRI drawables for this screen */
+ pDRIDrawablePriv->pScreen = pScreen;
+ pDRIDrawablePriv->refCount = 1;
+ pDRIDrawablePriv->drawableIndex = -1;
+ pDRIDrawablePriv->nrects = 1;
+
+ /* save private off of preallocated index */
+ pPixmap->devPrivates[DRIPixmapPrivIndex].ptr =
+ (pointer)pDRIDrawablePriv;
+ }
+
+ /* track this in case the client dies */
+ AddResource(FakeClientID(client->index), DRIDrawablePrivResType,
+ (pointer)pDrawable->id);
+
+ if (pDRIDrawablePriv->hwDrawable)
+ *hHWDrawable = pDRIDrawablePriv->hwDrawable;
+ }
+ else { /* for GLX 1.3, a PBuffer */
+ return FALSE;
}
return TRUE;
@@ -1334,7 +1373,12 @@ DRIDestroyDrawable(ScreenPtr pScreen, ClientPtr client, DrawablePtr pDrawable)
DRIDestroyDrawableCB,
(pointer)pDrawable->id);
}
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
+ else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ LookupClientResourceComplex(client, DRIDrawablePrivResType,
+ DRIDestroyDrawableCB,
+ (pointer)pDrawable->id);
+ }
+ else { /* for GLX 1.3, a PBuffer */
/* NOT_DONE */
return FALSE;
}
@@ -1346,6 +1390,7 @@ Bool
DRIDrawablePrivDelete(pointer pResource, XID id)
{
WindowPtr pWin;
+ PixmapPtr pPixmap;
id = (XID)pResource;
pWin = LookupIDByType(id, RT_WINDOW);
@@ -1361,7 +1406,39 @@ DRIDrawablePrivDelete(pointer pResource, XID id)
return TRUE;
}
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
+
+ pPixmap = LookupIDByType(id, RT_PIXMAP);
+
+ if (pPixmap) {
+ DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPixmap);
+ ScreenPtr pScreen;
+ DRIScreenPrivPtr pDRIPriv;
+
+ if (!pDRIDrawablePriv)
+ return FALSE;
+
+ pScreen = pPixmap->drawable.pScreen;
+ pDRIPriv = DRI_SCREEN_PRIV(pScreen);
+
+ if (--pDRIDrawablePriv->refCount == 0) {
+ if (pDRIDrawablePriv->drawableIndex != -1) {
+ /* bump stamp to force outstanding 3D requests to resync */
+ pDRIPriv->pSAREA->drawableTable[pDRIDrawablePriv->drawableIndex].stamp
+ = DRIDrawableValidationStamp++;
+
+ /* release drawable table entry */
+ pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
+ }
+
+ drmDestroyDrawable(pDRIPriv->drmFD, pDRIDrawablePriv->hwDrawable);
+
+ xfree(pDRIDrawablePriv);
+ pPixmap->devPrivates[DRIPixmapPrivIndex].ptr = NULL;
+ }
+
+ return TRUE;
+ }
+ else { /* or for GLX 1.3, a PBuffer */
/* NOT_DONE */
return FALSE;
}
@@ -1385,7 +1462,6 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIDrawablePrivPtr pDRIDrawablePriv, pOldDrawPriv;
- WindowPtr pWin, pOldWin;
int i;
#if 0
@@ -1393,7 +1469,8 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
#endif
if (pDrawable->type == DRAWABLE_WINDOW) {
- pWin = (WindowPtr)pDrawable;
+ WindowPtr pOldWin;
+ WindowPtr pWin = (WindowPtr)pDrawable;
if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
/* Manage drawable table */
@@ -1531,7 +1608,92 @@ DRIGetDrawableInfo(ScreenPtr pScreen,
return FALSE;
}
}
- else { /* pixmap (or for GLX 1.3, a PBuffer) */
+ else if (pDrawable->type == DRAWABLE_PIXMAP) {
+ PixmapPtr pOldPixmap;
+ PixmapPtr pPixmap = (PixmapPtr)pDrawable;
+ if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPixmap))) {
+
+ /* Manage drawable table */
+ if (pDRIDrawablePriv->drawableIndex == -1) { /* load SAREA table */
+
+ /* Search table for empty entry */
+ i = 0;
+ while (i < pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
+ if (!(pDRIPriv->DRIDrawables[i])) {
+ pDRIPriv->DRIDrawables[i] = pDrawable;
+ pDRIDrawablePriv->drawableIndex = i;
+ pDRIPriv->pSAREA->drawableTable[i].stamp =
+ DRIDrawableValidationStamp++;
+ break;
+ }
+ i++;
+ }
+
+ /* Search table for oldest entry */
+ if (i == pDRIPriv->pDriverInfo->maxDrawableTableEntry) {
+ unsigned int oldestStamp = ~0;
+ int oldestIndex = 0;
+ i = pDRIPriv->pDriverInfo->maxDrawableTableEntry;
+ while (i--) {
+ if (pDRIPriv->pSAREA->drawableTable[i].stamp <
+ oldestStamp) {
+ oldestIndex = i;
+ oldestStamp =
+ pDRIPriv->pSAREA->drawableTable[i].stamp;
+ }
+ }
+ pDRIDrawablePriv->drawableIndex = oldestIndex;
+
+ /* release oldest drawable table entry */
+ pOldPixmap = (PixmapPtr)pDRIPriv->DRIDrawables[oldestIndex];
+ pOldDrawPriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pOldPixmap);
+ pOldDrawPriv->drawableIndex = -1;
+
+ /* claim drawable table entry */
+ pDRIPriv->DRIDrawables[oldestIndex] = pDrawable;
+
+ /* validate SAREA entry */
+ pDRIPriv->pSAREA->drawableTable[oldestIndex].stamp =
+ DRIDrawableValidationStamp++;
+
+ /* check for stamp wrap around */
+ if (oldestStamp > DRIDrawableValidationStamp) {
+
+ /* walk SAREA table and invalidate all drawables */
+ for( i=0;
+ i < pDRIPriv->pDriverInfo->maxDrawableTableEntry;
+ i++) {
+ pDRIPriv->pSAREA->drawableTable[i].stamp =
+ DRIDrawableValidationStamp++;
+ }
+ }
+ }
+ }
+
+ *index = pDRIDrawablePriv->drawableIndex;
+ *stamp = pDRIPriv->pSAREA->drawableTable[*index].stamp;
+ *X = (int)(pPixmap->drawable.x);
+ *Y = (int)(pPixmap->drawable.y);
+ *W = (int)(pPixmap->drawable.width);
+ *H = (int)(pPixmap->drawable.height);
+ /* use pixmap clip rect */
+ pDRIPriv->fullscreen_rect.x1 = *X;
+ pDRIPriv->fullscreen_rect.y1 = *Y;
+ pDRIPriv->fullscreen_rect.x2 = *X + *W;
+ pDRIPriv->fullscreen_rect.y2 = *Y + *H;
+ *numClipRects = 1;
+ *pClipRects = &pDRIPriv->fullscreen_rect;
+
+ /* Use the frontbuffer cliprects for back buffers. */
+ *numBackClipRects = 0;
+ *pBackClipRects = NULL;
+ }
+ else {
+ /* Not a DRIDrawable */
+ return FALSE;
+ }
+ }
+ else { /* (or for GLX 1.3, a PBuffer) */
/* NOT_DONE */
return FALSE;
}
@@ -1816,7 +1978,7 @@ DRISwapContext(int drmFD, void *oldctx, void *newctx)
newContextStore);
}
-void*
+void*
DRIGetContextStore(DRIContextPrivPtr context)
{
return((void *)context->pContextStore);
@@ -1913,7 +2075,7 @@ DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
TraverseTree(pWin, DRITreeTraversal, (pointer)(&reg));
if(REGION_NOTEMPTY(pScreen, &reg)) {
- REGION_TRANSLATE(pScreen, &reg, ptOldOrg.x - pWin->drawable.x,
+ REGION_TRANSLATE(pScreen, &reg, ptOldOrg.x - pWin->drawable.x,
ptOldOrg.y - pWin->drawable.y);
REGION_INTERSECT(pScreen, &reg, &reg, prgnSrc);
@@ -2322,21 +2484,21 @@ DRIAdjustFrame(int scrnIndex, int x, int y, int flags)
_DRIAdjustFrame(pScrn, pDRIPriv, x, y);
}
-/*
+/*
* DRIMoveBuffersHelper swaps the regions rects in place leaving you
* a region with the rects in the order that you need to blit them,
* but it is possibly (likely) an invalid region afterwards. If you
- * need to use the region again for anything you have to call
+ * need to use the region again for anything you have to call
* REGION_VALIDATE on it, or better yet, save a copy first.
*/
void
DRIMoveBuffersHelper(
- ScreenPtr pScreen,
+ ScreenPtr pScreen,
int dx,
int dy,
- int *xdir,
- int *ydir,
+ int *xdir,
+ int *ydir,
RegionPtr reg
)
{
diff --git a/hw/xfree86/dri/dristruct.h b/hw/xfree86/dri/dristruct.h
index ae970d834..bf1332c4e 100644
--- a/hw/xfree86/dri/dristruct.h
+++ b/hw/xfree86/dri/dristruct.h
@@ -40,7 +40,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin) ((DRIDrawablePrivPtr) \
dixLookupPrivate(&(pWin)->devPrivates, DRIWindowPrivKey))
#define DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix) ((DRIDrawablePrivPtr) \
- dixLookupPrivate(&(pPix)->devPrivates, DRIWindowPrivKey))
+ dixLookupPrivate(&(pPix)->devPrivates, DRIPixmapPrivKey))
typedef struct _DRIDrawablePrivRec
{
diff --git a/hw/xfree86/glucose/Makefile.am b/hw/xfree86/glucose/Makefile.am
new file mode 100644
index 000000000..4e315e74d
--- /dev/null
+++ b/hw/xfree86/glucose/Makefile.am
@@ -0,0 +1,20 @@
+module_LTLIBRARIES = libglucose.la
+
+libglucose_la_LDFLAGS = -avoid-version
+
+INCLUDES = \
+ $(XORG_INCS) \
+ -I$(srcdir)/../../../glucose \
+ -I$(srcdir)/../../../miext/cw
+
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
+
+libglucose_la_SOURCES = \
+ glucosemodule.c
+
+libglucose_la_LIBADD = \
+ ../../../glucose/libglucose.la \
+ ../../../xgl/libxgl.la
+
+
+include $(top_srcdir)/cpprules.in
diff --git a/hw/xfree86/glucose/glucosemodule.c b/hw/xfree86/glucose/glucosemodule.c
new file mode 100644
index 000000000..c255fdf08
--- /dev/null
+++ b/hw/xfree86/glucose/glucosemodule.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2006 Zack Rusin
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * David Reveman not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * David Reveman makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * ZACK RUSIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL ZACK RUSIN 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.
+ *
+ * Authors: Alan Hourihane <alanh@tungstengraphics.com>
+ *
+ * Re-written from original code by Zack Rusin
+ *
+ **************************************************************************/
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "xf86str.h"
+#include "xf86.h"
+
+#define GLUCOSE_VERSION_MAJOR 1
+#define GLUCOSE_VERSION_MINOR 0
+#define GLUCOSE_VERSION_RELEASE 0
+
+static MODULESETUPPROTO(glucoseSetup);
+
+static const OptionInfoRec GlucoseOptions[] = {
+ { -1, NULL,
+ OPTV_NONE, {0}, FALSE }
+};
+
+/*ARGSUSED*/
+static const OptionInfoRec *
+GlucoseAvailableOptions(void *unused)
+{
+ return (GlucoseOptions);
+}
+
+static XF86ModuleVersionInfo glucoseVersRec =
+{
+ "glucose",
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XORG_VERSION_CURRENT,
+ GLUCOSE_VERSION_MAJOR, GLUCOSE_VERSION_MINOR, GLUCOSE_VERSION_RELEASE,
+ ABI_CLASS_VIDEODRV, /* requires the video driver ABI */
+ ABI_VIDEODRV_VERSION,
+ MOD_CLASS_NONE,
+ {0,0,0,0}
+};
+
+XF86ModuleData glucoseModuleData = { &glucoseVersRec, glucoseSetup, NULL };
+
+ModuleInfoRec Glucose = {
+ 1,
+ "Glucose",
+ NULL,
+ 0,
+ GlucoseAvailableOptions,
+};
+
+/*ARGSUSED*/
+static pointer
+glucoseSetup(pointer Module, pointer Options, int *ErrorMajor, int *ErrorMinor)
+{
+ static Bool Initialised = FALSE;
+
+ if (!Initialised) {
+ Initialised = TRUE;
+#ifndef REMOVE_LOADER_CHECK_MODULE_INFO
+ if (xf86LoaderCheckSymbol("xf86AddModuleInfo"))
+#endif
+ xf86AddModuleInfo(&Glucose, Module);
+ }
+
+ return (pointer)TRUE;
+}
diff --git a/hw/xgl/Makefile.am b/hw/xgl/Makefile.am
index ef9fc0ea9..68c96f817 100644
--- a/hw/xgl/Makefile.am
+++ b/hw/xgl/Makefile.am
@@ -19,60 +19,40 @@ SUBDIRS = \
$(XEGL_SUBDIRS)
AM_CFLAGS = \
- $(DIX_CFLAGS) \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
-DHAVE_XGL_CONFIG_H \
-DHAVE_DIX_CONFIG_H \
-I$(top_srcdir)/GL/glx \
-I$(top_srcdir)/GL/include \
-I@MESA_SOURCE@/include \
-I@MESA_SOURCE@/src/mesa/glapi \
+ -I$(top_srcdir)/xgl \
$(XGLMODULES_CFLAGS)
-noinst_LIBRARIES = libxgl.a
-
-libxgl_a_SOURCES = \
- xgl.h \
- xglmodule.h \
- xglglx.h \
- xglinput.c \
- xgloutput.c \
- xglcmap.c \
- xglparse.c \
- xglscreen.c \
- xglarea.c \
- xglgeometry.c \
- xglpixmap.c \
- xglsync.c \
- xglsolid.c \
- xgltile.c \
- xglcopy.c \
- xglfill.c \
- xglwindow.c \
- xglget.c \
- xglgc.c \
- xglshm.c \
- xglcompose.c \
- xglpict.c \
- xglglyph.c \
- xgltrap.c \
- xglloader.c \
- xglhash.c \
- xglglx.c \
- xglxv.c
-
EXTRA_DIST = \
xglmodule.h
Xgl_LDFLAGS = -export-dynamic
Xgl_SOURCES = \
xglinit.c \
+ xglmodule.h \
+ xglglx.h \
+ xglinput.c \
+ xgloutput.c \
+ xglparse.c \
+ xglscreen.c \
+ xglloader.c \
+ xglhash.c \
+ xglglx.c \
$(top_srcdir)/mi/miinitext.c \
$(top_srcdir)/Xext/dpmsstubs.c \
$(top_srcdir)/Xi/stubs.c \
$(top_srcdir)/fb/fbcmap.c
XGL_LIBS = \
- libxgl.a \
+ $(top_builddir)/xgl/libxgl.la \
@XGL_LIBS@ \
$(XSERVER_LIBS)
diff --git a/hw/xgl/egl/xeglinit.c b/hw/xgl/egl/xeglinit.c
index c28d946ac..19e0b3df8 100644
--- a/hw/xgl/egl/xeglinit.c
+++ b/hw/xgl/egl/xeglinit.c
@@ -32,7 +32,14 @@ static xglScreenInfoRec xglScreenInfo = {
FALSE,
XGL_DEFAULT_PBO_MASK,
FALSE,
- FALSE
+ FALSE,
+ FilterBilinear,
+ {
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } },
+ { FALSE, FALSE, { 0, 0, 0, 0 } }
+ }
};
#ifdef GLXEXT
diff --git a/hw/xgl/glx/Makefile.am b/hw/xgl/glx/Makefile.am
index 314c02e96..fc1d9ac70 100644
--- a/hw/xgl/glx/Makefile.am
+++ b/hw/xgl/glx/Makefile.am
@@ -9,15 +9,18 @@ SUBDIRS = \
$(XGL_MODULE_DIRS)
AM_CFLAGS = \
- -I$(srcdir)/.. \
- -I$(srcdir)/../glxext \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
+ -DHAVE_XGL_CONFIG_H \
+ -DHAVE_DIX_CONFIG_H \
-I$(top_srcdir)/GL/glx \
-I$(top_srcdir)/GL/include \
-I@MESA_SOURCE@/include \
-I@MESA_SOURCE@/src/mesa/glapi \
- $(DIX_CFLAGS) \
- -DHAVE_XGL_CONFIG_H \
- -DHAVE_DIX_CONFIG_H \
+ -I$(srcdir)/.. \
+ -I$(srcdir)/../glxext \
+ -I$(top_srcdir)/xgl \
$(XGLXMODULES_CFLAGS)
noinst_LTLIBRARIES = libxglx.la
diff --git a/hw/xgl/glx/module/Makefile.am b/hw/xgl/glx/module/Makefile.am
index bd1c4b08f..e08e26933 100644
--- a/hw/xgl/glx/module/Makefile.am
+++ b/hw/xgl/glx/module/Makefile.am
@@ -2,7 +2,15 @@ if GLX
GLX_LIB = $(top_builddir)/hw/xgl/glxext/libxglglxext.la
endif
-AM_CFLAGS = $(DIX_CFLAGS) \
+AM_CFLAGS = \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
+ -I$(top_srcdir)/GL/glx \
+ -I$(top_srcdir)/GL/include \
+ -I@MESA_SOURCE@/include \
+ -I@MESA_SOURCE@/src/mesa/glapi \
+ -I$(top_srcdir)/xgl \
-I$(srcdir)/.. \
-I$(srcdir)/../.. \
$(XGLXMODULES_CFLAGS)
diff --git a/hw/xgl/glx/xglx.c b/hw/xgl/glx/xglx.c
index 33b276b74..2833e577b 100644
--- a/hw/xgl/glx/xglx.c
+++ b/hw/xgl/glx/xglx.c
@@ -965,6 +965,22 @@ xglxBlockHandler (pointer blockData,
XFlush (xdisplay);
}
+static DeviceIntPtr xglxKeyboardDevice = NULL;
+static DeviceIntPtr xglxPointerDevice = NULL;
+
+static xEvent *xglxEvents = NULL;
+
+static void
+xglxQueueKeyEvent(int type, unsigned int keycode)
+{
+ int i, n;
+
+ lastEventTime = GetTimeInMillis();
+ n = GetKeyboardEvents(xglxEvents, xglxKeyboardDevice, type, keycode);
+ for (i = 0; i < n; i++)
+ mieqEnqueue(xglxKeyboardDevice, xglxEvents + i);
+}
+
static void
xglxWakeupHandler (pointer blockData,
int result,
@@ -978,28 +994,22 @@ xglxWakeupHandler (pointer blockData,
{
switch (X.type) {
case KeyPress:
- x.u.u.type = KeyPress;
- x.u.u.detail = X.xkey.keycode;
- x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
- mieqEnqueue (&x);
+ xglxQueueKeyEvent(KeyPress, X.xkey.keycode);
break;
case KeyRelease:
- x.u.u.type = KeyRelease;
- x.u.u.detail = X.xkey.keycode;
- x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
- mieqEnqueue (&x);
+ xglxQueueKeyEvent(KeyRelease, X.xkey.keycode);
break;
case ButtonPress:
x.u.u.type = ButtonPress;
x.u.u.detail = X.xbutton.button;
x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
- mieqEnqueue (&x);
+ mieqEnqueue (xglxPointerDevice, &x);
break;
case ButtonRelease:
x.u.u.type = ButtonRelease;
x.u.u.detail = X.xbutton.button;
x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
- mieqEnqueue (&x);
+ mieqEnqueue (xglxPointerDevice, &x);
break;
case MotionNotify:
x.u.u.type = MotionNotify;
@@ -1008,7 +1018,7 @@ xglxWakeupHandler (pointer blockData,
x.u.keyButtonPointer.rootY = X.xmotion.y;
x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis ();
miPointerAbsoluteCursor (X.xmotion.x, X.xmotion.y, lastEventTime);
- mieqEnqueue (&x);
+ mieqEnqueue (xglxPointerDevice, &x);
break;
case EnterNotify:
if (X.xcrossing.detail != NotifyInferior) {
@@ -1020,7 +1030,7 @@ xglxWakeupHandler (pointer blockData,
x.u.keyButtonPointer.rootY = X.xcrossing.y;
x.u.keyButtonPointer.time = lastEventTime =
GetTimeInMillis ();
- mieqEnqueue (&x);
+ mieqEnqueue (xglxPointerDevice, &x);
}
}
break;
@@ -1036,7 +1046,7 @@ xglxBell (int volume,
pointer ctrl,
int cls)
{
- XBell (xdisplay, volume);
+ XBell (xdisplay, volume);
}
static void
@@ -1072,11 +1082,10 @@ xglxKbdCtrl (DeviceIntPtr pDev,
}
static int
-xglxKeybdProc (DeviceIntPtr pDevice,
+xglxKeybdProc (DeviceIntPtr pDev,
int onoff)
{
Bool ret = FALSE;
- DevicePtr pDev = (DevicePtr) pDevice;
if (!pDev)
return BadImplementation;
@@ -1087,7 +1096,7 @@ xglxKeybdProc (DeviceIntPtr pDevice,
KeySym *xkeyMap;
int minKeyCode, maxKeyCode, mapWidth, i, j;
KeySymsRec xglxKeySyms;
- CARD8 xglxModMap[256];
+ CARD8 xglxModMap[MAP_LENGTH];
XKeyboardState values;
#ifdef _XSERVER64
@@ -1126,8 +1135,8 @@ xglxKeybdProc (DeviceIntPtr pDevice,
&mapWidth);
#endif
- memset (xglxModMap, 0, 256);
-
+ for (i = 0; i < MAP_LENGTH; i++)
+ xglxModMap[i] = 0;
for (j = 0; j < 8; j++)
{
for (i = 0; i < xmodMap->max_keypermod; i++)
@@ -1165,8 +1174,6 @@ xglxKeybdProc (DeviceIntPtr pDevice,
if (desc && desc->geom)
{
XkbComponentNamesRec names;
- FILE *file;
-
rules = XKB_DFLT_RULES_FILE;
model = XKB_DFLT_KB_MODEL;
layout = XKB_DFLT_KB_LAYOUT;
@@ -1202,7 +1209,7 @@ xglxKeybdProc (DeviceIntPtr pDevice,
memmove (defaultKeyboardControl.autoRepeats,
values.auto_repeats, sizeof (values.auto_repeats));
- ret = InitKeyboardDeviceStruct (pDev,
+ ret = InitKeyboardDeviceStruct (&pDev->public,
&xglxKeySyms,
xglxModMap,
xglxBell,
@@ -1220,11 +1227,9 @@ xglxKeybdProc (DeviceIntPtr pDevice,
} break;
case DEVICE_ON:
- pDev->on = TRUE;
break;
case DEVICE_OFF:
case DEVICE_CLOSE:
- pDev->on = FALSE;
break;
}
@@ -1249,16 +1254,18 @@ void
xglxInitInput (int argc,
char **argv)
{
- DeviceIntPtr pKeyboard, pPointer;
+ xglxPointerDevice = AddInputDevice (xglMouseProc, TRUE);
+ xglxKeyboardDevice = AddInputDevice (xglxKeybdProc, TRUE);
- pPointer = AddInputDevice (xglMouseProc, TRUE);
- pKeyboard = AddInputDevice (xglxKeybdProc, TRUE);
+ RegisterPointerDevice (xglxPointerDevice);
+ RegisterKeyboardDevice (xglxKeyboardDevice);
- RegisterPointerDevice (pPointer);
- RegisterKeyboardDevice (pKeyboard);
+ if (!xglxEvents)
+ xglxEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ if (!xglxEvents)
+ FatalError("couldn't allocate room for events\n");
- miRegisterPointerDevice (screenInfo.screens[0], pPointer);
- mieqInit (&pKeyboard->public, &pPointer->public);
+ mieqInit ();
AddEnabledDevice (XConnectionNumber (xdisplay));
diff --git a/hw/xgl/glx/xglxinit.c b/hw/xgl/glx/xglxinit.c
index b87e5d682..4ed70ded2 100644
--- a/hw/xgl/glx/xglxinit.c
+++ b/hw/xgl/glx/xglxinit.c
@@ -33,6 +33,8 @@ xglScreenInfoRec xglScreenInfo = {
FALSE,
XGL_DEFAULT_PBO_MASK,
FALSE,
+ FALSE,
+ FilterBilinear,
{
{ FALSE, FALSE, { 0, 0, 0, 0 } },
{ FALSE, FALSE, { 0, 0, 0, 0 } },
diff --git a/hw/xgl/glxext/Makefile.am b/hw/xgl/glxext/Makefile.am
index 98a9b13c4..4518cfb6d 100644
--- a/hw/xgl/glxext/Makefile.am
+++ b/hw/xgl/glxext/Makefile.am
@@ -1,12 +1,15 @@
SUBDIRS = module
AM_CFLAGS = \
- $(DIX_CFLAGS) \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
-DHAVE_XGL_CONFIG_H \
-DHAVE_DIX_CONFIG_H \
$(XGLMODULES_CFLAGS) \
-I$(top_srcdir)/GL/glx \
-I$(top_srcdir)/GL/include \
+ -I$(top_srcdir)/xgl \
-I$(top_srcdir)/hw/xgl \
-I@MESA_SOURCE@/include \
-I@MESA_SOURCE@/src/mesa/glapi
@@ -14,7 +17,7 @@ AM_CFLAGS = \
libxglglxext_libraries = libxglglxext.la
libxglglxext_la_SOURCES = \
xglglxext.h \
- xglglxext.c \
+ xglglxext.c \
xglglxlog.c
noinst_LTLIBRARIES = $(libxglglxext_libraries)
diff --git a/hw/xgl/glxext/module/Makefile.am b/hw/xgl/glxext/module/Makefile.am
index 4633f7ffa..9fb36c763 100644
--- a/hw/xgl/glxext/module/Makefile.am
+++ b/hw/xgl/glxext/module/Makefile.am
@@ -3,20 +3,15 @@ AM_CFLAGS = \
-DHAVE_XGL_CONFIG_H \
-DHAVE_DIX_CONFIG_H \
$(XGLMODULES_CFLAGS) \
+ -I$(top_srcdir)/xgl \
-I$(top_srcdir)/hw/xgl
-libglx_la_LDFLAGS = -avoid-version
-libglx_la_SOURCES = glxmodule.c
-libglx_la_LIBADD = $(top_builddir)/GL/glx/libglx.la
-libglx_modules = libglx.la
-
-libglcore_la_LDFLAGS = -avoid-version
-libglcore_la_SOURCES = glcoremodule.c
-libglcore_la_LIBADD = $(top_builddir)/GL/mesa/libGLcore.la
-libglcore_modules = libglcore.la
+libglxext_la_LDFLAGS = -avoid-version
+libglxext_la_SOURCES = glxmodule.c
+libglxext_la_LIBADD = $(top_builddir)/GL/glx/libglx.la \
+ $(top_builddir)/GL/mesa/libGLcore.la
+libglxext_modules = libglxext.la
moduledir = @XGL_MODULE_PATH@
-module_LTLIBRARIES = \
- $(libglcore_modules) \
- $(libglx_modules)
+module_LTLIBRARIES = $(libglxext_modules)
diff --git a/hw/xgl/glxext/module/glcoremodule.c b/hw/xgl/glxext/module/glcoremodule.c
deleted file mode 100644
index 37aa9c658..000000000
--- a/hw/xgl/glxext/module/glcoremodule.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2005 Novell, 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
- * Novell, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior permission.
- * Novell, Inc. makes no representations about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- *
- * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: David Reveman <davidr@novell.com>
- */
-
-#include "xglmodule.h"
-
-char *
-moduleVersion (void)
-{
- return VERSION;
-}
-
-Bool
-moduleInit (const char *module)
-{
- return TRUE;
-}
diff --git a/hw/xgl/glxext/xglglxext.c b/hw/xgl/glxext/xglglxext.c
index c260d8e2d..c47abdefa 100644
--- a/hw/xgl/glxext/xglglxext.c
+++ b/hw/xgl/glxext/xglglxext.c
@@ -30,6 +30,7 @@
#include <GL/gl.h>
#include <GL/glext.h>
#include <GL/internal/glcore.h>
+#include <GL/glxtokens.h>
#include "glxserver.h"
#include "glxdrawable.h"
@@ -40,6 +41,9 @@
#include "glapitable.h"
#include "glxext.h"
#include "micmap.h"
+#ifdef COMPOSITE
+#include "compint.h"
+#endif
#define XGL_MAX_TEXTURE_UNITS 8
#define XGL_MAX_ATTRIB_STACK_DEPTH 16
@@ -50,56 +54,31 @@
#define XGL_TEXTURE_RECTANGLE_BIT (1 << 3)
#define XGL_TEXTURE_CUBE_MAP_BIT (1 << 4)
-typedef Bool (*GLXScreenProbeProc) (int screen);
-typedef __GLinterface *(*GLXCreateContextProc) (__GLimports *imports,
- __GLcontextModes *modes,
- __GLinterface *shareGC);
-typedef void (*GLXCreateBufferProc) (__GLXdrawablePrivate *glxPriv);
-typedef GLboolean (*GLXSwapBuffersProc) (__GLXdrawablePrivate *glxPriv);
-typedef int (*GLXBindBuffersProc) (__GLXdrawablePrivate *glxPriv,
- int buffer);
-typedef int (*GLXReleaseBuffersProc) (__GLXdrawablePrivate *glxPriv,
- int buffer);
-
-typedef struct _xglGLXScreenInfo {
- GLXScreenProbeProc screenProbe;
- GLXCreateContextProc createContext;
- GLXCreateBufferProc createBuffer;
-} xglGLXScreenInfoRec, *xglGLXScreenInfoPtr;
-
-extern __GLXscreenInfo *__xglScreenInfoPtr;
-
-static xglGLXScreenInfoRec screenInfoPriv;
-
-//extern __GLXscreenInfo __glDDXScreenInfo;
-
-typedef GLboolean (*GLResizeBuffersProc) (__GLdrawableBuffer *buffer,
- GLint x,
- GLint y,
- GLuint width,
- GLuint height,
- __GLdrawablePrivate *glPriv,
- GLuint bufferMask);
-typedef void (*GLFreeBuffersProc) (__GLdrawablePrivate *glPriv);
+extern void GlxWrapInitVisuals(miInitVisualsProcPtr *);
+
+extern __GLXprovider *__xglMesaProvider;
+
+typedef struct _xglGLScreen {
+ __GLXscreen base;
+ __GLXscreen *mesaScreen;
+ char *GLXextensions;
+} xglGLScreenRec, *xglGLScreenPtr;
typedef struct _xglGLBuffer {
- GLXSwapBuffersProc swapBuffers;
- GLXBindBuffersProc bindBuffers;
- GLXReleaseBuffersProc releaseBuffers;
- GLResizeBuffersProc resizeBuffers;
- GLFreeBuffersProc freeBuffers;
- ScreenPtr pScreen;
- DrawablePtr pDrawable;
- xglVisualPtr pVisual;
- glitz_drawable_t *drawable;
- glitz_surface_t *backSurface;
- PixmapPtr pPixmap;
- GCPtr pGC;
- RegionRec damage;
- void *private;
- int screenX, screenY;
- int xOff, yOff;
- int yFlip;
+ __GLXdrawable base;
+ __GLXdrawable *mesaDrawable;
+
+ ScreenPtr pScreen;
+ DrawablePtr pDrawable;
+ xglVisualPtr pVisual;
+ glitz_drawable_t *drawable;
+ glitz_surface_t *backSurface;
+ PixmapPtr pPixmap;
+ GCPtr pGC;
+ RegionRec damage;
+ int screenX, screenY;
+ int xOff, yOff;
+ int yFlip;
} xglGLBufferRec, *xglGLBufferPtr;
typedef int xglGLXVisualConfigRec, *xglGLXVisualConfigPtr;
@@ -124,8 +103,8 @@ typedef struct _xglGLOp {
} rect;
struct {
GLenum target;
- GLuint texture;
- } bind_texture;
+ GLuint object;
+ } bind_object;
struct {
GLenum target;
GLenum pname;
@@ -265,54 +244,89 @@ typedef struct _xglGLAttributes {
} xglGLAttributesRec, *xglGLAttributesPtr;
typedef struct _xglGLContext {
- __GLinterface iface;
- __GLinterface *mIface;
- int refcnt;
- struct _xglGLContext *shared;
- glitz_context_t *context;
- struct _glapi_table glRenderTable;
+ __GLXcontext base;
+ __GLXcontext *mesaContext;
+
+ int refcnt;
+ struct _xglGLContext *shared;
+ glitz_context_t *context;
+ struct _glapi_table glRenderTable;
+
PFNGLACTIVETEXTUREARBPROC ActiveTextureARB;
- PFNGLWINDOWPOS3FMESAPROC WindowPos3fMESA;
- Bool needInit;
- xglGLBufferPtr pDrawBuffer;
- xglGLBufferPtr pReadBuffer;
- int drawXoff, drawYoff;
- __GLdrawablePrivate *readPriv;
- __GLdrawablePrivate *drawPriv;
- char *versionString;
- GLenum errorValue;
- GLboolean doubleBuffer;
- GLint depthBits;
- GLint stencilBits;
- xglHashTablePtr texObjects;
- xglHashTablePtr displayLists;
- GLuint list;
- GLenum listMode;
- GLuint beginCnt;
- xglDisplayListPtr pList;
- GLuint groupList;
- xglGLAttributesRec attrib;
- xglGLAttributesRec attribStack[XGL_MAX_ATTRIB_STACK_DEPTH];
- int nAttribStack;
- int activeTexUnit;
- GLint maxTexUnits;
- GLint maxListNesting;
- GLint maxAttribStackDepth;
+ PFNGLWINDOWPOS3FMESAPROC WindowPos3fMESA;
+ PFNGLISPROGRAMARBPROC IsProgramARB;
+ PFNGLGENPROGRAMSARBPROC GenProgramsARB;
+ PFNGLBINDPROGRAMARBPROC BindProgramARB;
+ PFNGLDELETEPROGRAMSARBPROC DeleteProgramsARB;
+ PFNGLISRENDERBUFFEREXTPROC IsRenderbufferEXT;
+ PFNGLBINDRENDERBUFFEREXTPROC BindRenderbufferEXT;
+ PFNGLDELETERENDERBUFFERSEXTPROC DeleteRenderbuffersEXT;
+ PFNGLGENRENDERBUFFERSEXTPROC GenRenderbuffersEXT;
+ PFNGLISFRAMEBUFFEREXTPROC IsFramebufferEXT;
+ PFNGLBINDFRAMEBUFFEREXTPROC BindFramebufferEXT;
+ PFNGLDELETEFRAMEBUFFERSEXTPROC DeleteFramebuffersEXT;
+ PFNGLGENFRAMEBUFFERSEXTPROC GenFramebuffersEXT;
+ PFNGLFRAMEBUFFERTEXTURE1DEXTPROC FramebufferTexture1DEXT;
+ PFNGLFRAMEBUFFERTEXTURE2DEXTPROC FramebufferTexture2DEXT;
+ PFNGLFRAMEBUFFERTEXTURE3DEXTPROC FramebufferTexture3DEXT;
+ PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC FramebufferRenderbufferEXT;
+ PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC
+ GetFramebufferAttachmentParameterivEXT;
+ PFNGLGENERATEMIPMAPEXTPROC GenerateMipmapEXT;
+
+ Bool needInit;
+ xglGLBufferPtr pDrawBuffer;
+ xglGLBufferPtr pReadBuffer;
+ int drawXoff, drawYoff;
+ int readXoff, readYoff;
+ char *versionString;
+ GLenum errorValue;
+ GLboolean doubleBuffer;
+ GLint depthBits;
+ GLint stencilBits;
+ xglHashTablePtr texObjects;
+ xglHashTablePtr programObjects;
+ xglHashTablePtr renderbufferObjects;
+ xglHashTablePtr framebufferObjects;
+ GLuint framebuffer;
+ xglHashTablePtr displayLists;
+ GLuint list;
+ GLenum listMode;
+ GLuint beginCnt;
+ xglDisplayListPtr pList;
+ GLuint groupList;
+ xglGLAttributesRec attrib;
+ xglGLAttributesRec attribStack[XGL_MAX_ATTRIB_STACK_DEPTH];
+ int nAttribStack;
+ int activeTexUnit;
+ GLint maxTexUnits;
+ GLint maxListNesting;
+ GLint maxAttribStackDepth;
} xglGLContextRec, *xglGLContextPtr;
static xglGLContextPtr cctx = NULL;
+static BoxRec _largeBox = { SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX };
+
static void
xglSetCurrentContext (xglGLContextPtr pContext);
-#define XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES(pBox, nBox, pScissorBox) \
- (pBox) = REGION_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip); \
- (nBox) = REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip); \
- (pScissorBox)->x1 = cctx->attrib.scissor.x + cctx->pDrawBuffer->xOff; \
- (pScissorBox)->x2 = (pScissorBox)->x1 + cctx->attrib.scissor.width; \
- (pScissorBox)->y2 = cctx->attrib.scissor.y + cctx->pDrawBuffer->yOff; \
- (pScissorBox)->y2 = cctx->pDrawBuffer->yFlip - (pScissorBox)->y2; \
- (pScissorBox)->y1 = (pScissorBox)->y2 - cctx->attrib.scissor.height
+#define XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES(pBox, nBox, pScissorBox) \
+ if (cctx->framebuffer) \
+ { \
+ (pBox) = &_largeBox; \
+ (nBox) = 1; \
+ } \
+ else \
+ { \
+ (pBox) = REGION_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip); \
+ (nBox) = REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip); \
+ (pScissorBox)->x1 = cctx->attrib.scissor.x + cctx->pDrawBuffer->xOff; \
+ (pScissorBox)->x2 = (pScissorBox)->x1 + cctx->attrib.scissor.width; \
+ (pScissorBox)->y2 = cctx->attrib.scissor.y + cctx->pDrawBuffer->yOff; \
+ (pScissorBox)->y2 = cctx->pDrawBuffer->yFlip - (pScissorBox)->y2; \
+ (pScissorBox)->y1 = (pScissorBox)->y2 - cctx->attrib.scissor.height; \
+ }
#define XGL_GLX_DRAW_PROLOGUE(pBox, nBox, pScissorBox) \
XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, pScissorBox); \
@@ -336,14 +350,27 @@ xglSetCurrentContext (xglGLContextPtr pContext);
(pBox1)->y2 = (pBox2)->y2; \
}
-#define XGL_GLX_SET_SCISSOR_BOX(pBox) \
- glScissor ((pBox)->x1, \
- cctx->pDrawBuffer->yFlip - (pBox)->y2, \
- (pBox)->x2 - (pBox)->x1, \
- (pBox)->y2 - (pBox)->y1)
+#define XGL_GLX_SET_SCISSOR_BOX(pBox) \
+ if (cctx->framebuffer) \
+ { \
+ if (cctx->attrib.scissorTest) \
+ glScissor (cctx->attrib.scissor.x, \
+ cctx->attrib.scissor.y, \
+ cctx->attrib.scissor.width, \
+ cctx->attrib.scissor.height); \
+ else \
+ glScissor (0, 0, SHRT_MAX, SHRT_MAX); \
+ } \
+ else \
+ { \
+ glScissor ((pBox)->x1, \
+ cctx->pDrawBuffer->yFlip - (pBox)->y2, \
+ (pBox)->x2 - (pBox)->x1, \
+ (pBox)->y2 - (pBox)->y1); \
+ }
#define XGL_GLX_DRAW_DAMAGE(pBox, pRegion) \
- if (cctx->attrib.drawBuffer != GL_BACK) \
+ if (!cctx->framebuffer && cctx->attrib.drawBuffer != GL_BACK) \
{ \
(pRegion)->extents.x1 = (pBox)->x1 - cctx->pDrawBuffer->screenX; \
(pRegion)->extents.y1 = (pBox)->y1 - cctx->pDrawBuffer->screenY; \
@@ -357,6 +384,29 @@ xglSetCurrentContext (xglGLContextPtr pContext);
xglAddBitDamage (cctx->pDrawBuffer->pDrawable, pRegion); \
}
+
+static void
+xglSetDrawOffset (int xOff,
+ int yOff)
+{
+ /* update viewport and raster position */
+ if (xOff != cctx->drawXoff || yOff != cctx->drawYoff)
+ {
+ glViewport (cctx->attrib.viewport.x + xOff,
+ cctx->attrib.viewport.y + yOff,
+ cctx->attrib.viewport.width,
+ cctx->attrib.viewport.height);
+
+ glBitmap (0, 0, 0, 0,
+ xOff - cctx->drawXoff,
+ yOff - cctx->drawYoff,
+ NULL);
+
+ cctx->drawXoff = xOff;
+ cctx->drawYoff = yOff;
+ }
+}
+
static void
xglRecordError (GLenum error)
{
@@ -495,8 +545,8 @@ xglViewportProc (xglGLOpPtr pOp)
cctx->attrib.viewport.width = pOp->u.rect.width;
cctx->attrib.viewport.height = pOp->u.rect.height;
- glViewport (pOp->u.rect.x + cctx->pDrawBuffer->xOff,
- pOp->u.rect.y + cctx->pDrawBuffer->yOff,
+ glViewport (pOp->u.rect.x + cctx->drawXoff,
+ pOp->u.rect.y + cctx->drawYoff,
pOp->u.rect.width,
pOp->u.rect.height);
}
@@ -551,6 +601,12 @@ xglDrawBufferProc (xglGLOpPtr pOp)
{
glitz_drawable_buffer_t buffers[2];
+ if (cctx->framebuffer)
+ {
+ glDrawBuffer (pOp->u.enumeration);
+ return;
+ }
+
switch (pOp->u.enumeration) {
case GL_FRONT:
buffers[0] = GLITZ_DRAWABLE_BUFFER_FRONT_COLOR;
@@ -598,6 +654,12 @@ xglDrawBuffer (GLenum mode)
static void
xglReadBufferProc (xglGLOpPtr pOp)
{
+ if (cctx->framebuffer)
+ {
+ glReadBuffer (pOp->u.enumeration);
+ return;
+ }
+
switch (pOp->u.enumeration) {
case GL_FRONT:
glitz_context_read_buffer (cctx->context,
@@ -1267,7 +1329,7 @@ xglBindTextureProc (xglGLOpPtr pOp)
{
xglTexObjPtr *ppTexObj;
- switch (pOp->u.bind_texture.target) {
+ switch (pOp->u.bind_object.target) {
case GL_TEXTURE_1D:
ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].p1D;
break;
@@ -1288,15 +1350,15 @@ xglBindTextureProc (xglGLOpPtr pOp)
return;
}
- if (pOp->u.bind_texture.texture)
+ if (pOp->u.bind_object.object)
{
- if (!*ppTexObj || pOp->u.bind_texture.texture != (*ppTexObj)->key)
+ if (!*ppTexObj || pOp->u.bind_object.object != (*ppTexObj)->key)
{
xglTexObjPtr pTexObj;
pTexObj = (xglTexObjPtr)
xglHashLookup (cctx->shared->texObjects,
- pOp->u.bind_texture.texture);
+ pOp->u.bind_object.object);
if (!pTexObj)
{
pTexObj = xalloc (sizeof (xglTexObjRec));
@@ -1306,7 +1368,7 @@ xglBindTextureProc (xglGLOpPtr pOp)
return;
}
- pTexObj->key = pOp->u.bind_texture.texture;
+ pTexObj->key = pOp->u.bind_object.object;
pTexObj->pPixmap = NULL;
pTexObj->object = NULL;
pTexObj->refcnt = 1;
@@ -1314,7 +1376,7 @@ xglBindTextureProc (xglGLOpPtr pOp)
glGenTextures (1, &pTexObj->name);
xglHashInsert (cctx->shared->texObjects,
- pOp->u.bind_texture.texture,
+ pOp->u.bind_object.object,
pTexObj);
}
@@ -1322,7 +1384,7 @@ xglBindTextureProc (xglGLOpPtr pOp)
xglUnrefTexObj (*ppTexObj);
*ppTexObj = pTexObj;
- glBindTexture (pOp->u.bind_texture.target, pTexObj->name);
+ glBindTexture (pOp->u.bind_object.target, pTexObj->name);
}
}
else
@@ -1330,7 +1392,7 @@ xglBindTextureProc (xglGLOpPtr pOp)
xglUnrefTexObj (*ppTexObj);
*ppTexObj = NULL;
- glBindTexture (pOp->u.bind_texture.target, 0);
+ glBindTexture (pOp->u.bind_object.target, 0);
}
}
@@ -1342,8 +1404,8 @@ xglBindTexture (GLenum target,
gl.glProc = xglBindTextureProc;
- gl.u.bind_texture.target = target;
- gl.u.bind_texture.texture = texture;
+ gl.u.bind_object.target = target;
+ gl.u.bind_object.object = texture;
xglGLOp (&gl);
}
@@ -1394,7 +1456,7 @@ xglSetupTextures (void)
{
if (i != activeTexUnit)
{
- cctx->ActiveTextureARB (GL_TEXTURE0_ARB + i);
+ (*cctx->ActiveTextureARB) (GL_TEXTURE0_ARB + i);
activeTexUnit = i;
}
glitz_context_bind_texture (cctx->context, pTexObj[i]->object);
@@ -1402,7 +1464,7 @@ xglSetupTextures (void)
}
if (activeTexUnit != cctx->activeTexUnit)
- cctx->ActiveTextureARB (cctx->activeTexUnit);
+ (*cctx->ActiveTextureARB) (cctx->activeTexUnit);
}
static GLboolean
@@ -1531,7 +1593,27 @@ xglPrioritizeTextures (GLsizei n,
}
static glitz_texture_filter_t
-xglTextureFilter (GLenum param)
+xglTextureMinFilter (GLenum param)
+{
+ switch (param) {
+ case GL_LINEAR:
+ return GLITZ_TEXTURE_FILTER_LINEAR;
+ case GL_NEAREST_MIPMAP_NEAREST:
+ return GLITZ_TEXTURE_FILTER_NEAREST_MIPMAP_NEAREST;
+ case GL_LINEAR_MIPMAP_NEAREST:
+ return GLITZ_TEXTURE_FILTER_LINEAR_MIPMAP_NEAREST;
+ case GL_NEAREST_MIPMAP_LINEAR:
+ return GLITZ_TEXTURE_FILTER_NEAREST_MIPMAP_LINEAR;
+ case GL_LINEAR_MIPMAP_LINEAR:
+ return GLITZ_TEXTURE_FILTER_LINEAR_MIPMAP_LINEAR;
+ case GL_NEAREST:
+ default:
+ return GLITZ_TEXTURE_FILTER_NEAREST;
+ }
+}
+
+static glitz_texture_filter_t
+xglTextureMagFilter (GLenum param)
{
switch (param) {
case GL_LINEAR:
@@ -1589,12 +1671,12 @@ xglTexParameterfvProc (xglGLOpPtr pOp)
case GL_TEXTURE_MIN_FILTER:
glitz_texture_object_set_filter (pTexObj->object,
GLITZ_TEXTURE_FILTER_TYPE_MIN,
- xglTextureFilter (params[0]));
+ xglTextureMinFilter (params[0]));
break;
case GL_TEXTURE_MAG_FILTER:
glitz_texture_object_set_filter (pTexObj->object,
GLITZ_TEXTURE_FILTER_TYPE_MAG,
- xglTextureFilter (params[0]));
+ xglTextureMagFilter (params[0]));
break;
case GL_TEXTURE_WRAP_S:
glitz_texture_object_set_wrap (pTexObj->object,
@@ -1849,7 +1931,7 @@ xglDrawList (GLuint list)
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -1942,41 +2024,41 @@ xglCallLists (GLsizei n,
{
switch (type) {
case GL_BYTE:
- list = (GLuint) *(((GLbyte *) lists) + n);
+ list = (GLuint) *(((GLbyte *) lists) + i);
break;
case GL_UNSIGNED_BYTE:
- list = (GLuint) *(((GLubyte *) lists) + n);
+ list = (GLuint) *(((GLubyte *) lists) + i);
break;
case GL_SHORT:
- list = (GLuint) *(((GLshort *) lists) + n);
+ list = (GLuint) *(((GLshort *) lists) + i);
break;
case GL_UNSIGNED_SHORT:
- list = (GLuint) *(((GLushort *) lists) + n);
+ list = (GLuint) *(((GLushort *) lists) + i);
break;
case GL_INT:
- list = (GLuint) *(((GLint *) lists) + n);
+ list = (GLuint) *(((GLint *) lists) + i);
break;
case GL_UNSIGNED_INT:
- list = (GLuint) *(((GLuint *) lists) + n);
+ list = (GLuint) *(((GLuint *) lists) + i);
break;
case GL_FLOAT:
- list = (GLuint) *(((GLfloat *) lists) + n);
+ list = (GLuint) *(((GLfloat *) lists) + i);
break;
case GL_2_BYTES:
{
- GLubyte *ubptr = ((GLubyte *) lists) + 2 * n;
+ GLubyte *ubptr = ((GLubyte *) lists) + 2 * i;
list = (GLuint) *ubptr * 256 + (GLuint) *(ubptr + 1);
} break;
case GL_3_BYTES:
{
- GLubyte *ubptr = ((GLubyte *) lists) + 3 * n;
+ GLubyte *ubptr = ((GLubyte *) lists) + 3 * i;
list = (GLuint) * ubptr * 65536
+ (GLuint) * (ubptr + 1) * 256
+ (GLuint) * (ubptr + 2);
} break;
case GL_4_BYTES:
{
- GLubyte *ubptr = ((GLubyte *) lists) + 4 * n;
+ GLubyte *ubptr = ((GLubyte *) lists) + 4 * i;
list = (GLuint) * ubptr * 16777216
+ (GLuint) * (ubptr + 1) * 65536
+ (GLuint) * (ubptr + 2) * 256
@@ -2109,7 +2191,7 @@ xglClear (GLbitfield mask)
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2163,7 +2245,7 @@ xglAccum (GLenum op,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2218,7 +2300,7 @@ xglDrawArrays (GLenum mode,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2271,7 +2353,7 @@ xglDrawElements (GLenum mode,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2325,7 +2407,7 @@ xglDrawPixels (GLsizei width,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2382,7 +2464,7 @@ xglBitmap (GLsizei width,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2435,7 +2517,7 @@ xglRectdv (const GLdouble *v1,
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2522,7 +2604,8 @@ xglBegin (GLenum mode)
}
else
{
- if (REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
+ if (cctx->framebuffer ||
+ REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
{
BoxRec scissor, box;
BoxPtr pBox;
@@ -2532,7 +2615,7 @@ xglBegin (GLenum mode)
XGL_GLX_DRAW_BOX (&box, pBox);
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
XGL_GLX_SET_SCISSOR_BOX (&box);
@@ -2578,7 +2661,8 @@ xglEnd (void)
}
else
{
- if (REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
+ if (cctx->framebuffer ||
+ REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
{
XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, &scissor);
}
@@ -2599,7 +2683,7 @@ xglEnd (void)
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2640,7 +2724,7 @@ xglCopyPixelsProc (xglGLOpPtr pOp)
pBox++;
- if (cctx->attrib.scissorTest)
+ if (!cctx->framebuffer && cctx->attrib.scissorTest)
XGL_GLX_INTERSECT_BOX (&box, &scissor);
if (box.x1 < box.x2 && box.y1 < box.y2)
@@ -2688,8 +2772,8 @@ xglReadPixels (GLint x,
GLenum type,
GLvoid *pixels)
{
- glReadPixels (x + cctx->pReadBuffer->xOff,
- y + cctx->pReadBuffer->yOff,
+ glReadPixels (x + cctx->readXoff,
+ y + cctx->readYoff,
width, height, format, type, pixels);
}
@@ -2699,8 +2783,8 @@ xglCopyTexImage1DProc (xglGLOpPtr pOp)
glCopyTexImage1D (pOp->u.copy_tex_image_1d.target,
pOp->u.copy_tex_image_1d.level,
pOp->u.copy_tex_image_1d.internalformat,
- pOp->u.copy_tex_image_1d.x + cctx->pReadBuffer->xOff,
- pOp->u.copy_tex_image_1d.y + cctx->pReadBuffer->yOff,
+ pOp->u.copy_tex_image_1d.x + cctx->readXoff,
+ pOp->u.copy_tex_image_1d.y + cctx->readYoff,
pOp->u.copy_tex_image_1d.width,
pOp->u.copy_tex_image_1d.border);
}
@@ -2735,8 +2819,8 @@ xglCopyTexImage2DProc (xglGLOpPtr pOp)
glCopyTexImage2D (pOp->u.copy_tex_image_2d.target,
pOp->u.copy_tex_image_2d.level,
pOp->u.copy_tex_image_2d.internalformat,
- pOp->u.copy_tex_image_2d.x + cctx->pReadBuffer->xOff,
- pOp->u.copy_tex_image_2d.y + cctx->pReadBuffer->yOff,
+ pOp->u.copy_tex_image_2d.x + cctx->readXoff,
+ pOp->u.copy_tex_image_2d.y + cctx->readYoff,
pOp->u.copy_tex_image_2d.width,
pOp->u.copy_tex_image_2d.height,
pOp->u.copy_tex_image_2d.border);
@@ -2774,10 +2858,8 @@ xglCopyTexSubImage1DProc (xglGLOpPtr pOp)
glCopyTexSubImage1D (pOp->u.copy_tex_sub_image_1d.target,
pOp->u.copy_tex_sub_image_1d.level,
pOp->u.copy_tex_sub_image_1d.xoffset,
- pOp->u.copy_tex_sub_image_1d.x +
- cctx->pReadBuffer->xOff,
- pOp->u.copy_tex_sub_image_1d.y +
- cctx->pReadBuffer->yOff,
+ pOp->u.copy_tex_sub_image_1d.x + cctx->readXoff,
+ pOp->u.copy_tex_sub_image_1d.y + cctx->readYoff,
pOp->u.copy_tex_sub_image_1d.width);
}
@@ -2810,10 +2892,8 @@ xglCopyTexSubImage2DProc (xglGLOpPtr pOp)
pOp->u.copy_tex_sub_image_2d.level,
pOp->u.copy_tex_sub_image_2d.xoffset,
pOp->u.copy_tex_sub_image_2d.yoffset,
- pOp->u.copy_tex_sub_image_2d.x +
- cctx->pReadBuffer->xOff,
- pOp->u.copy_tex_sub_image_2d.y +
- cctx->pReadBuffer->yOff,
+ pOp->u.copy_tex_sub_image_2d.x + cctx->readXoff,
+ pOp->u.copy_tex_sub_image_2d.y + cctx->readYoff,
pOp->u.copy_tex_sub_image_2d.width,
pOp->u.copy_tex_sub_image_2d.height);
}
@@ -2849,8 +2929,8 @@ xglCopyColorTableProc (xglGLOpPtr pOp)
{
glCopyColorTable (pOp->u.copy_color_table.target,
pOp->u.copy_color_table.internalformat,
- pOp->u.copy_color_table.x + cctx->pReadBuffer->xOff,
- pOp->u.copy_color_table.y + cctx->pReadBuffer->yOff,
+ pOp->u.copy_color_table.x + cctx->readXoff,
+ pOp->u.copy_color_table.y + cctx->readYoff,
pOp->u.copy_color_table.width);
}
@@ -2879,8 +2959,8 @@ xglCopyColorSubTableProc (xglGLOpPtr pOp)
{
glCopyColorTable (pOp->u.copy_color_sub_table.target,
pOp->u.copy_color_sub_table.start,
- pOp->u.copy_color_sub_table.x + cctx->pReadBuffer->xOff,
- pOp->u.copy_color_sub_table.y + cctx->pReadBuffer->yOff,
+ pOp->u.copy_color_sub_table.x + cctx->readXoff,
+ pOp->u.copy_color_sub_table.y + cctx->readYoff,
pOp->u.copy_color_sub_table.width);
}
@@ -2912,9 +2992,9 @@ xglCopyConvolutionFilter1DProc (xglGLOpPtr pOp)
glCopyConvolutionFilter1D (pOp->u.copy_convolution_filter_1d.target,
internalformat,
pOp->u.copy_convolution_filter_1d.x +
- cctx->pReadBuffer->xOff,
+ cctx->readXoff,
pOp->u.copy_convolution_filter_1d.y +
- cctx->pReadBuffer->yOff,
+ cctx->readYoff,
pOp->u.copy_convolution_filter_1d.width);
}
@@ -2946,9 +3026,9 @@ xglCopyConvolutionFilter2DProc (xglGLOpPtr pOp)
glCopyConvolutionFilter2D (pOp->u.copy_convolution_filter_2d.target,
internalformat,
pOp->u.copy_convolution_filter_2d.x +
- cctx->pReadBuffer->xOff,
+ cctx->readXoff,
pOp->u.copy_convolution_filter_2d.y +
- cctx->pReadBuffer->yOff,
+ cctx->readYoff,
pOp->u.copy_convolution_filter_2d.width,
pOp->u.copy_convolution_filter_2d.height);
}
@@ -2983,10 +3063,8 @@ xglCopyTexSubImage3DProc (xglGLOpPtr pOp)
pOp->u.copy_tex_sub_image_3d.xoffset,
pOp->u.copy_tex_sub_image_3d.yoffset,
pOp->u.copy_tex_sub_image_3d.zoffset,
- pOp->u.copy_tex_sub_image_3d.x +
- cctx->pReadBuffer->xOff,
- pOp->u.copy_tex_sub_image_3d.y +
- cctx->pReadBuffer->yOff,
+ pOp->u.copy_tex_sub_image_3d.x + cctx->readXoff,
+ pOp->u.copy_tex_sub_image_3d.y + cctx->readYoff,
pOp->u.copy_tex_sub_image_3d.width,
pOp->u.copy_tex_sub_image_3d.height);
}
@@ -3088,22 +3166,6 @@ xglNoOpMultiTexCoord4svARB (GLenum target, const GLshort *v) {}
static void
xglNoOpSampleCoverageARB (GLclampf value, GLboolean invert) {}
-/* GL_EXT_texture_object */
-static GLboolean
-xglNoOpAreTexturesResidentEXT (GLsizei n,
- const GLuint *textures,
- GLboolean *residences)
-{
- return GL_FALSE;
-}
-static void
-xglNoOpGenTexturesEXT (GLsizei n, GLuint *textures) {}
-static GLboolean
-xglNoOpIsTextureEXT (GLuint texture)
-{
- return GL_FALSE;
-}
-
/* GL_SGIS_multisample */
static void
xglNoOpSampleMaskSGIS (GLclampf value, GLboolean invert) {}
@@ -3118,7 +3180,7 @@ xglNoOpPointParameterfvEXT (GLenum pname, const GLfloat *params) {}
/* GL_MESA_window_pos */
static void
-xglNoOpWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z) {}
+xglNoOpWindowPos3fvMESA (const GLfloat *v) {}
static void
xglWindowPos3fMESAProc (xglGLOpPtr pOp)
{
@@ -3127,15 +3189,15 @@ xglWindowPos3fMESAProc (xglGLOpPtr pOp)
pOp->u.window_pos_3f.z);
}
static void
-xglWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z)
+xglWindowPos3fvMESA (const GLfloat *v)
{
xglGLOpRec gl;
gl.glProc = xglWindowPos3fMESAProc;
- gl.u.window_pos_3f.x = x;
- gl.u.window_pos_3f.y = y;
- gl.u.window_pos_3f.z = z;
+ gl.u.window_pos_3f.x = v[0];
+ gl.u.window_pos_3f.y = v[1];
+ gl.u.window_pos_3f.z = v[2];
xglGLOp (&gl);
}
@@ -3185,19 +3247,286 @@ xglNoOpPointParameterivNV (GLenum pname, const GLint *params) {}
static void
xglNoOpActiveStencilFaceEXT (GLenum face) {}
+/* GL_ARB_vertex_program */
+static void
+xglNoOpVertexAttrib1svARB (GLuint index, const GLshort *v) {}
+static void
+xglNoOpVertexAttrib1fvARB (GLuint index, const GLfloat *v) {}
+static void
+xglNoOpVertexAttrib1dvARB (GLuint index, const GLdouble *v) {}
+static void
+xglNoOpVertexAttrib2svARB (GLuint index, const GLshort *v) {}
+static void
+xglNoOpVertexAttrib2fvARB (GLuint index, const GLfloat *v) {}
+static void
+xglNoOpVertexAttrib2dvARB (GLuint index, const GLdouble *v) {}
+static void
+xglNoOpVertexAttrib3svARB (GLuint index, const GLshort *v) {}
+static void
+xglNoOpVertexAttrib3fvARB (GLuint index, const GLfloat *v) {}
+static void
+xglNoOpVertexAttrib3dvARB (GLuint index, const GLdouble *v) {}
+static void
+xglNoOpVertexAttrib4bvARB (GLuint index, const GLbyte *v) {}
+static void
+xglNoOpVertexAttrib4svARB (GLuint index, const GLshort *v) {}
+static void
+xglNoOpVertexAttrib4ivARB (GLuint index, const GLint *v) {}
+static void
+xglNoOpVertexAttrib4ubvARB (GLuint index, const GLubyte *v) {}
+static void
+xglNoOpVertexAttrib4usvARB (GLuint index, const GLushort *v) {}
+static void
+xglNoOpVertexAttrib4uivARB (GLuint index, const GLuint *v) {}
+static void
+xglNoOpVertexAttrib4fvARB (GLuint index, const GLfloat *v) {}
+static void
+xglNoOpVertexAttrib4dvARB (GLuint index, const GLdouble *v) {}
+static void
+xglNoOpVertexAttrib4NbvARB (GLuint index, const GLbyte *v) {}
+static void
+xglNoOpVertexAttrib4NsvARB (GLuint index, const GLshort *v) {}
+static void
+xglNoOpVertexAttrib4NivARB (GLuint index, const GLint *v) {}
+static void
+xglNoOpVertexAttrib4NubvARB (GLuint index, const GLubyte *v) {}
+static void
+xglNoOpVertexAttrib4NusvARB (GLuint index, const GLushort *v) {}
+static void
+xglNoOpVertexAttrib4NuivARB (GLuint index, const GLuint *v) {}
+static void
+xglNoOpProgramStringARB (GLenum target, GLenum format, GLsizei len,
+ const void *string) {}
+static void
+xglNoOpBindProgramARB (GLenum target, GLuint program) {}
+static void
+xglBindProgramARBProc (xglGLOpPtr pOp)
+{
+ if (pOp->u.bind_object.object)
+ {
+ GLuint po;
+
+ po = (GLuint) xglHashLookup (cctx->shared->programObjects,
+ pOp->u.bind_object.object);
+ if (!po)
+ {
+ (*cctx->GenProgramsARB) (1, &po);
+
+ xglHashInsert (cctx->shared->programObjects,
+ pOp->u.bind_object.object,
+ (void *) po);
+ }
+
+ (*cctx->BindProgramARB) (pOp->u.bind_object.target, po);
+ }
+ else
+ {
+ (*cctx->BindProgramARB) (pOp->u.bind_object.target, 0);
+ }
+}
+static void
+xglBindProgramARB (GLenum target, GLuint program)
+{
+ xglGLOpRec gl;
+
+ gl.glProc = xglBindProgramARBProc;
+
+ gl.u.bind_object.target = target;
+ gl.u.bind_object.object = program;
+
+ xglGLOp (&gl);
+}
+static void
+xglNoOpDeleteProgramsARB (GLsizei n, const GLuint *programs) {}
+static void
+xglDeleteProgramsARB (GLsizei n, const GLuint *programs)
+{
+ GLuint po;
+
+ while (n--)
+ {
+ if (!*programs)
+ continue;
+
+ po = (GLuint) xglHashLookup (cctx->shared->programObjects,
+ *programs);
+ if (po)
+ {
+ (*cctx->DeleteProgramsARB) (1, &po);
+ xglHashRemove (cctx->shared->programObjects, *programs);
+ }
+ programs++;
+ }
+}
+static void
+xglNoOpGenProgramsARB (GLsizei n, GLuint *programs) {}
+static void
+xglGenProgramsARB (GLsizei n, GLuint *programs)
+{
+ GLuint name;
+
+ name = xglHashFindFreeKeyBlock (cctx->shared->programObjects, n);
+
+ (cctx->GenProgramsARB) (n, programs);
+
+ while (n--)
+ {
+ xglHashInsert (cctx->shared->programObjects, name,
+ (void *) *programs);
+
+ *programs++ = name++;
+ }
+}
+static void
+xglNoOpProgramEnvParameter4dvARB (GLenum target, GLuint index,
+ const GLdouble *params) {}
+static void
+xglNoOpProgramEnvParameter4fvARB (GLenum target, GLuint index,
+ const GLfloat *params) {}
+static void
+xglNoOpProgramLocalParameter4dvARB (GLenum target, GLuint index,
+ const GLdouble *params) {}
+static void
+xglNoOpProgramLocalParameter4fvARB (GLenum target, GLuint index,
+ const GLfloat *params) {}
+static void
+xglNoOpGetProgramEnvParameterdvARB (GLenum target, GLuint index,
+ GLdouble *params) {}
+static void
+xglNoOpGetProgramEnvParameterfvARB (GLenum target, GLuint index,
+ GLfloat *params) {}
+static void
+xglNoOpGetProgramLocalParameterdvARB (GLenum target, GLuint index,
+ GLdouble *params) {}
+static void
+xglNoOpGetProgramLocalParameterfvARB (GLenum target, GLuint index,
+ GLfloat *params) {}
+static void
+xglNoOpGetProgramivARB (GLenum target, GLenum pname, GLint *params) {}
+static void
+xglNoOpGetProgramStringARB (GLenum target, GLenum pname, void *string) {}
+static void
+xglNoOpGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params) {}
+static void
+xglNoOpGetVertexAttribfvARB (GLuint index,GLenum pname, GLfloat *params) {}
+static void
+xglNoOpGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params) {}
+static GLboolean
+xglNoOpIsProgramARB (GLuint program)
+{
+ return GL_FALSE;
+}
+static GLboolean
+xglIsProgramARB (GLuint program)
+{
+ if (!program)
+ return GL_FALSE;
+
+ if (xglHashLookup (cctx->shared->programObjects, program))
+ return GL_TRUE;
+
+ return GL_FALSE;
+}
+
/* GL_EXT_framebuffer_object */
static GLboolean
xglNoOpIsRenderbufferEXT (GLuint renderbuffer)
{
return FALSE;
}
+static GLboolean
+xglIsRenderbufferEXT (GLuint renderbuffer)
+{
+ if (!renderbuffer)
+ return GL_FALSE;
+
+ if (xglHashLookup (cctx->shared->renderbufferObjects, renderbuffer))
+ return GL_TRUE;
+
+ return GL_FALSE;
+}
static void
xglNoOpBindRenderbufferEXT (GLenum target, GLuint renderbuffer) {}
static void
+xglBindRenderbufferEXTProc (xglGLOpPtr pOp)
+{
+ if (pOp->u.bind_object.object)
+ {
+ GLuint rbo;
+
+ rbo = (GLuint) xglHashLookup (cctx->shared->renderbufferObjects,
+ pOp->u.bind_object.object);
+ if (!rbo)
+ {
+ (*cctx->GenRenderbuffersEXT) (1, &rbo);
+
+ xglHashInsert (cctx->shared->renderbufferObjects,
+ pOp->u.bind_object.object,
+ (void *) rbo);
+ }
+
+ (*cctx->BindRenderbufferEXT) (pOp->u.bind_object.target, rbo);
+ }
+ else
+ {
+ (*cctx->BindRenderbufferEXT) (pOp->u.bind_object.target, 0);
+ }
+}
+static void
+xglBindRenderbufferEXT (GLenum target,
+ GLuint renderbuffer)
+{
+ xglGLOpRec gl;
+
+ gl.glProc = xglBindRenderbufferEXTProc;
+
+ gl.u.bind_object.target = target;
+ gl.u.bind_object.object = renderbuffer;
+
+ xglGLOp (&gl);
+}
+static void
xglNoOpDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers) {}
static void
+xglDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers)
+{
+ GLuint rbo;
+
+ while (n--)
+ {
+ if (!*renderbuffers)
+ continue;
+
+ rbo = (GLuint) xglHashLookup (cctx->shared->renderbufferObjects,
+ *renderbuffers);
+ if (rbo)
+ {
+ (*cctx->DeleteRenderbuffersEXT) (1, &rbo);
+ xglHashRemove (cctx->shared->renderbufferObjects, *renderbuffers);
+ }
+ renderbuffers++;
+ }
+}
+static void
xglNoOpGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers) {}
static void
+xglGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers)
+{
+ GLuint name;
+
+ name = xglHashFindFreeKeyBlock (cctx->shared->renderbufferObjects, n);
+
+ (cctx->GenRenderbuffersEXT) (n, renderbuffers);
+
+ while (n--)
+ {
+ xglHashInsert (cctx->shared->renderbufferObjects, name,
+ (void *) *renderbuffers);
+
+ *renderbuffers++ = name++;
+ }
+}
+static void
xglNoOpRenderbufferStorageEXT (GLenum target, GLenum internalformat,
GLsizei width, GLsizei height) {}
static void
@@ -3208,41 +3537,379 @@ xglNoOpIsFramebufferEXT (GLuint framebuffer)
{
return FALSE;
}
+static GLboolean
+xglIsFramebufferEXT (GLuint framebuffer)
+{
+ if (!framebuffer)
+ return GL_FALSE;
+
+ if (xglHashLookup (cctx->shared->framebufferObjects, framebuffer))
+ return GL_TRUE;
+
+ return GL_FALSE;
+}
static void
xglNoOpBindFramebufferEXT (GLenum target, GLuint framebuffer) {}
static void
+xglBindFramebufferEXTProc (xglGLOpPtr pOp)
+{
+ GLuint fbo;
+
+ switch (pOp->u.bind_object.target) {
+ case GL_FRAMEBUFFER_EXT:
+ fbo = cctx->framebuffer;
+ break;
+ default:
+ xglRecordError (GL_INVALID_ENUM);
+ return;
+ }
+
+ if (pOp->u.bind_object.object)
+ {
+ if (pOp->u.bind_object.object != fbo)
+ {
+ fbo = (GLuint)
+ xglHashLookup (cctx->shared->framebufferObjects,
+ pOp->u.bind_object.object);
+ if (!fbo)
+ {
+ (*cctx->GenFramebuffersEXT) (1, &fbo);
+
+ xglHashInsert (cctx->shared->framebufferObjects,
+ pOp->u.bind_object.object,
+ (void *) fbo);
+ }
+
+ if (!cctx->framebuffer)
+ {
+ xglSetDrawOffset (0, 0);
+
+ cctx->readXoff = 0;
+ cctx->readYoff = 0;
+ }
+
+ (*cctx->BindFramebufferEXT) (GL_FRAMEBUFFER_EXT, fbo);
+ }
+ }
+ else
+ {
+ (*cctx->BindFramebufferEXT) (GL_FRAMEBUFFER_EXT, 0);
+
+ /* window-system drawable */
+ glitz_context_make_current (cctx->context, cctx->pDrawBuffer->drawable);
+
+ xglSetDrawOffset (cctx->pDrawBuffer->xOff, cctx->pDrawBuffer->yOff);
+
+ cctx->readXoff = cctx->pReadBuffer->xOff;
+ cctx->readYoff = cctx->pReadBuffer->yOff;
+ }
+
+ cctx->framebuffer = pOp->u.bind_object.object;
+}
+static void
+xglBindFramebufferEXT (GLenum target,
+ GLuint framebuffer)
+{
+ xglGLOpRec gl;
+
+ gl.glProc = xglBindFramebufferEXTProc;
+
+ gl.u.bind_object.target = target;
+ gl.u.bind_object.object = framebuffer;
+
+ xglGLOp (&gl);
+}
+static void
xglNoOpDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers) {}
static void
+xglDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers)
+{
+ GLuint fbo;
+
+ while (n--)
+ {
+ if (!*framebuffers)
+ continue;
+
+ fbo = (GLuint) xglHashLookup (cctx->shared->framebufferObjects,
+ *framebuffers);
+ if (fbo)
+ {
+ (*cctx->DeleteFramebuffersEXT) (1, &fbo);
+ xglHashRemove (cctx->shared->framebufferObjects, *framebuffers);
+ }
+ framebuffers++;
+ }
+}
+static void
xglNoOpGenFramebuffersEXT (GLsizei n, GLuint *framebuffers) {}
+static void
+xglGenFramebuffersEXT (GLsizei n, GLuint *framebuffers)
+{
+ GLuint name;
+
+ name = xglHashFindFreeKeyBlock (cctx->shared->framebufferObjects, n);
+
+ (cctx->GenFramebuffersEXT) (n, framebuffers);
+
+ while (n--)
+ {
+ xglHashInsert (cctx->shared->framebufferObjects, name,
+ (void *) *framebuffers);
+
+ *framebuffers++ = name++;
+ }
+}
static GLenum
xglNoOpCheckFramebufferStatusEXT (GLenum target)
{
return GL_FRAMEBUFFER_UNSUPPORTED_EXT;
}
static void
-xglNoOpFramebufferTexture1DEXT (GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture,
- GLint level) {}
+xglNoOpFramebufferTexture1DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level) {}
+static void
+xglFramebufferTexture1DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level)
+{
+ if (!cctx->framebuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ if (texture)
+ {
+ xglTexObjPtr pTexObj;
+
+ pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
+ texture);
+ if (!pTexObj)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ texture = pTexObj->name;
+ }
+
+ (*cctx->FramebufferTexture1DEXT) (target,
+ attachment,
+ textarget,
+ texture,
+ level);
+}
+static void
+xglNoOpFramebufferTexture2DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level) {}
+static void
+xglFramebufferTexture2DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level)
+{
+ if (!cctx->framebuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ if (texture)
+ {
+ xglTexObjPtr pTexObj;
+
+ pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
+ texture);
+ if (!pTexObj)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ texture = pTexObj->name;
+ }
+
+ (*cctx->FramebufferTexture2DEXT) (target,
+ attachment,
+ textarget,
+ texture,
+ level);
+}
static void
-xglNoOpFramebufferTexture2DEXT (GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture,
- GLint level) {}
+xglNoOpFramebufferTexture3DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level,
+ GLint zoffset) {}
static void
-xglNoOpFramebufferTexture3DEXT (GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture,
- GLint level, GLint zoffset) {}
+xglFramebufferTexture3DEXT (GLenum target,
+ GLenum attachment,
+ GLenum textarget,
+ GLuint texture,
+ GLint level,
+ GLint zoffset)
+{
+ if (!cctx->framebuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ if (texture)
+ {
+ xglTexObjPtr pTexObj;
+
+ pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
+ texture);
+ if (!pTexObj)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ texture = pTexObj->name;
+ }
+
+ (*cctx->FramebufferTexture3DEXT) (target,
+ attachment,
+ textarget,
+ texture,
+ level,
+ zoffset);
+}
static void
-xglNoOpFramebufferRenderbufferEXT (GLenum target, GLenum attachment,
+xglNoOpFramebufferRenderbufferEXT (GLenum target,
+ GLenum attachment,
GLenum renderbuffertarget,
GLuint renderbuffer) {}
static void
+xglFramebufferRenderbufferEXT (GLenum target,
+ GLenum attachment,
+ GLenum renderbuffertarget,
+ GLuint renderbuffer)
+{
+ if (!cctx->framebuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ if (renderbuffer)
+ {
+ renderbuffer = (GLuint)
+ xglHashLookup (cctx->shared->renderbufferObjects,
+ renderbuffer);
+ if (!renderbuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+ }
+
+ (*cctx->FramebufferRenderbufferEXT) (target,
+ attachment,
+ renderbuffertarget,
+ renderbuffer);
+}
+static void
xglNoOpGetFramebufferAttachmentParameterivEXT (GLenum target,
GLenum attachment,
GLenum pname,
GLint *params) {}
static void
+xglGetFramebufferAttachmentParameterivEXT (GLenum target,
+ GLenum attachment,
+ GLenum pname,
+ GLint *params)
+{
+ if (!cctx->framebuffer)
+ {
+ xglRecordError (GL_INVALID_OPERATION);
+ return;
+ }
+
+ (*cctx->GetFramebufferAttachmentParameterivEXT) (target,
+ attachment,
+ pname,
+ params);
+
+ if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT)
+ {
+ GLint type;
+
+ pname = GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT;
+
+ (*cctx->GetFramebufferAttachmentParameterivEXT) (target,
+ attachment,
+ pname,
+ &type);
+
+ switch (type) {
+ case GL_RENDERBUFFER_EXT:
+ *params = (GLint) xglHashLookup (cctx->shared->renderbufferObjects,
+ *params);
+ break;
+ case GL_TEXTURE:
+ *params = (GLint) xglHashLookup (cctx->shared->texObjects,
+ *params);
+ break;
+ }
+ }
+}
+static void
xglNoOpGenerateMipmapEXT (GLenum target) {}
+static void
+xglGenerateMipmapEXT (GLenum target)
+{
+ xglTexObjPtr pTexObj = NULL;
+
+ switch (target) {
+ case GL_TEXTURE_2D:
+ pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
+ default:
+ break;
+ }
+
+ if (pTexObj)
+ {
+ if (pTexObj->pPixmap)
+ {
+ xglGLContextPtr pContext = cctx;
+
+ if (xglSyncSurface (&pTexObj->pPixmap->drawable))
+ {
+ if (pContext != cctx)
+ {
+ XGL_SCREEN_PRIV (pContext->pDrawBuffer->pGC->pScreen);
+
+ glitz_drawable_finish (pScreenPriv->drawable);
+
+ xglSetCurrentContext (pContext);
+ }
+
+ glitz_context_bind_texture (cctx->context, pTexObj->object);
+ }
+ else
+ pTexObj = NULL;
+ }
+
+ if (pTexObj)
+ (*cctx->GenerateMipmapEXT) (target);
+ }
+}
+
static struct _glapi_table __glNativeRenderTable = {
xglNewList,
xglEndList,
@@ -3652,44 +4319,166 @@ static struct _glapi_table __glNativeRenderTable = {
xglNoOpMultiTexCoord4ivARB,
0, /* glMultiTexCoord4sARB */
xglNoOpMultiTexCoord4svARB,
+ 0, /* glAttachShader */
+ 0, /* glCreateProgram */
+ 0, /* glCreateShader */
+ 0, /* glDeleteProgram */
+ 0, /* glDeleteShader */
+ 0, /* glDetachShader */
+ 0, /* glGetAttachedShaders */
+ 0, /* glGetProgramInfoLog */
+ 0, /* glGetProgramiv */
+ 0, /* glGetShaderInfoLog */
+ 0, /* glGetShaderiv */
+ 0, /* glIsProgram */
+ 0, /* glIsShader */
+ 0, /* glStencilFuncSeparate */
+ 0, /* glStencilMaskSeparate */
+ 0, /* glStencilOpSeparate */
+ 0, /* glUniformMatrix2x3fv */
+ 0, /* glUniformMatrix2x4fv */
+ 0, /* glUniformMatrix3x2fv */
+ 0, /* glUniformMatrix3x4fv */
+ 0, /* glUniformMatrix4x2fv */
+ 0, /* glUniformMatrix4x3fv */
0, /* glLoadTransposeMatrixfARB */
0, /* glLoadTransposeMatrixdARB */
0, /* glMultTransposeMatrixfARB */
0, /* glMultTransposeMatrixdARB */
xglNoOpSampleCoverageARB,
+ 0, /* glCompressedTexImage1DARB */
+ 0, /* glCompressedTexImage2DARB */
+ 0, /* glCompressedTexImage3DARB */
+ 0, /* glCompressedTexSubImage1DARB */
+ 0, /* glCompressedTexSubImage2DARB */
+ 0, /* glCompressedTexSubImage3DARB */
+ 0, /* glGetCompressedTexImageARB */
+ 0, /* glDisableVertexAttribArrayARB */
+ 0, /* glEnableVertexAttribArrayARB */
+ xglNoOpGetProgramEnvParameterdvARB,
+ xglNoOpGetProgramEnvParameterfvARB,
+ xglNoOpGetProgramLocalParameterdvARB,
+ xglNoOpGetProgramLocalParameterfvARB,
+ xglNoOpGetProgramStringARB,
+ xglNoOpGetProgramivARB,
+ xglNoOpGetVertexAttribdvARB,
+ xglNoOpGetVertexAttribfvARB,
+ xglNoOpGetVertexAttribivARB,
+ 0, /* glProgramEnvParameter4dARB */
+ xglNoOpProgramEnvParameter4dvARB,
+ 0, /* glProgramEnvParameter4fARB */
+ xglNoOpProgramEnvParameter4fvARB,
+ 0, /* glProgramLocalParameter4dARB */
+ xglNoOpProgramLocalParameter4dvARB,
+ 0, /* glProgramLocalParameter4fARB */
+ xglNoOpProgramLocalParameter4fvARB,
+ xglNoOpProgramStringARB,
+ 0, /* glVertexAttrib1dARB */
+ xglNoOpVertexAttrib1dvARB,
+ 0, /* glVertexAttrib1fARB */
+ xglNoOpVertexAttrib1fvARB,
+ 0, /* glVertexAttrib1sARB */
+ xglNoOpVertexAttrib1svARB,
+ 0, /* glVertexAttrib2dARB */
+ xglNoOpVertexAttrib2dvARB,
+ 0, /* glVertexAttrib2fARB */
+ xglNoOpVertexAttrib2fvARB,
+ 0, /* glVertexAttrib2sARB */
+ xglNoOpVertexAttrib2svARB,
+ 0, /* glVertexAttrib3dARB */
+ xglNoOpVertexAttrib3dvARB,
+ 0, /* glVertexAttrib3fARB */
+ xglNoOpVertexAttrib3fvARB,
+ 0, /* glVertexAttrib3sARB */
+ xglNoOpVertexAttrib3svARB,
+ xglNoOpVertexAttrib4NbvARB,
+ xglNoOpVertexAttrib4NivARB,
+ xglNoOpVertexAttrib4NsvARB,
+ 0, /* glVertexAttrib4NubARB */
+ xglNoOpVertexAttrib4NubvARB,
+ xglNoOpVertexAttrib4NuivARB,
+ xglNoOpVertexAttrib4NusvARB,
+ xglNoOpVertexAttrib4bvARB,
+ 0, /* glVertexAttrib4dARB */
+ xglNoOpVertexAttrib4dvARB,
+ 0, /* glVertexAttrib4fARB */
+ xglNoOpVertexAttrib4fvARB,
+ xglNoOpVertexAttrib4ivARB,
+ 0, /* glVertexAttrib4sARB */
+ xglNoOpVertexAttrib4svARB,
+ xglNoOpVertexAttrib4ubvARB,
+ xglNoOpVertexAttrib4uivARB,
+ xglNoOpVertexAttrib4usvARB,
+ 0, /* glVertexAttribPointerARB */
+ 0, /* glBindBufferARB */
+ 0, /* glBufferDataARB */
+ 0, /* glBufferSubDataARB */
+ 0, /* glDeleteBuffersARB */
+ 0, /* glGenBuffersARB */
+ 0, /* glGetBufferParameterivARB */
+ 0, /* glGetBufferPointervARB */
+ 0, /* glGetBufferSubDataARB */
+ 0, /* glIsBufferARB */
+ 0, /* glMapBufferARB */
+ 0, /* glUnmapBufferARB */
+ 0, /* glBeginQueryARB */
+ 0, /* glDeleteQueriesARB */
+ 0, /* glEndQueryARB */
+ 0, /* glGenQueriesARB */
+ 0, /* glGetQueryObjectivARB */
+ 0, /* glGetQueryObjectuivARB */
+ 0, /* glGetQueryivARB */
+ 0, /* IsQueryARB */
+ 0, /* glAttachObjectARB */
+ 0, /* glCompileShaderARB */
+ 0, /* CreateProgramObjectARB */
+ 0, /* CreateShaderObjectARB */
+ 0, /* glDeleteObjectARB */
+ 0, /* glDetachObjectARB */
+ 0, /* glGetActiveUniformARB */
+ 0, /* glGetAttachedObjectsARB */
+ 0, /* GetHandleARB */
+ 0, /* glGetInfoLogARB */
+ 0, /* glGetObjectParameterfvARB */
+ 0, /* glGetObjectParameterivARB */
+ 0, /* glGetShaderSourceARB */
+ 0, /* GetUniformLocationARB */
+ 0, /* glGetUniformfvARB */
+ 0, /* glGetUniformivARB */
+ 0, /* glLinkProgramARB */
+ 0, /* glShaderSourceARB */
+ 0, /* glUniform1fARB */
+ 0, /* glUniform1fvARB */
+ 0, /* glUniform1iARB */
+ 0, /* glUniform1ivARB */
+ 0, /* glUniform2fARB */
+ 0, /* glUniform2fvARB */
+ 0, /* glUniform2iARB */
+ 0, /* glUniform2ivARB */
+ 0, /* glUniform3fARB */
+ 0, /* glUniform3fvARB */
+ 0, /* glUniform3iARB */
+ 0, /* glUniform3ivARB */
+ 0, /* glUniform4fARB */
+ 0, /* glUniform4fvARB */
+ 0, /* glUniform4iARB */
+ 0, /* glUniform4ivARB */
+ 0, /* glUniformMatrix2fvARB */
+ 0, /* glUniformMatrix3fvARB */
+ 0, /* glUniformMatrix4fvARB */
+ 0, /* glUseProgramObjectARB */
+ 0, /* glValidateProgramARB */
+ 0, /* glBindAttribLocationARB */
+ 0, /* glGetActiveAttribARB */
+ 0, /* GetAttribLocationARB */
0, /* glDrawBuffersARB */
0, /* glPolygonOffsetEXT */
- 0, /* glGetTexFilterFuncSGIS */
- 0, /* glTexFilterFuncSGIS */
- 0, /* glGetHistogramEXT */
- 0, /* glGetHistogramParameterfvEXT */
- 0, /* glGetHistogramParameterivEXT */
- 0, /* glGetMinmaxEXT */
- 0, /* glGetMinmaxParameterfvEXT */
- 0, /* glGetMinmaxParameterivEXT */
- 0, /* glGetConvolutionFilterEXT */
- 0, /* glGetConvolutionParameterfvEXT */
- 0, /* glGetConvolutionParameterivEXT */
- 0, /* glGetSeparableFilterEXT */
- 0, /* glGetColorTableSGI */
- 0, /* glGetColorTableParameterfvSGI */
- 0, /* glGetColorTableParameterivSGI */
- 0, /* glPixelTexGenSGIX */
- 0, /* glPixelTexGenParameteriSGIS */
- 0, /* glPixelTexGenParameterivSGIS */
+ 0, /* glGetPixelTexGenParameterfvSGIS */
+ 0, /* glGetPixelTexGenParameterivSGIS */
0, /* glPixelTexGenParameterfSGIS */
0, /* glPixelTexGenParameterfvSGIS */
- 0, /* glGetPixelTexGenParameterivSGIS */
- 0, /* glGetPixelTexGenParameterfvSGIS */
- 0, /* glTexImage4DSGIS */
- 0, /* glTexSubImage4DSGIS */
- xglNoOpAreTexturesResidentEXT,
- xglNoOpGenTexturesEXT,
- xglNoOpIsTextureEXT,
- 0, /* glDetailTexFuncSGIS */
- 0, /* glGetDetailTexFuncSGIS */
- 0, /* glSharpenTexFuncSGIS */
- 0, /* glGetSharpenTexFuncSGIS */
+ 0, /* glPixelTexGenParameteriSGIS */
+ 0, /* glPixelTexGenParameterivSGIS */
xglNoOpSampleMaskSGIS,
xglNoOpSamplePatternSGIS,
0, /* glColorPointerEXT */
@@ -3698,57 +4487,46 @@ static struct _glapi_table __glNativeRenderTable = {
0, /* glNormalPointerEXT */
0, /* glTexCoordPointerEXT */
0, /* glVertexPointerEXT */
- 0, /* glSpriteParameterfSGIX */
- 0, /* glSpriteParameterfvSGIX */
- 0, /* glSpriteParameteriSGIX */
- 0, /* glSpriteParameterivSGIX */
xglNoOpPointParameterfEXT,
xglNoOpPointParameterfvEXT,
- 0, /* glGetInstrumentsSGIX */
- 0, /* glInstrumentsBufferSGIX */
- 0, /* glPollInstrumentsSGIX */
- 0, /* glReadInstrumentsSGIX */
- 0, /* glStartInstrumentsSGIX */
- 0, /* glStopInstrumentsSGIX */
- 0, /* glFrameZoomSGIX */
- 0, /* glTagSampleBufferSGIX */
- 0, /* glReferencePlaneSGIX */
- 0, /* glFlushRasterSGIX */
- 0, /* glGetListParameterfvSGIX */
- 0, /* glGetListParameterivSGIX */
- 0, /* glListParameterfSGIX */
- 0, /* glListParameterfvSGIX */
- 0, /* glListParameteriSGIX */
- 0, /* glListParameterivSGIX */
- 0, /* glFragmentColorMaterialSGIX */
- 0, /* glFragmentLightfSGIX */
- 0, /* glFragmentLightfvSGIX */
- 0, /* glFragmentLightiSGIX */
- 0, /* glFragmentLightivSGIX */
- 0, /* glFragmentLightModelfSGIX */
- 0, /* glFragmentLightModelfvSGIX */
- 0, /* glFragmentLightModeliSGIX */
- 0, /* glFragmentLightModelivSGIX */
- 0, /* glFragmentMaterialfSGIX */
- 0, /* glFragmentMaterialfvSGIX */
- 0, /* glFragmentMaterialiSGIX */
- 0, /* glFragmentMaterialivSGIX */
- 0, /* glGetFragmentLightfvSGIX */
- 0, /* glGetFragmentLightivSGIX */
- 0, /* glGetFragmentMaterialfvSGIX */
- 0, /* glGetFragmentMaterialivSGIX */
- 0, /* glLightEnviSGIX */
- 0, /* glVertexWeightfEXT */
- 0, /* glVertexWeightfvEXT */
- 0, /* glVertexWeightPointerEXT */
+ 0, /* glLockArraysEXT */
+ 0, /* glUnlockArraysEXT */
+ 0, /* glCullParameterdvEXT */
+ 0, /* glCullParameterfvEXT */
+ 0, /* glSecondaryColor3bEXT */
+ xglNoOpSecondaryColor3bvEXT,
+ 0, /* glSecondaryColor3dEXT */
+ xglNoOpSecondaryColor3dvEXT,
+ 0, /* glSecondaryColor3fEXT */
+ xglNoOpSecondaryColor3fvEXT,
+ 0, /* glSecondaryColor3iEXT */
+ xglNoOpSecondaryColor3ivEXT,
+ 0, /* glSecondaryColor3sEXT */
+ xglNoOpSecondaryColor3svEXT,
+ 0, /* glSecondaryColor3ubEXT */
+ xglNoOpSecondaryColor3ubvEXT,
+ 0, /* glSecondaryColor3uiEXT */
+ xglNoOpSecondaryColor3uivEXT,
+ 0, /* glSecondaryColor3usEXT */
+ xglNoOpSecondaryColor3usvEXT,
+ xglNoOpSecondaryColorPointerEXT,
+ 0, /* glMultiDrawArraysEXT */
+ 0, /* glMultiDrawElementsEXT */
+ xglNoOpFogCoordPointerEXT,
+ 0, /* glFogCoorddEXT */
+ xglNoOpFogCoorddvEXT,
+ 0, /* glFogCoordfEXT */
+ xglNoOpFogCoordfvEXT,
+ 0, /* glPixelTexGenSGIX */
+ xglNoOpBlendFuncSeparateEXT,
0, /* glFlushVertexArrayRangeNV */
0, /* glVertexArrayRangeNV */
- 0, /* glCombinerParameterfvNV */
- 0, /* glCombinerParameterfNV */
- 0, /* glCombinerParameterivNV */
- 0, /* glCombinerParameteriNV */
0, /* glCombinerInputNV */
0, /* glCombinerOutputNV */
+ 0, /* glCombinerParameterfNV */
+ 0, /* glCombinerParameterfvNV */
+ 0, /* glCombinerParameteriNV */
+ 0, /* glCombinerParameterivNV */
0, /* glFinalCombinerInputNV */
0, /* glGetCombinerInputParameterfvNV */
0, /* glGetCombinerInputParameterivNV */
@@ -3767,8 +4545,8 @@ static struct _glapi_table __glNativeRenderTable = {
0, /* glWindowPos2svMESA */
0, /* glWindowPos3dMESA */
0, /* glWindowPos3dvMESA */
- xglNoOpWindowPos3fMESA,
- 0, /* glWindowPos3fvMESA */
+ 0, /* glWindowPos3fMESA */
+ xglNoOpWindowPos3fvMESA,
0, /* glWindowPos3iMESA */
0, /* glWindowPos3ivMESA */
0, /* glWindowPos3sMESA */
@@ -3781,62 +4559,30 @@ static struct _glapi_table __glNativeRenderTable = {
0, /* glWindowPos4ivMESA */
0, /* glWindowPos4sMESA */
0, /* glWindowPos4svMESA */
- xglNoOpBlendFuncSeparateEXT,
- 0, /* glIndexMaterialEXT */
- 0, /* glIndexFuncEXT */
- 0, /* glLockArraysEXT */
- 0, /* glUnlockArraysEXT */
- 0, /* glCullParameterdvEXT */
- 0, /* glCullParameterfvEXT */
- 0, /* glHintPGI */
- 0, /* glFogCoordfEXT */
- xglNoOpFogCoordfvEXT,
- 0, /* glFogCoorddEXT */
- xglNoOpFogCoorddvEXT,
- xglNoOpFogCoordPointerEXT,
- 0, /* glGetColorTableEXT */
- 0, /* glGetColorTableParameterivEXT */
- 0, /* glGetColorTableParameterfvEXT */
- 0, /* glTbufferMask3DFX */
- 0, /* glCompressedTexImage3DARB */
- 0, /* glCompressedTexImage2DARB */
- 0, /* glCompressedTexImage1DARB */
- 0, /* glCompressedTexSubImage3DARB */
- 0, /* glCompressedTexSubImage2DARB */
- 0, /* glCompressedTexSubImage1DARB */
- 0, /* glGetCompressedTexImageARB */
- 0, /* glSecondaryColor3bEXT */
- xglNoOpSecondaryColor3bvEXT,
- 0, /* glSecondaryColor3dEXT */
- xglNoOpSecondaryColor3dvEXT,
- 0, /* glSecondaryColor3fEXT */
- xglNoOpSecondaryColor3fvEXT,
- 0, /* glSecondaryColor3iEXT */
- xglNoOpSecondaryColor3ivEXT,
- 0, /* glSecondaryColor3sEXT */
- xglNoOpSecondaryColor3svEXT,
- 0, /* glSecondaryColor3ubEXT */
- xglNoOpSecondaryColor3ubvEXT,
- 0, /* glSecondaryColor3uiEXT */
- xglNoOpSecondaryColor3uivEXT,
- 0, /* glSecondaryColor3usEXT */
- xglNoOpSecondaryColor3usvEXT,
- xglNoOpSecondaryColorPointerEXT,
+ 0, /* glMultiModeDrawArraysIBM */
+ 0, /* glMultiModeDrawElementsIBM */
+ 0, /* glDeleteFencesNV */
+ 0, /* glFinishFenceNV */
+ 0, /* glGenFencesNV */
+ 0, /* glGetFenceivNV */
+ 0, /* glIsFenceNV */
+ 0, /* glSetFenceNV */
+ 0, /* glTestFenceNV */
0, /* glAreProgramsResidentNV */
- 0, /* glBindProgramNV */
- 0, /* glDeleteProgramsNV */
+ xglNoOpBindProgramARB,
+ xglNoOpDeleteProgramsARB,
0, /* glExecuteProgramNV */
- 0, /* glGenProgramsNV */
+ xglNoOpGenProgramsARB,
0, /* glGetProgramParameterdvNV */
0, /* glGetProgramParameterfvNV */
- 0, /* glGetProgramivNV */
0, /* glGetProgramStringNV */
+ 0, /* glGetProgramivNV */
0, /* glGetTrackMatrixivNV */
- 0, /* glGetVertexAttribdvARB */
- 0, /* glGetVertexAttribfvARB */
- 0, /* glGetVertexAttribivARB */
0, /* glGetVertexAttribPointervNV */
- 0, /* glIsProgramNV */
+ 0, /* glGetVertexAttribdvNV */
+ 0, /* glGetVertexAttribfvNV */
+ 0, /* glGetVertexAttribivNV */
+ xglNoOpIsProgramARB,
0, /* glLoadProgramNV */
0, /* glProgramParameter4dNV */
0, /* glProgramParameter4dvNV */
@@ -3846,160 +4592,6 @@ static struct _glapi_table __glNativeRenderTable = {
0, /* glProgramParameters4fvNV */
0, /* glRequestResidentProgramsNV */
0, /* glTrackMatrixNV */
- 0, /* glVertexAttribPointerNV */
- 0, /* glVertexAttrib1dARB */
- 0, /* glVertexAttrib1dvARB */
- 0, /* glVertexAttrib1fARB */
- 0, /* glVertexAttrib1fvARB */
- 0, /* glVertexAttrib1sARB */
- 0, /* glVertexAttrib1svARB */
- 0, /* glVertexAttrib2dARB */
- 0, /* glVertexAttrib2dvARB */
- 0, /* glVertexAttrib2fARB */
- 0, /* glVertexAttrib2fvARB */
- 0, /* glVertexAttrib2sARB */
- 0, /* glVertexAttrib2svARB */
- 0, /* glVertexAttrib3dARB */
- 0, /* glVertexAttrib3dvARB */
- 0, /* glVertexAttrib3fARB */
- 0, /* glVertexAttrib3fvARB */
- 0, /* glVertexAttrib3sARB */
- 0, /* glVertexAttrib3svARB */
- 0, /* glVertexAttrib4dARB */
- 0, /* glVertexAttrib4dvARB */
- 0, /* glVertexAttrib4fARB */
- 0, /* glVertexAttrib4fvARB */
- 0, /* glVertexAttrib4sARB */
- 0, /* glVertexAttrib4svARB */
- 0, /* glVertexAttrib4NubARB */
- 0, /* glVertexAttrib4NubvARB */
- 0, /* glVertexAttribs1dvNV */
- 0, /* glVertexAttribs1fvNV */
- 0, /* glVertexAttribs1svNV */
- 0, /* glVertexAttribs2dvNV */
- 0, /* glVertexAttribs2fvNV */
- 0, /* glVertexAttribs2svNV */
- 0, /* glVertexAttribs3dvNV */
- 0, /* glVertexAttribs3fvNV */
- 0, /* glVertexAttribs3svNV */
- 0, /* glVertexAttribs4dvNV */
- 0, /* glVertexAttribs4fvNV */
- 0, /* glVertexAttribs4svNV */
- 0, /* glVertexAttribs4ubvNV */
- xglNoOpPointParameteriNV,
- xglNoOpPointParameterivNV,
- 0, /* glMultiDrawArraysEXT */
- 0, /* glMultiDrawElementsEXT */
- xglNoOpActiveStencilFaceEXT,
- 0, /* glDeleteFencesNV */
- 0, /* glGenFencesNV */
- 0, /* glIsFenceNV */
- 0, /* glTestFenceNV */
- 0, /* glGetFenceivNV */
- 0, /* glFinishFenceNV */
- 0, /* glSetFenceNV */
- 0, /* glVertexAttrib4bvARB */
- 0, /* glVertexAttrib4ivARB */
- 0, /* glVertexAttrib4ubvARB */
- 0, /* glVertexAttrib4usvARB */
- 0, /* glVertexAttrib4uivARB */
- 0, /* glVertexAttrib4NbvARB */
- 0, /* glVertexAttrib4NsvARB */
- 0, /* glVertexAttrib4NivARB */
- 0, /* glVertexAttrib4NusvARB */
- 0, /* glVertexAttrib4NuivARB */
- 0, /* glVertexAttribPointerARB */
- 0, /* glEnableVertexAttribArrayARB */
- 0, /* glDisableVertexAttribArrayARB */
- 0, /* glProgramStringARB */
- 0, /* glProgramEnvParameter4dARB */
- 0, /* glProgramEnvParameter4dvARB */
- 0, /* glProgramEnvParameter4fARB */
- 0, /* glProgramEnvParameter4fvARB */
- 0, /* glProgramLocalParameter4dARB */
- 0, /* glProgramLocalParameter4dvARB */
- 0, /* glProgramLocalParameter4fARB */
- 0, /* glProgramLocalParameter4fvARB */
- 0, /* glGetProgramEnvParameterdvARB */
- 0, /* glGetProgramEnvParameterfvARB */
- 0, /* glGetProgramLocalParameterdvARB */
- 0, /* glGetProgramLocalParameterfvARB */
- 0, /* glGetProgramivARB */
- 0, /* glGetProgramStringARB */
- 0, /* glProgramNamedParameter4fNV */
- 0, /* glProgramNamedParameter4dNV */
- 0, /* glProgramNamedParameter4fvNV */
- 0, /* glProgramNamedParameter4dvNV */
- 0, /* glGetProgramNamedParameterfvNV */
- 0, /* glGetProgramNamedParameterdvNV */
- 0, /* glBindBufferARB */
- 0, /* glBufferDataARB */
- 0, /* glBufferSubDataARB */
- 0, /* glDeleteBuffersARB */
- 0, /* glGenBuffersARB */
- 0, /* glGetBufferParameterivARB */
- 0, /* glGetBufferPointervARB */
- 0, /* glGetBufferSubDataARB */
- 0, /* glIsBufferARB */
- 0, /* glMapBufferARB */
- 0, /* glUnmapBufferARB */
- 0, /* glDepthBoundsEXT */
- 0, /* glGenQueriesARB */
- 0, /* glDeleteQueriesARB */
- 0, /* glIsQueryARB */
- 0, /* glBeginQueryARB */
- 0, /* glEndQueryARB */
- 0, /* glGetQueryivARB */
- 0, /* glGetQueryObjectivARB */
- 0, /* glGetQueryObjectuivARB */
- 0, /* glMultiModeDrawArraysIBM */
- 0, /* glMultiModeDrawElementsIBM */
- 0, /* glBlendEquationSeparateEXT */
- 0, /* glDeleteObjectARB */
- 0, /* glGetHandleARB */
- 0, /* glDetachObjectARB */
- 0, /* glCreateShaderObjectARB */
- 0, /* glShaderSourceARB */
- 0, /* glCompileShaderARB */
- 0, /* glCreateProgramObjectARB */
- 0, /* glAttachObjectARB */
- 0, /* glLinkProgramARB */
- 0, /* glUseProgramObjectARB */
- 0, /* glValidateProgramARB */
- 0, /* glUniform1fARB */
- 0, /* glUniform2fARB */
- 0, /* glUniform3fARB */
- 0, /* glUniform4fARB */
- 0, /* glUniform1iARB */
- 0, /* glUniform2iARB */
- 0, /* glUniform3iARB */
- 0, /* glUniform4iARB */
- 0, /* glUniform1fvARB */
- 0, /* glUniform2fvARB */
- 0, /* glUniform3fvARB */
- 0, /* glUniform4fvARB */
- 0, /* glUniform1ivARB */
- 0, /* glUniform2ivARB */
- 0, /* glUniform3ivARB */
- 0, /* glUniform4ivARB */
- 0, /* glUniformMatrix2fvARB */
- 0, /* glUniformMatrix3fvARB */
- 0, /* glUniformMatrix4fvARB */
- 0, /* glGetObjectParameterfvARB */
- 0, /* glGetObjectParameterivARB */
- 0, /* glGetInfoLogARB */
- 0, /* glGetAttachedObjectsARB */
- 0, /* glGetUniformLocationARB */
- 0, /* glGetActiveUniformARB */
- 0, /* glGetUniformfvARB */
- 0, /* glGetUniformivARB */
- 0, /* glGetShaderSourceARB */
- 0, /* glBindAttribLocationARB */
- 0, /* glGetActiveAttribARB */
- 0, /* glGetAttribLocationARB */
- 0, /* glGetVertexAttribdvNV */
- 0, /* glGetVertexAttribfvNV */
- 0, /* glGetVertexAttribivNV */
0, /* glVertexAttrib1dNV */
0, /* glVertexAttrib1dvNV */
0, /* glVertexAttrib1fNV */
@@ -4026,40 +4618,69 @@ static struct _glapi_table __glNativeRenderTable = {
0, /* glVertexAttrib4svNV */
0, /* glVertexAttrib4ubNV */
0, /* glVertexAttrib4ubvNV */
- 0, /* glGenFragmentShadersATI */
+ 0, /* glVertexAttribPointerNV */
+ 0, /* glVertexAttribs1dvNV */
+ 0, /* glVertexAttribs1fvNV */
+ 0, /* glVertexAttribs1svNV */
+ 0, /* glVertexAttribs2dvNV */
+ 0, /* glVertexAttribs2fvNV */
+ 0, /* glVertexAttribs2svNV */
+ 0, /* glVertexAttribs3dvNV */
+ 0, /* glVertexAttribs3fvNV */
+ 0, /* glVertexAttribs3svNV */
+ 0, /* glVertexAttribs4dvNV */
+ 0, /* glVertexAttribs4fvNV */
+ 0, /* glVertexAttribs4svNV */
+ 0, /* glVertexAttribs4ubvNV */
+ 0, /* glAlphaFragmentOp1ATI */
+ 0, /* glAlphaFragmentOp2ATI */
+ 0, /* glAlphaFragmentOp3ATI */
+ 0, /* glBeginFragmentShaderATI */
0, /* glBindFragmentShaderATI */
+ 0, /* glColorFragmentOp1ATI */
+ 0, /* glColorFragmentOp2ATI */
+ 0, /* glColorFragmentOp3ATI */
0, /* glDeleteFragmentShaderATI */
- 0, /* glBeginFragmentShaderATI */
0, /* glEndFragmentShaderATI */
+ 0, /* glGenFragmentShadersATI */
0, /* glPassTexCoordATI */
0, /* glSampleMapATI */
- 0, /* glColorFragmentOp1ATI */
- 0, /* glColorFragmentOp2ATI */
- 0, /* glColorFragmentOp3ATI */
- 0, /* glAlphaFragmentOp1ATI */
- 0, /* glAlphaFragmentOp2ATI */
- 0, /* glAlphaFragmentOp3ATI */
0, /* glSetFragmentShaderConstantATI */
- xglNoOpIsRenderbufferEXT,
- xglNoOpBindRenderbufferEXT,
- xglNoOpDeleteRenderbuffersEXT,
- xglNoOpGenRenderbuffersEXT,
- xglNoOpRenderbufferStorageEXT,
- xglNoOpGetRenderbufferParameterivEXT,
- xglNoOpIsFramebufferEXT,
+ xglNoOpPointParameteriNV,
+ xglNoOpPointParameterivNV,
+ xglNoOpActiveStencilFaceEXT,
+ 0, /* glBindVertexArrayAPPLE */
+ 0, /* glDeleteVertexArraysAPPLE */
+ 0, /* glGenVertexArraysAPPLE */
+ 0, /* glIsVertexArrayAPPLE */
+ 0, /* glGetProgramNamedParameterdvNV */
+ 0, /* glGetProgramNamedParameterfvNV */
+ 0, /* glProgramNamedParameter4dNV */
+ 0, /* glProgramNamedParameter4fNV */
+ 0, /* glProgramNamedParameter4dvNV */
+ 0, /* glProgramNamedParameter4fvNV */
+ 0, /* glDepthBoundsEXT */
+ 0, /* glBlendEquationSeparateEXT */
xglNoOpBindFramebufferEXT,
- xglNoOpDeleteFramebuffersEXT,
- xglNoOpGenFramebuffersEXT,
+ xglNoOpBindRenderbufferEXT,
xglNoOpCheckFramebufferStatusEXT,
+ xglNoOpDeleteFramebuffersEXT,
+ xglNoOpDeleteRenderbuffersEXT,
+ xglNoOpFramebufferRenderbufferEXT,
xglNoOpFramebufferTexture1DEXT,
xglNoOpFramebufferTexture2DEXT,
xglNoOpFramebufferTexture3DEXT,
- xglNoOpFramebufferRenderbufferEXT,
- xglNoOpGetFramebufferAttachmentParameterivEXT,
+ xglNoOpGenFramebuffersEXT,
+ xglNoOpGenRenderbuffersEXT,
xglNoOpGenerateMipmapEXT,
- 0, /* glStencilFuncSeparate */
- 0, /* glStencilOpSeparate */
- 0, /* glStencilMaskSeparate */
+ xglNoOpGetFramebufferAttachmentParameterivEXT,
+ xglNoOpGetRenderbufferParameterivEXT,
+ xglNoOpIsFramebufferEXT,
+ xglNoOpIsRenderbufferEXT,
+ xglNoOpRenderbufferStorageEXT,
+ 0, /* glBlitFramebufferEXT */
+ 0, /* glProgramEnvParameters4fvEXT */
+ 0, /* glProgramLocalParameters4fvEXT */
0, /* glGetQueryObjecti64vEXT */
0 /* glGetQueryObjectui64vEXT */
};
@@ -4163,14 +4784,6 @@ xglInitExtensions (xglGLContextPtr pContext)
"glSampleCoverageARB");
}
- if (strstr (extensions, "GL_EXT_texture_object"))
- {
- pContext->glRenderTable.AreTexturesResidentEXT =
- xglAreTexturesResident;
- pContext->glRenderTable.GenTexturesEXT = xglGenTextures;
- pContext->glRenderTable.IsTextureEXT = xglIsTexture;
- }
-
if (strstr (extensions, "GL_SGIS_multisample"))
{
pContext->glRenderTable.SampleMaskSGIS =
@@ -4195,14 +4808,23 @@ xglInitExtensions (xglGLContextPtr pContext)
"glPointParameterfvEXT");
}
- if (strstr (extensions, "GL_MESA_window_pos"))
+ if (strstr (extensions, "GL_ARB_window_pos"))
+ {
+ pContext->WindowPos3fMESA =
+ (PFNGLWINDOWPOS3FMESAPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glWindowPos3fARB");
+
+ pContext->glRenderTable.WindowPos3fvMESA = xglWindowPos3fvMESA;
+ }
+ else if (strstr (extensions, "GL_MESA_window_pos"))
{
pContext->WindowPos3fMESA =
(PFNGLWINDOWPOS3FMESAPROC)
glitz_context_get_proc_address (pContext->context,
"glWindowPos3fMESA");
- pContext->glRenderTable.WindowPos3fMESA = xglWindowPos3fMESA;
+ pContext->glRenderTable.WindowPos3fvMESA = xglWindowPos3fvMESA;
}
if (strstr (extensions, "GL_EXT_blend_func_separate"))
@@ -4289,21 +4911,194 @@ xglInitExtensions (xglGLContextPtr pContext)
"glActiveStencilFaceEXT");
}
+ if (strstr (extensions, "GL_ARB_vertex_program"))
+ {
+ pContext->BindProgramARB =
+ (PFNGLBINDPROGRAMARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glBindProgramARB");
+ pContext->DeleteProgramsARB =
+ (PFNGLDELETEPROGRAMSARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glDeleteProgramsARB");
+ pContext->GenProgramsARB =
+ (PFNGLGENPROGRAMSARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGenProgramsARB");
+ pContext->glRenderTable.GetProgramivARB =
+ (PFNGLGETPROGRAMIVPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramivARB");
+ pContext->glRenderTable.GetVertexAttribdvARB =
+ (PFNGLGETVERTEXATTRIBDVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetVertexAttribdvARB");
+ pContext->glRenderTable.GetVertexAttribfvARB =
+ (PFNGLGETVERTEXATTRIBFVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetVertexAttribfvARB");
+ pContext->glRenderTable.GetVertexAttribivARB =
+ (PFNGLGETVERTEXATTRIBIVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetVertexAttribivARB");
+ pContext->IsProgramARB =
+ (PFNGLISPROGRAMARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glIsProgramARB");
+ pContext->glRenderTable.ProgramEnvParameter4fvARB =
+ (PFNGLPROGRAMENVPARAMETER4FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glProgramEnvParameter4fvARB");
+ pContext->glRenderTable.ProgramEnvParameter4dvARB =
+ (PFNGLPROGRAMENVPARAMETER4DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glProgramEnvParameter4dvARB");
+ pContext->glRenderTable.VertexAttrib1svARB =
+ (PFNGLVERTEXATTRIB1SVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib1svARB");
+ pContext->glRenderTable.VertexAttrib2svARB =
+ (PFNGLVERTEXATTRIB2SVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib2svARB");
+ pContext->glRenderTable.VertexAttrib3svARB =
+ (PFNGLVERTEXATTRIB3SVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib3svARB");
+ pContext->glRenderTable.VertexAttrib4svARB =
+ (PFNGLVERTEXATTRIB4SVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4svARB");
+ pContext->glRenderTable.VertexAttrib1fvARB =
+ (PFNGLVERTEXATTRIB1FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib1fvARB");
+ pContext->glRenderTable.VertexAttrib2fvARB =
+ (PFNGLVERTEXATTRIB2FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib2fvARB");
+ pContext->glRenderTable.VertexAttrib3fvARB =
+ (PFNGLVERTEXATTRIB3FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib3fvARB");
+ pContext->glRenderTable.VertexAttrib4fvARB =
+ (PFNGLVERTEXATTRIB4FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4fvARB");
+ pContext->glRenderTable.VertexAttrib1dvARB =
+ (PFNGLVERTEXATTRIB1DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib1dvARB");
+ pContext->glRenderTable.VertexAttrib2dvARB =
+ (PFNGLVERTEXATTRIB2DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib2dvARB");
+ pContext->glRenderTable.VertexAttrib3dvARB =
+ (PFNGLVERTEXATTRIB3DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib3dvARB");
+ pContext->glRenderTable.VertexAttrib4dvARB =
+ (PFNGLVERTEXATTRIB4DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4dvARB");
+ pContext->glRenderTable.VertexAttrib4NubvARB =
+ (PFNGLVERTEXATTRIB4NUBVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NubvARB");
+ pContext->glRenderTable.ProgramLocalParameter4fvARB =
+ (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glProgramLocalParameter4fvARB");
+ pContext->glRenderTable.ProgramLocalParameter4dvARB =
+ (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glProgramLocalParameter4dvARB");
+ pContext->glRenderTable.GetProgramEnvParameterdvARB =
+ (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramEnvParameterdvARB");
+ pContext->glRenderTable.GetProgramEnvParameterfvARB =
+ (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramEnvParameterfvARB");
+ pContext->glRenderTable.GetProgramLocalParameterdvARB =
+ (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramLocalParameterdvARB");
+ pContext->glRenderTable.GetProgramLocalParameterfvARB =
+ (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramLocalParameterfvARB");
+ pContext->glRenderTable.ProgramStringARB =
+ (PFNGLPROGRAMSTRINGARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glProgramStringARB");
+ pContext->glRenderTable.GetProgramStringARB =
+ (PFNGLGETPROGRAMSTRINGARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glGetProgramStringARB");
+ pContext->glRenderTable.VertexAttrib4bvARB =
+ (PFNGLVERTEXATTRIB4BVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4bvARB");
+ pContext->glRenderTable.VertexAttrib4ivARB =
+ (PFNGLVERTEXATTRIB4IVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4ivARB");
+ pContext->glRenderTable.VertexAttrib4ubvARB =
+ (PFNGLVERTEXATTRIB4UBVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4ubvARB");
+ pContext->glRenderTable.VertexAttrib4usvARB =
+ (PFNGLVERTEXATTRIB4USVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4usvARB");
+ pContext->glRenderTable.VertexAttrib4uivARB =
+ (PFNGLVERTEXATTRIB4UIVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4uivARB");
+ pContext->glRenderTable.VertexAttrib4NbvARB =
+ (PFNGLVERTEXATTRIB4NBVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NbvARB");
+ pContext->glRenderTable.VertexAttrib4NsvARB =
+ (PFNGLVERTEXATTRIB4NSVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NsvARB");
+ pContext->glRenderTable.VertexAttrib4NivARB =
+ (PFNGLVERTEXATTRIB4NIVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NivARB");
+ pContext->glRenderTable.VertexAttrib4NusvARB =
+ (PFNGLVERTEXATTRIB4NUSVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NusvARB");
+ pContext->glRenderTable.VertexAttrib4NuivARB =
+ (PFNGLVERTEXATTRIB4NUIVARBPROC)
+ glitz_context_get_proc_address (pContext->context,
+ "glVertexAttrib4NuivARB");
+
+ pContext->glRenderTable.IsProgramNV = xglIsProgramARB;
+ pContext->glRenderTable.BindProgramNV = xglBindProgramARB;
+ pContext->glRenderTable.DeleteProgramsNV = xglDeleteProgramsARB;
+ pContext->glRenderTable.GenProgramsNV = xglGenProgramsARB;
+ }
+
if (strstr (extensions, "GL_EXT_framebuffer_object"))
{
- pContext->glRenderTable.IsRenderbufferEXT =
+ pContext->IsRenderbufferEXT =
(PFNGLISRENDERBUFFEREXTPROC)
glitz_context_get_proc_address (pContext->context,
"glIsRenderbufferEXT");
- pContext->glRenderTable.BindRenderbufferEXT =
+ pContext->BindRenderbufferEXT =
(PFNGLBINDRENDERBUFFEREXTPROC)
glitz_context_get_proc_address (pContext->context,
"glBindRenderbufferEXT");
- pContext->glRenderTable.DeleteRenderbuffersEXT =
+ pContext->DeleteRenderbuffersEXT =
(PFNGLDELETERENDERBUFFERSEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glDeleteRenderbuffersEXT");
- pContext->glRenderTable.GenRenderbuffersEXT =
+ pContext->GenRenderbuffersEXT =
(PFNGLGENRENDERBUFFERSEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glGenRenderbuffersEXT");
@@ -4315,19 +5110,19 @@ xglInitExtensions (xglGLContextPtr pContext)
(PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glGetRenderbufferParameterivEXT");
- pContext->glRenderTable.IsFramebufferEXT =
+ pContext->IsFramebufferEXT =
(PFNGLISFRAMEBUFFEREXTPROC)
glitz_context_get_proc_address (pContext->context,
"glIsFramebufferEXT");
- pContext->glRenderTable.BindFramebufferEXT =
+ pContext->BindFramebufferEXT =
(PFNGLBINDFRAMEBUFFEREXTPROC)
glitz_context_get_proc_address (pContext->context,
"glBindFramebufferEXT");
- pContext->glRenderTable.DeleteFramebuffersEXT =
+ pContext->DeleteFramebuffersEXT =
(PFNGLDELETEFRAMEBUFFERSEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glDeleteFramebuffersEXT");
- pContext->glRenderTable.GenFramebuffersEXT =
+ pContext->GenFramebuffersEXT =
(PFNGLGENFRAMEBUFFERSEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glGenFramebuffersEXT");
@@ -4335,32 +5130,549 @@ xglInitExtensions (xglGLContextPtr pContext)
(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glCheckFramebufferStatusEXT");
- pContext->glRenderTable.FramebufferTexture1DEXT =
+ pContext->FramebufferTexture1DEXT =
(PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glFramebufferTexture1DEXT");
- pContext->glRenderTable.FramebufferTexture2DEXT =
+ pContext->FramebufferTexture2DEXT =
(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glFramebufferTexture2DEXT");
- pContext->glRenderTable.FramebufferTexture3DEXT =
+ pContext->FramebufferTexture3DEXT =
(PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glFramebufferTexture3DEXT");
- pContext->glRenderTable.FramebufferRenderbufferEXT =
+ pContext->FramebufferRenderbufferEXT =
(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
glitz_context_get_proc_address (pContext->context,
"glFramebufferRenderbufferEXT");
- pContext->glRenderTable.GetFramebufferAttachmentParameterivEXT =
+ pContext->GetFramebufferAttachmentParameterivEXT =
(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glGetFramebufferAttachment"
"ParameterivEXT");
- pContext->glRenderTable.GenerateMipmapEXT =
+ pContext->GenerateMipmapEXT =
(PFNGLGENERATEMIPMAPEXTPROC)
glitz_context_get_proc_address (pContext->context,
"glGenerateMipmapEXT");
+
+ pContext->glRenderTable.IsRenderbufferEXT = xglIsRenderbufferEXT;
+ pContext->glRenderTable.BindRenderbufferEXT = xglBindRenderbufferEXT;
+ pContext->glRenderTable.DeleteRenderbuffersEXT =
+ xglDeleteRenderbuffersEXT;
+ pContext->glRenderTable.GenRenderbuffersEXT = xglGenRenderbuffersEXT;
+ pContext->glRenderTable.IsFramebufferEXT = xglIsFramebufferEXT;
+ pContext->glRenderTable.BindFramebufferEXT = xglBindFramebufferEXT;
+ pContext->glRenderTable.DeleteFramebuffersEXT = xglDeleteFramebuffersEXT;
+ pContext->glRenderTable.GenFramebuffersEXT = xglGenFramebuffersEXT;
+ pContext->glRenderTable.FramebufferTexture1DEXT =
+ xglFramebufferTexture1DEXT;
+ pContext->glRenderTable.FramebufferTexture2DEXT =
+ xglFramebufferTexture2DEXT;
+ pContext->glRenderTable.FramebufferTexture3DEXT =
+ xglFramebufferTexture3DEXT;
+ pContext->glRenderTable.FramebufferRenderbufferEXT =
+ xglFramebufferRenderbufferEXT;
+ pContext->glRenderTable.GetFramebufferAttachmentParameterivEXT =
+ xglGetFramebufferAttachmentParameterivEXT;
+ pContext->glRenderTable.GenerateMipmapEXT = xglGenerateMipmapEXT;
+ }
+}
+
+static GLboolean
+xglResizeBuffer (xglGLBufferPtr pBufferPriv)
+{
+ DrawablePtr pDrawable = pBufferPriv->pDrawable;
+
+ XGL_SCREEN_PRIV (pDrawable->pScreen);
+ XGL_DRAWABLE_PIXMAP (pBufferPriv->pDrawable);
+
+ if (pPixmap != pScreenPriv->pScreenPixmap)
+ {
+ if (!xglCreatePixmapSurface (pPixmap))
+ return FALSE;
+
+ if (pBufferPriv->drawable == pScreenPriv->drawable)
+ {
+ if (pBufferPriv->backSurface)
+ glitz_surface_destroy (pBufferPriv->backSurface);
+
+ glitz_drawable_destroy (pBufferPriv->drawable);
+
+ pBufferPriv->drawable = NULL;
+ pBufferPriv->backSurface = NULL;
+ }
+
+ if (pBufferPriv->drawable)
+ {
+ glitz_drawable_update_size (pBufferPriv->drawable,
+ pPixmap->drawable.width,
+ pPixmap->drawable.height);
+ }
+ else
+ {
+ glitz_drawable_format_t *format;
+
+ format = pBufferPriv->pVisual->format.drawable;
+ if (pBufferPriv->pVisual->pbuffer)
+ {
+ pBufferPriv->drawable =
+ glitz_create_pbuffer_drawable (pScreenPriv->drawable,
+ format,
+ pPixmap->drawable.width,
+ pPixmap->drawable.height);
+ }
+ else
+ {
+ pBufferPriv->drawable =
+ glitz_create_drawable (pScreenPriv->drawable, format,
+ pPixmap->drawable.width,
+ pPixmap->drawable.height);
+
+ if (!pBufferPriv->drawable)
+ return FALSE;
+
+ if (format->doublebuffer)
+ {
+ glitz_format_t *backFormat;
+
+ backFormat = pBufferPriv->pVisual->format.surface;
+
+ pBufferPriv->backSurface =
+ glitz_surface_create (pScreenPriv->drawable, backFormat,
+ pPixmap->drawable.width,
+ pPixmap->drawable.height,
+ 0, NULL);
+ if (pBufferPriv->backSurface)
+ glitz_surface_attach (pBufferPriv->backSurface,
+ pBufferPriv->drawable,
+ GLITZ_DRAWABLE_BUFFER_BACK_COLOR);
+ }
+ }
+ }
+ }
+ else
+ {
+ glitz_drawable_reference (pScreenPriv->drawable);
+
+ if (pBufferPriv->backSurface)
+ glitz_surface_destroy (pBufferPriv->backSurface);
+
+ if (pBufferPriv->drawable)
+ glitz_drawable_destroy (pBufferPriv->drawable);
+
+ pBufferPriv->drawable = pScreenPriv->drawable;
+ pBufferPriv->backSurface = NULL;
+ }
+
+ ValidateGC (pDrawable, pBufferPriv->pGC);
+
+ return TRUE;
+}
+
+static GLboolean
+xglSwapBuffers (__GLXdrawable *drawable)
+{
+ xglGLBufferPtr pBufferPriv = (xglGLBufferPtr) drawable;
+ __GLXdrawable *mesaDrawable = pBufferPriv->mesaDrawable;
+ DrawablePtr pDrawable = pBufferPriv->pDrawable;
+ GLboolean status = GL_TRUE;
+
+ if (pDrawable)
+ {
+ glitz_surface_t *surface;
+ int xOff, yOff;
+ GCPtr pGC = pBufferPriv->pGC;
+ BoxPtr pBox = REGION_RECTS (pGC->pCompositeClip);
+ int nBox = REGION_NUM_RECTS (pGC->pCompositeClip);
+
+ XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
+
+ glitz_drawable_swap_buffer_region (pBufferPriv->drawable,
+ xOff, yOff,
+ (glitz_box_t *) pBox, nBox);
+
+ xglAddBitDamage (pDrawable, pGC->pCompositeClip);
+ DamageDamageRegion (pDrawable, pGC->pCompositeClip);
+ REGION_EMPTY (pGC->pScreen, &pBufferPriv->damage);
+ }
+ else if (mesaDrawable)
+ {
+ status = (*mesaDrawable->swapBuffers) (mesaDrawable);
+ }
+
+ return status;
+}
+
+static void
+xglCopySubBuffer (__GLXdrawable *drawable,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ xglGLBufferPtr pBufferPriv = (xglGLBufferPtr) drawable;
+ __GLXdrawable *mesaDrawable = pBufferPriv->mesaDrawable;
+ DrawablePtr pDrawable = pBufferPriv->pDrawable;
+
+ if (pDrawable)
+ {
+ glitz_surface_t *surface;
+ int xOff, yOff;
+ GCPtr pGC = pBufferPriv->pGC;
+ RegionRec region;
+ BoxRec box;
+
+ XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
+
+ box.x1 = pDrawable->x + x;
+ box.y2 = pDrawable->height - y;
+ box.x2 = box.x1 + width;
+ box.y1 = box.y2 - height;
+
+ REGION_INIT (pGC->pScreen, &region, &box, 1);
+ REGION_INTERSECT (pDrawable->pScreen, &region,
+ pGC->pCompositeClip, &region);
+
+ glitz_drawable_swap_buffer_region (pBufferPriv->drawable,
+ xOff, yOff, (glitz_box_t *)
+ REGION_RECTS (&region),
+ REGION_NUM_RECTS (&region));
+
+ xglAddBitDamage (pDrawable, &region);
+ DamageDamageRegion (pDrawable, &region);
+ REGION_SUBTRACT (pGC->pScreen, &pBufferPriv->damage,
+ &pBufferPriv->damage, &region);
+
+ REGION_UNINIT (pGC->pScreen, &region);
+ }
+ else if (mesaDrawable)
+ {
+ (*mesaDrawable->copySubBuffer) (mesaDrawable,
+ x, y, width, height);
+ }
+}
+
+static GLboolean
+xglResizeDrawable (__GLXdrawable *drawable)
+{
+ xglGLBufferPtr pBufferPriv = (xglGLBufferPtr) drawable;
+ __GLXdrawable *mesaDrawable = pBufferPriv->mesaDrawable;
+ DrawablePtr pDrawable = pBufferPriv->pDrawable;
+ GLboolean status = GL_TRUE;
+
+ if (pDrawable)
+ {
+ if (!xglResizeBuffer (pBufferPriv))
+ return GL_FALSE;
+ }
+ else if (mesaDrawable)
+ {
+ status = (*mesaDrawable->resize) (mesaDrawable);
+ }
+
+ return status;
+}
+
+static int
+xglBindTexImage (__GLXcontext *context,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
+
+ if (cctx)
+ {
+ xglTexUnitPtr pTexUnit = &cctx->attrib.texUnits[cctx->activeTexUnit];
+ ScreenPtr pScreen = pixmap->pDraw->pScreen;
+
+ XGL_SCREEN_PRIV (pScreen);
+ XGL_DRAWABLE_PIXMAP (pixmap->pDraw);
+
+ /* XXX: front left buffer is only supported so far */
+ if (buffer != GLX_FRONT_LEFT_EXT)
+ return BadMatch;
+
+ if (xglCreatePixmapSurface (pPixmap))
+ {
+ glitz_texture_object_t *texture;
+
+ XGL_PIXMAP_PRIV (pPixmap);
+
+ texture = glitz_texture_object_create (pPixmapPriv->surface);
+ if (texture)
+ {
+ xglTexObjPtr pTexObj;
+
+ switch (glitz_texture_object_get_target (texture)) {
+ case GLITZ_TEXTURE_TARGET_2D:
+ pTexObj = pTexUnit->p2D;
+ break;
+ case GLITZ_TEXTURE_TARGET_RECT:
+ pTexObj = pTexUnit->pRect;
+ break;
+ default:
+ pTexObj = NULL;
+ break;
+ }
+
+ if (pTexObj)
+ {
+ pPixmap->refcnt++;
+
+ if (pTexObj->pPixmap)
+ (*pScreen->DestroyPixmap) (pTexObj->pPixmap);
+
+ if (pTexObj->object)
+ glitz_texture_object_destroy (pTexObj->object);
+
+ pTexObj->pPixmap = pPixmap;
+ pTexObj->object = texture;
+ }
+ else
+ glitz_texture_object_destroy (texture);
+
+ return Success;
+ }
+ }
+ }
+ else
+ {
+ return (*mesaContext->textureFromPixmap->bindTexImage) (mesaContext,
+ buffer,
+ pixmap);
+ }
+
+ return BadDrawable;
+}
+
+static int
+xglReleaseTexImage (__GLXcontext *context,
+ int buffer,
+ __GLXdrawable *pixmap)
+{
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
+
+ if (cctx)
+ {
+ DrawablePtr pDrawable = pixmap->pDraw;
+ xglTexObjPtr pTexObj;
+
+ XGL_DRAWABLE_PIXMAP (pDrawable);
+
+ /* XXX: front left buffer is only supported so far */
+ if (buffer != GLX_FRONT_LEFT_EXT)
+ return BadMatch;
+
+ pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
+ if (pTexObj && pTexObj->pPixmap == pPixmap)
+ {
+ (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
+ pTexObj->pPixmap = NULL;
+ glitz_texture_object_destroy (pTexObj->object);
+ pTexObj->object = NULL;
+
+ return Success;
+ }
+ else
+ {
+ pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
+ if (pTexObj && pTexObj->pPixmap == pPixmap)
+ {
+ (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
+ pTexObj->pPixmap = NULL;
+ glitz_texture_object_destroy (pTexObj->object);
+ pTexObj->object = NULL;
+
+ return Success;
+ }
+ }
+ }
+ else
+ {
+ return (*mesaContext->textureFromPixmap->releaseTexImage) (mesaContext,
+ buffer,
+ pixmap);
+ }
+
+ return BadDrawable;
+}
+
+static __GLXtextureFromPixmap __xglTextureFromPixmapContext = {
+ xglBindTexImage,
+ xglReleaseTexImage
+};
+
+static void
+xglDestroyDrawable (__GLXdrawable *drawable)
+{
+ xglGLBufferPtr pBufferPriv = (xglGLBufferPtr) drawable;
+ __GLXdrawable *mesaDrawable = pBufferPriv->mesaDrawable;
+
+ if (mesaDrawable)
+ {
+ mesaDrawable->refCount--;
+ if (!mesaDrawable->refCount)
+ (*mesaDrawable->destroy) (mesaDrawable);
+ }
+
+ if (pBufferPriv->pGC)
+ FreeGC (pBufferPriv->pGC, (GContext) 0);
+
+ if (pBufferPriv->backSurface)
+ glitz_surface_destroy (pBufferPriv->backSurface);
+
+ if (pBufferPriv->drawable)
+ glitz_drawable_destroy (pBufferPriv->drawable);
+
+ xfree (pBufferPriv);
+}
+
+static __GLXdrawable *
+xglCreateDrawable (__GLXscreen *screen,
+ DrawablePtr pDrawable,
+ int type,
+ XID drawId,
+ __GLcontextModes *modes)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ xglGLScreenPtr pGLScreen = (xglGLScreenPtr) screen;
+ __GLXscreen *mesaScreen = pGLScreen->mesaScreen;
+ xglGLBufferPtr pBufferPriv;
+ xglVisualPtr v;
+ Bool useMesa;
+
+ XGL_SCREEN_PRIV (pScreen);
+ XGL_DRAWABLE_PIXMAP (pDrawable);
+
+ pBufferPriv = xalloc (sizeof (xglGLBufferRec));
+ if (!pBufferPriv)
+ return NULL;
+
+ memset (pBufferPriv, 0, sizeof (xglGLBufferRec));
+
+ if (!__glXDrawableInit (&pBufferPriv->base, screen, pDrawable, type, drawId, modes))
+ {
+ xfree (pBufferPriv);
+ return NULL;
+ }
+
+ pBufferPriv->mesaDrawable = NULL;
+
+ pBufferPriv->pScreen = pScreen;
+ pBufferPriv->pDrawable = NULL;
+ pBufferPriv->pPixmap = NULL;
+ pBufferPriv->pGC = NULL;
+
+ pBufferPriv->base.destroy = xglDestroyDrawable;
+ pBufferPriv->base.resize = xglResizeDrawable;
+ pBufferPriv->base.swapBuffers = xglSwapBuffers;
+ pBufferPriv->base.copySubBuffer = xglCopySubBuffer;
+
+ pBufferPriv->drawable = NULL;
+ pBufferPriv->backSurface = NULL;
+
+ REGION_INIT (pScreen, &pBufferPriv->damage, NullBox, 0);
+
+ pBufferPriv->pVisual = 0;
+
+ /* glx acceleration */
+ if (pScreenPriv->accel.glx.enabled &&
+ xglCheckPixmapSize (pPixmap, &pScreenPriv->accel.glx.size))
+ {
+ for (v = pScreenPriv->pGlxVisual; v; v = v->next)
+ {
+ glitz_drawable_format_t *format;
+
+ if (pScreenPriv->accel.glx.pbuffer != v->pbuffer)
+ continue;
+
+ format = v->format.drawable;
+ if (!format)
+ continue;
+
+ if (format->color.red_size != modes->redBits ||
+ format->color.green_size != modes->greenBits ||
+ format->color.blue_size != modes->blueBits)
+ continue;
+
+ if (format->color.alpha_size < modes->alphaBits ||
+ format->depth_size < modes->depthBits ||
+ format->stencil_size < modes->stencilBits ||
+ format->doublebuffer < modes->doubleBufferMode)
+ continue;
+
+ /* this is good enought for pbuffers */
+ if (v->pbuffer)
+ break;
+
+ /* we want an exact match for non-pbuffer formats */
+ if (format->color.alpha_size == modes->alphaBits &&
+ format->depth_size == modes->depthBits &&
+ format->stencil_size == modes->stencilBits &&
+ format->doublebuffer == modes->doubleBufferMode)
+ break;
+ }
+
+ pBufferPriv->pVisual = v;
+ }
+
+ useMesa = TRUE;
+
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ {
+
+#ifdef COMPOSITE
+ if (pBufferPriv->pVisual)
+ {
+ useMesa = FALSE;
+ }
+ else
+ {
+ WindowPtr pWin = (WindowPtr) pDrawable;
+
+ /* this is a root window, can't be redirected */
+ if (!pWin->parent)
+ {
+ useMesa = FALSE;
+ }
+ else
+ {
+ CompScreenPtr cs = GetCompScreen (pScreen);
+
+ /* allow native GL with overlay windows */
+ for (; pWin; pWin = pWin->parent)
+ {
+ if (pWin == cs->pOverlayWin)
+ {
+ useMesa = FALSE;
+ break;
+ }
+ }
+ }
+ }
+#else
+ useMesa = FALSE;
+#endif
+
+ }
+
+ if (useMesa)
+ {
+ pBufferPriv->mesaDrawable = (*mesaScreen->createDrawable) (mesaScreen,
+ pDrawable,
+ type,
+ drawId,
+ modes);
+ }
+ else
+ {
+ pBufferPriv->pDrawable = pDrawable;
}
+
+ return &pBufferPriv->base;
}
static void
@@ -4388,6 +5700,13 @@ xglFreeContext (xglGLContextPtr pContext)
if (pContext->shared != pContext)
xglFreeContext (pContext->shared);
+ if (pContext->context)
+ {
+ XGL_SCREEN_PRIV (pContext->base.pScreen);
+
+ glitz_context_make_current (pContext->context, pScreenPriv->drawable);
+ }
+
if (pContext->texObjects)
{
xglTexObjPtr pTexObj;
@@ -4409,6 +5728,68 @@ xglFreeContext (xglGLContextPtr pContext)
xglDeleteHashTable (pContext->texObjects);
}
+ if (pContext->programObjects)
+ {
+ GLuint po;
+ GLuint key;
+
+ do {
+ key = xglHashFirstEntry (pContext->programObjects);
+ if (key)
+ {
+ po = (GLuint) xglHashLookup (pContext->programObjects, key);
+ if (po)
+ (*pContext->DeleteProgramsARB) (1, &po);
+
+ xglHashRemove (pContext->programObjects, key);
+ }
+ } while (key);
+
+ xglDeleteHashTable (pContext->programObjects);
+ }
+
+ if (pContext->renderbufferObjects)
+ {
+ GLuint rbo;
+ GLuint key;
+
+ do {
+ key = xglHashFirstEntry (pContext->renderbufferObjects);
+ if (key)
+ {
+ rbo = (GLuint) xglHashLookup (pContext->renderbufferObjects,
+ key);
+ if (rbo)
+ (*pContext->DeleteRenderbuffersEXT) (1, &rbo);
+
+ xglHashRemove (pContext->renderbufferObjects, key);
+ }
+ } while (key);
+
+ xglDeleteHashTable (pContext->renderbufferObjects);
+ }
+
+ if (pContext->framebufferObjects)
+ {
+ GLuint fbo;
+ GLuint key;
+
+ do {
+ key = xglHashFirstEntry (pContext->framebufferObjects);
+ if (key)
+ {
+ fbo = (GLuint) xglHashLookup (pContext->framebufferObjects,
+ key);
+ if (fbo)
+ (*pContext->DeleteFramebuffersEXT) (1, &fbo);
+
+ xglHashRemove (pContext->framebufferObjects, key);
+ }
+ } while (key);
+
+ xglDeleteHashTable (pContext->framebufferObjects);
+ }
+
if (pContext->displayLists)
{
xglDisplayListPtr pDisplayList;
@@ -4451,46 +5832,41 @@ xglFreeContext (xglGLContextPtr pContext)
xfree (pContext);
}
-static GLboolean
-xglDestroyContext (__GLcontext *gc)
+static void
+xglDestroyContext (__GLXcontext *context)
{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
xglFreeContext (pContext);
- if (!iface)
- return GL_TRUE;
-
- return (*iface->exports.destroyContext) ((__GLcontext *) iface);
+ if (mesaContext)
+ (*mesaContext->destroy) (mesaContext);
}
-static GLboolean
-xglLoseCurrent (__GLcontext *gc)
+static int
+xglLoseCurrent (__GLXcontext *context)
{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
- GlxFlushContextCache ();
+ __glXFlushContextCache ();
GlxSetRenderTables (0);
- if (!iface)
- return GL_TRUE;
+ if (!mesaContext)
+ return TRUE;
- return (*iface->exports.loseCurrent) ((__GLcontext *) iface);
+ return (*mesaContext->loseCurrent) (mesaContext);
}
-static GLboolean
-xglMakeCurrent (__GLcontext *gc)
+static int
+xglMakeCurrent (__GLXcontext *context)
{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = &pContext->iface;
- __GLinterface *mIface = pContext->mIface;
- __GLdrawablePrivate *drawPriv = iface->imports.getDrawablePrivate (gc);
- __GLdrawablePrivate *readPriv = iface->imports.getReadablePrivate (gc);
- xglGLBufferPtr pDrawBufferPriv = drawPriv->private;
- xglGLBufferPtr pReadBufferPriv = readPriv->private;
- GLboolean status = GL_TRUE;
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
+ xglGLBufferPtr pDrawBufferPriv = (xglGLBufferPtr) context->drawPriv;
+ xglGLBufferPtr pReadBufferPriv = (xglGLBufferPtr) context->readPriv;
+ int status = TRUE;
if (pReadBufferPriv->pDrawable && pDrawBufferPriv->pDrawable)
{
@@ -4508,11 +5884,11 @@ xglMakeCurrent (__GLcontext *gc)
/* this happens if client previously used this context with a buffer
not supported by the native GL stack */
if (!pContext->context)
- return GL_FALSE;
+ return FALSE;
/* XXX: GLX_SGI_make_current_read disabled for now */
if (pDrawBufferPriv != pReadBufferPriv)
- return GL_FALSE;
+ return FALSE;
if (!pReadBufferPriv->pGC)
pReadBufferPriv->pGC =
@@ -4536,30 +5912,24 @@ xglMakeCurrent (__GLcontext *gc)
pContext->pReadBuffer = pReadBufferPriv;
pContext->pDrawBuffer = pDrawBufferPriv;
- pContext->readPriv = readPriv;
- pContext->drawPriv = drawPriv;
-
/* from now on this context can only be used with native GL stack */
- if (mIface)
+ if (mesaContext)
{
- (*mIface->exports.destroyContext) ((__GLcontext *) mIface);
- pContext->mIface = NULL;
+ (*mesaContext->destroy) (mesaContext);
+ pContext->mesaContext = NULL;
}
}
else
{
/* this happens if client previously used this context with a buffer
supported by the native GL stack */
- if (!mIface)
+ if (!mesaContext)
return GL_FALSE;
- drawPriv->private = pDrawBufferPriv->private;
- readPriv->private = pReadBufferPriv->private;
-
- status = (*mIface->exports.makeCurrent) ((__GLcontext *) mIface);
+ mesaContext->drawPriv = pDrawBufferPriv->mesaDrawable;
+ mesaContext->readPriv = pDrawBufferPriv->mesaDrawable;
- drawPriv->private = pDrawBufferPriv;
- readPriv->private = pReadBufferPriv;
+ status = (*mesaContext->makeCurrent) (mesaContext);
/* from now on this context can not be used with native GL stack */
if (status == GL_TRUE && pContext->context)
@@ -4572,160 +5942,37 @@ xglMakeCurrent (__GLcontext *gc)
return status;
}
-static GLboolean
-xglShareContext (__GLcontext *gc,
- __GLcontext *gcShare)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- xglGLContextPtr pContextShare = (xglGLContextPtr) gcShare;
- __GLinterface *iface = pContext->mIface;
- __GLinterface *ifaceShare = pContextShare->mIface;
-
- if (!iface || !ifaceShare)
- return GL_TRUE;
-
- return (*iface->exports.shareContext) ((__GLcontext *) iface,
- (__GLcontext *) ifaceShare);
-}
-
-static GLboolean
-xglCopyContext (__GLcontext *dst,
- const __GLcontext *src,
- GLuint mask)
+static int
+xglCopyContext (__GLXcontext *dst,
+ __GLXcontext *src,
+ unsigned long mask)
{
- xglGLContextPtr pDst = (xglGLContextPtr) dst;
- xglGLContextPtr pSrc = (xglGLContextPtr) src;
- const __GLcontext *srcCtx = (const __GLcontext *) pSrc->mIface;
- __GLinterface *dstIface = (__GLinterface *) pDst->mIface;
- GLboolean status = GL_TRUE;
+ xglGLContextPtr pDst = (xglGLContextPtr) dst;
+ xglGLContextPtr pSrc = (xglGLContextPtr) src;
+ __GLXcontext *mesaDst = pDst->mesaContext;
+ __GLXcontext *mesaSrc = pSrc->mesaContext;
+ int status = TRUE;
if (pSrc->context && pDst->context)
glitz_context_copy (pSrc->context, pDst->context, mask);
else
- status = GL_FALSE;
+ status = FALSE;
- if (dstIface && srcCtx)
- status = (*dstIface->exports.copyContext) ((__GLcontext *) dstIface,
- srcCtx,
- mask);
+ if (mesaDst && mesaSrc)
+ status = (*mesaDst->copy) (mesaDst, mesaSrc, mask);
return status;
}
-static Bool
-xglResizeBuffer (__GLdrawablePrivate *glPriv,
- int x,
- int y,
- unsigned int width,
- unsigned int height)
-{
- xglGLBufferPtr pBufferPriv = glPriv->private;
- DrawablePtr pDrawable = pBufferPriv->pDrawable;
-
- XGL_SCREEN_PRIV (pDrawable->pScreen);
- XGL_DRAWABLE_PIXMAP (pBufferPriv->pDrawable);
-
- if (pPixmap != pScreenPriv->pScreenPixmap)
- {
- if (!xglCreatePixmapSurface (pPixmap))
- return FALSE;
-
- if (pBufferPriv->drawable == pScreenPriv->drawable)
- {
- if (pBufferPriv->backSurface)
- glitz_surface_destroy (pBufferPriv->backSurface);
-
- glitz_drawable_destroy (pBufferPriv->drawable);
-
- pBufferPriv->drawable = NULL;
- pBufferPriv->backSurface = NULL;
- }
-
- if (pBufferPriv->drawable)
- {
- glitz_drawable_update_size (pBufferPriv->drawable,
- pPixmap->drawable.width,
- pPixmap->drawable.height);
- }
- else
- {
- glitz_drawable_format_t *format;
-
- format = pBufferPriv->pVisual->format.drawable;
- if (pBufferPriv->pVisual->pbuffer)
- {
- pBufferPriv->drawable =
- glitz_create_pbuffer_drawable (pScreenPriv->drawable,
- format,
- pPixmap->drawable.width,
- pPixmap->drawable.height);
- }
- else
- {
- pBufferPriv->drawable =
- glitz_create_drawable (pScreenPriv->drawable, format,
- pPixmap->drawable.width,
- pPixmap->drawable.height);
-
- if (!pBufferPriv->drawable)
- return FALSE;
-
- if (format->doublebuffer)
- {
- glitz_format_t *backFormat;
-
- backFormat = pBufferPriv->pVisual->format.surface;
-
- pBufferPriv->backSurface =
- glitz_surface_create (pScreenPriv->drawable, backFormat,
- pPixmap->drawable.width,
- pPixmap->drawable.height,
- 0, NULL);
- if (pBufferPriv->backSurface)
- glitz_surface_attach (pBufferPriv->backSurface,
- pBufferPriv->drawable,
- GLITZ_DRAWABLE_BUFFER_BACK_COLOR);
- }
- }
- }
- }
- else
- {
- glitz_drawable_reference (pScreenPriv->drawable);
-
- if (pBufferPriv->backSurface)
- glitz_surface_destroy (pBufferPriv->backSurface);
-
- if (pBufferPriv->drawable)
- glitz_drawable_destroy (pBufferPriv->drawable);
-
- pBufferPriv->drawable = pScreenPriv->drawable;
- pBufferPriv->backSurface = NULL;
- }
-
- ValidateGC (pDrawable, pBufferPriv->pGC);
-
- return TRUE;
-}
-
-static GLboolean
-xglForceCurrent (__GLcontext *gc)
+static int
+xglForceCurrent (__GLXcontext *context)
{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
- GLboolean status = GL_TRUE;
+ xglGLContextPtr pContext = (xglGLContextPtr) context;
+ __GLXcontext *mesaContext = pContext->mesaContext;
+ int status = TRUE;
if (pContext && pContext->context)
{
- __GLdrawablePrivate *readPriv, *drawPriv;
-
- readPriv = pContext->readPriv;
- drawPriv = pContext->drawPriv;
-
- drawPriv->lockDP (drawPriv, gc);
- if (readPriv != drawPriv)
- readPriv->lockDP (readPriv, gc);
-
cctx = pContext;
if (cctx->pReadBuffer->pDrawable && cctx->pDrawBuffer->pDrawable)
@@ -4780,44 +6027,18 @@ xglForceCurrent (__GLcontext *gc)
if (cctx->pDrawBuffer->pPixmap != pDrawPixmap ||
cctx->pReadBuffer->pPixmap != pReadPixmap)
{
- if (!xglResizeBuffer (drawPriv,
- pDrawable->x,
- pDrawable->y,
- pDrawable->width,
- pDrawable->height))
- {
- drawPriv->unlockDP (drawPriv);
- if (readPriv != drawPriv)
- readPriv->unlockDP (readPriv);
-
+ if (!xglResizeBuffer (cctx->pDrawBuffer))
return FALSE;
- }
-
- if (!xglResizeBuffer (readPriv,
- cctx->pReadBuffer->pDrawable->x,
- cctx->pReadBuffer->pDrawable->y,
- cctx->pReadBuffer->pDrawable->width,
- cctx->pReadBuffer->pDrawable->height))
- {
- drawPriv->unlockDP (drawPriv);
- if (readPriv != drawPriv)
- readPriv->unlockDP (readPriv);
+ if (!xglResizeBuffer (cctx->pReadBuffer))
return FALSE;
- }
cctx->pReadBuffer->pPixmap = pReadPixmap;
cctx->pDrawBuffer->pPixmap = pDrawPixmap;
}
if (!xglSyncSurface (pContext->pDrawBuffer->pDrawable))
- {
- drawPriv->unlockDP (drawPriv);
- if (readPriv != drawPriv)
- readPriv->unlockDP (readPriv);
-
return FALSE;
- }
if (pDrawPixmap != pScreenPriv->pScreenPixmap)
{
@@ -4871,112 +6092,42 @@ xglForceCurrent (__GLcontext *gc)
cctx->needInit = FALSE;
}
- /* update viewport and raster position */
- if (cctx->pDrawBuffer->xOff != cctx->drawXoff ||
- cctx->pDrawBuffer->yOff != cctx->drawYoff)
+ if (cctx->framebuffer)
{
- glViewport (cctx->attrib.viewport.x + cctx->pDrawBuffer->xOff,
- cctx->attrib.viewport.y + cctx->pDrawBuffer->yOff,
- cctx->attrib.viewport.width,
- cctx->attrib.viewport.height);
-
- glBitmap (0, 0, 0, 0,
- cctx->pDrawBuffer->xOff - cctx->drawXoff,
- cctx->pDrawBuffer->yOff - cctx->drawYoff,
- NULL);
-
- cctx->drawXoff = cctx->pDrawBuffer->xOff;
- cctx->drawYoff = cctx->pDrawBuffer->yOff;
+ GLuint fbo;
+
+ fbo = (GLuint)
+ xglHashLookup (cctx->shared->framebufferObjects,
+ cctx->framebuffer);
+ if (fbo)
+ (*cctx->BindFramebufferEXT) (GL_FRAMEBUFFER_EXT, fbo);
}
+ else
+ {
+ xglSetDrawOffset (cctx->pDrawBuffer->xOff,
+ cctx->pDrawBuffer->yOff);
+
+ cctx->readXoff = cctx->pReadBuffer->xOff;
+ cctx->readYoff = cctx->pReadBuffer->yOff;
- xglDrawBuffer (cctx->attrib.drawBuffer);
- xglReadBuffer (cctx->attrib.readBuffer);
+ xglDrawBuffer (cctx->attrib.drawBuffer);
+ xglReadBuffer (cctx->attrib.readBuffer);
+ }
}
else
{
xglSetCurrentContext (pContext);
}
-
- drawPriv->unlockDP (drawPriv);
- if (readPriv != drawPriv)
- readPriv->unlockDP (readPriv);
}
else
{
cctx = NULL;
- status = (*iface->exports.forceCurrent) ((__GLcontext *) iface);
+ status = (*mesaContext->forceCurrent) (mesaContext);
}
return status;
}
-static GLboolean
-xglNotifyResize (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- if (!iface)
- return GL_TRUE;
-
- return (*iface->exports.notifyResize) ((__GLcontext *) iface);
-}
-
-static void
-xglNotifyDestroy (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- pContext->pReadBuffer->pDrawable = 0;
- pContext->pDrawBuffer->pDrawable = 0;
-
- if (iface)
- (*iface->exports.notifyDestroy) ((__GLcontext *) iface);
-}
-
-static void
-xglNotifySwapBuffers (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- if (iface)
- (*iface->exports.notifySwapBuffers) ((__GLcontext *) iface);
-}
-
-static struct __GLdispatchStateRec *
-xglDispatchExec (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- if (!iface)
- return NULL;
-
- return (*iface->exports.dispatchExec) ((__GLcontext *) iface);
-}
-
-static void
-xglBeginDispatchOverride (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- if (iface)
- (*iface->exports.beginDispatchOverride) ((__GLcontext *) iface);
-}
-
-static void
-xglEndDispatchOverride (__GLcontext *gc)
-{
- xglGLContextPtr pContext = (xglGLContextPtr) gc;
- __GLinterface *iface = pContext->mIface;
-
- if (iface)
- (*iface->exports.endDispatchOverride) ((__GLcontext *) iface);
-}
-
static void
xglLoseCurrentContext (void *closure)
{
@@ -4984,29 +6135,35 @@ xglLoseCurrentContext (void *closure)
{
cctx = NULL;
- GlxFlushContextCache ();
+ /* make sure that all preceding drawing commands are finished
+ before switching context */
+ glFinish ();
+
+ __glXFlushContextCache ();
GlxSetRenderTables (0);
}
}
-static __GLinterface *
-xglCreateContext (__GLimports *imports,
+static __GLXcontext *
+xglCreateContext (__GLXscreen *screen,
__GLcontextModes *modes,
- __GLinterface *shareGC)
+ __GLXcontext *shareContext)
{
glitz_drawable_format_t *format;
- xglGLContextPtr pShareContext = (xglGLContextPtr) shareGC;
+ xglGLScreenPtr pGLScreen = (xglGLScreenPtr) screen;
+ __GLXscreen *mesaScreen = pGLScreen->mesaScreen;
+ xglGLContextPtr pShareContext = (xglGLContextPtr) shareContext;
xglGLContextPtr pContext;
- __GLinterface *shareIface = NULL;
- __GLinterface *iface;
- __GLXcontext *glxCtx = (__GLXcontext *) imports->other;
+ __GLXcontext *shareMesaContext = NULL;
- XGL_SCREEN_PRIV (glxCtx->pScreen);
+ XGL_SCREEN_PRIV (screen->pScreen);
pContext = xalloc (sizeof (xglGLContextRec));
if (!pContext)
return NULL;
+ memset (pContext, 0, sizeof (xglGLContextRec));
+
format = glitz_drawable_get_format (pScreenPriv->drawable);
pContext->context = glitz_context_create (pScreenPriv->drawable, format);
glitz_context_set_user_data (pContext->context, pContext,
@@ -5022,12 +6179,15 @@ xglCreateContext (__GLimports *imports,
pContext->beginCnt = 0;
pContext->nAttribStack = 0;
pContext->refcnt = 1;
- pContext->doubleBuffer = glxCtx->modes->doubleBufferMode;
- pContext->depthBits = glxCtx->modes->depthBits;
- pContext->stencilBits = glxCtx->modes->stencilBits;
+ pContext->doubleBuffer = modes->doubleBufferMode;
+ pContext->depthBits = modes->depthBits;
+ pContext->stencilBits = modes->stencilBits;
pContext->drawXoff = 0;
pContext->drawYoff = 0;
+ pContext->readXoff = 0;
+ pContext->readYoff = 0;
pContext->maxTexUnits = 0;
+ pContext->framebuffer = 0;
if (pContext->doubleBuffer)
{
@@ -5042,13 +6202,16 @@ xglCreateContext (__GLimports *imports,
pContext->attrib.scissorTest = GL_FALSE;
- if (shareGC)
+ if (shareContext)
{
- pContext->texObjects = NULL;
- pContext->displayLists = NULL;
+ pContext->texObjects = NULL;
+ pContext->programObjects = NULL;
+ pContext->renderbufferObjects = NULL;
+ pContext->framebufferObjects = NULL;
+ pContext->displayLists = NULL;
pContext->shared = pShareContext->shared;
- shareIface = pShareContext->mIface;
+ shareMesaContext = pShareContext->mesaContext;
}
else
{
@@ -5059,439 +6222,136 @@ xglCreateContext (__GLimports *imports,
return NULL;
}
- pContext->displayLists = xglNewHashTable ();
- if (!pContext->displayLists)
+ pContext->programObjects = xglNewHashTable ();
+ if (!pContext->programObjects)
{
xglFreeContext (pContext);
return NULL;
}
- pContext->shared = pContext;
- }
-
- pContext->shared->refcnt++;
-
- iface = (*screenInfoPriv.createContext) (imports, modes, shareIface);
- if (!iface)
- {
- xglFreeContext (pContext);
- return NULL;
- }
-
- pContext->mIface = iface;
- pContext->iface.imports = *imports;
-
- pContext->iface.exports.destroyContext = xglDestroyContext;
- pContext->iface.exports.loseCurrent = xglLoseCurrent;
- pContext->iface.exports.makeCurrent = xglMakeCurrent;
- pContext->iface.exports.shareContext = xglShareContext;
- pContext->iface.exports.copyContext = xglCopyContext;
- pContext->iface.exports.forceCurrent = xglForceCurrent;
- pContext->iface.exports.notifyResize = xglNotifyResize;
- pContext->iface.exports.notifyDestroy = xglNotifyDestroy;
- pContext->iface.exports.notifySwapBuffers = xglNotifySwapBuffers;
- pContext->iface.exports.dispatchExec = xglDispatchExec;
- pContext->iface.exports.beginDispatchOverride = xglBeginDispatchOverride;
- pContext->iface.exports.endDispatchOverride = xglEndDispatchOverride;
-
- return (__GLinterface *) pContext;
-}
-
-static GLboolean
-xglSwapBuffers (__GLXdrawablePrivate *glxPriv)
-{
- __GLdrawablePrivate *glPriv = &glxPriv->glPriv;
- xglGLBufferPtr pBufferPriv = glPriv->private;
- DrawablePtr pDrawable = pBufferPriv->pDrawable;
- GLboolean status = GL_TRUE;
-
- if (pDrawable)
- {
- if (glPriv->modes->doubleBufferMode)
+ pContext->renderbufferObjects = xglNewHashTable ();
+ if (!pContext->renderbufferObjects)
{
- glitz_surface_t *surface;
- int xOff, yOff;
- GCPtr pGC = pBufferPriv->pGC;
- BoxPtr pBox = REGION_RECTS (pGC->pCompositeClip);
- int nBox = REGION_NUM_RECTS (pGC->pCompositeClip);
-
- XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
-
- glitz_drawable_swap_buffer_region (pBufferPriv->drawable,
- xOff, yOff,
- (glitz_box_t *) pBox, nBox);
-
- xglAddBitDamage (pDrawable, pGC->pCompositeClip);
- DamageDamageRegion (pDrawable, pGC->pCompositeClip);
- REGION_EMPTY (pGC->pScreen, &pBufferPriv->damage);
+ xglFreeContext (pContext);
+ return NULL;
}
- }
- else if (pBufferPriv->private)
- {
- glPriv->private = pBufferPriv->private;
- status = (*pBufferPriv->swapBuffers) (glxPriv);
- glPriv->private = pBufferPriv;
- }
-
- return status;
-}
-
-static GLboolean
-xglResizeBuffers (__GLdrawableBuffer *buffer,
- GLint x,
- GLint y,
- GLuint width,
- GLuint height,
- __GLdrawablePrivate *glPriv,
- GLuint bufferMask)
-{
- xglGLBufferPtr pBufferPriv = glPriv->private;
- DrawablePtr pDrawable = pBufferPriv->pDrawable;
- GLboolean status = GL_TRUE;
- if (pDrawable)
- {
- if (!xglResizeBuffer (glPriv, x, y, width, height))
- return GL_FALSE;
- }
- else if (pBufferPriv->private)
- {
- glPriv->private = pBufferPriv->private;
- status = (*pBufferPriv->resizeBuffers) (buffer,
- x, y, width, height,
- glPriv,
- bufferMask);
- glPriv->private = pBufferPriv;
- }
-
- return status;
-}
-
-static int
-xglBindBuffers (__GLXdrawablePrivate *glxPriv,
- int buffer)
-{
- __GLdrawablePrivate *glPriv = &glxPriv->glPriv;
- xglGLBufferPtr pBufferPriv = glPriv->private;
-
- if (cctx)
- {
- xglTexUnitPtr pTexUnit = &cctx->attrib.texUnits[cctx->activeTexUnit];
- xglTexObjPtr pTexObj = NULL;
- DrawablePtr pDrawable;
-
- /* XXX: front left buffer is only supported so far */
- if (buffer != GLX_FRONT_LEFT_EXT)
- return BadMatch;
-
- /* Must be a GLXpixmap */
- if (!glxPriv->pGlxPixmap)
- return BadDrawable;
-
- pDrawable = glxPriv->pGlxPixmap->pDraw;
-
- switch (glxPriv->texTarget) {
- case GLX_TEXTURE_RECTANGLE_EXT:
- pTexObj = pTexUnit->pRect;
- break;
- case GLX_TEXTURE_2D_EXT:
- pTexObj = pTexUnit->p2D;
- break;
- default:
- break;
+ pContext->framebufferObjects = xglNewHashTable ();
+ if (!pContext->framebufferObjects)
+ {
+ xglFreeContext (pContext);
+ return NULL;
}
- if (pTexObj)
+ pContext->displayLists = xglNewHashTable ();
+ if (!pContext->displayLists)
{
- glitz_texture_object_t *object;
-
- XGL_SCREEN_PRIV (pDrawable->pScreen);
- XGL_DRAWABLE_PIXMAP (pDrawable);
- XGL_PIXMAP_PRIV (pPixmap);
-
- if (pPixmap == pScreenPriv->pScreenPixmap)
- return BadDrawable;
-
- object = glitz_texture_object_create (pPixmapPriv->surface);
- if (object)
- {
- pPixmap->refcnt++;
-
- if (pTexObj->pPixmap)
- (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
-
- if (pTexObj->object)
- glitz_texture_object_destroy (pTexObj->object);
-
- pTexObj->pPixmap = pPixmap;
- pTexObj->object = object;
-
- return Success;
- }
+ xglFreeContext (pContext);
+ return NULL;
}
- }
- else if (pBufferPriv->private)
- {
- int status;
- glPriv->private = pBufferPriv->private;
- status = (*pBufferPriv->bindBuffers) (glxPriv, buffer);
- glPriv->private = pBufferPriv;
-
- return status;
+ pContext->shared = pContext;
}
- return BadDrawable;
-}
-
-static int
-xglReleaseBuffers (__GLXdrawablePrivate *glxPriv,
- int buffer)
-{
- __GLdrawablePrivate *glPriv = &glxPriv->glPriv;
- xglGLBufferPtr pBufferPriv = glPriv->private;
-
- if (cctx)
- {
- xglTexObjPtr pTexObj;
-
- /* XXX: front left buffer is only supported so far */
- if (buffer != GLX_FRONT_LEFT_EXT)
- return BadMatch;
-
- /* Must be a GLXpixmap */
- if (glxPriv->pGlxPixmap)
- {
- DrawablePtr pDrawable = glxPriv->pGlxPixmap->pDraw;
+ pContext->shared->refcnt++;
- XGL_DRAWABLE_PIXMAP (pDrawable);
+ pContext->base.destroy = xglDestroyContext;
+ pContext->base.makeCurrent = xglMakeCurrent;
+ pContext->base.loseCurrent = xglLoseCurrent;
+ pContext->base.copy = xglCopyContext;
+ pContext->base.forceCurrent = xglForceCurrent;
- pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
- if (pTexObj && pTexObj->pPixmap == pPixmap)
- {
- (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
- pTexObj->pPixmap = NULL;
- glitz_texture_object_destroy (pTexObj->object);
- pTexObj->object = NULL;
+ pContext->base.textureFromPixmap = &__xglTextureFromPixmapContext;
- return Success;
- }
- else
- {
- pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
- if (pTexObj && pTexObj->pPixmap == pPixmap)
- {
- (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
- pTexObj->pPixmap = NULL;
- glitz_texture_object_destroy (pTexObj->object);
- pTexObj->object = NULL;
-
- return Success;
- }
- }
- }
- }
- else if (pBufferPriv->private)
+ pContext->mesaContext = (*mesaScreen->createContext) (mesaScreen,
+ modes,
+ shareMesaContext);
+ if (!pContext->mesaContext)
{
- int status;
-
- glPriv->private = pBufferPriv->private;
- status = (*pBufferPriv->releaseBuffers) (glxPriv, buffer);
- glPriv->private = pBufferPriv;
-
- return status;
+ xglFreeContext (pContext);
+ return NULL;
}
- return BadDrawable;
+ return &pContext->base;
}
+
static void
-xglFreeBuffers (__GLdrawablePrivate *glPriv)
+xglScreenDestroy (__GLXscreen *screen)
{
- xglGLBufferPtr pBufferPriv = glPriv->private;
-
- glPriv->private = pBufferPriv->private;
-
- if (pBufferPriv->freeBuffers)
- (*pBufferPriv->freeBuffers) (glPriv);
-
- if (pBufferPriv->pGC)
- FreeGC (pBufferPriv->pGC, (GContext) 0);
+ xglGLScreenPtr pScreen = (xglGLScreenPtr) screen;
+ __GLXscreen *mesaScreen = pScreen->mesaScreen;
- if (pBufferPriv->backSurface)
- glitz_surface_destroy (pBufferPriv->backSurface);
+ if (mesaScreen)
+ (*mesaScreen->destroy) (mesaScreen);
- if (pBufferPriv->drawable)
- glitz_drawable_destroy (pBufferPriv->drawable);
+ if (pScreen->GLXextensions)
+ xfree (pScreen->GLXextensions);
- xfree (pBufferPriv);
+ xfree (pScreen);
}
-static void
-xglCreateBuffer (__GLXdrawablePrivate *glxPriv)
+static __GLXscreen *
+xglScreenProbe (ScreenPtr pScreen)
{
- __GLdrawablePrivate *glPriv = &glxPriv->glPriv;
- DrawablePtr pDrawable = glxPriv->pDraw;
- ScreenPtr pScreen = pDrawable->pScreen;
- xglGLBufferPtr pBufferPriv;
- xglVisualPtr v;
+ xglGLScreenPtr screen;
+ __GLcontextModes *modes;
+ xglVisualPtr pVisual;
+ int i;
XGL_SCREEN_PRIV (pScreen);
- XGL_DRAWABLE_PIXMAP (pDrawable);
-
- pBufferPriv = xalloc (sizeof (xglGLBufferRec));
- if (!pBufferPriv)
- FatalError ("xglCreateBuffer: No memory\n");
-
- pBufferPriv->pScreen = pScreen;
- pBufferPriv->pDrawable = NULL;
- pBufferPriv->pPixmap = NULL;
- pBufferPriv->pGC = NULL;
-
- pBufferPriv->swapBuffers = NULL;
-
- pBufferPriv->bindBuffers = NULL;
- pBufferPriv->releaseBuffers = NULL;
-
- pBufferPriv->resizeBuffers = NULL;
- pBufferPriv->private = NULL;
- pBufferPriv->freeBuffers = NULL;
-
- pBufferPriv->drawable = NULL;
- pBufferPriv->backSurface = NULL;
-
- REGION_INIT (pScreen, &pBufferPriv->damage, NullBox, 0);
-
- pBufferPriv->pVisual = 0;
-
- /* glx acceleration */
- if (pScreenPriv->accel.glx.enabled &&
- xglCheckPixmapSize (pPixmap, &pScreenPriv->accel.glx.size))
- {
- for (v = pScreenPriv->pGlxVisual; v; v = v->next)
- {
- glitz_drawable_format_t *format;
-
- if (pScreenPriv->accel.glx.pbuffer != v->pbuffer)
- continue;
-
- format = v->format.drawable;
- if (!format)
- continue;
-
- if (format->color.red_size != glxPriv->modes->redBits ||
- format->color.green_size != glxPriv->modes->greenBits ||
- format->color.blue_size != glxPriv->modes->blueBits)
- continue;
-
- if (format->color.alpha_size < glxPriv->modes->alphaBits ||
- format->depth_size < glxPriv->modes->depthBits ||
- format->stencil_size < glxPriv->modes->stencilBits ||
- format->doublebuffer < glxPriv->modes->doubleBufferMode)
- continue;
-
- /* this is good enought for pbuffers */
- if (v->pbuffer)
- break;
-
- /* we want an exact match for non-pbuffer formats */
- if (format->color.alpha_size == glxPriv->modes->alphaBits &&
- format->depth_size == glxPriv->modes->depthBits &&
- format->stencil_size == glxPriv->modes->stencilBits &&
- format->doublebuffer == glxPriv->modes->doubleBufferMode)
- break;
- }
-
- pBufferPriv->pVisual = v;
- }
- if ((pDrawable->type == DRAWABLE_WINDOW)
-
-#ifdef COMPOSITE
- && (pBufferPriv->pVisual
-
- /* this is a root window, can't be redirected */
- || (!((WindowPtr) pDrawable)->parent))
-#endif
-
- )
- {
- pBufferPriv->pDrawable = pDrawable;
- }
- else
- {
- (*screenInfoPriv.createBuffer) (glxPriv);
+ screen = (xglGLScreenPtr) xalloc (sizeof (xglGLScreenRec));
+ if (!screen)
+ return NULL;
- /* Wrap the swap buffers routine */
- pBufferPriv->swapBuffers = glxPriv->swapBuffers;
+ memset (screen, 0, sizeof (xglGLScreenRec));
- /* Wrap the render texture routines */
- pBufferPriv->bindBuffers = glxPriv->bindBuffers;
- pBufferPriv->releaseBuffers = glxPriv->releaseBuffers;
+ screen->base.destroy = xglScreenDestroy;
+ screen->base.createContext = xglCreateContext;
+ screen->base.createDrawable = xglCreateDrawable;
+ screen->base.pScreen = pScreen;
- /* Wrap the front buffer's resize routine */
- pBufferPriv->resizeBuffers = glPriv->frontBuffer.resize;
+ screen->mesaScreen = (*__xglMesaProvider->screenProbe) (pScreen);
- /* Save Xgl's private buffer structure */
- pBufferPriv->freeBuffers = glPriv->freePrivate;
- pBufferPriv->private = glPriv->private;
- }
+ screen->base.GLextensions = screen->mesaScreen->GLextensions;
+ screen->base.GLXvendor = screen->mesaScreen->GLXvendor;
+ screen->base.GLXversion = screen->mesaScreen->GLXversion;
+ screen->base.GLXextensions = screen->mesaScreen->GLXextensions;
- glxPriv->texTarget = GLX_NO_TEXTURE_EXT;
-
- /* We enable render texture for all GLXPixmaps right now. Eventually, this
- should only be enabled when fbconfig attribute GLX_RENDER_TEXTURE_RGB or
- GLX_RENDER_TEXTURE_RGBA is set to TRUE. */
- if (pDrawable->type != DRAWABLE_WINDOW)
+ /* Remove GLX_MESA_copy_sub_buffer from GLX extension string if
+ glitz can't efficiently support it */
+ if (!(glitz_drawable_get_features (pScreenPriv->drawable) &
+ GLITZ_FEATURE_COPY_SUB_BUFFER_MASK))
{
- XGL_DRAWABLE_PIXMAP (pDrawable);
-
- if (xglCreatePixmapSurface (pPixmap))
+ screen->GLXextensions = strdup (screen->mesaScreen->GLXextensions);
+ if (screen->GLXextensions)
{
- glitz_texture_object_t *texture;
-
- XGL_PIXMAP_PRIV (pPixmap);
+ char *s;
- texture = glitz_texture_object_create (pPixmapPriv->surface);
- if (texture)
+ s = strstr (screen->GLXextensions, "GLX_MESA_copy_sub_buffer ");
+ if (s)
{
- switch (glitz_texture_object_get_target (texture)) {
- case GLITZ_TEXTURE_TARGET_2D:
- glxPriv->texTarget = GLX_TEXTURE_2D_EXT;
- break;
- case GLITZ_TEXTURE_TARGET_RECT:
- glxPriv->texTarget = GLX_TEXTURE_RECTANGLE_EXT;
- break;
- }
+ int n, n2;
- glitz_texture_object_destroy (texture);
+ n = strlen ("GLX_MESA_copy_sub_buffer ");
+ n2 = strlen (s);
+
+ memmove (s, s + n, n2 - n + 1);
}
+
+ screen->base.GLXextensions = screen->GLXextensions;
}
}
- glxPriv->swapBuffers = xglSwapBuffers;
-
- glxPriv->bindBuffers = xglBindBuffers;
- glxPriv->releaseBuffers = xglReleaseBuffers;
- glPriv->frontBuffer.resize = xglResizeBuffers;
-
- glPriv->private = (void *) pBufferPriv;
- glPriv->freePrivate = xglFreeBuffers;
-}
-
-static Bool
-xglScreenProbe (int screen)
-{
- ScreenPtr pScreen = screenInfo.screens[screen];
- xglVisualPtr pVisual;
- Bool status;
- int i;
-
- XGL_SCREEN_PRIV (pScreen);
+ screen->base.fbconfigs = screen->mesaScreen->fbconfigs;
+ screen->base.numFBConfigs = screen->mesaScreen->numFBConfigs;
+ screen->base.numVisuals = screen->mesaScreen->numVisuals;
+ screen->base.visuals = screen->mesaScreen->visuals;
- status = (*screenInfoPriv.screenProbe) (screen);
+ modes = screen->base.fbconfigs;
/* Create Xgl GLX visuals */
- for (i = 0; i < __xglScreenInfoPtr->numVisuals; i++)
+ for (i = 0; i < pScreen->numVisuals; i++)
{
pVisual = xglFindVisualWithId (pScreen, pScreen->visuals[i].vid);
if (pVisual)
@@ -5500,9 +6360,9 @@ xglScreenProbe (int screen)
unsigned long mask;
templ.color = pVisual->format.surface->color;
- templ.depth_size = __xglScreenInfoPtr->modes[i].depthBits;
- templ.stencil_size = __xglScreenInfoPtr->modes[i].stencilBits;
- templ.doublebuffer = __xglScreenInfoPtr->modes[i].doubleBufferMode;
+ templ.depth_size = modes->depthBits;
+ templ.stencil_size = modes->stencilBits;
+ templ.doublebuffer = modes->doubleBufferMode;
templ.samples = 1;
mask =
@@ -5578,25 +6438,19 @@ xglScreenProbe (int screen)
}
}
}
- }
-
- /* Wrap createBuffer */
- if (__xglScreenInfoPtr->createBuffer != xglCreateBuffer)
- {
- screenInfoPriv.createBuffer = __xglScreenInfoPtr->createBuffer;
- __xglScreenInfoPtr->createBuffer = xglCreateBuffer;
- }
- /* Wrap createContext */
- if (__xglScreenInfoPtr->createContext != xglCreateContext)
- {
- screenInfoPriv.createContext = __xglScreenInfoPtr->createContext;
- __xglScreenInfoPtr->createContext = xglCreateContext;
+ modes = modes->next;
}
- return status;
+ return &screen->base;
}
+__GLXprovider __glXXGLProvider = {
+ xglScreenProbe,
+ "XGL",
+ NULL
+};
+
Bool
xglInitVisualConfigs (ScreenPtr pScreen)
{
@@ -5716,15 +6570,9 @@ xglInitVisualConfigs (ScreenPtr pScreen)
pConfig[i].transparentIndex = 0;
}
+ GlxPushProvider (&__glXXGLProvider);
GlxSetVisualConfigs (numConfig, pConfig, (void **) ppConfigPriv);
- /* Wrap screenProbe */
- if (__xglScreenInfoPtr->screenProbe != xglScreenProbe)
- {
- screenInfoPriv.screenProbe = __xglScreenInfoPtr->screenProbe;
- __xglScreenInfoPtr->screenProbe = xglScreenProbe;
- }
-
visuals = pScreen->visuals;
nvisuals = pScreen->numVisuals;
depths = pScreen->allowedDepths;
diff --git a/hw/xgl/glxext/xglglxlog.c b/hw/xgl/glxext/xglglxlog.c
index 0f194c9ed..8be30e663 100644
--- a/hw/xgl/glxext/xglglxlog.c
+++ b/hw/xgl/glxext/xglglxlog.c
@@ -3225,34 +3225,6 @@ logSampleCoverageARB (GLclampf value,
}
-/* GL_EXT_texture_object */
-
-static GLboolean
-logAreTexturesResidentEXT (GLsizei n,
- const GLuint *textures,
- GLboolean *residences)
-{
- fprintf (logFp, "glAreTexturesResidentEXT (%d, %p, %p)\n",
- n, textures, residences);
- return (*nativeRenderTable->AreTexturesResidentEXT) (n, textures,
- residences);
-}
-static void
-logGenTexturesEXT (GLsizei n,
- GLuint *textures)
-{
- fprintf (logFp, "glGenTexturesEXT (%d, %p)\n", n, textures);
- (*nativeRenderTable->GenTexturesEXT) (n, textures);
-}
-
-static GLboolean
-logIsTextureEXT (GLuint texture)
-{
- fprintf (logFp, "glIsTextureEXT (%d)\n", texture);
- return (*nativeRenderTable->IsTextureEXT) (texture);
-}
-
-
/* GL_SGIS_multisample */
static void
@@ -3293,12 +3265,10 @@ logPointParameterfvEXT (GLenum pname,
/* GL_MESA_window_pos */
static void
-logWindowPos3fMESA (GLfloat x,
- GLfloat y,
- GLfloat z)
+logWindowPos3fvMESA (const GLfloat *v)
{
- fprintf (logFp, "glWindowPos3fMESA (%f, %f, %f)\n", x, y, z);
- (*nativeRenderTable->WindowPos3fMESA) (x, y, z);
+ fprintf (logFp, "glWindowPos3fvMESA (%p)\n", v);
+ (*nativeRenderTable->WindowPos3fvMESA) (v);
}
@@ -3466,6 +3436,364 @@ logActiveStencilFaceEXT (GLenum face)
}
+/* GL_ARB_vertex_program */
+
+static void
+logVertexAttrib1svARB (GLuint index,
+ const GLshort *v)
+{
+ fprintf (logFp, "glVertexAttrib1svARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib1svARB) (index, v);
+}
+
+static void
+logVertexAttrib1fvARB (GLuint index,
+ const GLfloat *v)
+{
+ fprintf (logFp, "glVertexAttrib1fvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib1fvARB) (index, v);
+}
+
+static void
+logVertexAttrib1dvARB (GLuint index,
+ const GLdouble *v)
+{
+ fprintf (logFp, "glVertexAttrib1dvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib1dvARB) (index, v);
+}
+
+static void
+logVertexAttrib2svARB (GLuint index,
+ const GLshort *v)
+{
+ fprintf (logFp, "glVertexAttrib2svARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib2svARB) (index, v);
+}
+
+static void
+logVertexAttrib2fvARB (GLuint index,
+ const GLfloat *v)
+{
+ fprintf (logFp, "glVertexAttrib2fvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib2fvARB) (index, v);
+}
+
+static void
+logVertexAttrib2dvARB (GLuint index,
+ const GLdouble *v)
+{
+ fprintf (logFp, "glVertexAttrib2dvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib2dvARB) (index, v);
+}
+
+static void
+logVertexAttrib3svARB (GLuint index,
+ const GLshort *v)
+{
+ fprintf (logFp, "glVertexAttrib3svARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib3svARB) (index, v);
+}
+
+static void
+logVertexAttrib3fvARB (GLuint index,
+ const GLfloat *v)
+{
+ fprintf (logFp, "glVertexAttrib3fvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib3fvARB) (index, v);
+}
+
+static void
+logVertexAttrib3dvARB (GLuint index,
+ const GLdouble *v)
+{
+ fprintf (logFp, "glVertexAttrib3dvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib3dvARB) (index, v);
+}
+
+static void
+logVertexAttrib4bvARB (GLuint index,
+ const GLbyte *v)
+{
+ fprintf (logFp, "glVertexAttrib4bvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4bvARB) (index, v);
+}
+
+static void
+logVertexAttrib4svARB (GLuint index,
+ const GLshort *v)
+{
+ fprintf (logFp, "glVertexAttrib4svARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4svARB) (index, v);
+}
+
+static void
+logVertexAttrib4ivARB (GLuint index,
+ const GLint *v)
+{
+ fprintf (logFp, "glVertexAttrib4ivARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4ivARB) (index, v);
+}
+
+static void
+logVertexAttrib4ubvARB (GLuint index,
+ const GLubyte *v)
+{
+ fprintf (logFp, "glVertexAttrib4ubvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4ubvARB) (index, v);
+}
+
+static void
+logVertexAttrib4usvARB (GLuint index,
+ const GLushort *v)
+{
+ fprintf (logFp, "glVertexAttrib4usvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4usvARB) (index, v);
+}
+
+static void
+logVertexAttrib4uivARB (GLuint index,
+ const GLuint *v)
+{
+ fprintf (logFp, "glVertexAttrib4uivARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4uivARB) (index, v);
+}
+
+static void
+logVertexAttrib4fvARB (GLuint index,
+ const GLfloat *v)
+{
+ fprintf (logFp, "glVertexAttrib4fvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4fvARB) (index, v);
+}
+
+static void
+logVertexAttrib4dvARB (GLuint index,
+ const GLdouble *v)
+{
+ fprintf (logFp, "glVertexAttrib4dvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4dvARB) (index, v);
+}
+
+static void
+logVertexAttrib4NbvARB (GLuint index,
+ const GLbyte *v)
+{
+ fprintf (logFp, "glVertexAttrib4NbvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NbvARB) (index, v);
+}
+
+static void
+logVertexAttrib4NsvARB (GLuint index,
+ const GLshort *v)
+{
+ fprintf (logFp, "glVertexAttrib4NsvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NsvARB) (index, v);
+}
+
+static void
+logVertexAttrib4NivARB (GLuint index,
+ const GLint *v)
+{
+ fprintf (logFp, "glVertexAttrib4NivARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NivARB) (index, v);
+}
+
+static void
+logVertexAttrib4NubvARB (GLuint index,
+ const GLubyte *v)
+{
+ fprintf (logFp, "glVertexAttrib4NubvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NubvARB) (index, v);
+}
+
+static void
+logVertexAttrib4NusvARB (GLuint index,
+ const GLushort *v)
+{
+ fprintf (logFp, "glVertexAttrib4NusvARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NusvARB) (index, v);
+}
+
+static void
+logVertexAttrib4NuivARB (GLuint index,
+ const GLuint *v)
+{
+ fprintf (logFp, "glVertexAttrib4NuivARB (%d, %p)\n", index, v);
+ (*nativeRenderTable->VertexAttrib4NuivARB) (index, v);
+}
+
+static void
+logProgramStringARB (GLenum target,
+ GLenum format,
+ GLsizei len,
+ const void *string)
+{
+ fprintf (logFp, "glProgramStringARB (0x%x, 0x%x, %d, %p)\n",
+ target, format, len, string);
+ (*nativeRenderTable->ProgramStringARB) (target, format, len, string);
+}
+
+static void
+logBindProgramARB (GLenum target,
+ GLuint program)
+{
+ fprintf (logFp, "glBindProgramARB (0x%x, %d)\n", target, program);
+ (*nativeRenderTable->BindProgramNV) (target, program);
+}
+
+static void
+logDeleteProgramsARB (GLsizei n,
+ const GLuint *programs)
+{
+ fprintf (logFp, "glDeleteProgramsARB (%d, %p)\n", n, programs);
+ (*nativeRenderTable->DeleteProgramsNV) (n, programs);
+}
+
+static void
+logGenProgramsARB (GLsizei n,
+ GLuint *programs)
+{
+ fprintf (logFp, "glGenProgramsARB (%d, %p)\n", n, programs);
+ (*nativeRenderTable->GenProgramsNV) (n, programs);
+}
+
+static void
+logProgramEnvParameter4dvARB (GLenum target,
+ GLuint index,
+ const GLdouble *params)
+{
+ fprintf (logFp, "glProgramEnvParameter4dvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->ProgramEnvParameter4dvARB) (target, index, params);
+}
+
+static void
+logProgramEnvParameter4fvARB (GLenum target,
+ GLuint index,
+ const GLfloat *params)
+{
+ fprintf (logFp, "glProgramEnvParameter4fvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->ProgramEnvParameter4fvARB) (target, index, params);
+}
+
+static void
+logProgramLocalParameter4dvARB (GLenum target,
+ GLuint index,
+ const GLdouble *params)
+{
+ fprintf (logFp, "glProgramLocalParameter4dvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->ProgramLocalParameter4dvARB) (target, index, params);
+}
+
+static void
+logProgramLocalParameter4fvARB (GLenum target,
+ GLuint index,
+ const GLfloat *params)
+{
+ fprintf (logFp, "glProgramLocalParameter4fvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->ProgramLocalParameter4fvARB) (target, index, params);
+}
+
+static void
+logGetProgramEnvParameterdvARB (GLenum target,
+ GLuint index,
+ GLdouble *params)
+{
+ fprintf (logFp, "glGetProgramEnvParameterdvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->GetProgramEnvParameterdvARB) (target, index, params);
+}
+
+static void
+logGetProgramEnvParameterfvARB (GLenum target,
+ GLuint index,
+ GLfloat *params)
+{
+ fprintf (logFp, "glGetProgramEnvParameterfvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->GetProgramEnvParameterfvARB) (target, index, params);
+}
+
+static void
+logGetProgramLocalParameterdvARB (GLenum target,
+ GLuint index,
+ GLdouble *params)
+{
+ fprintf (logFp, "glGetProgramLocalParameterdvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->GetProgramLocalParameterdvARB) (target, index, params);
+}
+
+static void
+logGetProgramLocalParameterfvARB (GLenum target,
+ GLuint index,
+ GLfloat *params)
+{
+ fprintf (logFp, "glGetProgramLocalParameterfvARB (0x%x, %d, %p)\n",
+ target, index, params);
+ (*nativeRenderTable->GetProgramLocalParameterfvARB) (target, index, params);
+}
+
+static void
+logGetProgramivARB (GLenum target,
+ GLenum pname,
+ GLint *params)
+{
+ fprintf (logFp, "glGetProgramivARB (0x%x, 0x%x, %p)\n",
+ target, pname, params);
+ (*nativeRenderTable->GetProgramivARB) (target, pname, params);
+}
+
+static void
+logGetProgramStringARB (GLenum target,
+ GLenum pname,
+ void *string)
+{
+ fprintf (logFp, "glGetProgramStringARB (0x%x, 0x%x, %p)\n",
+ target, pname, string);
+ (*nativeRenderTable->GetProgramStringARB) (target, pname, string);
+}
+
+static void
+logGetVertexAttribdvARB (GLuint index,
+ GLenum pname,
+ GLdouble *params)
+{
+ fprintf (logFp, "glGetVertexAttribdvARB (%d, 0x%x, %p)\n",
+ index, pname, params);
+ (*nativeRenderTable->GetVertexAttribdvARB) (index, pname, params);
+}
+
+static void
+logGetVertexAttribfvARB (GLuint index,
+ GLenum pname,
+ GLfloat *params)
+{
+ fprintf (logFp, "glGetVertexAttribfvARB (%d, 0x%x, %p)\n",
+ index, pname, params);
+ (*nativeRenderTable->GetVertexAttribfvARB) (index, pname, params);
+}
+
+static void
+logGetVertexAttribivARB (GLuint index,
+ GLenum pname,
+ GLint *params)
+{
+ fprintf (logFp, "glGetVertexAttribivARB (%d, 0x%x, %p)\n",
+ index, pname, params);
+ (*nativeRenderTable->GetVertexAttribivARB) (index, pname, params);
+}
+
+static GLboolean
+logIsProgramARB (GLuint program)
+{
+ fprintf (logFp, "glIsProgramARB (%d)\n", program);
+ return (*nativeRenderTable->IsProgramNV) (program);
+}
+
/* GL_EXT_framebuffer_object */
static GLboolean
@@ -4051,44 +4379,166 @@ static struct _glapi_table __logRenderTable = {
logMultiTexCoord4ivARB,
0, /* glMultiTexCoord4sARB */
logMultiTexCoord4svARB,
+ 0, /* glAttachShader */
+ 0, /* glCreateProgram */
+ 0, /* glCreateShader */
+ 0, /* glDeleteProgram */
+ 0, /* glDeleteShader */
+ 0, /* glDetachShader */
+ 0, /* glGetAttachedShaders */
+ 0, /* glGetProgramInfoLog */
+ 0, /* glGetProgramiv */
+ 0, /* glGetShaderInfoLog */
+ 0, /* glGetShaderiv */
+ 0, /* glIsProgram */
+ 0, /* glIsShader */
+ 0, /* glStencilFuncSeparate */
+ 0, /* glStencilMaskSeparate */
+ 0, /* glStencilOpSeparate */
+ 0, /* glUniformMatrix2x3fv */
+ 0, /* glUniformMatrix2x4fv */
+ 0, /* glUniformMatrix3x2fv */
+ 0, /* glUniformMatrix3x4fv */
+ 0, /* glUniformMatrix4x2fv */
+ 0, /* glUniformMatrix4x3fv */
0, /* glLoadTransposeMatrixfARB */
0, /* glLoadTransposeMatrixdARB */
0, /* glMultTransposeMatrixfARB */
0, /* glMultTransposeMatrixdARB */
logSampleCoverageARB,
+ 0, /* glCompressedTexImage1DARB */
+ 0, /* glCompressedTexImage2DARB */
+ 0, /* glCompressedTexImage3DARB */
+ 0, /* glCompressedTexSubImage1DARB */
+ 0, /* glCompressedTexSubImage2DARB */
+ 0, /* glCompressedTexSubImage3DARB */
+ 0, /* glGetCompressedTexImageARB */
+ 0, /* glDisableVertexAttribArrayARB */
+ 0, /* glEnableVertexAttribArrayARB */
+ logGetProgramEnvParameterdvARB,
+ logGetProgramEnvParameterfvARB,
+ logGetProgramLocalParameterdvARB,
+ logGetProgramLocalParameterfvARB,
+ logGetProgramStringARB,
+ logGetProgramivARB,
+ logGetVertexAttribdvARB,
+ logGetVertexAttribfvARB,
+ logGetVertexAttribivARB,
+ 0, /* glProgramEnvParameter4dARB */
+ logProgramEnvParameter4dvARB,
+ 0, /* glProgramEnvParameter4fARB */
+ logProgramEnvParameter4fvARB,
+ 0, /* glProgramLocalParameter4dARB */
+ logProgramLocalParameter4dvARB,
+ 0, /* glProgramLocalParameter4fARB */
+ logProgramLocalParameter4fvARB,
+ logProgramStringARB,
+ 0, /* glVertexAttrib1dARB */
+ logVertexAttrib1dvARB,
+ 0, /* glVertexAttrib1fARB */
+ logVertexAttrib1fvARB,
+ 0, /* glVertexAttrib1sARB */
+ logVertexAttrib1svARB,
+ 0, /* glVertexAttrib2dARB */
+ logVertexAttrib2dvARB,
+ 0, /* glVertexAttrib2fARB */
+ logVertexAttrib2fvARB,
+ 0, /* glVertexAttrib2sARB */
+ logVertexAttrib2svARB,
+ 0, /* glVertexAttrib3dARB */
+ logVertexAttrib3dvARB,
+ 0, /* glVertexAttrib3fARB */
+ logVertexAttrib3fvARB,
+ 0, /* glVertexAttrib3sARB */
+ logVertexAttrib3svARB,
+ logVertexAttrib4NbvARB,
+ logVertexAttrib4NivARB,
+ logVertexAttrib4NsvARB,
+ 0, /* glVertexAttrib4NubARB */
+ logVertexAttrib4NubvARB,
+ logVertexAttrib4NuivARB,
+ logVertexAttrib4NusvARB,
+ logVertexAttrib4bvARB,
+ 0, /* glVertexAttrib4dARB */
+ logVertexAttrib4dvARB,
+ 0, /* glVertexAttrib4fARB */
+ logVertexAttrib4fvARB,
+ logVertexAttrib4ivARB,
+ 0, /* glVertexAttrib4sARB */
+ logVertexAttrib4svARB,
+ logVertexAttrib4ubvARB,
+ logVertexAttrib4uivARB,
+ logVertexAttrib4usvARB,
+ 0, /* glVertexAttribPointerARB */
+ 0, /* glBindBufferARB */
+ 0, /* glBufferDataARB */
+ 0, /* glBufferSubDataARB */
+ 0, /* glDeleteBuffersARB */
+ 0, /* glGenBuffersARB */
+ 0, /* glGetBufferParameterivARB */
+ 0, /* glGetBufferPointervARB */
+ 0, /* glGetBufferSubDataARB */
+ 0, /* glIsBufferARB */
+ 0, /* glMapBufferARB */
+ 0, /* glUnmapBufferARB */
+ 0, /* glBeginQueryARB */
+ 0, /* glDeleteQueriesARB */
+ 0, /* glEndQueryARB */
+ 0, /* glGenQueriesARB */
+ 0, /* glGetQueryObjectivARB */
+ 0, /* glGetQueryObjectuivARB */
+ 0, /* glGetQueryivARB */
+ 0, /* IsQueryARB */
+ 0, /* glAttachObjectARB */
+ 0, /* glCompileShaderARB */
+ 0, /* CreateProgramObjectARB */
+ 0, /* CreateShaderObjectARB */
+ 0, /* glDeleteObjectARB */
+ 0, /* glDetachObjectARB */
+ 0, /* glGetActiveUniformARB */
+ 0, /* glGetAttachedObjectsARB */
+ 0, /* GetHandleARB */
+ 0, /* glGetInfoLogARB */
+ 0, /* glGetObjectParameterfvARB */
+ 0, /* glGetObjectParameterivARB */
+ 0, /* glGetShaderSourceARB */
+ 0, /* GetUniformLocationARB */
+ 0, /* glGetUniformfvARB */
+ 0, /* glGetUniformivARB */
+ 0, /* glLinkProgramARB */
+ 0, /* glShaderSourceARB */
+ 0, /* glUniform1fARB */
+ 0, /* glUniform1fvARB */
+ 0, /* glUniform1iARB */
+ 0, /* glUniform1ivARB */
+ 0, /* glUniform2fARB */
+ 0, /* glUniform2fvARB */
+ 0, /* glUniform2iARB */
+ 0, /* glUniform2ivARB */
+ 0, /* glUniform3fARB */
+ 0, /* glUniform3fvARB */
+ 0, /* glUniform3iARB */
+ 0, /* glUniform3ivARB */
+ 0, /* glUniform4fARB */
+ 0, /* glUniform4fvARB */
+ 0, /* glUniform4iARB */
+ 0, /* glUniform4ivARB */
+ 0, /* glUniformMatrix2fvARB */
+ 0, /* glUniformMatrix3fvARB */
+ 0, /* glUniformMatrix4fvARB */
+ 0, /* glUseProgramObjectARB */
+ 0, /* glValidateProgramARB */
+ 0, /* glBindAttribLocationARB */
+ 0, /* glGetActiveAttribARB */
+ 0, /* GetAttribLocationARB */
0, /* glDrawBuffersARB */
0, /* glPolygonOffsetEXT */
- 0, /* glGetTexFilterFuncSGIS */
- 0, /* glTexFilterFuncSGIS */
- 0, /* glGetHistogramEXT */
- 0, /* glGetHistogramParameterfvEXT */
- 0, /* glGetHistogramParameterivEXT */
- 0, /* glGetMinmaxEXT */
- 0, /* glGetMinmaxParameterfvEXT */
- 0, /* glGetMinmaxParameterivEXT */
- 0, /* glGetConvolutionFilterEXT */
- 0, /* glGetConvolutionParameterfvEXT */
- 0, /* glGetConvolutionParameterivEXT */
- 0, /* glGetSeparableFilterEXT */
- 0, /* glGetColorTableSGI */
- 0, /* glGetColorTableParameterfvSGI */
- 0, /* glGetColorTableParameterivSGI */
- 0, /* glPixelTexGenSGIX */
- 0, /* glPixelTexGenParameteriSGIS */
- 0, /* glPixelTexGenParameterivSGIS */
+ 0, /* glGetPixelTexGenParameterfvSGIS */
+ 0, /* glGetPixelTexGenParameterivSGIS */
0, /* glPixelTexGenParameterfSGIS */
0, /* glPixelTexGenParameterfvSGIS */
- 0, /* glGetPixelTexGenParameterivSGIS */
- 0, /* glGetPixelTexGenParameterfvSGIS */
- 0, /* glTexImage4DSGIS */
- 0, /* glTexSubImage4DSGIS */
- logAreTexturesResidentEXT,
- logGenTexturesEXT,
- logIsTextureEXT,
- 0, /* glDetailTexFuncSGIS */
- 0, /* glGetDetailTexFuncSGIS */
- 0, /* glSharpenTexFuncSGIS */
- 0, /* glGetSharpenTexFuncSGIS */
+ 0, /* glPixelTexGenParameteriSGIS */
+ 0, /* glPixelTexGenParameterivSGIS */
logSampleMaskSGIS,
logSamplePatternSGIS,
0, /* glColorPointerEXT */
@@ -4097,57 +4547,46 @@ static struct _glapi_table __logRenderTable = {
0, /* glNormalPointerEXT */
0, /* glTexCoordPointerEXT */
0, /* glVertexPointerEXT */
- 0, /* glSpriteParameterfSGIX */
- 0, /* glSpriteParameterfvSGIX */
- 0, /* glSpriteParameteriSGIX */
- 0, /* glSpriteParameterivSGIX */
logPointParameterfEXT,
logPointParameterfvEXT,
- 0, /* glGetInstrumentsSGIX */
- 0, /* glInstrumentsBufferSGIX */
- 0, /* glPollInstrumentsSGIX */
- 0, /* glReadInstrumentsSGIX */
- 0, /* glStartInstrumentsSGIX */
- 0, /* glStopInstrumentsSGIX */
- 0, /* glFrameZoomSGIX */
- 0, /* glTagSampleBufferSGIX */
- 0, /* glReferencePlaneSGIX */
- 0, /* glFlushRasterSGIX */
- 0, /* glGetListParameterfvSGIX */
- 0, /* glGetListParameterivSGIX */
- 0, /* glListParameterfSGIX */
- 0, /* glListParameterfvSGIX */
- 0, /* glListParameteriSGIX */
- 0, /* glListParameterivSGIX */
- 0, /* glFragmentColorMaterialSGIX */
- 0, /* glFragmentLightfSGIX */
- 0, /* glFragmentLightfvSGIX */
- 0, /* glFragmentLightiSGIX */
- 0, /* glFragmentLightivSGIX */
- 0, /* glFragmentLightModelfSGIX */
- 0, /* glFragmentLightModelfvSGIX */
- 0, /* glFragmentLightModeliSGIX */
- 0, /* glFragmentLightModelivSGIX */
- 0, /* glFragmentMaterialfSGIX */
- 0, /* glFragmentMaterialfvSGIX */
- 0, /* glFragmentMaterialiSGIX */
- 0, /* glFragmentMaterialivSGIX */
- 0, /* glGetFragmentLightfvSGIX */
- 0, /* glGetFragmentLightivSGIX */
- 0, /* glGetFragmentMaterialfvSGIX */
- 0, /* glGetFragmentMaterialivSGIX */
- 0, /* glLightEnviSGIX */
- 0, /* glVertexWeightfEXT */
- 0, /* glVertexWeightfvEXT */
- 0, /* glVertexWeightPointerEXT */
+ 0, /* glLockArraysEXT */
+ 0, /* glUnlockArraysEXT */
+ 0, /* glCullParameterdvEXT */
+ 0, /* glCullParameterfvEXT */
+ 0, /* glSecondaryColor3bEXT */
+ logSecondaryColor3bvEXT,
+ 0, /* glSecondaryColor3dEXT */
+ logSecondaryColor3dvEXT,
+ 0, /* glSecondaryColor3fEXT */
+ logSecondaryColor3fvEXT,
+ 0, /* glSecondaryColor3iEXT */
+ logSecondaryColor3ivEXT,
+ 0, /* glSecondaryColor3sEXT */
+ logSecondaryColor3svEXT,
+ 0, /* glSecondaryColor3ubEXT */
+ logSecondaryColor3ubvEXT,
+ 0, /* glSecondaryColor3uiEXT */
+ logSecondaryColor3uivEXT,
+ 0, /* glSecondaryColor3usEXT */
+ logSecondaryColor3usvEXT,
+ logSecondaryColorPointerEXT,
+ 0, /* glMultiDrawArraysEXT */
+ 0, /* glMultiDrawElementsEXT */
+ logFogCoordPointerEXT,
+ 0, /* glFogCoorddEXT */
+ logFogCoorddvEXT,
+ 0, /* glFogCoordfEXT */
+ logFogCoordfvEXT,
+ 0, /* glPixelTexGenSGIX */
+ logBlendFuncSeparateEXT,
0, /* glFlushVertexArrayRangeNV */
0, /* glVertexArrayRangeNV */
- 0, /* glCombinerParameterfvNV */
- 0, /* glCombinerParameterfNV */
- 0, /* glCombinerParameterivNV */
- 0, /* glCombinerParameteriNV */
0, /* glCombinerInputNV */
0, /* glCombinerOutputNV */
+ 0, /* glCombinerParameterfNV */
+ 0, /* glCombinerParameterfvNV */
+ 0, /* glCombinerParameteriNV */
+ 0, /* glCombinerParameterivNV */
0, /* glFinalCombinerInputNV */
0, /* glGetCombinerInputParameterfvNV */
0, /* glGetCombinerInputParameterivNV */
@@ -4166,8 +4605,8 @@ static struct _glapi_table __logRenderTable = {
0, /* glWindowPos2svMESA */
0, /* glWindowPos3dMESA */
0, /* glWindowPos3dvMESA */
- logWindowPos3fMESA,
- 0, /* glWindowPos3fvMESA */
+ 0, /* glWindowPos3fMESA */
+ logWindowPos3fvMESA,
0, /* glWindowPos3iMESA */
0, /* glWindowPos3ivMESA */
0, /* glWindowPos3sMESA */
@@ -4180,62 +4619,30 @@ static struct _glapi_table __logRenderTable = {
0, /* glWindowPos4ivMESA */
0, /* glWindowPos4sMESA */
0, /* glWindowPos4svMESA */
- logBlendFuncSeparateEXT,
- 0, /* glIndexMaterialEXT */
- 0, /* glIndexFuncEXT */
- 0, /* glLockArraysEXT */
- 0, /* glUnlockArraysEXT */
- 0, /* glCullParameterdvEXT */
- 0, /* glCullParameterfvEXT */
- 0, /* glHintPGI */
- 0, /* glFogCoordfEXT */
- logFogCoordfvEXT,
- 0, /* glFogCoorddEXT */
- logFogCoorddvEXT,
- logFogCoordPointerEXT,
- 0, /* glGetColorTableEXT */
- 0, /* glGetColorTableParameterivEXT */
- 0, /* glGetColorTableParameterfvEXT */
- 0, /* glTbufferMask3DFX */
- 0, /* glCompressedTexImage3DARB */
- 0, /* glCompressedTexImage2DARB */
- 0, /* glCompressedTexImage1DARB */
- 0, /* glCompressedTexSubImage3DARB */
- 0, /* glCompressedTexSubImage2DARB */
- 0, /* glCompressedTexSubImage1DARB */
- 0, /* glGetCompressedTexImageARB */
- 0, /* glSecondaryColor3bEXT */
- logSecondaryColor3bvEXT,
- 0, /* glSecondaryColor3dEXT */
- logSecondaryColor3dvEXT,
- 0, /* glSecondaryColor3fEXT */
- logSecondaryColor3fvEXT,
- 0, /* glSecondaryColor3iEXT */
- logSecondaryColor3ivEXT,
- 0, /* glSecondaryColor3sEXT */
- logSecondaryColor3svEXT,
- 0, /* glSecondaryColor3ubEXT */
- logSecondaryColor3ubvEXT,
- 0, /* glSecondaryColor3uiEXT */
- logSecondaryColor3uivEXT,
- 0, /* glSecondaryColor3usEXT */
- logSecondaryColor3usvEXT,
- logSecondaryColorPointerEXT,
+ 0, /* glMultiModeDrawArraysIBM */
+ 0, /* glMultiModeDrawElementsIBM */
+ 0, /* glDeleteFencesNV */
+ 0, /* glFinishFenceNV */
+ 0, /* glGenFencesNV */
+ 0, /* glGetFenceivNV */
+ 0, /* glIsFenceNV */
+ 0, /* glSetFenceNV */
+ 0, /* glTestFenceNV */
0, /* glAreProgramsResidentNV */
- 0, /* glBindProgramNV */
- 0, /* glDeleteProgramsNV */
+ logBindProgramARB,
+ logDeleteProgramsARB,
0, /* glExecuteProgramNV */
- 0, /* glGenProgramsNV */
+ logGenProgramsARB,
0, /* glGetProgramParameterdvNV */
0, /* glGetProgramParameterfvNV */
- 0, /* glGetProgramivNV */
0, /* glGetProgramStringNV */
+ 0, /* glGetProgramivNV */
0, /* glGetTrackMatrixivNV */
- 0, /* glGetVertexAttribdvARB */
- 0, /* glGetVertexAttribfvARB */
- 0, /* glGetVertexAttribivARB */
0, /* glGetVertexAttribPointervNV */
- 0, /* glIsProgramNV */
+ 0, /* glGetVertexAttribdvNV */
+ 0, /* glGetVertexAttribfvNV */
+ 0, /* glGetVertexAttribivNV */
+ logIsProgramARB,
0, /* glLoadProgramNV */
0, /* glProgramParameter4dNV */
0, /* glProgramParameter4dvNV */
@@ -4245,160 +4652,6 @@ static struct _glapi_table __logRenderTable = {
0, /* glProgramParameters4fvNV */
0, /* glRequestResidentProgramsNV */
0, /* glTrackMatrixNV */
- 0, /* glVertexAttribPointerNV */
- 0, /* glVertexAttrib1dARB */
- 0, /* glVertexAttrib1dvARB */
- 0, /* glVertexAttrib1fARB */
- 0, /* glVertexAttrib1fvARB */
- 0, /* glVertexAttrib1sARB */
- 0, /* glVertexAttrib1svARB */
- 0, /* glVertexAttrib2dARB */
- 0, /* glVertexAttrib2dvARB */
- 0, /* glVertexAttrib2fARB */
- 0, /* glVertexAttrib2fvARB */
- 0, /* glVertexAttrib2sARB */
- 0, /* glVertexAttrib2svARB */
- 0, /* glVertexAttrib3dARB */
- 0, /* glVertexAttrib3dvARB */
- 0, /* glVertexAttrib3fARB */
- 0, /* glVertexAttrib3fvARB */
- 0, /* glVertexAttrib3sARB */
- 0, /* glVertexAttrib3svARB */
- 0, /* glVertexAttrib4dARB */
- 0, /* glVertexAttrib4dvARB */
- 0, /* glVertexAttrib4fARB */
- 0, /* glVertexAttrib4fvARB */
- 0, /* glVertexAttrib4sARB */
- 0, /* glVertexAttrib4svARB */
- 0, /* glVertexAttrib4NubARB */
- 0, /* glVertexAttrib4NubvARB */
- 0, /* glVertexAttribs1dvNV */
- 0, /* glVertexAttribs1fvNV */
- 0, /* glVertexAttribs1svNV */
- 0, /* glVertexAttribs2dvNV */
- 0, /* glVertexAttribs2fvNV */
- 0, /* glVertexAttribs2svNV */
- 0, /* glVertexAttribs3dvNV */
- 0, /* glVertexAttribs3fvNV */
- 0, /* glVertexAttribs3svNV */
- 0, /* glVertexAttribs4dvNV */
- 0, /* glVertexAttribs4fvNV */
- 0, /* glVertexAttribs4svNV */
- 0, /* glVertexAttribs4ubvNV */
- logPointParameteriNV,
- logPointParameterivNV,
- 0, /* glMultiDrawArraysEXT */
- 0, /* glMultiDrawElementsEXT */
- logActiveStencilFaceEXT,
- 0, /* glDeleteFencesNV */
- 0, /* glGenFencesNV */
- 0, /* glIsFenceNV */
- 0, /* glTestFenceNV */
- 0, /* glGetFenceivNV */
- 0, /* glFinishFenceNV */
- 0, /* glSetFenceNV */
- 0, /* glVertexAttrib4bvARB */
- 0, /* glVertexAttrib4ivARB */
- 0, /* glVertexAttrib4ubvARB */
- 0, /* glVertexAttrib4usvARB */
- 0, /* glVertexAttrib4uivARB */
- 0, /* glVertexAttrib4NbvARB */
- 0, /* glVertexAttrib4NsvARB */
- 0, /* glVertexAttrib4NivARB */
- 0, /* glVertexAttrib4NusvARB */
- 0, /* glVertexAttrib4NuivARB */
- 0, /* glVertexAttribPointerARB */
- 0, /* glEnableVertexAttribArrayARB */
- 0, /* glDisableVertexAttribArrayARB */
- 0, /* glProgramStringARB */
- 0, /* glProgramEnvParameter4dARB */
- 0, /* glProgramEnvParameter4dvARB */
- 0, /* glProgramEnvParameter4fARB */
- 0, /* glProgramEnvParameter4fvARB */
- 0, /* glProgramLocalParameter4dARB */
- 0, /* glProgramLocalParameter4dvARB */
- 0, /* glProgramLocalParameter4fARB */
- 0, /* glProgramLocalParameter4fvARB */
- 0, /* glGetProgramEnvParameterdvARB */
- 0, /* glGetProgramEnvParameterfvARB */
- 0, /* glGetProgramLocalParameterdvARB */
- 0, /* glGetProgramLocalParameterfvARB */
- 0, /* glGetProgramivARB */
- 0, /* glGetProgramStringARB */
- 0, /* glProgramNamedParameter4fNV */
- 0, /* glProgramNamedParameter4dNV */
- 0, /* glProgramNamedParameter4fvNV */
- 0, /* glProgramNamedParameter4dvNV */
- 0, /* glGetProgramNamedParameterfvNV */
- 0, /* glGetProgramNamedParameterdvNV */
- 0, /* glBindBufferARB */
- 0, /* glBufferDataARB */
- 0, /* glBufferSubDataARB */
- 0, /* glDeleteBuffersARB */
- 0, /* glGenBuffersARB */
- 0, /* glGetBufferParameterivARB */
- 0, /* glGetBufferPointervARB */
- 0, /* glGetBufferSubDataARB */
- 0, /* glIsBufferARB */
- 0, /* glMapBufferARB */
- 0, /* glUnmapBufferARB */
- 0, /* glDepthBoundsEXT */
- 0, /* glGenQueriesARB */
- 0, /* glDeleteQueriesARB */
- 0, /* glIsQueryARB */
- 0, /* glBeginQueryARB */
- 0, /* glEndQueryARB */
- 0, /* glGetQueryivARB */
- 0, /* glGetQueryObjectivARB */
- 0, /* glGetQueryObjectuivARB */
- 0, /* glMultiModeDrawArraysIBM */
- 0, /* glMultiModeDrawElementsIBM */
- 0, /* glBlendEquationSeparateEXT */
- 0, /* glDeleteObjectARB */
- 0, /* glGetHandleARB */
- 0, /* glDetachObjectARB */
- 0, /* glCreateShaderObjectARB */
- 0, /* glShaderSourceARB */
- 0, /* glCompileShaderARB */
- 0, /* glCreateProgramObjectARB */
- 0, /* glAttachObjectARB */
- 0, /* glLinkProgramARB */
- 0, /* glUseProgramObjectARB */
- 0, /* glValidateProgramARB */
- 0, /* glUniform1fARB */
- 0, /* glUniform2fARB */
- 0, /* glUniform3fARB */
- 0, /* glUniform4fARB */
- 0, /* glUniform1iARB */
- 0, /* glUniform2iARB */
- 0, /* glUniform3iARB */
- 0, /* glUniform4iARB */
- 0, /* glUniform1fvARB */
- 0, /* glUniform2fvARB */
- 0, /* glUniform3fvARB */
- 0, /* glUniform4fvARB */
- 0, /* glUniform1ivARB */
- 0, /* glUniform2ivARB */
- 0, /* glUniform3ivARB */
- 0, /* glUniform4ivARB */
- 0, /* glUniformMatrix2fvARB */
- 0, /* glUniformMatrix3fvARB */
- 0, /* glUniformMatrix4fvARB */
- 0, /* glGetObjectParameterfvARB */
- 0, /* glGetObjectParameterivARB */
- 0, /* glGetInfoLogARB */
- 0, /* glGetAttachedObjectsARB */
- 0, /* glGetUniformLocationARB */
- 0, /* glGetActiveUniformARB */
- 0, /* glGetUniformfvARB */
- 0, /* glGetUniformivARB */
- 0, /* glGetShaderSourceARB */
- 0, /* glBindAttribLocationARB */
- 0, /* glGetActiveAttribARB */
- 0, /* glGetAttribLocationARB */
- 0, /* glGetVertexAttribdvNV */
- 0, /* glGetVertexAttribfvNV */
- 0, /* glGetVertexAttribivNV */
0, /* glVertexAttrib1dNV */
0, /* glVertexAttrib1dvNV */
0, /* glVertexAttrib1fNV */
@@ -4425,40 +4678,69 @@ static struct _glapi_table __logRenderTable = {
0, /* glVertexAttrib4svNV */
0, /* glVertexAttrib4ubNV */
0, /* glVertexAttrib4ubvNV */
- 0, /* glGenFragmentShadersATI */
+ 0, /* glVertexAttribPointerNV */
+ 0, /* glVertexAttribs1dvNV */
+ 0, /* glVertexAttribs1fvNV */
+ 0, /* glVertexAttribs1svNV */
+ 0, /* glVertexAttribs2dvNV */
+ 0, /* glVertexAttribs2fvNV */
+ 0, /* glVertexAttribs2svNV */
+ 0, /* glVertexAttribs3dvNV */
+ 0, /* glVertexAttribs3fvNV */
+ 0, /* glVertexAttribs3svNV */
+ 0, /* glVertexAttribs4dvNV */
+ 0, /* glVertexAttribs4fvNV */
+ 0, /* glVertexAttribs4svNV */
+ 0, /* glVertexAttribs4ubvNV */
+ 0, /* glAlphaFragmentOp1ATI */
+ 0, /* glAlphaFragmentOp2ATI */
+ 0, /* glAlphaFragmentOp3ATI */
+ 0, /* glBeginFragmentShaderATI */
0, /* glBindFragmentShaderATI */
+ 0, /* glColorFragmentOp1ATI */
+ 0, /* glColorFragmentOp2ATI */
+ 0, /* glColorFragmentOp3ATI */
0, /* glDeleteFragmentShaderATI */
- 0, /* glBeginFragmentShaderATI */
0, /* glEndFragmentShaderATI */
+ 0, /* glGenFragmentShadersATI */
0, /* glPassTexCoordATI */
0, /* glSampleMapATI */
- 0, /* glColorFragmentOp1ATI */
- 0, /* glColorFragmentOp2ATI */
- 0, /* glColorFragmentOp3ATI */
- 0, /* glAlphaFragmentOp1ATI */
- 0, /* glAlphaFragmentOp2ATI */
- 0, /* glAlphaFragmentOp3ATI */
0, /* glSetFragmentShaderConstantATI */
- logIsRenderbufferEXT,
- logBindRenderbufferEXT,
- logDeleteRenderbuffersEXT,
- logGenRenderbuffersEXT,
- logRenderbufferStorageEXT,
- logGetRenderbufferParameterivEXT,
- logIsFramebufferEXT,
+ logPointParameteriNV,
+ logPointParameterivNV,
+ logActiveStencilFaceEXT,
+ 0, /* glBindVertexArrayAPPLE */
+ 0, /* glDeleteVertexArraysAPPLE */
+ 0, /* glGenVertexArraysAPPLE */
+ 0, /* glIsVertexArrayAPPLE */
+ 0, /* glGetProgramNamedParameterdvNV */
+ 0, /* glGetProgramNamedParameterfvNV */
+ 0, /* glProgramNamedParameter4dNV */
+ 0, /* glProgramNamedParameter4fNV */
+ 0, /* glProgramNamedParameter4dvNV */
+ 0, /* glProgramNamedParameter4fvNV */
+ 0, /* glDepthBoundsEXT */
+ 0, /* glBlendEquationSeparateEXT */
logBindFramebufferEXT,
- logDeleteFramebuffersEXT,
- logGenFramebuffersEXT,
+ logBindRenderbufferEXT,
logCheckFramebufferStatusEXT,
+ logDeleteFramebuffersEXT,
+ logDeleteRenderbuffersEXT,
+ logFramebufferRenderbufferEXT,
logFramebufferTexture1DEXT,
logFramebufferTexture2DEXT,
logFramebufferTexture3DEXT,
- logFramebufferRenderbufferEXT,
- logGetFramebufferAttachmentParameterivEXT,
+ logGenFramebuffersEXT,
+ logGenRenderbuffersEXT,
logGenerateMipmapEXT,
- 0, /* glStencilFuncSeparate */
- 0, /* glStencilOpSeparate */
- 0, /* glStencilMaskSeparate */
+ logGetFramebufferAttachmentParameterivEXT,
+ logGetRenderbufferParameterivEXT,
+ logIsFramebufferEXT,
+ logIsRenderbufferEXT,
+ logRenderbufferStorageEXT,
+ 0, /* glBlitFramebufferEXT */
+ 0, /* glProgramEnvParameters4fvEXT */
+ 0, /* glProgramLocalParameters4fvEXT */
0, /* glGetQueryObjecti64vEXT */
0 /* glGetQueryObjectui64vEXT */
};
diff --git a/hw/xgl/xglglx.c b/hw/xgl/xglglx.c
index d92f9659e..8a9430f54 100644
--- a/hw/xgl/xglglx.c
+++ b/hw/xgl/xglglx.c
@@ -38,33 +38,33 @@ FILE *__xglGLXLogFp;
#endif
static void *glXHandle = 0;
-static void *glCoreHandle = 0;
#define SYM(ptr, name) { (void **) &(ptr), (name) }
-__GLXextensionInfo *__xglExtensionInfo;
-__GLXscreenInfo *__xglScreenInfoPtr;
+__GLXprovider *__xglMesaProvider;
+
+void *(*__GlxGetMesaProvider) (void);
void
GlxSetVisualConfigs (int nconfigs,
__GLXvisualConfig *configs,
void **privates)
{
- if (glXHandle && glCoreHandle)
+ if (glXHandle)
(*__xglGLXFunc.setVisualConfigs) (nconfigs, configs, privates);
}
void
GlxExtensionInit (void)
{
- if (glXHandle && glCoreHandle)
+ if (glXHandle)
(*__xglGLXFunc.extensionInit) ();
}
void
GlxWrapInitVisuals (miInitVisualsProcPtr *initVisuals)
{
- if (glXHandle && glCoreHandle)
+ if (glXHandle)
(*__xglGLXFunc.wrapInitVisuals) (initVisuals);
}
@@ -79,7 +79,7 @@ GlxInitVisuals (VisualPtr *visualp,
int bitsPerRGB,
int preferredVis)
{
- if (glXHandle && glCoreHandle)
+ if (glXHandle)
return (*__xglGLXFunc.initVisuals) (visualp, depthp, nvisualp, ndepthp,
rootDepthp, defaultVisp, sizes,
bitsPerRGB, preferredVis);
@@ -88,61 +88,55 @@ GlxInitVisuals (VisualPtr *visualp,
}
void
-GlxFlushContextCache (void)
+__glXFlushContextCache (void)
{
- (*__xglGLXFunc.flushContextCache) ();
+ if (glXHandle)
+ (*__xglGLXFunc.flushContextCache) ();
}
void
GlxSetRenderTables (struct _glapi_table *table)
{
- (*__xglGLXFunc.setRenderTables) (table);
-}
-
-struct _glapi_table *_mglapi_Dispatch;
-
-void *(*__glcore_DDXScreenInfo)(void);
-
-void *__glXglDDXScreenInfo(void)
-{
- return __xglScreenInfoPtr;
+ if (glXHandle)
+ (*__xglGLXFunc.setRenderTables) (table);
}
-void *(*__glcore_DDXExtensionInfo)(void);
-
-void *__glXglDDXExtensionInfo(void)
-{
- return __xglExtensionInfo;
-}
-
-void _gl_copy_visual_to_context_mode( __GLcontextModes * mode,
- const __GLXvisualConfig * config )
+void
+GlxPushProvider (__GLXprovider *provider)
{
- (*__xglGLXFunc.copy_visual_to_context_mode)(mode, config);
+ if (glXHandle)
+ (*__xglGLXFunc.pushProvider) (provider);
}
-__GLcontextModes *_gl_context_modes_create( unsigned count, size_t minimum_size )
+void
+__glXScreenInit (__GLXscreen *screen,
+ ScreenPtr pScreen)
{
- return (*__xglGLXFunc.context_modes_create)(count, minimum_size);
+ if (glXHandle)
+ (*__xglGLXFunc.screenInit) (screen, pScreen);
}
-void _gl_context_modes_destroy( __GLcontextModes * modes )
+void
+__glXScreenDestroy (__GLXscreen *screen)
{
- (*__xglGLXFunc.context_modes_destroy)(modes);
+ if (glXHandle)
+ (*__xglGLXFunc.screenDestroy) (screen);
}
-GLint _gl_convert_from_x_visual_type( int visualType )
+GLboolean
+__glXDrawableInit (__GLXdrawable *drawable,
+ __GLXscreen *screen,
+ DrawablePtr pDrawable,
+ int type,
+ XID drawId,
+ __GLcontextModes *modes)
{
- return (*__xglGLXFunc.convert_from_x_visual_type)(visualType);
-}
+ if (glXHandle)
+ return (*__xglGLXFunc.drawableInit) (drawable, screen, pDrawable, type, drawId, modes);
-GLint _gl_convert_to_x_visual_type( int visualType )
-{
- return (*__xglGLXFunc.convert_to_x_visual_type)(visualType);
+ return GL_FALSE;
}
-
-
Bool
xglLoadGLXModules (void)
{
@@ -157,14 +151,15 @@ xglLoadGLXModules (void)
SYM (__xglGLXFunc.initVisuals, "GlxInitVisuals"),
SYM (__xglGLXFunc.flushContextCache, "__glXFlushContextCache"),
SYM (__xglGLXFunc.setRenderTables, "GlxSetRenderTables"),
- SYM (__xglGLXFunc.copy_visual_to_context_mode, "_gl_copy_visual_to_context_mode"),
- SYM (__xglGLXFunc.context_modes_create, "_gl_context_modes_create"),
- SYM (__xglGLXFunc.context_modes_destroy, "_gl_context_modes_destroy"),
- SYM (__xglGLXFunc.convert_from_x_visual_type, "_gl_convert_from_x_visual_type"),
- SYM (__xglGLXFunc.convert_to_x_visual_type, "_gl_convert_to_x_visual_type"),
+ SYM (__xglGLXFunc.pushProvider, "GlxPushProvider"),
+ SYM (__xglGLXFunc.screenInit, "__glXScreenInit"),
+ SYM (__xglGLXFunc.screenDestroy, "__glXScreenDestroy"),
+ SYM (__xglGLXFunc.drawableInit, "__glXDrawableInit"),
+
+ SYM (__GlxGetMesaProvider, "GlxGetMesaProvider")
};
- glXHandle = xglLoadModule ("glx", RTLD_NOW | RTLD_LOCAL);
+ glXHandle = xglLoadModule ("glxext", RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND);
if (!glXHandle)
return FALSE;
@@ -175,58 +170,15 @@ xglLoadGLXModules (void)
return FALSE;
}
- }
- if (!glCoreHandle)
- {
- xglSymbolRec ddxsym[] = {
- SYM (__glcore_DDXExtensionInfo, "__glXglDDXExtensionInfo"),
- SYM (__glcore_DDXScreenInfo, "__glXglDDXScreenInfo")
- };
-
- glCoreHandle = xglLoadModule ("glcore", RTLD_NOW | RTLD_LOCAL);
- if (!glCoreHandle)
- return FALSE;
+ __xglMesaProvider = __GlxGetMesaProvider ();
- if (!xglLookupSymbols (glCoreHandle, ddxsym,
- sizeof (ddxsym) / sizeof(ddxsym[0])))
+ if (!xglLoadHashFuncs (glXHandle))
{
- xglUnloadModule (glCoreHandle);
- glCoreHandle = 0;
-
- return FALSE;
- }
+ xglUnloadModule (glXHandle);
+ glXHandle = 0;
- __xglScreenInfoPtr = __glcore_DDXScreenInfo();
- __xglExtensionInfo = __glcore_DDXExtensionInfo();
- {
- xglSymbolRec sym[] = {
- SYM (__xglScreenInfoPtr->screenProbe, "__MESA_screenProbe"),
- SYM (__xglScreenInfoPtr->createContext, "__MESA_createContext"),
- SYM (__xglScreenInfoPtr->createBuffer, "__MESA_createBuffer"),
- SYM (__xglExtensionInfo->resetExtension,
- "__MESA_resetExtension"),
- SYM (__xglExtensionInfo->initVisuals, "__MESA_initVisuals"),
- SYM (__xglExtensionInfo->setVisualConfigs,
- "__MESA_setVisualConfigs"),
-
- };
-
-
- if (!xglLookupSymbols (glCoreHandle, sym,
- sizeof (sym) / sizeof (sym[0])))
- {
- xglUnloadModule (glCoreHandle);
- glCoreHandle = 0;
-
return FALSE;
- }
- }
-
- if (!xglLoadHashFuncs (glCoreHandle))
- {
- xglUnloadModule (glCoreHandle);
- glCoreHandle = 0;
}
}
@@ -247,14 +199,18 @@ xglUnloadGLXModules (void)
xglUnloadModule (glXHandle);
glXHandle = 0;
}
-
- if (glCoreHandle)
- {
- xglUnloadModule (glCoreHandle);
- glCoreHandle = 0;
- }
#endif
}
+void
+xglEnterServer(void)
+{
+}
+
+void
+xglLeaveServer(void)
+{
+}
+
#endif
diff --git a/hw/xgl/xglglx.h b/hw/xgl/xglglx.h
index d895f4262..bcfc552e3 100644
--- a/hw/xgl/xglglx.h
+++ b/hw/xgl/xglglx.h
@@ -29,35 +29,36 @@
#include "glxserver.h"
#include "glxscreens.h"
+#include "glxutil.h"
#include "glxext.h"
#include "glapitable.h"
-
typedef struct _xglGLXFunc {
- void (*extensionInit) (void);
- void (*setVisualConfigs) (int nconfigs,
- __GLXvisualConfig *configs,
- void **privates);
- void (*wrapInitVisuals) (miInitVisualsProcPtr *initVisuals);
- int (*initVisuals) (VisualPtr *visualp,
- DepthPtr *depthp,
- int *nvisualp,
- int *ndepthp,
- int *rootDepthp,
- VisualID *defaultVisp,
- unsigned long sizes,
- int bitsPerRGB,
- int preferredVis);
-
+ void (*extensionInit) (void);
+ void (*setVisualConfigs) (int nconfigs,
+ __GLXvisualConfig *configs,
+ void **privates);
+ void (*wrapInitVisuals) (miInitVisualsProcPtr *initVisuals);
+ int (*initVisuals) (VisualPtr *visualp,
+ DepthPtr *depthp,
+ int *nvisualp,
+ int *ndepthp,
+ int *rootDepthp,
+ VisualID *defaultVisp,
+ unsigned long sizes,
+ int bitsPerRGB,
+ int preferredVis);
void (*flushContextCache) (void);
- void *(*DDXExtensionInfo) (void);
- void *(*DDXScreenInfo) (void);
- void (*setRenderTables) (struct _glapi_table *table);
- void (*copy_visual_to_context_mode)( __GLcontextModes *mode, const __GLXvisualConfig *config );
- __GLcontextModes *(*context_modes_create)( unsigned count, size_t minimum_size );
- void (*context_modes_destroy)( __GLcontextModes * modes );
- GLint (*convert_from_x_visual_type)( int visualType );
- GLint (*convert_to_x_visual_type)( int visualType );
+ void (*setRenderTables) (struct _glapi_table *table);
+ void (*pushProvider) (__GLXprovider *provider);
+ void (*screenInit) (__GLXscreen *screen, ScreenPtr pScreen);
+ void (*screenDestroy) (__GLXscreen *screen);
+ GLboolean (*drawableInit) (__GLXdrawable *drawable,
+ __GLXscreen *screen,
+ DrawablePtr pDrawable,
+ int type,
+ XID drawId,
+ __GLcontextModes *modes);
} xglGLXFuncRec, *xglGLXFuncPtr;
extern xglGLXFuncRec __xglGLXFunc;
diff --git a/hw/xgl/xglinit.c b/hw/xgl/xglinit.c
index e0c9e7ded..d915c91d8 100644
--- a/hw/xgl/xglinit.c
+++ b/hw/xgl/xglinit.c
@@ -44,6 +44,8 @@ xglScreenInfoRec xglScreenInfo = {
FALSE,
XGL_DEFAULT_PBO_MASK,
FALSE,
+ FALSE,
+ FilterBilinear,
{
{ FALSE, FALSE, { 0, 0, 0, 0 } },
{ FALSE, FALSE, { 0, 0, 0, 0 } },
@@ -68,7 +70,7 @@ typedef struct _xglDDXFunc {
void (*initInput) (int argc,
char **argv);
Bool (*legalModifier) (unsigned int key,
- DevicePtr pDev);
+ DeviceIntPtr pDev);
void (*processInputEvents) (void);
void (*useMsg) (void);
int (*processArgument) (int argc,
@@ -99,10 +101,8 @@ void *symTab[] = {
SYMFUNC (mieqInit),
SYMFUNC (mieqProcessInputEvents),
SYMFUNC (miPointerAbsoluteCursor),
- SYMFUNC (miRegisterPointerDevice),
SYMFUNC (miPointerWarpCursor),
SYMFUNC (miDCInitialize),
- SYMFUNC (miPointerAbsoluteCursor),
SYMFUNC (miPointerUpdate),
SYMFUNC (miRegisterRedirectBorderClipProc)
};
diff --git a/hw/xgl/xglinput.c b/hw/xgl/xglinput.c
index 9499fcf1f..e9278a48f 100644
--- a/hw/xgl/xglinput.c
+++ b/hw/xgl/xglinput.c
@@ -51,9 +51,9 @@ xglMouseProc (DeviceIntPtr pDevice,
InitPointerDeviceStruct (pDev,
map,
NUM_BUTTONS,
- miPointerGetMotionEvents,
+ GetMotionHistory,
(PtrCtrlProcPtr) NoopDDA,
- miPointerGetMotionBufferSize ());
+ GetMotionHistorySize (), 2);
break;
case DEVICE_ON:
pDev->on = TRUE;
@@ -76,6 +76,11 @@ xglBell (int volume,
}
void
+DDXRingBell(int volume, int pitch, int duration)
+{
+}
+
+void
xglKbdCtrl (DeviceIntPtr pDevice,
KeybdCtrl *ctrl)
{
@@ -258,6 +263,5 @@ xglInitInput (int argc, char **argv)
RegisterPointerDevice (pPointer);
RegisterKeyboardDevice (pKeyboard);
- miRegisterPointerDevice (screenInfo.screens[0], pPointer);
- mieqInit (&pKeyboard->public, &pPointer->public);
+ mieqInit ();
}
diff --git a/hw/xgl/xglparse.c b/hw/xgl/xglparse.c
index 5292692a4..983ee674c 100644
--- a/hw/xgl/xglparse.c
+++ b/hw/xgl/xglparse.c
@@ -188,12 +188,25 @@ xglUseMsg (void)
ErrorF ("-yinverted Y is upside-down\n");
ErrorF ("-lines "
"accelerate lines that are not vertical or horizontal\n");
+ ErrorF ("-noyuv "
+ "turns off hardware color-space conversion of YUV data\n");
+
+#ifdef XV
+ ErrorF ("-xvfilter [nearest|linear] set xvideo filter\n");
+#endif
+
ErrorF ("-vbo "
"use vertex buffer objects for streaming of vertex data\n");
ErrorF ("-pbomask [1|4|8|16|32] "
"set bpp's to use with pixel buffer objects\n");
ErrorF ("-accel TYPE[@WIDTH[/MIN]xHEIGHT[/MIN]][:METHOD] "
"offscreen acceleration\n");
+
+#ifdef XEVDEV
+ ErrorF ("-kbd file evdev file to read keyboard events\n");
+ ErrorF ("-ptr file evdev file to read pointer events\n");
+#endif
+
}
int
@@ -225,6 +238,29 @@ xglProcessArgument (int argc,
xglScreenInfo.lines = TRUE;
return 1;
}
+ else if (!strcmp (argv[i], "-noyuv"))
+ {
+ xglScreenInfo.noYuv = TRUE;
+ return 1;
+ }
+
+#ifdef XV
+ else if (!strcmp (argv[i], "-xvfilter"))
+ {
+ if ((i + 1) < argc)
+ {
+ if (!strcasecmp (argv[i + 1], "nearest"))
+ xglScreenInfo.xvFilter = FilterNearest;
+ else if (!strcasecmp (argv[i + 1], "linear"))
+ xglScreenInfo.xvFilter = FilterBilinear;
+ }
+ else
+ return 1;
+
+ return 2;
+ }
+#endif
+
else if (!strcmp (argv[i], "-vbo"))
{
xglScreenInfo.geometryUsage = GEOMETRY_USAGE_STREAM;
@@ -253,5 +289,32 @@ xglProcessArgument (int argc,
return 2;
}
+#ifdef XEVDEV
+ else if (!strcmp (argv[i], "-kbd"))
+ {
+ if ((i + 1) < argc)
+ {
+ kbdEvdevFile = argv[i + 1];
+ useEvdev = TRUE;
+ }
+ else
+ return 1;
+
+ return 2;
+ }
+ else if (!strcmp (argv[i], "-ptr"))
+ {
+ if ((i + 1) < argc)
+ {
+ ptrEvdevFile = argv[i + 1];
+ useEvdev = TRUE;
+ }
+ else
+ return 1;
+
+ return 2;
+ }
+#endif
+
return 0;
}
diff --git a/hw/xgl/xglscreen.c b/hw/xgl/xglscreen.c
index 47ed34508..94307f0de 100644
--- a/hw/xgl/xglscreen.c
+++ b/hw/xgl/xglscreen.c
@@ -118,6 +118,7 @@ xglScreenInit (ScreenPtr pScreen)
xglScreenPtr pScreenPriv;
xglVisualPtr v;
int i, depth, bpp = 0;
+ int dpiX, dpiY;
#ifdef RENDER
PictureScreenPtr pPictureScreen;
@@ -151,6 +152,37 @@ xglScreenInit (ScreenPtr pScreen)
xglSetVisualTypes (screenInfo.formats[i].depth, 0, 0, 0, 0);
}
+ fbSetVisualTypesAndMasks (depth, (1 << TrueColor),
+ v->pPixel->bitsPerRGB,
+ v->pPixel->masks.red_mask,
+ v->pPixel->masks.green_mask,
+ v->pPixel->masks.blue_mask);
+
+ for (i = 0; i < screenInfo.numPixmapFormats; i++)
+ {
+ Pixel rm = 0, gm = 0, bm = 0;
+ int bitsPerRGB = 0;
+
+ if (screenInfo.formats[i].depth == depth)
+ continue;
+
+ for (v = xglVisuals; v; v = v->next)
+ {
+ if (v->pPixel->depth == screenInfo.formats[i].depth)
+ {
+ rm = v->pPixel->masks.red_mask;
+ gm = v->pPixel->masks.green_mask;
+ bm = v->pPixel->masks.blue_mask;
+
+ bitsPerRGB = v->pPixel->bitsPerRGB;
+ break;
+ }
+ }
+
+ fbSetVisualTypesAndMasks (screenInfo.formats[i].depth,
+ 0, bitsPerRGB, rm, gm, bm);
+ }
+
pScreenPriv->pVisual = 0;
#ifdef GLXEXT
@@ -172,14 +204,31 @@ xglScreenInit (ScreenPtr pScreen)
pScreenPriv->yInverted = xglScreenInfo.yInverted;
pScreenPriv->pboMask = xglScreenInfo.pboMask;
pScreenPriv->lines = xglScreenInfo.lines;
+ pScreenPriv->noYuv = xglScreenInfo.noYuv;
+ pScreenPriv->xvFilter = xglScreenInfo.xvFilter;
pScreenPriv->accel = xglScreenInfo.accel;
- if (monitorResolution == 0)
- monitorResolution = XGL_DEFAULT_DPI;
+ if (monitorResolution)
+ {
+ dpiX = dpiY = monitorResolution;
+ }
+ else
+ {
+ dpiX = xglScreenInfo.widthMm;
+ dpiY = xglScreenInfo.heightMm;
+
+ if (dpiX && dpiY)
+ {
+ dpiX = (xglScreenInfo.width * 254 + dpiX * 5) / (dpiX * 10);
+ dpiY = (xglScreenInfo.height * 254 + dpiY * 5) / (dpiY * 10);
+ }
+ else
+ dpiX = dpiY = XGL_DEFAULT_DPI;
+ }
if (!fbSetupScreen (pScreen, NULL,
xglScreenInfo.width, xglScreenInfo.height,
- monitorResolution, monitorResolution,
+ dpiX, dpiY,
xglScreenInfo.width, bpp))
return FALSE;
@@ -190,7 +239,7 @@ xglScreenInit (ScreenPtr pScreen)
if (!fbFinishScreenInit (pScreen, NULL,
xglScreenInfo.width, xglScreenInfo.height,
- monitorResolution, monitorResolution,
+ dpiX, dpiY,
xglScreenInfo.width, bpp))
return FALSE;
@@ -213,6 +262,7 @@ xglScreenInit (ScreenPtr pScreen)
XGL_SCREEN_WRAP (CreateGC, xglCreateGC);
+#if 0
pScreen->ConstrainCursor = xglConstrainCursor;
pScreen->CursorLimits = xglCursorLimits;
pScreen->DisplayCursor = xglDisplayCursor;
@@ -220,6 +270,7 @@ xglScreenInit (ScreenPtr pScreen)
pScreen->UnrealizeCursor = xglUnrealizeCursor;
pScreen->RecolorCursor = xglRecolorCursor;
pScreen->SetCursorPosition = xglSetCursorPosition;
+#endif
pScreen->ModifyPixmapHeader = xglModifyPixmapHeader;
diff --git a/include/xgl-config.h.in b/include/xgl-config.h.in
index 877d179c4..b708a93cf 100644
--- a/include/xgl-config.h.in
+++ b/include/xgl-config.h.in
@@ -7,6 +7,9 @@
#include <dix-config.h>
+/* Building XGL server */
+#undef XGLServer
+
/* Use loadable XGL modules. */
#undef XGL_MODULAR
diff --git a/mi/miinitext.c b/mi/miinitext.c
index 3c55eebb3..cc98bd8f6 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -27,13 +27,13 @@ Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
All Rights Reserved
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
+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
+both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Digital not be
used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
+software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
@@ -585,7 +585,7 @@ InitExtensions(argc, argv)
if (!noXCMiscExtension) XCMiscExtensionInit();
#endif
#ifdef XRECORD
- if (!noTestExtensions) RecordExtensionInit();
+ if (!noTestExtensions) RecordExtensionInit();
#endif
#ifdef DBE
if (!noDbeExtension) DbeExtensionInit();
@@ -717,10 +717,10 @@ static ExtensionModule staticExtensions[] = {
#endif
#ifdef XEVIE
{ XevieExtensionInit, "XEVIE", &noXevieExtension, NULL },
-#endif
+#endif
{ NULL, NULL, NULL, NULL, NULL }
};
-
+
/*ARGSUSED*/
void
InitExtensions(argc, argv)
@@ -743,8 +743,8 @@ InitExtensions(argc, argv)
for (i = 0; ExtensionModuleList[i].name != NULL; i++) {
ext = &ExtensionModuleList[i];
- if (ext->initFunc != NULL &&
- (ext->disablePtr == NULL ||
+ if (ext->initFunc != NULL &&
+ (ext->disablePtr == NULL ||
(ext->disablePtr != NULL && !*ext->disablePtr))) {
(ext->initFunc)();
}
diff --git a/randr/randrstr.h b/randr/randrstr.h
index e8358bc0c..9ae05da68 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -55,9 +55,11 @@
#define RANDR_10_INTERFACE 1
#define RANDR_12_INTERFACE 1
+#ifndef _XRANDR_H_
typedef XID RRMode;
typedef XID RROutput;
typedef XID RRCrtc;
+#endif
extern int RREventBase, RRErrorBase;
diff --git a/render/picture.c b/render/picture.c
index 35e2a28b3..e1a7f1da6 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -16,7 +16,7 @@
* 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
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Keith Packard, SuSE, Inc.
@@ -182,14 +182,10 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
formats[nformats].format = PICT_a1;
formats[nformats].depth = 1;
nformats++;
- formats[nformats].format = PICT_FORMAT(BitsPerPixel(8),
- PICT_TYPE_A,
- 8, 0, 0, 0);
+ formats[nformats].format = PICT_a8;
formats[nformats].depth = 8;
nformats++;
- formats[nformats].format = PICT_FORMAT(BitsPerPixel(4),
- PICT_TYPE_A,
- 4, 0, 0, 0);
+ formats[nformats].format = PICT_a4;
formats[nformats].depth = 4;
nformats++;
formats[nformats].format = PICT_a8r8g8b8;
@@ -226,7 +222,7 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
type = PICT_TYPE_ARGB;
}
else if (pVisual->offsetRed == 0 &&
- pVisual->offsetGreen == r &&
+ pVisual->offsetGreen == r &&
pVisual->offsetBlue == r + g)
{
type = PICT_TYPE_ABGR;
@@ -276,7 +272,7 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
PICT_x1b5g5r5, pDepth->depth);
}
/* depth 16 formats */
- if (pDepth->depth >= 16)
+ if (pDepth->depth >= 16)
{
nformats = addFormat (formats, nformats,
PICT_a1r5g5b5, pDepth->depth);
@@ -312,7 +308,7 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
break;
}
}
-
+
pFormats = (PictFormatPtr) xalloc (nformats * sizeof (PictFormatRec));
if (!pFormats)
@@ -327,40 +323,40 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
switch (PICT_FORMAT_TYPE(format)) {
case PICT_TYPE_ARGB:
pFormats[f].type = PictTypeDirect;
-
+
pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
if (pFormats[f].direct.alphaMask)
pFormats[f].direct.alpha = (PICT_FORMAT_R(format) +
PICT_FORMAT_G(format) +
PICT_FORMAT_B(format));
-
+
pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
- pFormats[f].direct.red = (PICT_FORMAT_G(format) +
+ pFormats[f].direct.red = (PICT_FORMAT_G(format) +
PICT_FORMAT_B(format));
-
+
pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
pFormats[f].direct.green = PICT_FORMAT_B(format);
-
+
pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
pFormats[f].direct.blue = 0;
break;
case PICT_TYPE_ABGR:
pFormats[f].type = PictTypeDirect;
-
+
pFormats[f].direct.alphaMask = Mask(PICT_FORMAT_A(format));
if (pFormats[f].direct.alphaMask)
pFormats[f].direct.alpha = (PICT_FORMAT_B(format) +
PICT_FORMAT_G(format) +
PICT_FORMAT_R(format));
-
+
pFormats[f].direct.blueMask = Mask(PICT_FORMAT_B(format));
- pFormats[f].direct.blue = (PICT_FORMAT_G(format) +
+ pFormats[f].direct.blue = (PICT_FORMAT_G(format) +
PICT_FORMAT_R(format));
-
+
pFormats[f].direct.greenMask = Mask(PICT_FORMAT_G(format));
pFormats[f].direct.green = PICT_FORMAT_R(format);
-
+
pFormats[f].direct.redMask = Mask(PICT_FORMAT_R(format));
pFormats[f].direct.red = 0;
break;
@@ -373,7 +369,7 @@ PictureCreateDefaultFormats (ScreenPtr pScreen, int *nformatp)
/* remaining fields already set to zero */
break;
-
+
case PICT_TYPE_COLOR:
case PICT_TYPE_GRAY:
pFormats[f].type = PictTypeIndexed;
@@ -463,7 +459,7 @@ PictureSetSubpixelOrder (ScreenPtr pScreen, int subpixel)
return FALSE;
ps->subpixel = subpixel;
return TRUE;
-
+
}
_X_EXPORT int
@@ -475,7 +471,7 @@ PictureGetSubpixelOrder (ScreenPtr pScreen)
return SubPixelUnknown;
return ps->subpixel;
}
-
+
PictFormatPtr
PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual)
{
@@ -513,11 +509,11 @@ PictureMatchVisual (ScreenPtr pScreen, int depth, VisualPtr pVisual)
}
else
{
- if (format->direct.redMask << format->direct.red ==
+ if (format->direct.redMask << format->direct.red ==
pVisual->redMask &&
- format->direct.greenMask << format->direct.green ==
+ format->direct.greenMask << format->direct.green ==
pVisual->greenMask &&
- format->direct.blueMask << format->direct.blue ==
+ format->direct.blueMask << format->direct.blue ==
pVisual->blueMask)
{
return format;
@@ -572,7 +568,7 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
PictureScreenPtr ps;
int n;
CARD32 type, a, r, g, b;
-
+
if (PictureGeneration != serverGeneration)
{
PictureType = CreateNewResourceType (FreePicture);
@@ -602,6 +598,7 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
xfree (formats);
return FALSE;
}
+ a = r = g = b = 0;
if (formats[n].type == PictTypeIndexed)
{
VisualPtr pVisual = PictureFindVisual (pScreen, formats[n].index.vid);
@@ -609,9 +606,8 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
type = PICT_TYPE_COLOR;
else
type = PICT_TYPE_GRAY;
- a = r = g = b = 0;
}
- else
+ else if (formats[n].type == PictTypeDirect)
{
if ((formats[n].direct.redMask|
formats[n].direct.blueMask|
@@ -626,6 +622,10 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
g = Ones (formats[n].direct.greenMask);
b = Ones (formats[n].direct.blueMask);
}
+ else
+ {
+ type = PICT_FORMAT_TYPE (formats[n].format);
+ }
formats[n].format = PICT_FORMAT(0,type,a,r,g,b);
}
ps = (PictureScreenPtr) xalloc (sizeof (PictureScreenRec));
@@ -639,7 +639,7 @@ PictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
ps->formats = formats;
ps->fallback = formats;
ps->nformats = nformats;
-
+
ps->filters = 0;
ps->nfilters = 0;
ps->filterAliases = 0;
@@ -743,7 +743,7 @@ CreatePicture (Picture pid,
}
SetPictureToDefaults (pPicture);
-
+
if (vmask)
*error = ChangePicture (pPicture, vmask, vlist, 0, client);
else
@@ -803,8 +803,8 @@ PictureGradientColor (PictGradientStopPtr stop1,
CARD32 current_color, next_color;
int dist, idist;
- current_color = xRenderColorToCard32 (stop1->color);
- next_color = xRenderColorToCard32 (stop2->color);
+ current_color = stop1->color;
+ next_color = stop2->color;
dist = (int) (256 * (x - stop1->x) / (stop2->x - stop1->x));
idist = 256 - dist;
@@ -843,7 +843,7 @@ static void initGradient(SourcePictPtr pGradient, int stopCount,
for (i = 0; i < stopCount; ++i) {
pGradient->gradient.stops[i].x = stopPoints[i];
- pGradient->gradient.stops[i].color = stopColors[i];
+ pGradient->gradient.stops[i].color = xRenderColorToCard32 (stopColors[i]);
}
pGradient->gradient.class = SourcePictClassUnknown;
@@ -852,7 +852,7 @@ static void initGradient(SourcePictPtr pGradient, int stopCount,
pGradient->gradient.colorTableSize = 0;
}
-static PicturePtr createSourcePicture(void)
+static PicturePtr createPicture(void)
{
PicturePtr pPicture;
pPicture = (PicturePtr) xalloc(sizeof(PictureRec));
@@ -866,24 +866,57 @@ static PicturePtr createSourcePicture(void)
return pPicture;
}
+static SourcePictPtr createSourcePicture(int type)
+{
+ SourcePictPtr pSourcePict;
+ pSourcePict = (SourcePictPtr) xalloc(sizeof(SourcePict));
+
+ pSourcePict->source.type = type;
+ pSourcePict->source.class = SourcePictClassUnknown;
+ pSourcePict->source.devPrivate.ptr = NULL;
+ pSourcePict->source.Destroy = NULL;
+
+ return pSourcePict;
+}
+
+PicturePtr
+CreateDevicePicture (Picture pid, int *error)
+{
+ PicturePtr pPicture;
+
+ pPicture = createPicture();
+ if (!pPicture) {
+ *error = BadAlloc;
+ return 0;
+ }
+
+ pPicture->id = pid;
+ pPicture->pSourcePict = createSourcePicture(SourcePictTypeOther);
+ if (!pPicture->pSourcePict) {
+ *error = BadAlloc;
+ xfree(pPicture);
+ return 0;
+ }
+ return pPicture;
+}
+
PicturePtr
CreateSolidPicture (Picture pid, xRenderColor *color, int *error)
{
PicturePtr pPicture;
- pPicture = createSourcePicture();
+ pPicture = createPicture();
if (!pPicture) {
*error = BadAlloc;
return 0;
}
pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictSolidFill));
+ pPicture->pSourcePict = createSourcePicture(SourcePictTypeSolidFill);
if (!pPicture->pSourcePict) {
*error = BadAlloc;
xfree(pPicture);
return 0;
}
- pPicture->pSourcePict->type = SourcePictTypeSolidFill;
pPicture->pSourcePict->solidFill.color = xRenderColorToCard32(*color);
return pPicture;
}
@@ -899,21 +932,20 @@ CreateLinearGradientPicture (Picture pid, xPointFixed *p1, xPointFixed *p2,
return 0;
}
- pPicture = createSourcePicture();
+ pPicture = createPicture();
if (!pPicture) {
*error = BadAlloc;
return 0;
}
pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictLinearGradient));
+ pPicture->pSourcePict = createSourcePicture(SourcePictTypeLinear);
if (!pPicture->pSourcePict) {
*error = BadAlloc;
xfree(pPicture);
return 0;
}
- pPicture->pSourcePict->linear.type = SourcePictTypeLinear;
pPicture->pSourcePict->linear.p1 = *p1;
pPicture->pSourcePict->linear.p2 = *p2;
@@ -940,14 +972,14 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
return 0;
}
- pPicture = createSourcePicture();
+ pPicture = createPicture();
if (!pPicture) {
*error = BadAlloc;
return 0;
}
pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictRadialGradient));
+ pPicture->pSourcePict = createSourcePicture(SourcePictTypeRadial);
if (!pPicture->pSourcePict) {
*error = BadAlloc;
xfree(pPicture);
@@ -955,7 +987,6 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
}
radial = &pPicture->pSourcePict->radial;
- radial->type = SourcePictTypeRadial;
radial->c1.x = inner->x;
radial->c1.y = inner->y;
radial->c1.radius = innerRadius;
@@ -968,7 +999,7 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
radial->A = ( radial->cdx * radial->cdx
+ radial->cdy * radial->cdy
- radial->dr * radial->dr);
-
+
initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
if (*error) {
xfree(pPicture);
@@ -988,21 +1019,20 @@ CreateConicalGradientPicture (Picture pid, xPointFixed *center, xFixed angle,
return 0;
}
- pPicture = createSourcePicture();
+ pPicture = createPicture();
if (!pPicture) {
*error = BadAlloc;
return 0;
}
pPicture->id = pid;
- pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictConicalGradient));
+ pPicture->pSourcePict = createSourcePicture(SourcePictTypeConical);
if (!pPicture->pSourcePict) {
*error = BadAlloc;
xfree(pPicture);
return 0;
}
- pPicture->pSourcePict->conical.type = SourcePictTypeConical;
pPicture->pSourcePict->conical.center = *center;
pPicture->pSourcePict->conical.angle = angle;
@@ -1030,7 +1060,7 @@ ChangePicture (PicturePtr pPicture,
BITS32 index2;
int error = 0;
BITS32 maskQ;
-
+
pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
maskQ = vmask;
while (vmask && !error)
@@ -1059,7 +1089,7 @@ ChangePicture (PicturePtr pPicture,
case CPAlphaMap:
{
PicturePtr pAlpha;
-
+
if (vlist)
{
Picture pid = NEXT_VAL(Picture);
@@ -1263,7 +1293,7 @@ SetPictureClipRects (PicturePtr pPicture,
nRect, rects, CT_UNSORTED);
if (!clientClip)
return BadAlloc;
- result =(*ps->ChangePictureClip) (pPicture, CT_REGION,
+ result =(*ps->ChangePictureClip) (pPicture, CT_REGION,
(pointer) clientClip, 0);
if (result == Success)
{
@@ -1319,27 +1349,22 @@ SetPictureClipRegion (PicturePtr pPicture,
return result;
}
-static Bool
-transformIsIdentity(PictTransform *t)
-{
- return ((t->matrix[0][0] == t->matrix[1][1]) &&
- (t->matrix[0][0] == t->matrix[2][2]) &&
- (t->matrix[0][0] != 0) &&
- (t->matrix[0][1] == 0) &&
- (t->matrix[0][2] == 0) &&
- (t->matrix[1][0] == 0) &&
- (t->matrix[1][2] == 0) &&
- (t->matrix[2][0] == 0) &&
- (t->matrix[2][1] == 0));
-}
int
SetPictureTransform (PicturePtr pPicture,
PictTransform *transform)
{
- if (transform && transformIsIdentity (transform))
+ static const PictTransform identity = { {
+ { xFixed1, 0x00000, 0x00000 },
+ { 0x00000, xFixed1, 0x00000 },
+ { 0x00000, 0x00000, xFixed1 },
+ } };
+ PictureScreenPtr ps = pPicture->pDrawable ? GetPictureScreen(pPicture->pDrawable->pScreen) : 0;
+ int result = 0;
+
+ if (transform && memcmp (transform, &identity, sizeof (PictTransform)) == 0)
transform = 0;
-
+
if (transform)
{
if (!pPicture->transform)
@@ -1359,17 +1384,10 @@ SetPictureTransform (PicturePtr pPicture,
}
}
pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT;
+ if (ps)
+ result = (*ps->ChangePictureTransform) (pPicture, transform);
- if (pPicture->pDrawable != NULL) {
- int result;
- PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
-
- result = (*ps->ChangePictureTransform) (pPicture, transform);
-
- return result;
- }
-
- return Success;
+ return result;
}
void
@@ -1488,19 +1506,11 @@ FreePicture (pointer value,
if (pPicture->transform)
xfree (pPicture->transform);
- if (pPicture->pSourcePict)
- {
- if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
- xfree(pPicture->pSourcePict->linear.stops);
-
- xfree(pPicture->pSourcePict);
- }
-
if (pPicture->pDrawable)
{
ScreenPtr pScreen = pPicture->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pScreen);
-
+
if (pPicture->alphaMap)
FreePicture ((pointer) pPicture->alphaMap, (XID) 0);
(*ps->DestroyPicture) (pPicture);
@@ -1560,7 +1570,7 @@ ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst)
pDst->alphaMap == NULL;
/* TODO, maybe: Conjoint and Disjoint op reductions? */
-
+
/* Deal with simplifications where the source alpha is always 1. */
if (no_src_alpha)
{
@@ -1648,7 +1658,7 @@ CompositePicture (CARD8 op,
CARD16 height)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pSrc);
if (pMask)
ValidatePicture (pMask);
@@ -1680,7 +1690,7 @@ CompositeRects (CARD8 op,
xRectangle *rects)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pDst);
(*ps->CompositeRects) (op, pDst, color, nRect, rects);
}
@@ -1696,7 +1706,7 @@ CompositeTrapezoids (CARD8 op,
xTrapezoid *traps)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->Trapezoids) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntrap, traps);
@@ -1713,7 +1723,7 @@ CompositeTriangles (CARD8 op,
xTriangle *triangles)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->Triangles) (op, pSrc, pDst, maskFormat, xSrc, ySrc, ntriangles, triangles);
@@ -1730,7 +1740,7 @@ CompositeTriStrip (CARD8 op,
xPointFixed *points)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->TriStrip) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points);
@@ -1747,7 +1757,7 @@ CompositeTriFan (CARD8 op,
xPointFixed *points)
{
PictureScreenPtr ps = GetPictureScreen(pDst->pDrawable->pScreen);
-
+
ValidatePicture (pSrc);
ValidatePicture (pDst);
(*ps->TriFan) (op, pSrc, pDst, maskFormat, xSrc, ySrc, npoints, points);
@@ -1761,7 +1771,7 @@ AddTraps (PicturePtr pPicture,
xTrap *traps)
{
PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen);
-
+
ValidatePicture (pPicture);
(*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
}
@@ -1809,7 +1819,7 @@ PictureTransformPoint (PictTransformPtr transform,
v = 0;
for (i = 0; i < 3; i++)
{
- partial = ((xFixed_48_16) transform->matrix[j][i] *
+ partial = ((xFixed_48_16) transform->matrix[j][i] *
(xFixed_48_16) vector->vector[i]);
v += partial >> 16;
}
diff --git a/render/picture.h b/render/picture.h
index 045b29944..501d49475 100644
--- a/render/picture.h
+++ b/render/picture.h
@@ -60,6 +60,8 @@ typedef struct _Picture *PicturePtr;
#define PICT_TYPE_ABGR PIXMAN_TYPE_ABGR
#define PICT_TYPE_COLOR PIXMAN_TYPE_COLOR
#define PICT_TYPE_GRAY PIXMAN_TYPE_GRAY
+#define PICT_TYPE_YUY2 PIXMAN_TYPE_YUY2
+#define PICT_TYPE_YV12 PIXMAN_TYPE_YV12
#define PICT_FORMAT_COLOR(f) PIXMAN_FORMAT_COLOR(f)
@@ -115,7 +117,11 @@ typedef enum _PictFormatShort {
/* 1bpp formats */
PICT_a1 = PIXMAN_a1,
- PICT_g1 = PIXMAN_g1
+ PICT_g1 = PIXMAN_g1,
+
+/* YUV formats */
+ PICT_yuy2 = PIXMAN_yuy2,
+ PICT_yv12 = PIXMAN_yv12
} PictFormatShort;
/*
diff --git a/render/picturestr.h b/render/picturestr.h
index acd15c7fe..e99fb2902 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -29,6 +29,8 @@
#include "resource.h"
#include "privates.h"
+#define PictTypeOther 0xff
+
typedef struct _DirectFormat {
CARD16 red, redMask;
CARD16 green, greenMask;
@@ -56,30 +58,44 @@ typedef struct _PictFormat {
typedef struct pixman_vector PictVector, *PictVectorPtr;
typedef struct pixman_transform PictTransform, *PictTransformPtr;
+typedef void (*DestroySourcePictProcPtr) (PicturePtr pPicture);
+
#define PICT_GRADIENT_STOPTABLE_SIZE 1024
#define SourcePictTypeSolidFill 0
-#define SourcePictTypeLinear 1
-#define SourcePictTypeRadial 2
-#define SourcePictTypeConical 3
+#define SourcePictTypeLinear 1
+#define SourcePictTypeRadial 2
+#define SourcePictTypeConical 3
+#define SourcePictTypeOther 4
#define SourcePictClassUnknown 0
#define SourcePictClassHorizontal 1
#define SourcePictClassVertical 2
-typedef struct _PictSolidFill {
+typedef struct _PictSource {
unsigned int type;
unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
+} PictSourceRec, *PictSourcePtr;
+
+typedef struct _PictSolidFill {
+ unsigned int type;
+ unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
CARD32 color;
} PictSolidFill, *PictSolidFillPtr;
typedef struct _PictGradientStop {
xFixed x;
- xRenderColor color;
+ CARD32 color;
} PictGradientStop, *PictGradientStopPtr;
typedef struct _PictGradient {
- unsigned int type;
- unsigned int class;
+ unsigned int type;
+ unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
int nstops;
PictGradientStopPtr stops;
int stopRange;
@@ -88,8 +104,10 @@ typedef struct _PictGradient {
} PictGradient, *PictGradientPtr;
typedef struct _PictLinearGradient {
- unsigned int type;
- unsigned int class;
+ unsigned int type;
+ unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
int nstops;
PictGradientStopPtr stops;
int stopRange;
@@ -106,8 +124,10 @@ typedef struct _PictCircle {
} PictCircle, *PictCirclePtr;
typedef struct _PictRadialGradient {
- unsigned int type;
- unsigned int class;
+ unsigned int type;
+ unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
int nstops;
PictGradientStopPtr stops;
int stopRange;
@@ -122,8 +142,10 @@ typedef struct _PictRadialGradient {
} PictRadialGradient, *PictRadialGradientPtr;
typedef struct _PictConicalGradient {
- unsigned int type;
- unsigned int class;
+ unsigned int type;
+ unsigned int class;
+ DevUnion devPrivate;
+ DestroySourcePictProcPtr Destroy;
int nstops;
PictGradientStopPtr stops;
int stopRange;
@@ -135,6 +157,7 @@ typedef struct _PictConicalGradient {
typedef union _SourcePict {
unsigned int type;
+ PictSourceRec source;
PictSolidFill solidFill;
PictGradient gradient;
PictLinearGradient linear;
@@ -638,6 +661,10 @@ PixmanImageFromPicture (PicturePtr pPict,
Bool hasClip);
PicturePtr
+CreateDevicePicture (Picture pid,
+ int *error);
+
+PicturePtr
CreateSolidPicture (Picture pid,
xRenderColor *color,
int *error);
diff --git a/render/render.c b/render/render.c
index f03f54a2b..b6d551083 100644
--- a/render/render.c
+++ b/render/render.c
@@ -361,7 +361,14 @@ ProcRenderQueryPictFormats (ClientPtr client)
}
ps = GetPictureScreenIfSet(pScreen);
if (ps)
- nformat += ps->nformats;
+ {
+ for (d = 0; d < ps->nformats; d++)
+ {
+ if (ps->formats[d].type == PictTypeIndexed ||
+ ps->formats[d].type == PictTypeDirect)
+ nformat++;
+ }
+ }
}
if (pRenderClient->major_version == 0 && pRenderClient->minor_version < 6)
numSubpixel = 0;
@@ -398,6 +405,10 @@ ProcRenderQueryPictFormats (ClientPtr client)
nformat < ps->nformats;
nformat++, pFormat++)
{
+ if (pFormat->type != PictTypeIndexed &&
+ pFormat->type != PictTypeDirect)
+ continue;
+
pictForm->id = pFormat->id;
pictForm->type = pFormat->type;
pictForm->depth = pFormat->depth;
diff --git a/xgl/Makefile.am b/xgl/Makefile.am
new file mode 100644
index 000000000..b386ce036
--- /dev/null
+++ b/xgl/Makefile.am
@@ -0,0 +1,40 @@
+noinst_LTLIBRARIES = libxgl.la
+
+INCLUDES = -I@MESA_SOURCE@/include \
+ -I$(top_srcdir)/GL/mesa/glapi \
+ -I$(top_srcdir)/GL/glx \
+ -I$(top_srcdir)/GL/include \
+ -I$(top_srcdir)/hw/xfree86/os-support \
+ -I$(top_srcdir)/hw/xfree86/os-support/bus \
+ -I$(top_srcdir)/hw/xfree86/common
+
+# -DXFree86Server is required because the X11 driver in Mesa thinks that
+# symbol means "being built in the server"
+AM_CFLAGS = \
+ @DIX_CFLAGS@ \
+ @LIBDRM_CFLAGS@ \
+ @DRIPROTO_CFLAGS@ \
+ $(XGL_CFLAGS) \
+ @GLX_DEFINES@ \
+ -DXFree86Server
+
+libxgl_la_SOURCES = \
+ xgl.h \
+ xglarea.c \
+ xglcmap.c \
+ xglcompose.c \
+ xglcopy.c \
+ xglfill.c \
+ xglgc.c \
+ xglgeometry.c \
+ xglget.c \
+ xglglyph.c \
+ xglpict.c \
+ xglpixmap.c \
+ xglshm.c \
+ xglsolid.c \
+ xglsync.c \
+ xgltile.c \
+ xgltrap.c \
+ xglwindow.c \
+ xglxv.c
diff --git a/hw/xgl/xgl.h b/xgl/xgl.h
index 03dc90c70..56309cb3c 100644
--- a/hw/xgl/xgl.h
+++ b/xgl/xgl.h
@@ -28,6 +28,11 @@
#include <xgl-config.h>
+#include "glxserver.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+
#include <X11/X.h>
#define NEED_EVENTS
#include <X11/Xproto.h>
@@ -102,6 +107,8 @@ typedef struct _xglScreenInfo {
Bool yInverted;
int pboMask;
Bool lines;
+ Bool noYuv;
+ char *xvFilter;
xglScreenAccelInfoRec accel;
} xglScreenInfoRec, *xglScreenInfoPtr;
@@ -124,6 +131,7 @@ typedef struct _xglVisual {
} xglVisualRec, *xglVisualPtr;
extern xglVisualPtr xglVisuals;
+extern xglPixelFormatRec xglPixelFormats[];
#define xglAreaAvailable 0
#define xglAreaDivided 1
@@ -256,6 +264,8 @@ typedef struct _xglScreen {
Bool yInverted;
int pboMask;
Bool lines;
+ Bool noYuv;
+ char *xvFilter;
xglGeometryRec scratchGeometry;
xglScreenAccelInfoRec accel;
@@ -369,6 +379,7 @@ typedef struct _xglXvPort {
PixmapPtr pPixmap;
PicturePtr pSrc;
PicturePtr pDst;
+ PicturePtr pTmp;
} xglXvPortRec, *xglXvPortPtr;
#endif
@@ -500,6 +511,21 @@ xglKbdCtrl (DeviceIntPtr pDevice,
void
xglInitInput (int argc, char **argv);
+#ifdef XEVDEV
+
+extern Bool useEvdev;
+extern char *kbdEvdevFile;
+extern char *ptrEvdevFile;
+
+void
+xglEvdevReadInput (void);
+
+void
+xglWakeupHandler (pointer blockData,
+ int result,
+ pointer pReadMask);
+
+#endif
/* xgloutput.c */
@@ -542,6 +568,9 @@ xglFindVisualWithId (ScreenPtr pScreen,
void
xglClearVisualTypes (void);
+int
+xglNumPixelFormats (void);
+
/* xglparse.c */
@@ -921,6 +950,14 @@ void
xglEnablePixmapAccel (PixmapPtr pPixmap,
xglAccelInfoPtr pAccel);
+Bool
+xglPixmapSurfaceInit (PixmapPtr pPixmap,
+ unsigned long features,
+ int width,
+ int height);
+
+Bool
+xglPixmapCreateDamage (PixmapPtr pPixmap);
/* xglsync.c */
@@ -1471,4 +1508,9 @@ unsigned int
xglHashFindFreeKeyBlock (xglHashTablePtr pTable,
unsigned int numKeys);
+
+void xglLeaveServer(void);
+
+void xglEnterServer(void);
+
#endif /* _XGL_H_ */
diff --git a/hw/xgl/xglarea.c b/xgl/xglarea.c
index cdf652d0f..cdf652d0f 100644
--- a/hw/xgl/xglarea.c
+++ b/xgl/xglarea.c
diff --git a/hw/xgl/xglcmap.c b/xgl/xglcmap.c
index b96308ddf..99593ebd7 100644
--- a/hw/xgl/xglcmap.c
+++ b/xgl/xglcmap.c
@@ -28,7 +28,7 @@
#include "micmap.h"
#include "fb.h"
-static xglPixelFormatRec xglPixelFormats[] = {
+xglPixelFormatRec xglPixelFormats[] = {
{
8, 8,
{
@@ -77,11 +77,14 @@ static xglPixelFormatRec xglPixelFormats[] = {
}
};
-#define NUM_XGL_PIXEL_FORMATS \
- (sizeof (xglPixelFormats) / sizeof (xglPixelFormats[0]))
-
xglVisualPtr xglVisuals = NULL;
+int
+xglNumPixelFormats(void)
+{
+ return (sizeof (xglPixelFormats) / sizeof(xglPixelFormats[0]));
+}
+
void
xglSetVisualTypes (int depth,
int visuals,
@@ -92,7 +95,7 @@ xglSetVisualTypes (int depth,
xglPixelFormatPtr pBestFormat = 0;
int i, rs, gs, bs, diff, bestDiff = 0;
- for (i = 0; i < NUM_XGL_PIXEL_FORMATS; i++)
+ for (i = 0; i < xglNumPixelFormats(); i++)
{
if (xglPixelFormats[i].depth == depth)
{
@@ -133,8 +136,6 @@ xglSetVisualTypes (int depth,
if (pBestFormat)
{
xglVisualPtr new, *prev, v;
- unsigned int bitsPerRGB;
- Pixel rm, gm, bm;
new = xalloc (sizeof (xglVisualRec));
if (!new)
@@ -147,21 +148,9 @@ xglSetVisualTypes (int depth,
new->pPixel = pBestFormat;
new->vid = 0;
- bitsPerRGB = pBestFormat->bitsPerRGB;
-
- rm = pBestFormat->masks.red_mask;
- gm = pBestFormat->masks.green_mask;
- bm = pBestFormat->masks.blue_mask;
-
- fbSetVisualTypesAndMasks (depth, visuals, bitsPerRGB, rm, gm, bm);
-
for (prev = &xglVisuals; (v = *prev); prev = &v->next);
*prev = new;
}
- else
- {
- fbSetVisualTypesAndMasks (depth, 0, 0, 0, 0, 0);
- }
}
Bool
diff --git a/hw/xgl/xglcompose.c b/xgl/xglcompose.c
index 34f7a0c43..0099d0aa9 100644
--- a/hw/xgl/xglcompose.c
+++ b/xgl/xglcompose.c
@@ -175,9 +175,10 @@ xglCompositeGeneral (CARD8 op,
if (!pGeometry)
{
- if (!pSrc->transform && pSrc->filter != PictFilterConvolution)
+ if (pSrc->pDrawable && !pSrc->transform &&
+ pSrc->filter != PictFilterConvolution)
{
- if (pSrc->pDrawable && pSrc->repeatType == RepeatNormal)
+ if (pSrc->repeatType == RepeatNormal)
{
XGL_PIXMAP_PRIV ((PixmapPtr) pSrc->pDrawable);
@@ -261,12 +262,14 @@ xglCompositeGeneral (CARD8 op,
else
GEOMETRY_DISABLE (dst);
+ xglLeaveServer();
glitz_composite (XGL_OPERATOR (op),
src, mask, dst,
xSrc, ySrc,
xMask, yMask,
xDst + dstXoff, yDst + dstYoff,
width, height);
+ xglEnterServer();
glitz_surface_set_clip_region (dst, 0, 0, NULL, 0);
diff --git a/hw/xgl/xglcopy.c b/xgl/xglcopy.c
index d612b332a..a64016337 100644
--- a/hw/xgl/xglcopy.c
+++ b/xgl/xglcopy.c
@@ -64,6 +64,7 @@ xglCopy (DrawablePtr pSrc,
dstXoff, dstYoff,
(glitz_box_t *) pBox, nBox);
+ xglLeaveServer();
glitz_copy_area (src,
dst,
srcXoff + dx,
@@ -72,6 +73,7 @@ xglCopy (DrawablePtr pSrc,
pPixmap->drawable.height - dstYoff,
dstXoff,
dstYoff);
+ xglEnterServer();
glitz_surface_set_clip_region (dst, 0, 0, NULL, 0);
diff --git a/hw/xgl/xglfill.c b/xgl/xglfill.c
index 64759ab2e..a2957b2f0 100644
--- a/hw/xgl/xglfill.c
+++ b/xgl/xglfill.c
@@ -172,6 +172,7 @@ xglFillRect (DrawablePtr pDrawable,
RegionPtr pClip = pGC->pCompositeClip;
BoxPtr pClipBox;
BoxPtr pExtent = REGION_EXTENTS (pGC->pScreen, pClip);
+ int fullX1, fullX2, fullY1, fullY2;
BoxRec part, full;
BoxPtr heapBox = NULL;
BoxRec stackBox[N_STACK_BOX];
@@ -181,21 +182,26 @@ xglFillRect (DrawablePtr pDrawable,
while (nrect--)
{
- full.x1 = prect->x + pDrawable->x;
- full.y1 = prect->y + pDrawable->y;
- full.x2 = full.x1 + (int) prect->width;
- full.y2 = full.y1 + (int) prect->height;
+ fullX1 = prect->x + pDrawable->x;
+ fullY1 = prect->y + pDrawable->y;
+ fullX2 = fullX1 + (int) prect->width;
+ fullY2 = fullY1 + (int) prect->height;
prect++;
- if (full.x1 < pExtent->x1)
- full.x1 = pExtent->x1;
- if (full.y1 < pExtent->y1)
- full.y1 = pExtent->y1;
- if (full.x2 > pExtent->x2)
- full.x2 = pExtent->x2;
- if (full.y2 > pExtent->y2)
- full.y2 = pExtent->y2;
+ if (fullX1 < pExtent->x1)
+ fullX1 = pExtent->x1;
+ if (fullY1 < pExtent->y1)
+ fullY1 = pExtent->y1;
+ if (fullX2 > pExtent->x2)
+ fullX2 = pExtent->x2;
+ if (fullY2 > pExtent->y2)
+ fullY2 = pExtent->y2;
+
+ full.x1 = fullX1;
+ full.y1 = fullY1;
+ full.x2 = fullX2;
+ full.y2 = fullY2;
if (full.x1 >= full.x2 || full.y1 >= full.y2)
continue;
@@ -246,6 +252,7 @@ xglFillSpan (DrawablePtr pDrawable,
RegionPtr pClip = pGC->pCompositeClip;
BoxPtr pClipBox;
BoxPtr pExtent = REGION_EXTENTS (pGC->pScreen, pClip);
+ int fullX1, fullX2, fullY1, fullY2;
BoxRec part, full;
BoxPtr heapBox = NULL;
BoxRec stackBox[N_STACK_BOX];
@@ -255,22 +262,27 @@ xglFillSpan (DrawablePtr pDrawable,
while (n--)
{
- full.x1 = ppt->x;
- full.y1 = ppt->y;
- full.x2 = full.x1 + *pwidth;
- full.y2 = full.y1 + 1;
+ fullX1 = ppt->x;
+ fullY1 = ppt->y;
+ fullX2 = fullX1 + *pwidth;
+ fullY2 = fullY1 + 1;
pwidth++;
ppt++;
- if (full.x1 < pExtent->x1)
- full.x1 = pExtent->x1;
- if (full.y1 < pExtent->y1)
- full.y1 = pExtent->y1;
- if (full.x2 > pExtent->x2)
- full.x2 = pExtent->x2;
- if (full.y2 > pExtent->y2)
- full.y2 = pExtent->y2;
+ if (fullX1 < pExtent->x1)
+ fullX1 = pExtent->x1;
+ if (fullY1 < pExtent->y1)
+ fullY1 = pExtent->y1;
+ if (fullX2 > pExtent->x2)
+ fullX2 = pExtent->x2;
+ if (fullY2 > pExtent->y2)
+ fullY2 = pExtent->y2;
+
+ full.x1 = fullX1;
+ full.y1 = fullY1;
+ full.x2 = fullX2;
+ full.y2 = fullY2;
if (full.x1 >= full.x2 || full.y1 >= full.y2)
continue;
@@ -373,6 +385,7 @@ xglFillLine (DrawablePtr pDrawable,
if (horizontalAndVertical)
{
BoxPtr pClipBox;
+ int fullX1, fullX2, fullY1, fullY2;
BoxRec part, full;
BoxPtr heapBox = NULL;
BoxRec stackBox[N_STACK_BOX];
@@ -403,49 +416,49 @@ xglFillLine (DrawablePtr pDrawable,
{
if (dx > 0)
{
- full.x1 = pt.x + pDrawable->x;
+ fullX1 = pt.x + pDrawable->x;
if (npt || coincidentEndpoints)
- full.x2 = full.x1 + dx;
+ fullX2 = fullX1 + dx;
else
- full.x2 = full.x1 + dx + 1;
+ fullX2 = fullX1 + dx + 1;
}
else
{
- full.x2 = pt.x + pDrawable->x + 1;
+ fullX2 = pt.x + pDrawable->x + 1;
if (npt || coincidentEndpoints)
- full.x1 = full.x2 + dx;
+ fullX1 = fullX2 + dx;
else
- full.x1 = full.x2 + dx - 1;
+ fullX1 = fullX2 + dx - 1;
}
- full.y1 = pt.y + pDrawable->y;
- full.y2 = full.y1 + 1;
+ fullY1 = pt.y + pDrawable->y;
+ fullY2 = fullY1 + 1;
}
else
{
if (dy > 0)
{
- full.y1 = pt.y + pDrawable->y;
+ fullY1 = pt.y + pDrawable->y;
if (npt || coincidentEndpoints)
- full.y2 = full.y1 + dy;
+ fullY2 = fullY1 + dy;
else
- full.y2 = full.y1 + dy + 1;
+ fullY2 = fullY1 + dy + 1;
}
else
{
- full.y2 = pt.y + pDrawable->y + 1;
+ fullY2 = pt.y + pDrawable->y + 1;
if (npt || coincidentEndpoints)
- full.y1 = full.y2 + dy;
+ fullY1 = fullY2 + dy;
else
- full.y1 = full.y2 + dy - 1;
+ fullY1 = fullY2 + dy - 1;
}
- full.x1 = pt.x + pDrawable->x;
- full.x2 = full.x1 + 1;
+ fullX1 = pt.x + pDrawable->x;
+ fullX2 = fullX1 + 1;
}
pt.x += dx;
@@ -453,14 +466,19 @@ xglFillLine (DrawablePtr pDrawable,
ppt++;
- if (full.x1 < pExtent->x1)
- full.x1 = pExtent->x1;
- if (full.y1 < pExtent->y1)
- full.y1 = pExtent->y1;
- if (full.x2 > pExtent->x2)
- full.x2 = pExtent->x2;
- if (full.y2 > pExtent->y2)
- full.y2 = pExtent->y2;
+ if (fullX1 < pExtent->x1)
+ fullX1 = pExtent->x1;
+ if (fullY1 < pExtent->y1)
+ fullY1 = pExtent->y1;
+ if (fullX2 > pExtent->x2)
+ fullX2 = pExtent->x2;
+ if (fullY2 > pExtent->y2)
+ fullY2 = pExtent->y2;
+
+ full.x1 = fullX1;
+ full.y1 = fullY1;
+ full.x2 = fullX2;
+ full.y2 = fullY2;
if (full.x1 >= full.x2 || full.y1 >= full.y2)
continue;
@@ -570,6 +588,7 @@ xglFillSegment (DrawablePtr pDrawable,
if (horizontalAndVertical)
{
BoxPtr pClipBox;
+ int fullX1, fullX2, fullY1, fullY2;
BoxRec part, full;
BoxPtr heapBox = NULL;
BoxRec stackBox[N_STACK_BOX];
@@ -583,49 +602,62 @@ xglFillSegment (DrawablePtr pDrawable,
{
if (pSegInit->x1 < pSegInit->x2)
{
- full.x1 = pSegInit->x1;
- full.x2 = pSegInit->x2;
+ fullX1 = pSegInit->x1;
+ fullX2 = pSegInit->x2;
+ if (pGC->capStyle != CapNotLast)
+ fullX2++;
}
else
{
- full.x1 = pSegInit->x2;
- full.x2 = pSegInit->x1;
+ fullX1 = pSegInit->x2;
+ fullX2 = pSegInit->x1 + 1;
+ if (pGC->capStyle == CapNotLast)
+ fullX1++;
}
- full.x1 += pDrawable->x;
- full.x2 += pDrawable->x + 1;
- full.y1 = pSegInit->y1 + pDrawable->y;
- full.y2 = full.y1 + 1;
+ fullX1 += pDrawable->x;
+ fullX2 += pDrawable->x;
+ fullY1 = pSegInit->y1 + pDrawable->y;
+ fullY2 = fullY1 + 1;
}
else
{
if (pSegInit->y1 < pSegInit->y2)
{
- full.y1 = pSegInit->y1;
- full.y2 = pSegInit->y2;
+ fullY1 = pSegInit->y1;
+ fullY2 = pSegInit->y2;
+ if (pGC->capStyle != CapNotLast)
+ fullY2++;
}
else
{
- full.y1 = pSegInit->y2;
- full.y2 = pSegInit->y1;
+ fullY1 = pSegInit->y2;
+ fullY2 = pSegInit->y1 + 1;
+ if (pGC->capStyle == CapNotLast)
+ fullY1++;
}
- full.y1 += pDrawable->y;
- full.y2 += pDrawable->y + 1;
- full.x1 = pSegInit->x1 + pDrawable->x;
- full.x2 = full.x1 + 1;
+ fullY1 += pDrawable->y;
+ fullY2 += pDrawable->y;
+ fullX1 = pSegInit->x1 + pDrawable->x;
+ fullX2 = fullX1 + 1;
}
pSegInit++;
- if (full.x1 < pExtent->x1)
- full.x1 = pExtent->x1;
- if (full.y1 < pExtent->y1)
- full.y1 = pExtent->y1;
- if (full.x2 > pExtent->x2)
- full.x2 = pExtent->x2;
- if (full.y2 > pExtent->y2)
- full.y2 = pExtent->y2;
+ if (fullX1 < pExtent->x1)
+ fullX1 = pExtent->x1;
+ if (fullY1 < pExtent->y1)
+ fullY1 = pExtent->y1;
+ if (fullX2 > pExtent->x2)
+ fullX2 = pExtent->x2;
+ if (fullY2 > pExtent->y2)
+ fullY2 = pExtent->y2;
+
+ full.x1 = fullX1;
+ full.y1 = fullY1;
+ full.x2 = fullX2;
+ full.y2 = fullY2;
if (full.x1 >= full.x2 || full.y1 >= full.y2)
continue;
diff --git a/hw/xgl/xglgc.c b/xgl/xglgc.c
index 7e7e75134..deb3982a5 100644
--- a/hw/xgl/xglgc.c
+++ b/xgl/xglgc.c
@@ -85,6 +85,9 @@ static const GCOps xglGCOps = {
xglImageGlyphBlt,
xglPolyGlyphBlt,
xglPushPixels
+#ifdef NEED_LINEHELPER
+ , NULL
+#endif
};
void
diff --git a/hw/xgl/xglgeometry.c b/xgl/xglgeometry.c
index 7ab1ba45c..7ab1ba45c 100644
--- a/hw/xgl/xglgeometry.c
+++ b/xgl/xglgeometry.c
diff --git a/hw/xgl/xglget.c b/xgl/xglget.c
index 87bcb0508..893ab2c8d 100644
--- a/hw/xgl/xglget.c
+++ b/xgl/xglget.c
@@ -48,8 +48,10 @@ xglGetImage (DrawablePtr pDrawable,
if (!xglSyncSurface (&pScreenPriv->pScreenPixmap->drawable))
FatalError (XGL_SW_FAILURE_STRING);
+ xglLeaveServer();
glitz_surface_flush (pScreenPriv->surface);
glitz_drawable_finish (pScreenPriv->drawable);
+ xglEnterServer();
}
XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
diff --git a/hw/xgl/xglglyph.c b/xgl/xglglyph.c
index c1a484ac0..c1a484ac0 100644
--- a/hw/xgl/xglglyph.c
+++ b/xgl/xglglyph.c
diff --git a/hw/xgl/xglpict.c b/xgl/xglpict.c
index fee2431b7..c120bb63b 100644
--- a/hw/xgl/xglpict.c
+++ b/xgl/xglpict.c
@@ -234,8 +234,11 @@ xglChangePictureFilter (PicturePtr pPicture,
static void
xglDestroyDevicePicture (PicturePtr pPicture)
{
- if (pPicture->pSourcePict->source.devPrivate.ptr)
+ if (pPicture->pSourcePict->source.devPrivate.ptr) {
+ xglLeaveServer(pPicture->pDrawable->pScreen);
glitz_surface_destroy (pPicture->pSourcePict->source.devPrivate.ptr);
+ xglEnterServer(pPicture->pDrawable->pScreen);
+ }
}
PicturePtr
@@ -270,9 +273,11 @@ xglUpdatePicture (PicturePtr pPicture)
surface = pPixmapPriv->surface;
+ xglLeaveServer(pPicture->pDrawable->pScreen);
+
if (pPixmapPriv->pictureMask & xglPCFillMask)
{
- glitz_surface_set_fill (surface, fillMode[pPicture->repeat]);
+ glitz_surface_set_fill (surface, fillMode[pPicture->repeatType]);
}
if (pPixmapPriv->pictureMask & xglPCFilterMask)
@@ -312,6 +317,8 @@ xglUpdatePicture (PicturePtr pPicture)
glitz_surface_set_dither (surface, pPicture->dither);
}
+ xglEnterServer(pPicture->pDrawable->pScreen);
+
pPixmapPriv->pictureMask &= ~XGL_PICTURE_CHANGES (~0);
}
@@ -405,6 +412,8 @@ xglSyncPicture (ScreenPtr pScreen,
pixel = (CARD32 *) (param + nParam + nStop * 3);
+ xglLeaveServer(pScreen);
+
buffer = glitz_buffer_create_for_data (pixel);
if (!buffer)
{
@@ -450,12 +459,12 @@ xglSyncPicture (ScreenPtr pScreen,
param, nParam + nStop * 3);
break;
case SourcePictTypeRadial:
- param[0] = pPicture->pSourcePict->radial.inner.x;
- param[1] = pPicture->pSourcePict->radial.inner.y;
- param[2] = pPicture->pSourcePict->radial.inner_radius;
- param[3] = pPicture->pSourcePict->radial.outer.x;
- param[4] = pPicture->pSourcePict->radial.outer.y;
- param[5] = pPicture->pSourcePict->radial.outer_radius;
+ param[0] = pPicture->pSourcePict->radial.c1.x;
+ param[1] = pPicture->pSourcePict->radial.c1.y;
+ param[2] = pPicture->pSourcePict->radial.c1.radius;
+ param[3] = pPicture->pSourcePict->radial.c2.x;
+ param[4] = pPicture->pSourcePict->radial.c2.y;
+ param[5] = pPicture->pSourcePict->radial.c2.radius;
glitz_surface_set_filter (surface,
GLITZ_FILTER_RADIAL_GRADIENT,
@@ -463,10 +472,12 @@ xglSyncPicture (ScreenPtr pScreen,
break;
}
- glitz_surface_set_fill (surface, fillMode[pPicture->repeat]);
+ glitz_surface_set_fill (surface, fillMode[pPicture->repeatType]);
glitz_surface_set_transform (surface, (glitz_transform_t *)
pPicture->transform);
+ xglEnterServer(pScreen);
+
pPicture->pSourcePict->gradient.devPrivate.ptr = surface;
pPicture->pSourcePict->gradient.Destroy = xglDestroyDevicePicture;
@@ -784,4 +795,48 @@ xglPictureClipExtents (PicturePtr pPicture,
}
}
+void
+xglCreateSolidAlphaPicture (ScreenPtr pScreen)
+{
+ static xRenderColor solidWhite = { 0xffff, 0xffff, 0xffff, 0xffff };
+ static xRectangle one = { 0, 0, 1, 1 };
+ PixmapPtr pPixmap;
+ PictFormatPtr pFormat;
+ int error;
+ Pixel pixel;
+ GCPtr pGC;
+ XID tmpval[2];
+
+ XGL_SCREEN_PRIV (pScreen);
+
+ pFormat = PictureMatchFormat (pScreen, 32, PICT_a8r8g8b8);
+ if (!pFormat)
+ return;
+
+ pGC = GetScratchGC (pFormat->depth, pScreen);
+ if (!pGC)
+ return;
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, 1, 1, pFormat->depth, 0);
+ if (!pPixmap)
+ return;
+
+ miRenderColorToPixel (pFormat, &solidWhite, &pixel);
+
+ tmpval[0] = GXcopy;
+ tmpval[1] = pixel;
+
+ ChangeGC (pGC, GCFunction | GCForeground, tmpval);
+ ValidateGC (&pPixmap->drawable, pGC);
+ (*pGC->ops->PolyFillRect) (&pPixmap->drawable, pGC, 1, &one);
+ FreeScratchGC (pGC);
+
+ tmpval[0] = xTrue;
+ pScreenPriv->pSolidAlpha = CreatePicture (0, &pPixmap->drawable, pFormat,
+ CPRepeat, tmpval, 0, &error);
+ (*pScreen->DestroyPixmap) (pPixmap);
+
+ if (pScreenPriv->pSolidAlpha)
+ ValidatePicture (pScreenPriv->pSolidAlpha);
+}
#endif
diff --git a/hw/xgl/xglpixmap.c b/xgl/xglpixmap.c
index 8e602cee3..b994db636 100644
--- a/hw/xgl/xglpixmap.c
+++ b/xgl/xglpixmap.c
@@ -75,7 +75,7 @@ xglPixmapDamageReport (DamagePtr pDamage,
}
-static Bool
+Bool
xglPixmapCreateDamage (PixmapPtr pPixmap)
{
XGL_PIXMAP_PRIV (pPixmap);
@@ -156,7 +156,7 @@ xglSetPixmapVisual (PixmapPtr pPixmap,
}
}
-static Bool
+Bool
xglPixmapSurfaceInit (PixmapPtr pPixmap,
unsigned long features,
int width,
@@ -300,8 +300,12 @@ xglFiniPixmap (PixmapPtr pPixmap)
if (pPixmapPriv->drawable)
glitz_drawable_destroy (pPixmapPriv->drawable);
- if (pPixmapPriv->surface)
+ if (pPixmapPriv->surface) {
+ /* leaving because texture destruction can occur and flush primitives */
+ xglLeaveServer();
glitz_surface_destroy (pPixmapPriv->surface);
+ xglEnterServer();
+ }
}
Bool
@@ -567,12 +571,14 @@ xglCreatePixmapSurface (PixmapPtr pPixmap)
if (!pPixmapPriv->pVisual || !pPixmapPriv->pVisual->format.surface)
return FALSE;
+ xglLeaveServer();
pPixmapPriv->surface =
glitz_surface_create (pScreenPriv->drawable,
pPixmapPriv->pVisual->format.surface,
pPixmap->drawable.width,
pPixmap->drawable.height,
0, NULL);
+ xglEnterServer();
if (!pPixmapPriv->surface)
{
pPixmapPriv->pVisual = NULL;
@@ -597,7 +603,7 @@ xglAllocatePixmapBits (PixmapPtr pPixmap, int hint)
height = pPixmap->drawable.height;
bpp = pPixmap->drawable.bitsPerPixel;
- stride = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
+ stride = ((width * bpp + FB_MASK) >> FB_SHIFT) * (int) sizeof (FbBits);
if (stride)
{
diff --git a/hw/xgl/xglshm.c b/xgl/xglshm.c
index 567daa954..567daa954 100644
--- a/hw/xgl/xglshm.c
+++ b/xgl/xglshm.c
diff --git a/hw/xgl/xglsolid.c b/xgl/xglsolid.c
index 8657a9a16..97ef7d180 100644
--- a/hw/xgl/xglsolid.c
+++ b/xgl/xglsolid.c
@@ -67,6 +67,7 @@ xglSolid (DrawablePtr pDrawable,
if (!GEOMETRY_ENABLE (pGeometry, surface))
return FALSE;
+ xglLeaveServer();
glitz_composite (op,
solid, NULL, surface,
0, 0,
@@ -74,6 +75,7 @@ xglSolid (DrawablePtr pDrawable,
x + xOff,
y + yOff,
width, height);
+ xglEnterServer();
glitz_surface_set_clip_region (surface, 0, 0, NULL, 0);
diff --git a/hw/xgl/xglsync.c b/xgl/xglsync.c
index 6b5c00b57..94417a059 100644
--- a/hw/xgl/xglsync.c
+++ b/xgl/xglsync.c
@@ -154,6 +154,7 @@ xglSyncBits (DrawablePtr pDrawable,
glitz_surface_set_clip_region (pPixmapPriv->surface,
0, 0, (glitz_box_t *) pBox, nBox);
+ xglLeaveServer();
glitz_get_pixels (pPixmapPriv->surface,
pExt->x1,
pExt->y1,
@@ -161,6 +162,7 @@ xglSyncBits (DrawablePtr pDrawable,
pExt->y2 - pExt->y1,
&format,
pPixmapPriv->buffer);
+ xglEnterServer();
glitz_surface_set_clip_region (pPixmapPriv->surface, 0, 0, NULL, 0);
}
@@ -206,7 +208,7 @@ xglSyncSurface (DrawablePtr pDrawable)
pRegion = DamageRegion (pPixmapPriv->pDamage);
- if (REGION_NOTEMPTY (pDrawable->pScreen, pRegion))
+ if (pPixmapPriv->surface && REGION_NOTEMPTY (pDrawable->pScreen, pRegion))
{
glitz_pixel_format_t format;
BoxPtr pBox;
@@ -236,9 +238,46 @@ xglSyncSurface (DrawablePtr pDrawable)
format.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN;
}
+ /* If all bits are up to date we can avoid transferring a large set
+ of boxes by transferring the extents box instead. */
+ if (pPixmapPriv->allBits && nBox != 1)
+ {
+ /* This many boxes. It is likely more efficient to always transfer
+ the extents box instead. */
+ if (nBox > 64)
+ {
+ pBox = pExt;
+ nBox = 1;
+ }
+ else
+ {
+ int i, w, e, r = 0;
+
+ for (i = 0; i < nBox; i++)
+ r += (pBox[i].x2 - pBox[i].x1) * (pBox[i].y2 - pBox[i].y1);
+
+ e = (pExt->x2 - pExt->x1) * (pExt->y2 - pExt->y1);
+ w = e - r;
+
+ /* r, is the area of all boxes. e, is the are for the
+ extents. w, is the area that doesn't need to be
+ transferred.
+
+ If w per box is less than 2 times the area of all
+ boxes, transferring the extents has been proved more
+ efficient. */
+ if ((w / nBox) < (r << 1))
+ {
+ pBox = pExt;
+ nBox = 1;
+ }
+ }
+ }
+
glitz_surface_set_clip_region (pPixmapPriv->surface,
0, 0, (glitz_box_t *) pBox, nBox);
+ xglLeaveServer();
glitz_set_pixels (pPixmapPriv->surface,
pExt->x1,
pExt->y1,
@@ -246,6 +285,7 @@ xglSyncSurface (DrawablePtr pDrawable)
pExt->y2 - pExt->y1,
&format,
pPixmapPriv->buffer);
+ xglEnterServer();
glitz_surface_set_clip_region (pPixmapPriv->surface, 0, 0, NULL, 0);
@@ -322,6 +362,10 @@ xglAddSurfaceDamage (DrawablePtr pDrawable,
glitz_surface_t *surface;
int xOff, yOff;
+#if 0
+ miPrintRegion(pRegion);
+#endif
+
XGL_DRAWABLE_PIXMAP_PRIV (pDrawable);
pPixmapPriv->damageBox = miEmptyBox;
@@ -431,6 +475,15 @@ xglAddCurrentBitDamage (DrawablePtr pDrawable)
{
XGL_DRAWABLE_PIXMAP_PRIV (pDrawable);
+ {
+ /* This is a little severe as it also impacts xgl - tune me */
+ XGL_SCREEN_PRIV (pDrawable->pScreen);
+ xglLeaveServer();
+ glitz_surface_flush (pScreenPriv->surface);
+ glitz_drawable_finish (pScreenPriv->drawable);
+ xglEnterServer();
+ }
+
if (REGION_NOTEMPTY (pDrawable->pScreen, &pPixmapPriv->bitRegion))
{
BoxPtr pBitExt;
diff --git a/hw/xgl/xgltile.c b/xgl/xgltile.c
index 25b78c316..5c5fad1d8 100644
--- a/hw/xgl/xgltile.c
+++ b/xgl/xgltile.c
@@ -23,6 +23,7 @@
* Author: David Reveman <davidr@novell.com>
*/
+
#include "xgl.h"
static glitz_geometry_format_t tileGeometryFormat = {
@@ -221,6 +222,7 @@ xglTile (DrawablePtr pDrawable,
pTilePriv->pictureMask |= xglPCFillMask;
glitz_surface_set_fill (pTilePriv->surface, GLITZ_FILL_REPEAT);
+ xglLeaveServer();
glitz_composite (op,
pTilePriv->surface, NULL, surface,
x + tileX,
@@ -229,6 +231,7 @@ xglTile (DrawablePtr pDrawable,
x + xOff,
y + yOff,
width, height);
+ xglEnterServer();
glitz_surface_set_clip_region (surface, 0, 0, NULL, 0);
@@ -253,6 +256,7 @@ xglTile (DrawablePtr pDrawable,
if (!GEOMETRY_ENABLE (pGeometry, surface))
return FALSE;
+ xglLeaveServer();
glitz_composite (op,
pTilePriv->surface, NULL, surface,
0, 0,
@@ -260,6 +264,7 @@ xglTile (DrawablePtr pDrawable,
x + xOff,
y + yOff,
width, height);
+ xglEnterServer();
if (glitz_surface_get_status (surface))
return FALSE;
diff --git a/hw/xgl/xgltrap.c b/xgl/xgltrap.c
index 6e7a5082c..6e7a5082c 100644
--- a/hw/xgl/xgltrap.c
+++ b/xgl/xgltrap.c
diff --git a/hw/xgl/xglwindow.c b/xgl/xglwindow.c
index 393f01df1..393f01df1 100644
--- a/hw/xgl/xglwindow.c
+++ b/xgl/xglwindow.c
diff --git a/hw/xgl/xglxv.c b/xgl/xglxv.c
index 353f9b3bb..4e46afcb1 100644
--- a/hw/xgl/xglxv.c
+++ b/xgl/xglxv.c
@@ -200,6 +200,12 @@ xglXvFreePort (XvPortPtr pPort)
pPortPriv->pSrc = (PicturePtr) 0;
}
+ if (pPortPriv->pTmp)
+ {
+ FreePicture ((pointer) pPortPriv->pTmp, 0);
+ pPortPriv->pTmp = (PicturePtr) 0;
+ }
+
if (pPortPriv->pPixmap)
{
ScreenPtr pScreen;
@@ -239,6 +245,37 @@ xglXvStopVideo (ClientPtr client,
return Success;
}
+static PicturePtr
+xglXvCreateDstPict (DrawablePtr pDrawable,
+ Mask vmask,
+ XID *vlist,
+ int *error)
+{
+ ScreenPtr pScreen = pDrawable->pScreen;
+ PictFormatPtr pFormat = 0;
+ int i;
+
+ for (i = 0; i < pScreen->numVisuals; i++)
+ {
+ if (pScreen->visuals[i].nplanes == pDrawable->depth)
+ {
+ pFormat = PictureMatchVisual (pScreen, pDrawable->depth,
+ &pScreen->visuals[i]);
+ break;
+ }
+ }
+
+ if (!pFormat)
+ {
+ *error = BadImplementation;
+ return (PicturePtr) 0;
+ }
+
+ return CreatePicture (0, pDrawable,
+ pFormat, vmask, vlist, serverClient,
+ error);
+}
+
static int
xglXvPutImage (ClientPtr client,
DrawablePtr pDrawable,
@@ -259,8 +296,9 @@ xglXvPutImage (ClientPtr client,
CARD16 height)
{
ScreenPtr pScreen = pDrawable->pScreen;
+ PicturePtr pSrc;
PictTransform transform;
- int depth, bpp;
+ int depth, bpp, stride, noVisual = FALSE;
CARD32 format;
XGL_SCREEN_PRIV (pScreen);
@@ -268,19 +306,25 @@ xglXvPutImage (ClientPtr client,
XGL_DRAWABLE_PIXMAP (pDrawable);
XGL_PIXMAP_PRIV (pPixmap);
+ stride = ((width + 7) & ~7);
+
switch (pImage->id) {
case GLITZ_FOURCC_YUY2:
bpp = depth = 16;
format = PICT_yuy2;
+ noVisual = !pScreenPriv->pXvVisual[XGL_XV_FORMAT_YUY2].format.surface;
+ stride *= 2;
break;
case GLITZ_FOURCC_YV12:
depth = bpp = 12;
format = PICT_yv12;
+ noVisual = !pScreenPriv->pXvVisual[XGL_XV_FORMAT_YV12].format.surface;
break;
case GLITZ_FOURCC_RGB:
depth = 24;
bpp = 32;
format = PICT_x8r8g8b8;
+ stride *= 4;
break;
default:
return BadImplementation;
@@ -299,7 +343,7 @@ xglXvPutImage (ClientPtr client,
srcWidth, srcHeight,
depth, bpp, -1, (pointer) data);
- XGL_GET_PIXMAP_PRIV (pPortPriv->pPixmap)->stride = -srcWidth;
+ XGL_GET_PIXMAP_PRIV (pPortPriv->pPixmap)->stride = -stride;
pPortPriv->pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
@@ -326,34 +370,21 @@ xglXvPutImage (ClientPtr client,
}
SetPictureFilter (pPortPriv->pSrc,
- FilterBilinear, strlen (FilterBilinear),
+ pScreenPriv->xvFilter,
+ strlen (pScreenPriv->xvFilter),
0, 0);
}
+ pSrc = pPortPriv->pSrc;
+
if (!pPortPriv->pDst || pPortPriv->pDst->pDrawable != pDrawable)
{
- PictFormatPtr pFormat = 0;
- int i, error;
-
- for (i = 0; i < pScreen->numVisuals; i++)
- {
- if (pScreen->visuals[i].nplanes == pDrawable->depth)
- {
- pFormat = PictureMatchVisual (pScreen, pDrawable->depth,
- &pScreen->visuals[i]);
- break;
- }
- }
-
- if (!pFormat)
- return BadImplementation;
+ int error;
if (pPortPriv->pDst)
FreePicture ((pointer) pPortPriv->pDst, 0);
- pPortPriv->pDst = CreatePicture (0, pDrawable,
- pFormat, 0, 0, serverClient,
- &error);
+ pPortPriv->pDst = xglXvCreateDstPict (pDrawable, 0, NULL, &error);
if (!pPortPriv->pDst)
{
xglXvFreePort (pPort);
@@ -361,6 +392,66 @@ xglXvPutImage (ClientPtr client,
}
}
+ if (pPixmap != pScreenPriv->pScreenPixmap && !pPixmapPriv->target)
+ xglEnablePixmapAccel (pPixmap, &pScreenPriv->accel.xv);
+
+ /* software color-space conversion */
+ if (pPixmapPriv->target && (noVisual || pScreenPriv->noYuv))
+ {
+ if (!pPortPriv->pTmp ||
+ srcWidth != pPortPriv->pTmp->pDrawable->width ||
+ srcHeight != pPortPriv->pTmp->pDrawable->height)
+ {
+ static XID value = RepeatPad;
+ int error;
+
+ if (pPortPriv->pTmp)
+ FreePicture ((pointer) pPortPriv->pTmp, 0);
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen,
+ srcWidth, srcHeight,
+ pDrawable->depth, 0);
+ if (!pPixmap)
+ {
+ xglXvFreePort (pPort);
+ return BadAlloc;
+ }
+
+ pPortPriv->pTmp = xglXvCreateDstPict (&pPixmap->drawable,
+ CPRepeat, &value,
+ &error);
+ if (!pPortPriv->pTmp)
+ {
+ (*pScreen->DestroyPixmap) (pPixmap);
+ xglXvFreePort (pPort);
+ return error;
+ }
+
+ /* no accelerated drawing */
+ XGL_GET_PIXMAP_PRIV (pPixmap)->target = xglPixmapTargetNo;
+
+ (*pScreen->DestroyPixmap) (pPixmap);
+
+ SetPictureFilter (pPortPriv->pTmp,
+ pScreenPriv->xvFilter,
+ strlen (pScreenPriv->xvFilter),
+ 0, 0);
+ }
+
+ SetPictureTransform (pSrc, 0);
+
+ CompositePicture (PictOpSrc,
+ pSrc,
+ (PicturePtr) 0,
+ pPortPriv->pTmp,
+ 0, 0,
+ 0, 0,
+ 0, 0,
+ srcWidth, srcHeight);
+
+ pSrc = pPortPriv->pTmp;
+ }
+
transform.matrix[0][0] = ((srcWidth << 16) + (dstWidth >> 1))
/ dstWidth;
transform.matrix[0][1] = 0;
@@ -376,13 +467,10 @@ xglXvPutImage (ClientPtr client,
transform.matrix[2][1] = 0;
transform.matrix[2][2] = 1 << 16;
- SetPictureTransform (pPortPriv->pSrc, &transform);
-
- if (pPixmap != pScreenPriv->pScreenPixmap && !pPixmapPriv->target)
- xglEnablePixmapAccel (pPixmap, &pScreenPriv->accel.xv);
+ SetPictureTransform (pSrc, &transform);
CompositePicture (PictOpSrc,
- pPortPriv->pSrc,
+ pSrc,
(PicturePtr) 0,
pPortPriv->pDst,
srcX, srcY,