diff options
-rw-r--r-- | Makefile.am | 13 | ||||
-rw-r--r-- | configure.ac | 33 | ||||
-rw-r--r-- | dix/window.c | 1 | ||||
-rw-r--r-- | fb/fb.h | 4 | ||||
-rw-r--r-- | fb/fbbltone.c | 6 | ||||
-rw-r--r-- | fb/fbpict.c | 2 | ||||
-rw-r--r-- | fb/fbpict.h | 44 | ||||
-rw-r--r-- | fb/fbtile.c | 2 | ||||
-rw-r--r-- | glucose/Makefile.am | 30 | ||||
-rw-r--r-- | glucose/glitz_glucose.h | 179 | ||||
-rw-r--r-- | glucose/glucose.c | 802 | ||||
-rw-r--r-- | glucose/glucose.h | 58 | ||||
-rw-r--r-- | glucose/glucose_context.c | 435 | ||||
-rw-r--r-- | glucose/glucose_drawable.c | 181 | ||||
-rw-r--r-- | glucose/glucose_format.c | 240 | ||||
-rw-r--r-- | glucose/glucose_info.c | 980 | ||||
-rw-r--r-- | hw/xfree86/Makefile.am | 13 | ||||
-rw-r--r-- | hw/xfree86/dri/dri.c | 196 | ||||
-rw-r--r-- | hw/xfree86/dri/dristruct.h | 2 | ||||
-rw-r--r-- | hw/xfree86/glucose/Makefile.am | 20 | ||||
-rw-r--r-- | hw/xfree86/glucose/glucosemodule.c | 94 | ||||
-rw-r--r-- | hw/xgl/Makefile.am | 48 | ||||
-rw-r--r-- | hw/xgl/egl/xeglinit.c | 9 | ||||
-rw-r--r-- | hw/xgl/glx/Makefile.am | 13 | ||||
-rw-r--r-- | hw/xgl/glx/module/Makefile.am | 10 | ||||
-rw-r--r-- | hw/xgl/glx/xglx.c | 67 | ||||
-rw-r--r-- | hw/xgl/glx/xglxinit.c | 2 | ||||
-rw-r--r-- | hw/xgl/glxext/Makefile.am | 7 | ||||
-rw-r--r-- | hw/xgl/glxext/module/Makefile.am | 19 | ||||
-rw-r--r-- | hw/xgl/glxext/module/glcoremodule.c | 38 | ||||
-rw-r--r-- | hw/xgl/glxext/xglglxext.c | 3326 | ||||
-rw-r--r-- | hw/xgl/glxext/xglglxlog.c | 950 | ||||
-rw-r--r-- | hw/xgl/xglglx.c | 156 | ||||
-rw-r--r-- | hw/xgl/xglglx.h | 49 | ||||
-rw-r--r-- | hw/xgl/xglinit.c | 6 | ||||
-rw-r--r-- | hw/xgl/xglinput.c | 12 | ||||
-rw-r--r-- | hw/xgl/xglparse.c | 63 | ||||
-rw-r--r-- | hw/xgl/xglscreen.c | 59 | ||||
-rw-r--r-- | include/xgl-config.h.in | 3 | ||||
-rw-r--r-- | mi/miinitext.c | 18 | ||||
-rw-r--r-- | randr/randrstr.h | 2 | ||||
-rw-r--r-- | render/picture.c | 198 | ||||
-rw-r--r-- | render/picture.h | 8 | ||||
-rw-r--r-- | render/picturestr.h | 53 | ||||
-rw-r--r-- | render/render.c | 13 | ||||
-rw-r--r-- | xgl/Makefile.am | 40 | ||||
-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 @@ -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)(®)); if(REGION_NOTEMPTY(pScreen, ®)) { - REGION_TRANSLATE(pScreen, ®, ptOldOrg.x - pWin->drawable.x, + REGION_TRANSLATE(pScreen, ®, ptOldOrg.x - pWin->drawable.x, ptOldOrg.y - pWin->drawable.y); REGION_INTERSECT(pScreen, ®, ®, 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, ®ion, &box, 1); + REGION_INTERSECT (pDrawable->pScreen, ®ion, + pGC->pCompositeClip, ®ion); + + glitz_drawable_swap_buffer_region (pBufferPriv->drawable, + xOff, yOff, (glitz_box_t *) + REGION_RECTS (®ion), + REGION_NUM_RECTS (®ion)); + + xglAddBitDamage (pDrawable, ®ion); + DamageDamageRegion (pDrawable, ®ion); + REGION_SUBTRACT (pGC->pScreen, &pBufferPriv->damage, + &pBufferPriv->damage, ®ion); + + REGION_UNINIT (pGC->pScreen, ®ion); + } + 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, |