Compare commits
162 Commits
mesa-7.8.1
...
7.8
Author | SHA1 | Date | |
---|---|---|---|
|
3af43c0b4c | ||
|
337dace22d | ||
|
cc32ff741c | ||
|
340e063525 | ||
|
9c0eb872a2 | ||
|
b7cea230b3 | ||
|
5aade70660 | ||
|
793a121433 | ||
|
d2c4a8813e | ||
|
75181e974c | ||
|
6628188a87 | ||
|
435474e116 | ||
|
4adff471fe | ||
|
016a79b732 | ||
|
84e84cf4e7 | ||
|
800473566c | ||
|
9af135c7cd | ||
|
d06b34f563 | ||
|
f8363b25bb | ||
|
b69946870e | ||
|
3daa728fe7 | ||
|
596e1d3e44 | ||
|
7b6a68df92 | ||
|
4a915f34e1 | ||
|
be86a63d9a | ||
|
cb37c3a1c6 | ||
|
218b9be37a | ||
|
fb9a133071 | ||
|
886019125e | ||
|
aac05a8580 | ||
|
8186c7d106 | ||
|
7e07c8f40e | ||
|
c81ba220d7 | ||
|
8f2100b48e | ||
|
27bbb68dfb | ||
|
c3cc7d4033 | ||
|
47a2046a08 | ||
|
f3724c830c | ||
|
bedecdff1f | ||
|
43f332e6fc | ||
|
12df872f8c | ||
|
0d3ac51bf2 | ||
|
9cad102121 | ||
|
66ad60399a | ||
|
7f31029471 | ||
|
7b706cc69b | ||
|
69088d5484 | ||
|
8cb6b198d2 | ||
|
ac82d16021 | ||
|
f02cd9030c | ||
|
74959ed201 | ||
|
d06e0117e3 | ||
|
b69d5414aa | ||
|
f6bba7b996 | ||
|
6afe2936f7 | ||
|
fd95ea52e5 | ||
|
31799da47f | ||
|
078d04ed81 | ||
|
a2782af384 | ||
|
b12692404c | ||
|
43becf60f8 | ||
|
c19bc5de96 | ||
|
41e371e351 | ||
|
7b86b24808 | ||
|
6e0c3a1ba0 | ||
|
843a02eb9b | ||
|
8825d5ca54 | ||
|
226e612631 | ||
|
3e9f4d19f6 | ||
|
37a8fa74c3 | ||
|
eb99b66737 | ||
|
fc0b912f1e | ||
|
a48edfad8a | ||
|
1f756d916a | ||
|
7dbfc2565e | ||
|
d2f2d0a1b7 | ||
|
fadc3c5c06 | ||
|
011e7b2c96 | ||
|
2eb5bc5add | ||
|
7d313d3506 | ||
|
5c54b54e00 | ||
|
433626e5c0 | ||
|
b4777f82d5 | ||
|
f94e259d8e | ||
|
533b766383 | ||
|
71f028bf93 | ||
|
f007d0f89d | ||
|
728df9aaca | ||
|
d2ade4b802 | ||
|
e48964a561 | ||
|
53557f1f34 | ||
|
3bf7ea2a1c | ||
|
f3b55494f3 | ||
|
8b68c0aa24 | ||
|
3c407b52ff | ||
|
210b74c613 | ||
|
f7638f004d | ||
|
30e9ffcd3b | ||
|
4d63be67f3 | ||
|
7b640f9f70 | ||
|
56f99ee640 | ||
|
ef9a8fcb1b | ||
|
9cfaaa291f | ||
|
eecd2a59c1 | ||
|
29fc97606b | ||
|
c5bf13c537 | ||
|
c0b41116f1 | ||
|
717e86738f | ||
|
cc806f70b2 | ||
|
a1cb3babbe | ||
|
f64773010d | ||
|
f5aa5377a5 | ||
|
de96d063b1 | ||
|
163901bc7f | ||
|
80b280db88 | ||
|
77dc40b289 | ||
|
ad503c4155 | ||
|
f1381880a8 | ||
|
ea373df069 | ||
|
b0e2c5f8aa | ||
|
4eb803975d | ||
|
273058b677 | ||
|
b695cbd57c | ||
|
ad7d36e919 | ||
|
eb4dc54788 | ||
|
c37e275e77 | ||
|
355370e30b | ||
|
b1a9c76b57 | ||
|
4d7ef6e06b | ||
|
986eb4b99f | ||
|
2e995cdf25 | ||
|
88be2171e7 | ||
|
8e5effefc7 | ||
|
4e7a4bed37 | ||
|
4f8bf353bd | ||
|
3b693fd93f | ||
|
0a18cdb0ed | ||
|
385e2896eb | ||
|
c060265bdb | ||
|
cf7d08b443 | ||
|
f4553d99c6 | ||
|
c39ab02ae9 | ||
|
7f1ae3a94d | ||
|
e3a34cc7f6 | ||
|
db3b34219e | ||
|
885048232f | ||
|
b3a68cdc6f | ||
|
d9793fc3ac | ||
|
157bdd1446 | ||
|
497b66094d | ||
|
4a796264df | ||
|
2657325c4a | ||
|
6a5518861e | ||
|
edff2e0585 | ||
|
394c25133e | ||
|
b22a00bff4 | ||
|
21cf976ad9 | ||
|
3ad9a98ec2 | ||
|
ffedd28c9c | ||
|
bab6c0a035 | ||
|
8ac7d7fa05 | ||
|
4b39a0da89 |
10
Makefile
10
Makefile
@@ -180,7 +180,7 @@ ultrix-gcc:
|
||||
|
||||
# Rules for making release tarballs
|
||||
|
||||
VERSION=7.8.1
|
||||
VERSION=7.8.3-rc1
|
||||
DIRECTORY = Mesa-$(VERSION)
|
||||
LIB_NAME = MesaLib-$(VERSION)
|
||||
DEMO_NAME = MesaDemos-$(VERSION)
|
||||
@@ -285,9 +285,6 @@ MAIN_FILES = \
|
||||
$(DIRECTORY)/src/mesa/x86-64/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/x86-64/Makefile \
|
||||
$(DIRECTORY)/progs/Makefile \
|
||||
$(DIRECTORY)/progs/util/README \
|
||||
$(DIRECTORY)/progs/util/*.[ch] \
|
||||
$(DIRECTORY)/progs/util/sampleMakefile \
|
||||
$(DIRECTORY)/windows/VC8/
|
||||
|
||||
ES_FILES = \
|
||||
@@ -438,7 +435,10 @@ DEMO_FILES = \
|
||||
$(DIRECTORY)/progs/glsl/*.c \
|
||||
$(DIRECTORY)/progs/glsl/*.frag \
|
||||
$(DIRECTORY)/progs/glsl/*.vert \
|
||||
$(DIRECTORY)/progs/glsl/*.shtest
|
||||
$(DIRECTORY)/progs/glsl/*.shtest \
|
||||
$(DIRECTORY)/progs/util/README \
|
||||
$(DIRECTORY)/progs/util/*.[ch] \
|
||||
$(DIRECTORY)/progs/util/sampleMakefile
|
||||
|
||||
GLUT_FILES = \
|
||||
$(DIRECTORY)/include/GL/glut.h \
|
||||
|
@@ -24,6 +24,13 @@ RADEON_CFLAGS = @RADEON_CFLAGS@
|
||||
RADEON_LDFLAGS = @RADEON_LDFLAGS@
|
||||
INTEL_LIBS = @INTEL_LIBS@
|
||||
INTEL_CFLAGS = @INTEL_CFLAGS@
|
||||
X11_LIBS = @X11_LIBS@
|
||||
X11_CFLAGS = @X11_CFLAGS@
|
||||
GLW_CFLAGS = @GLW_CFLAGS@
|
||||
GLUT_CFLAGS = @GLUT_CFLAGS@
|
||||
|
||||
# dlopen
|
||||
DLOPEN_LIBS = @DLOPEN_LIBS@
|
||||
|
||||
# Assembler
|
||||
MESA_ASM_SOURCES = @MESA_ASM_SOURCES@
|
||||
|
@@ -13,7 +13,10 @@ CC = gcc
|
||||
CXX = g++
|
||||
PIC_FLAGS = -fPIC
|
||||
DEFINES = -D_DARWIN_C_SOURCE -DPTHREADS -D_GNU_SOURCE \
|
||||
-DGLX_ALIAS_UNSUPPORTED -DGLX_INDIRECT_RENDERING
|
||||
-DGLX_ALIAS_UNSUPPORTED \
|
||||
-DGLX_DIRECT_RENDERING -DGLX_USE_APPLEGL
|
||||
|
||||
# -DGLX_INDIRECT_RENDERING \
|
||||
|
||||
# -D_GNU_SOURCE - for src/mesa/main ...
|
||||
# -DGLX_DIRECT_RENDERING - pulls in libdrm stuff in glx
|
||||
@@ -49,7 +52,7 @@ GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -L$(INSTALL_DIR)/$(LIB_DIR) -L$(X
|
||||
APP_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -L$(INSTALL_DIR)/$(LIB_DIR) -L$(X11_DIR)/$(LIB_DIR) -lX11 -lXmu -lXt -lXi -lm
|
||||
|
||||
# omit glw lib for now:
|
||||
SRC_DIRS = glsl glx mesa gallium glu glut/glx glew
|
||||
SRC_DIRS = glsl glx/apple mesa gallium glu glut/glx glew
|
||||
GLU_DIRS = sgi
|
||||
DRIVER_DIRS = osmesa
|
||||
#DRIVER_DIRS = dri
|
||||
|
@@ -10,7 +10,7 @@ CONFIG_NAME = default
|
||||
# Version info
|
||||
MESA_MAJOR=7
|
||||
MESA_MINOR=8
|
||||
MESA_TINY=1
|
||||
MESA_TINY=2
|
||||
MESA_VERSION = $(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY)
|
||||
|
||||
# external projects. This should be useless now that we use libdrm.
|
||||
@@ -119,7 +119,9 @@ APP_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LI
|
||||
|
||||
# Program dependencies - specific GL/glut libraries added in Makefiles
|
||||
APP_LIB_DEPS = -lm
|
||||
X11_LIBS = -lX11
|
||||
|
||||
DLOPEN_LIBS = -ldl
|
||||
|
||||
# Installation directories (for make install)
|
||||
INSTALL_DIR = /usr/local
|
||||
|
@@ -9,7 +9,7 @@ CONFIG_NAME = linux-osmesa
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DPTHREADS
|
||||
CFLAGS = -g -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -DPTHREADS
|
||||
CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
||||
# Work around aliasing bugs - developers should comment this out
|
||||
@@ -17,12 +17,12 @@ CFLAGS += -fno-strict-aliasing
|
||||
CXXFLAGS += -fno-strict-aliasing
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = gallium mesa glu
|
||||
SRC_DIRS = glsl mesa glu
|
||||
DRIVER_DIRS = osmesa
|
||||
PROGRAM_DIRS = osdemos
|
||||
|
||||
|
||||
# Dependencies
|
||||
OSMESA_LIB_DEPS = -lm -lpthread
|
||||
OSMESA_LIB_DEPS = -lm -lpthread -ldl
|
||||
GLU_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(OSMESA_LIB)
|
||||
APP_LIB_DEPS = -lm -lpthread
|
||||
|
@@ -20,7 +20,7 @@ OSMESA_LIB_NAME = libOSMesa16.so
|
||||
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = gallium mesa glu
|
||||
SRC_DIRS = glsl mesa glu
|
||||
DRIVER_DIRS = osmesa
|
||||
PROGRAM_DIRS =
|
||||
|
||||
|
@@ -20,7 +20,7 @@ OSMESA_LIB_NAME = libOSMesa32.so
|
||||
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = gallium mesa glu
|
||||
SRC_DIRS = glsl mesa glu
|
||||
DRIVER_DIRS = osmesa
|
||||
PROGRAM_DIRS =
|
||||
|
||||
|
40
configure.ac
40
configure.ac
@@ -398,6 +398,7 @@ dnl Check to see if dlopen is in default libraries (like Solaris, which
|
||||
dnl has it in libc), or if libdl is needed to get it.
|
||||
AC_CHECK_FUNC([dlopen], [],
|
||||
[AC_CHECK_LIB([dl], [dlopen], [DLOPEN_LIBS="-ldl"])])
|
||||
AC_SUBST([DLOPEN_LIBS])
|
||||
|
||||
dnl See if posix_memalign is available
|
||||
AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES -DHAVE_POSIX_MEMALIGN"])
|
||||
@@ -547,8 +548,14 @@ else
|
||||
x11_pkgconfig=no
|
||||
fi
|
||||
dnl Use the autoconf macro if no pkg-config files
|
||||
if test "$x11_pkgconfig" = no; then
|
||||
if test "$x11_pkgconfig" = yes; then
|
||||
PKG_CHECK_MODULES([X11], [x11])
|
||||
else
|
||||
AC_PATH_XTRA
|
||||
test -z "$X11_CFLAGS" && X11_CFLAGS="$X_CFLAGS"
|
||||
test -z "$X11_LIBS" && X11_LIBS="$X_LIBS -lX11"
|
||||
AC_SUBST([X11_CFLAGS])
|
||||
AC_SUBST([X11_LIBS])
|
||||
fi
|
||||
|
||||
dnl Try to tell the user that the --x-* options are only used when
|
||||
@@ -693,7 +700,7 @@ AC_SUBST([DRI_DRIVER_SEARCH_DIR])
|
||||
dnl Direct rendering or just indirect rendering
|
||||
AC_ARG_ENABLE([driglx-direct],
|
||||
[AS_HELP_STRING([--disable-driglx-direct],
|
||||
[enable direct rendering in GLX for DRI @<:@default=enabled@:>@])],
|
||||
[enable direct rendering in GLX and EGL for DRI @<:@default=enabled@:>@])],
|
||||
[driglx_direct="$enableval"],
|
||||
[driglx_direct="yes"])
|
||||
dnl Which drivers to build - default is chosen by platform
|
||||
@@ -859,7 +866,7 @@ else
|
||||
fi
|
||||
AC_ARG_ENABLE([gl-osmesa],
|
||||
[AS_HELP_STRING([--enable-gl-osmesa],
|
||||
[enable OSMesa on libGL @<:@default=enabled for xlib driver@:>@])],
|
||||
[enable OSMesa with libGL @<:@default=enabled for xlib driver@:>@])],
|
||||
[gl_osmesa="$enableval"],
|
||||
[gl_osmesa="$default_gl_osmesa"])
|
||||
if test "x$gl_osmesa" = xyes; then
|
||||
@@ -894,8 +901,8 @@ x16|x32)
|
||||
esac
|
||||
AC_SUBST([OSMESA_LIB])
|
||||
|
||||
case "$mesa_driver" in
|
||||
osmesa)
|
||||
case "$DRIVER_DIRS" in
|
||||
*osmesa*)
|
||||
# only link libraries with osmesa if shared
|
||||
if test "$enable_static" = no; then
|
||||
OSMESA_LIB_DEPS="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
|
||||
@@ -905,19 +912,7 @@ osmesa)
|
||||
OSMESA_MESA_DEPS=""
|
||||
OSMESA_PC_LIB_PRIV="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
|
||||
;;
|
||||
*)
|
||||
# Link OSMesa to libGL otherwise
|
||||
OSMESA_LIB_DEPS=""
|
||||
# only link libraries with osmesa if shared
|
||||
if test "$enable_static" = no; then
|
||||
OSMESA_MESA_DEPS='-l$(GL_LIB)'
|
||||
else
|
||||
OSMESA_MESA_DEPS=""
|
||||
fi
|
||||
OSMESA_PC_REQ="gl"
|
||||
;;
|
||||
esac
|
||||
OSMESA_PC_LIB_PRIV="$OSMESA_PC_LIB_PRIV"
|
||||
AC_SUBST([OSMESA_LIB_DEPS])
|
||||
AC_SUBST([OSMESA_MESA_DEPS])
|
||||
AC_SUBST([OSMESA_PC_REQ])
|
||||
@@ -1108,10 +1103,6 @@ fi
|
||||
|
||||
if test "x$enable_glut" = xyes; then
|
||||
SRC_DIRS="$SRC_DIRS glut/glx"
|
||||
GLUT_CFLAGS=""
|
||||
if test "x$GCC" = xyes; then
|
||||
GLUT_CFLAGS="-fexceptions"
|
||||
fi
|
||||
if test "$x11_pkgconfig" = yes; then
|
||||
PKG_CHECK_MODULES([GLUT],[x11 xmu xi])
|
||||
GLUT_PC_REQ_PRIV="x11 xmu xi"
|
||||
@@ -1122,6 +1113,9 @@ if test "x$enable_glut" = xyes; then
|
||||
GLUT_PC_LIB_PRIV="$GLUT_LIB_DEPS"
|
||||
GLUT_PC_CFLAGS="$X11_INCLUDES"
|
||||
fi
|
||||
if test "x$GCC" = xyes; then
|
||||
GLUT_CFLAGS="$GLUT_CFLAGS -fexceptions"
|
||||
fi
|
||||
GLUT_LIB_DEPS="$GLUT_LIB_DEPS -lm"
|
||||
GLUT_PC_LIB_PRIV="$GLUT_PC_LIB_PRIV -lm"
|
||||
|
||||
@@ -1223,6 +1217,10 @@ yes)
|
||||
if test "x$enable_egl" != xyes; then
|
||||
AC_MSG_ERROR([cannot build egl state tracker without EGL library])
|
||||
fi
|
||||
# define GLX_DIRECT_RENDERING even when the driver is not dri
|
||||
if test "x$mesa_driver" != xdri -a "x$driglx_direct" = xyes; then
|
||||
DEFINES="$DEFINES -DGLX_DIRECT_RENDERING"
|
||||
fi
|
||||
;;
|
||||
xorg)
|
||||
PKG_CHECK_MODULES([LIBDRM_XORG], [libdrm >= $LIBDRM_XORG_REQUIRED])
|
||||
|
@@ -145,7 +145,7 @@ Make sure the values in src/mesa/main/version.h are correct.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Update the docs/news.html file and docs/download.html files.
|
||||
Update docs/news.html.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -208,10 +208,11 @@ sftp USERNAME,mesa3d@web.sourceforge.net
|
||||
|
||||
<p>
|
||||
Make an announcement on the mailing lists:
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>,
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
and
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
|
||||
<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -13,14 +13,14 @@
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-users"
|
||||
target="_parent">mesa3d-users</a> - intended for end-users of Mesa and DRI
|
||||
<li><a href="http://lists.freedesktop.org/mailman/listinfo/mesa-users"
|
||||
target="_parent">mesa-users</a> - intended for end-users of Mesa and DRI
|
||||
drivers. Newbie questions are OK, but please try the general OpenGL
|
||||
resources and Mesa/DRI documentation first.
|
||||
</li>
|
||||
<br>
|
||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-dev"
|
||||
target="_parent">mesa3d-dev</a> - for Mesa, Gallium and DRI development
|
||||
<li><a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev"
|
||||
target="_parent">mesa-dev</a> - for Mesa, Gallium and DRI development
|
||||
discussion. Not for beginners.
|
||||
</li>
|
||||
<br>
|
||||
@@ -30,8 +30,8 @@ target="_parent">mesa-commit</a> - relays git check-in messages
|
||||
In general, people should not post to this list.
|
||||
</li>
|
||||
<br>
|
||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-announce"
|
||||
target="_parent">mesa3d-announce</a> - announcements of new Mesa
|
||||
<li><a href="http://lists.freedesktop.org/mailman/listinfo/mesa-announce"
|
||||
target="_parent">mesa-announce</a> - announcements of new Mesa
|
||||
versions are sent to this list. Very low traffic.
|
||||
</li>
|
||||
</ul>
|
||||
@@ -40,6 +40,15 @@ versions are sent to this list. Very low traffic.
|
||||
Follow the links above for list archives.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The old Mesa lists hosted at SourceForge are no longer in use.
|
||||
The archives are still available, however:
|
||||
<a href="http://sourceforge.net/mailarchive/forum.php?forum_name=mesa3d-announce" target="_parent">mesa3d-announce</a>,
|
||||
<a href="http://sourceforge.net/mailarchive/forum.php?forum_name=mesa3d-users" target="_parent">mesa3d-users</a>,
|
||||
<a href="http://sourceforge.net/mailarchive/forum.php?forum_name=mesa3d-dev" target="_parent">mesa3d-dev</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<p>For mailing lists about Direct Rendering Modules (drm) in Linux/BSD
|
||||
kernels, see the
|
||||
<a href="http://dri.freedesktop.org/wiki/MailingLists" target="_parent">
|
||||
|
@@ -11,6 +11,22 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<h2>TBD, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.8.3.html">Mesa 7.8.3</a> is released. This is a bug-fix
|
||||
release collecting fixes since the 7.8.2 release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>June 16, 2010</h2>
|
||||
|
||||
<p>
|
||||
<a href="relnotes-7.8.2.html">Mesa 7.8.2</a> is released. This is a bug-fix
|
||||
release collecting fixes since the 7.8.1 release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>April 5, 2010</h2>
|
||||
|
||||
<p>
|
||||
|
146
docs/relnotes-7.8.2.html
Normal file
146
docs/relnotes-7.8.2.html
Normal file
@@ -0,0 +1,146 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.8.2 Release Notes / (date tbd)</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.8.2 is a bug fix release which fixes bugs found since the 7.8.1 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.8.2 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
c89b63d253605ed40e8ac370d25a833c MesaLib-7.8.2.tar.gz
|
||||
6be2d343a0089bfd395ce02aaf8adb57 MesaLib-7.8.2.tar.bz2
|
||||
a04ad3b06ac5ff3969a003fa7bbf7d5b MesaLib-7.8.2.zip
|
||||
7c213f92efeb471f0331670d5079d4c0 MesaDemos-7.8.2.tar.gz
|
||||
757d9e2e06f48b1a52848be9b0307ced MesaDemos-7.8.2.tar.bz2
|
||||
8d0e5cfe68b8ebf90265d350ae2c48b1 MesaDemos-7.8.2.zip
|
||||
b74482e3f44f35ed395c4aada4fd8240 MesaGLUT-7.8.2.tar.gz
|
||||
a471807b65e49c325808ba4551be93ed MesaGLUT-7.8.2.tar.bz2
|
||||
9f190268c42be582ef66e47365ee61e3 MesaGLUT-7.8.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>Upgraded glext.h to version 61, and upgraded glxext.h
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
<li>Fixed Gallium glDrawPixels(GL_DEPTH_COMPONENT).
|
||||
<li>Fixed Gallium Cell driver to buildable, runable state
|
||||
<li>Fixed bad error checking for glFramebufferRenderbuffer(attachment=GL_DEPTH_STENCIL_ATTACHMENT).
|
||||
<li>Fixed incorrect Z coordinate handling in "meta" glDraw/CopyPixels.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">Bug
|
||||
#23670</a>.</li>
|
||||
|
||||
<li>Assorted i965 driver fixes.
|
||||
Including but not limited to:
|
||||
<ul>
|
||||
<li>Fix scissoring when width or height is
|
||||
0. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27643">Bug
|
||||
#27643</a>.
|
||||
<li>Fix bit allocation for number of color regions for
|
||||
ARB_draw_buffers.</li>
|
||||
<li>Set the correct provoking vertex for clipped first-mode
|
||||
trifans. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24470">Bug
|
||||
#24470</a>.</li>
|
||||
<li>Use <code>R16G16B16A16_FLOAT</code> for 3-component half-float.</li>
|
||||
<li>Fix assertion for surface tile offset usage on Ironlake.</li>
|
||||
<li>Fix cube map layouts on Ironlake.</li>
|
||||
<li>When an RB gets a new region, clear the old from the state
|
||||
cache. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24119">Bug
|
||||
#24119</a>.</li>
|
||||
<li>Reject shaders with uninlined function calls instead of hanging.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted i915 driver fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed texture LOD clamping in i915 driver.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=24846">Bug
|
||||
#24846</a>.</li>
|
||||
<li>Fix off-by-one for drawing rectangle.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27408">Bug
|
||||
#27408</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed hangs in etracer on 830 and 845
|
||||
chipsets. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26557">Bug
|
||||
#26557</a>.</li>
|
||||
<li>Fixed tiling of small textures on all Intel drivers.</li>
|
||||
<li>Fixed crash in Savage driver when using <code>_mesa_CopyTexImage2D</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27652">Bug
|
||||
#27652</a>.</li>
|
||||
|
||||
<li>Assorted GLX fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Fixed <code>__glXInitializeVisualConfigFromTags</code>'s handling of
|
||||
unrecognized fbconfig tags.</li>
|
||||
<li>Fixed regression with <code>GLX_USE_GL</code>.
|
||||
<li>Fixed config chooser logic for 'mask' matching.</li>
|
||||
<li>Report swap events correctly in direct rendered case (DRI2)</li>
|
||||
<li>Fixed build with dri2proto which doesn't define
|
||||
<code>X_DRI2SwapInterval</code>.</li>
|
||||
<li>Get <code>GLX_SCREEN</code> first in <code>__glXQueryContextInfo</code>.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=14245">Bug
|
||||
#14245</a>.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Assorted GLSL fixes. Including but not limited to:
|
||||
<ul>
|
||||
<li>Change variable declared assertion into conditional in GLSL
|
||||
compiler. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27921">Bug
|
||||
#27921</a>.</li>
|
||||
<li>Fix instruction indexing
|
||||
bugs. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27566">Bug
|
||||
#27566</a>.</li>
|
||||
<li>Updated uniform location / offset encoding to be more like
|
||||
other implementations.</li>
|
||||
<li>Don't overwrite a driver's shader infolog with generic failure
|
||||
message.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Fixed OSMesa build for 16 and 32-bit color channel depth.
|
||||
<li>Fixed OSMesa build with hidden symbol visibility. libOSMesa no longer links to libGL.
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28305">Bug
|
||||
#28305</a>.
|
||||
<li>Fixed handling of multiple render targets in fixed-function
|
||||
texture envrionmnent programs.</li>
|
||||
<li>Fixed conversion errors in <code>signed_rgba8888[rev]</code> texel
|
||||
fetch.</li>
|
||||
<li>Don't set srcLevel on <code>GL_TEXTURE_RECTANGLE_ARB</code> targets.</li>
|
||||
<li>Various build fixes for OpenBSD.</li>
|
||||
<li>Various build fixes for OS X.</li>
|
||||
<li>Various build fixes for GCC 3.3.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
89
docs/relnotes-7.8.3.html
Normal file
89
docs/relnotes-7.8.3.html
Normal file
@@ -0,0 +1,89 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.8.3 Release Notes / (date tbd)</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.8.3 is a bug fix release which fixes bugs found since the 7.8.2 release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.8.3 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
See the <a href="install.html">Compiling/Installing page</a> for prerequisites
|
||||
for DRI hardware acceleration.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
x MesaLib-7.8.3.tar.gz
|
||||
x MesaLib-7.8.3.tar.bz2
|
||||
x MesaLib-7.8.3.zip
|
||||
x MesaDemos-7.8.3.tar.gz
|
||||
x MesaDemos-7.8.3.tar.bz2
|
||||
x MesaDemos-7.8.3.zip
|
||||
x MesaGLUT-7.8.3.tar.gz
|
||||
x MesaGLUT-7.8.3.tar.bz2
|
||||
x MesaGLUT-7.8.3.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<p>None.</p>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>The radeon driver should use less memory when searching for a valid mip
|
||||
image.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
<li>Fix unsupported FB with D24S8 (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">29116</a>)</li>
|
||||
<li>Fix ReadPixels crash when reading depth/stencil from an FBO</li>
|
||||
<li>Fixed a bug rendering to 16-bit buffers using swrast.</li>
|
||||
<li>Fixed a state tracker/TGSI bug that caused crashes when using Windows'
|
||||
memory debugging features.</li>
|
||||
<li>Fixed an issue rendering to 32-bit channels with swrast (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29487">29487</a>)</li>
|
||||
<li>GLSL: fix indirect <TT>gl_TextureMatrix</TT> addressing (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">28967</a>)</li>
|
||||
<li>GLSL: fix for bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">27216</a></li>
|
||||
<li>GLSL: fix zw fragcoord entries in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29183">29183</a>)</li>
|
||||
<li>Fix texture env generation in some cases (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=28169">28169</a>)</li>
|
||||
<li>osmesa: a fix for calling <TT>OSMesaMakeCurrent</TT> twice was applied (bug
|
||||
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=10966">10966</a></li>
|
||||
<li>A bug was fixed which could cause Mesa to ignore the
|
||||
<TT>MESA_EXTENSION_OVERRIDE</TT> environment variable.</li>
|
||||
<li>A bug related to specular highlights on backfaces was fixed.</li>
|
||||
<li>A radeon-specific issue with <TT>glCopyTex(Sub)Image</TT> was
|
||||
corrected.</li>
|
||||
<li>radeon/wine: flush command stream in more cases, fixing wine d3d9
|
||||
tests.</li>
|
||||
<li>r600: fix sin+cos normalization.</li>
|
||||
<li>r600: (properly) ignore <TT>GL_COORD_REPLACE</TT> when point sprites are
|
||||
disabled.</li>
|
||||
<li>radeon: avoid flushing when the context is not current.</li>
|
||||
<li>r300c: a bug affecting unaligned BOs was fixed.</li>
|
||||
<li>r300c: a hardlock caused by ARB_half_float_vertex incorrectly advertised on some chipsets.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -13,6 +13,8 @@ The release notes summarize what's new or changed in each Mesa release.
|
||||
</p>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="relnotes-7.8.3.html">7.8.3 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.2.html">7.8.2 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.1.html">7.8.1 release notes</A>
|
||||
<LI><A HREF="relnotes-7.8.html">7.8 release notes</A>
|
||||
<LI><A HREF="relnotes-7.7.1.html">7.7.1 release notes</A>
|
||||
|
@@ -56,6 +56,7 @@
|
||||
#define glBeginOcclusionQueryNV MANGLE(BeginOcclusionQueryNV)
|
||||
#define glBeginPerfMonitorAMD MANGLE(BeginPerfMonitorAMD)
|
||||
#define glBeginQueryARB MANGLE(BeginQueryARB)
|
||||
#define glBeginQueryIndexed MANGLE(BeginQueryIndexed)
|
||||
#define glBeginQuery MANGLE(BeginQuery)
|
||||
#define glBeginTransformFeedbackEXT MANGLE(BeginTransformFeedbackEXT)
|
||||
#define glBeginTransformFeedback MANGLE(BeginTransformFeedback)
|
||||
@@ -75,6 +76,7 @@
|
||||
#define glBindBufferRange MANGLE(BindBufferRange)
|
||||
#define glBindBufferRangeNV MANGLE(BindBufferRangeNV)
|
||||
#define glBindFragDataLocationEXT MANGLE(BindFragDataLocationEXT)
|
||||
#define glBindFragDataLocationIndexed MANGLE(BindFragDataLocationIndexed)
|
||||
#define glBindFragDataLocation MANGLE(BindFragDataLocation)
|
||||
#define glBindFragmentShaderATI MANGLE(BindFragmentShaderATI)
|
||||
#define glBindFramebufferEXT MANGLE(BindFramebufferEXT)
|
||||
@@ -87,10 +89,12 @@
|
||||
#define glBindProgramNV MANGLE(BindProgramNV)
|
||||
#define glBindRenderbufferEXT MANGLE(BindRenderbufferEXT)
|
||||
#define glBindRenderbuffer MANGLE(BindRenderbuffer)
|
||||
#define glBindSampler MANGLE(BindSampler)
|
||||
#define glBindTexGenParameterEXT MANGLE(BindTexGenParameterEXT)
|
||||
#define glBindTextureEXT MANGLE(BindTextureEXT)
|
||||
#define glBindTexture MANGLE(BindTexture)
|
||||
#define glBindTextureUnitParameterEXT MANGLE(BindTextureUnitParameterEXT)
|
||||
#define glBindTransformFeedback MANGLE(BindTransformFeedback)
|
||||
#define glBindTransformFeedbackNV MANGLE(BindTransformFeedbackNV)
|
||||
#define glBindVertexArrayAPPLE MANGLE(BindVertexArrayAPPLE)
|
||||
#define glBindVertexArray MANGLE(BindVertexArray)
|
||||
@@ -215,6 +219,10 @@
|
||||
#define glColorMaskIndexedEXT MANGLE(ColorMaskIndexedEXT)
|
||||
#define glColorMask MANGLE(ColorMask)
|
||||
#define glColorMaterial MANGLE(ColorMaterial)
|
||||
#define glColorP3ui MANGLE(ColorP3ui)
|
||||
#define glColorP3uiv MANGLE(ColorP3uiv)
|
||||
#define glColorP4ui MANGLE(ColorP4ui)
|
||||
#define glColorP4uiv MANGLE(ColorP4uiv)
|
||||
#define glColorPointerEXT MANGLE(ColorPointerEXT)
|
||||
#define glColorPointerListIBM MANGLE(ColorPointerListIBM)
|
||||
#define glColorPointer MANGLE(ColorPointer)
|
||||
@@ -236,6 +244,7 @@
|
||||
#define glCombinerParameterivNV MANGLE(CombinerParameterivNV)
|
||||
#define glCombinerStageParameterfvNV MANGLE(CombinerStageParameterfvNV)
|
||||
#define glCompileShaderARB MANGLE(CompileShaderARB)
|
||||
#define glCompileShaderIncludeARB MANGLE(CompileShaderIncludeARB)
|
||||
#define glCompileShader MANGLE(CompileShader)
|
||||
#define glCompressedMultiTexImage1DEXT MANGLE(CompressedMultiTexImage1DEXT)
|
||||
#define glCompressedMultiTexImage2DEXT MANGLE(CompressedMultiTexImage2DEXT)
|
||||
@@ -326,6 +335,7 @@
|
||||
#define glDeleteFramebuffersEXT MANGLE(DeleteFramebuffersEXT)
|
||||
#define glDeleteFramebuffers MANGLE(DeleteFramebuffers)
|
||||
#define glDeleteLists MANGLE(DeleteLists)
|
||||
#define glDeleteNamedStringARB MANGLE(DeleteNamedStringARB)
|
||||
#define glDeleteObjectARB MANGLE(DeleteObjectARB)
|
||||
#define glDeleteOcclusionQueriesNV MANGLE(DeleteOcclusionQueriesNV)
|
||||
#define glDeletePerfMonitorsAMD MANGLE(DeletePerfMonitorsAMD)
|
||||
@@ -336,10 +346,12 @@
|
||||
#define glDeleteQueries MANGLE(DeleteQueries)
|
||||
#define glDeleteRenderbuffersEXT MANGLE(DeleteRenderbuffersEXT)
|
||||
#define glDeleteRenderbuffers MANGLE(DeleteRenderbuffers)
|
||||
#define glDeleteSamplers MANGLE(DeleteSamplers)
|
||||
#define glDeleteShader MANGLE(DeleteShader)
|
||||
#define glDeleteSync MANGLE(DeleteSync)
|
||||
#define glDeleteTexturesEXT MANGLE(DeleteTexturesEXT)
|
||||
#define glDeleteTextures MANGLE(DeleteTextures)
|
||||
#define glDeleteTransformFeedbacks MANGLE(DeleteTransformFeedbacks)
|
||||
#define glDeleteTransformFeedbacksNV MANGLE(DeleteTransformFeedbacksNV)
|
||||
#define glDeleteVertexArraysAPPLE MANGLE(DeleteVertexArraysAPPLE)
|
||||
#define glDeleteVertexArrays MANGLE(DeleteVertexArrays)
|
||||
@@ -363,6 +375,7 @@
|
||||
#define glDisableVertexAttribArrayARB MANGLE(DisableVertexAttribArrayARB)
|
||||
#define glDisableVertexAttribArray MANGLE(DisableVertexAttribArray)
|
||||
#define glDrawArraysEXT MANGLE(DrawArraysEXT)
|
||||
#define glDrawArraysIndirect MANGLE(DrawArraysIndirect)
|
||||
#define glDrawArraysInstancedARB MANGLE(DrawArraysInstancedARB)
|
||||
#define glDrawArraysInstancedEXT MANGLE(DrawArraysInstancedEXT)
|
||||
#define glDrawArraysInstanced MANGLE(DrawArraysInstanced)
|
||||
@@ -374,6 +387,7 @@
|
||||
#define glDrawElementArrayAPPLE MANGLE(DrawElementArrayAPPLE)
|
||||
#define glDrawElementArrayATI MANGLE(DrawElementArrayATI)
|
||||
#define glDrawElementsBaseVertex MANGLE(DrawElementsBaseVertex)
|
||||
#define glDrawElementsIndirect MANGLE(DrawElementsIndirect)
|
||||
#define glDrawElementsInstancedARB MANGLE(DrawElementsInstancedARB)
|
||||
#define glDrawElementsInstancedBaseVertex MANGLE(DrawElementsInstancedBaseVertex)
|
||||
#define glDrawElementsInstancedEXT MANGLE(DrawElementsInstancedEXT)
|
||||
@@ -386,7 +400,9 @@
|
||||
#define glDrawRangeElementsBaseVertex MANGLE(DrawRangeElementsBaseVertex)
|
||||
#define glDrawRangeElementsEXT MANGLE(DrawRangeElementsEXT)
|
||||
#define glDrawRangeElements MANGLE(DrawRangeElements)
|
||||
#define glDrawTransformFeedback MANGLE(DrawTransformFeedback)
|
||||
#define glDrawTransformFeedbackNV MANGLE(DrawTransformFeedbackNV)
|
||||
#define glDrawTransformFeedbackStream MANGLE(DrawTransformFeedbackStream)
|
||||
#define glEdgeFlagFormatNV MANGLE(EdgeFlagFormatNV)
|
||||
#define glEdgeFlag MANGLE(EdgeFlag)
|
||||
#define glEdgeFlagPointerEXT MANGLE(EdgeFlagPointerEXT)
|
||||
@@ -414,6 +430,7 @@
|
||||
#define glEndOcclusionQueryNV MANGLE(EndOcclusionQueryNV)
|
||||
#define glEndPerfMonitorAMD MANGLE(EndPerfMonitorAMD)
|
||||
#define glEndQueryARB MANGLE(EndQueryARB)
|
||||
#define glEndQueryIndexed MANGLE(EndQueryIndexed)
|
||||
#define glEndQuery MANGLE(EndQuery)
|
||||
#define glEndTransformFeedbackEXT MANGLE(EndTransformFeedbackEXT)
|
||||
#define glEndTransformFeedback MANGLE(EndTransformFeedback)
|
||||
@@ -498,7 +515,6 @@
|
||||
#define glFramebufferTextureEXT MANGLE(FramebufferTextureEXT)
|
||||
#define glFramebufferTextureFaceARB MANGLE(FramebufferTextureFaceARB)
|
||||
#define glFramebufferTextureFaceEXT MANGLE(FramebufferTextureFaceEXT)
|
||||
#define glFramebufferTextureFace MANGLE(FramebufferTextureFace)
|
||||
#define glFramebufferTextureLayerARB MANGLE(FramebufferTextureLayerARB)
|
||||
#define glFramebufferTextureLayerEXT MANGLE(FramebufferTextureLayerEXT)
|
||||
#define glFramebufferTextureLayer MANGLE(FramebufferTextureLayer)
|
||||
@@ -529,15 +545,20 @@
|
||||
#define glGenQueries MANGLE(GenQueries)
|
||||
#define glGenRenderbuffersEXT MANGLE(GenRenderbuffersEXT)
|
||||
#define glGenRenderbuffers MANGLE(GenRenderbuffers)
|
||||
#define glGenSamplers MANGLE(GenSamplers)
|
||||
#define glGenSymbolsEXT MANGLE(GenSymbolsEXT)
|
||||
#define glGenTexturesEXT MANGLE(GenTexturesEXT)
|
||||
#define glGenTextures MANGLE(GenTextures)
|
||||
#define glGenTransformFeedbacks MANGLE(GenTransformFeedbacks)
|
||||
#define glGenTransformFeedbacksNV MANGLE(GenTransformFeedbacksNV)
|
||||
#define glGenVertexArraysAPPLE MANGLE(GenVertexArraysAPPLE)
|
||||
#define glGenVertexArrays MANGLE(GenVertexArrays)
|
||||
#define glGenVertexShadersEXT MANGLE(GenVertexShadersEXT)
|
||||
#define glGetActiveAttribARB MANGLE(GetActiveAttribARB)
|
||||
#define glGetActiveAttrib MANGLE(GetActiveAttrib)
|
||||
#define glGetActiveSubroutineName MANGLE(GetActiveSubroutineName)
|
||||
#define glGetActiveSubroutineUniformiv MANGLE(GetActiveSubroutineUniformiv)
|
||||
#define glGetActiveSubroutineUniformName MANGLE(GetActiveSubroutineUniformName)
|
||||
#define glGetActiveUniformARB MANGLE(GetActiveUniformARB)
|
||||
#define glGetActiveUniformBlockiv MANGLE(GetActiveUniformBlockiv)
|
||||
#define glGetActiveUniformBlockName MANGLE(GetActiveUniformBlockName)
|
||||
@@ -599,6 +620,7 @@
|
||||
#define glGetFloatIndexedvEXT MANGLE(GetFloatIndexedvEXT)
|
||||
#define glGetFloatv MANGLE(GetFloatv)
|
||||
#define glGetFogFuncSGIS MANGLE(GetFogFuncSGIS)
|
||||
#define glGetFragDataIndex MANGLE(GetFragDataIndex)
|
||||
#define glGetFragDataLocationEXT MANGLE(GetFragDataLocationEXT)
|
||||
#define glGetFragDataLocation MANGLE(GetFragDataLocation)
|
||||
#define glGetFragmentLightfvSGIX MANGLE(GetFragmentLightfvSGIX)
|
||||
@@ -678,6 +700,8 @@
|
||||
#define glGetNamedProgramLocalParameterIuivEXT MANGLE(GetNamedProgramLocalParameterIuivEXT)
|
||||
#define glGetNamedProgramStringEXT MANGLE(GetNamedProgramStringEXT)
|
||||
#define glGetNamedRenderbufferParameterivEXT MANGLE(GetNamedRenderbufferParameterivEXT)
|
||||
#define glGetNamedStringARB MANGLE(GetNamedStringARB)
|
||||
#define glGetNamedStringivARB MANGLE(GetNamedStringivARB)
|
||||
#define glGetObjectBufferfvATI MANGLE(GetObjectBufferfvATI)
|
||||
#define glGetObjectBufferivATI MANGLE(GetObjectBufferivATI)
|
||||
#define glGetObjectParameterfvARB MANGLE(GetObjectParameterfvARB)
|
||||
@@ -717,18 +741,26 @@
|
||||
#define glGetProgramParameterdvNV MANGLE(GetProgramParameterdvNV)
|
||||
#define glGetProgramParameterfvNV MANGLE(GetProgramParameterfvNV)
|
||||
#define glGetProgramRegisterfvMESA MANGLE(GetProgramRegisterfvMESA)
|
||||
#define glGetProgramStageiv MANGLE(GetProgramStageiv)
|
||||
#define glGetProgramStringARB MANGLE(GetProgramStringARB)
|
||||
#define glGetProgramStringNV MANGLE(GetProgramStringNV)
|
||||
#define glGetQueryIndexediv MANGLE(GetQueryIndexediv)
|
||||
#define glGetQueryivARB MANGLE(GetQueryivARB)
|
||||
#define glGetQueryiv MANGLE(GetQueryiv)
|
||||
#define glGetQueryObjecti64vEXT MANGLE(GetQueryObjecti64vEXT)
|
||||
#define glGetQueryObjecti64v MANGLE(GetQueryObjecti64v)
|
||||
#define glGetQueryObjectivARB MANGLE(GetQueryObjectivARB)
|
||||
#define glGetQueryObjectiv MANGLE(GetQueryObjectiv)
|
||||
#define glGetQueryObjectui64vEXT MANGLE(GetQueryObjectui64vEXT)
|
||||
#define glGetQueryObjectui64v MANGLE(GetQueryObjectui64v)
|
||||
#define glGetQueryObjectuivARB MANGLE(GetQueryObjectuivARB)
|
||||
#define glGetQueryObjectuiv MANGLE(GetQueryObjectuiv)
|
||||
#define glGetRenderbufferParameterivEXT MANGLE(GetRenderbufferParameterivEXT)
|
||||
#define glGetRenderbufferParameteriv MANGLE(GetRenderbufferParameteriv)
|
||||
#define glGetSamplerParameterfv MANGLE(GetSamplerParameterfv)
|
||||
#define glGetSamplerParameterIfv MANGLE(GetSamplerParameterIfv)
|
||||
#define glGetSamplerParameterIiv MANGLE(GetSamplerParameterIiv)
|
||||
#define glGetSamplerParameteriv MANGLE(GetSamplerParameteriv)
|
||||
#define glGetSeparableFilterEXT MANGLE(GetSeparableFilterEXT)
|
||||
#define glGetSeparableFilter MANGLE(GetSeparableFilter)
|
||||
#define glGetShaderInfoLog MANGLE(GetShaderInfoLog)
|
||||
@@ -738,6 +770,8 @@
|
||||
#define glGetSharpenTexFuncSGIS MANGLE(GetSharpenTexFuncSGIS)
|
||||
#define glGetStringi MANGLE(GetStringi)
|
||||
#define glGetString MANGLE(GetString)
|
||||
#define glGetSubroutineIndex MANGLE(GetSubroutineIndex)
|
||||
#define glGetSubroutineUniformLocation MANGLE(GetSubroutineUniformLocation)
|
||||
#define glGetSynciv MANGLE(GetSynciv)
|
||||
#define glGetTexBumpParameterfvATI MANGLE(GetTexBumpParameterfvATI)
|
||||
#define glGetTexBumpParameterivATI MANGLE(GetTexBumpParameterivATI)
|
||||
@@ -770,6 +804,7 @@
|
||||
#define glGetTransformFeedbackVaryingNV MANGLE(GetTransformFeedbackVaryingNV)
|
||||
#define glGetUniformBlockIndex MANGLE(GetUniformBlockIndex)
|
||||
#define glGetUniformBufferSizeEXT MANGLE(GetUniformBufferSizeEXT)
|
||||
#define glGetUniformdv MANGLE(GetUniformdv)
|
||||
#define glGetUniformfvARB MANGLE(GetUniformfvARB)
|
||||
#define glGetUniformfv MANGLE(GetUniformfv)
|
||||
#define glGetUniformIndices MANGLE(GetUniformIndices)
|
||||
@@ -778,6 +813,7 @@
|
||||
#define glGetUniformLocationARB MANGLE(GetUniformLocationARB)
|
||||
#define glGetUniformLocation MANGLE(GetUniformLocation)
|
||||
#define glGetUniformOffsetEXT MANGLE(GetUniformOffsetEXT)
|
||||
#define glGetUniformSubroutineuiv MANGLE(GetUniformSubroutineuiv)
|
||||
#define glGetUniformui64vNV MANGLE(GetUniformui64vNV)
|
||||
#define glGetUniformuivEXT MANGLE(GetUniformuivEXT)
|
||||
#define glGetUniformuiv MANGLE(GetUniformuiv)
|
||||
@@ -865,6 +901,7 @@
|
||||
#define glIsFramebuffer MANGLE(IsFramebuffer)
|
||||
#define glIsList MANGLE(IsList)
|
||||
#define glIsNamedBufferResidentNV MANGLE(IsNamedBufferResidentNV)
|
||||
#define glIsNamedStringARB MANGLE(IsNamedStringARB)
|
||||
#define glIsObjectBufferATI MANGLE(IsObjectBufferATI)
|
||||
#define glIsOcclusionQueryNV MANGLE(IsOcclusionQueryNV)
|
||||
#define glIsProgramARB MANGLE(IsProgramARB)
|
||||
@@ -874,10 +911,12 @@
|
||||
#define glIsQuery MANGLE(IsQuery)
|
||||
#define glIsRenderbufferEXT MANGLE(IsRenderbufferEXT)
|
||||
#define glIsRenderbuffer MANGLE(IsRenderbuffer)
|
||||
#define glIsSampler MANGLE(IsSampler)
|
||||
#define glIsShader MANGLE(IsShader)
|
||||
#define glIsSync MANGLE(IsSync)
|
||||
#define glIsTextureEXT MANGLE(IsTextureEXT)
|
||||
#define glIsTexture MANGLE(IsTexture)
|
||||
#define glIsTransformFeedback MANGLE(IsTransformFeedback)
|
||||
#define glIsTransformFeedbackNV MANGLE(IsTransformFeedbackNV)
|
||||
#define glIsVariantEnabledEXT MANGLE(IsVariantEnabledEXT)
|
||||
#define glIsVertexArrayAPPLE MANGLE(IsVertexArrayAPPLE)
|
||||
@@ -915,6 +954,8 @@
|
||||
#define glLogicOp MANGLE(LogicOp)
|
||||
#define glMakeBufferNonResidentNV MANGLE(MakeBufferNonResidentNV)
|
||||
#define glMakeBufferResidentNV MANGLE(MakeBufferResidentNV)
|
||||
#define glMakeNamedBufferNonResidentNV MANGLE(MakeNamedBufferNonResidentNV)
|
||||
#define glMakeNamedBufferResidentNV MANGLE(MakeNamedBufferResidentNV)
|
||||
#define glMap1d MANGLE(Map1d)
|
||||
#define glMap1f MANGLE(Map1f)
|
||||
#define glMap2d MANGLE(Map2d)
|
||||
@@ -1048,6 +1089,14 @@
|
||||
#define glMultiTexCoord4s MANGLE(MultiTexCoord4s)
|
||||
#define glMultiTexCoord4svARB MANGLE(MultiTexCoord4svARB)
|
||||
#define glMultiTexCoord4sv MANGLE(MultiTexCoord4sv)
|
||||
#define glMultiTexCoordP1ui MANGLE(MultiTexCoordP1ui)
|
||||
#define glMultiTexCoordP1uiv MANGLE(MultiTexCoordP1uiv)
|
||||
#define glMultiTexCoordP2ui MANGLE(MultiTexCoordP2ui)
|
||||
#define glMultiTexCoordP2uiv MANGLE(MultiTexCoordP2uiv)
|
||||
#define glMultiTexCoordP3ui MANGLE(MultiTexCoordP3ui)
|
||||
#define glMultiTexCoordP3uiv MANGLE(MultiTexCoordP3uiv)
|
||||
#define glMultiTexCoordP4ui MANGLE(MultiTexCoordP4ui)
|
||||
#define glMultiTexCoordP4uiv MANGLE(MultiTexCoordP4uiv)
|
||||
#define glMultiTexCoordPointerEXT MANGLE(MultiTexCoordPointerEXT)
|
||||
#define glMultiTexEnvfEXT MANGLE(MultiTexEnvfEXT)
|
||||
#define glMultiTexEnvfvEXT MANGLE(MultiTexEnvfvEXT)
|
||||
@@ -1087,8 +1136,6 @@
|
||||
#define glNamedFramebufferTextureEXT MANGLE(NamedFramebufferTextureEXT)
|
||||
#define glNamedFramebufferTextureFaceEXT MANGLE(NamedFramebufferTextureFaceEXT)
|
||||
#define glNamedFramebufferTextureLayerEXT MANGLE(NamedFramebufferTextureLayerEXT)
|
||||
#define glNamedMakeBufferNonResidentNV MANGLE(NamedMakeBufferNonResidentNV)
|
||||
#define glNamedMakeBufferResidentNV MANGLE(NamedMakeBufferResidentNV)
|
||||
#define glNamedProgramLocalParameter4dEXT MANGLE(NamedProgramLocalParameter4dEXT)
|
||||
#define glNamedProgramLocalParameter4dvEXT MANGLE(NamedProgramLocalParameter4dvEXT)
|
||||
#define glNamedProgramLocalParameter4fEXT MANGLE(NamedProgramLocalParameter4fEXT)
|
||||
@@ -1104,6 +1151,7 @@
|
||||
#define glNamedRenderbufferStorageEXT MANGLE(NamedRenderbufferStorageEXT)
|
||||
#define glNamedRenderbufferStorageMultisampleCoverageEXT MANGLE(NamedRenderbufferStorageMultisampleCoverageEXT)
|
||||
#define glNamedRenderbufferStorageMultisampleEXT MANGLE(NamedRenderbufferStorageMultisampleEXT)
|
||||
#define glNamedStringARB MANGLE(NamedStringARB)
|
||||
#define glNewList MANGLE(NewList)
|
||||
#define glNewObjectBufferATI MANGLE(NewObjectBufferATI)
|
||||
#define glNormal3b MANGLE(Normal3b)
|
||||
@@ -1121,6 +1169,8 @@
|
||||
#define glNormal3s MANGLE(Normal3s)
|
||||
#define glNormal3sv MANGLE(Normal3sv)
|
||||
#define glNormalFormatNV MANGLE(NormalFormatNV)
|
||||
#define glNormalP3ui MANGLE(NormalP3ui)
|
||||
#define glNormalP3uiv MANGLE(NormalP3uiv)
|
||||
#define glNormalPointerEXT MANGLE(NormalPointerEXT)
|
||||
#define glNormalPointerListIBM MANGLE(NormalPointerListIBM)
|
||||
#define glNormalPointer MANGLE(NormalPointer)
|
||||
@@ -1140,6 +1190,9 @@
|
||||
#define glOrtho MANGLE(Ortho)
|
||||
#define glPassTexCoordATI MANGLE(PassTexCoordATI)
|
||||
#define glPassThrough MANGLE(PassThrough)
|
||||
#define glPatchParameterfv MANGLE(PatchParameterfv)
|
||||
#define glPatchParameteri MANGLE(PatchParameteri)
|
||||
#define glPauseTransformFeedback MANGLE(PauseTransformFeedback)
|
||||
#define glPauseTransformFeedbackNV MANGLE(PauseTransformFeedbackNV)
|
||||
#define glPixelDataRangeNV MANGLE(PixelDataRangeNV)
|
||||
#define glPixelMapfv MANGLE(PixelMapfv)
|
||||
@@ -1231,38 +1284,55 @@
|
||||
#define glProgramParameters4dvNV MANGLE(ProgramParameters4dvNV)
|
||||
#define glProgramParameters4fvNV MANGLE(ProgramParameters4fvNV)
|
||||
#define glProgramStringARB MANGLE(ProgramStringARB)
|
||||
#define glProgramUniform1dEXT MANGLE(ProgramUniform1dEXT)
|
||||
#define glProgramUniform1dvEXT MANGLE(ProgramUniform1dvEXT)
|
||||
#define glProgramUniform1fEXT MANGLE(ProgramUniform1fEXT)
|
||||
#define glProgramUniform1fvEXT MANGLE(ProgramUniform1fvEXT)
|
||||
#define glProgramUniform1iEXT MANGLE(ProgramUniform1iEXT)
|
||||
#define glProgramUniform1ivEXT MANGLE(ProgramUniform1ivEXT)
|
||||
#define glProgramUniform1uiEXT MANGLE(ProgramUniform1uiEXT)
|
||||
#define glProgramUniform1uivEXT MANGLE(ProgramUniform1uivEXT)
|
||||
#define glProgramUniform2dEXT MANGLE(ProgramUniform2dEXT)
|
||||
#define glProgramUniform2dvEXT MANGLE(ProgramUniform2dvEXT)
|
||||
#define glProgramUniform2fEXT MANGLE(ProgramUniform2fEXT)
|
||||
#define glProgramUniform2fvEXT MANGLE(ProgramUniform2fvEXT)
|
||||
#define glProgramUniform2iEXT MANGLE(ProgramUniform2iEXT)
|
||||
#define glProgramUniform2ivEXT MANGLE(ProgramUniform2ivEXT)
|
||||
#define glProgramUniform2uiEXT MANGLE(ProgramUniform2uiEXT)
|
||||
#define glProgramUniform2uivEXT MANGLE(ProgramUniform2uivEXT)
|
||||
#define glProgramUniform3dEXT MANGLE(ProgramUniform3dEXT)
|
||||
#define glProgramUniform3dvEXT MANGLE(ProgramUniform3dvEXT)
|
||||
#define glProgramUniform3fEXT MANGLE(ProgramUniform3fEXT)
|
||||
#define glProgramUniform3fvEXT MANGLE(ProgramUniform3fvEXT)
|
||||
#define glProgramUniform3iEXT MANGLE(ProgramUniform3iEXT)
|
||||
#define glProgramUniform3ivEXT MANGLE(ProgramUniform3ivEXT)
|
||||
#define glProgramUniform3uiEXT MANGLE(ProgramUniform3uiEXT)
|
||||
#define glProgramUniform3uivEXT MANGLE(ProgramUniform3uivEXT)
|
||||
#define glProgramUniform4dEXT MANGLE(ProgramUniform4dEXT)
|
||||
#define glProgramUniform4dvEXT MANGLE(ProgramUniform4dvEXT)
|
||||
#define glProgramUniform4fEXT MANGLE(ProgramUniform4fEXT)
|
||||
#define glProgramUniform4fvEXT MANGLE(ProgramUniform4fvEXT)
|
||||
#define glProgramUniform4iEXT MANGLE(ProgramUniform4iEXT)
|
||||
#define glProgramUniform4ivEXT MANGLE(ProgramUniform4ivEXT)
|
||||
#define glProgramUniform4uiEXT MANGLE(ProgramUniform4uiEXT)
|
||||
#define glProgramUniform4uivEXT MANGLE(ProgramUniform4uivEXT)
|
||||
#define glProgramUniformMatrix2dvEXT MANGLE(ProgramUniformMatrix2dvEXT)
|
||||
#define glProgramUniformMatrix2fvEXT MANGLE(ProgramUniformMatrix2fvEXT)
|
||||
#define glProgramUniformMatrix2x3dvEXT MANGLE(ProgramUniformMatrix2x3dvEXT)
|
||||
#define glProgramUniformMatrix2x3fvEXT MANGLE(ProgramUniformMatrix2x3fvEXT)
|
||||
#define glProgramUniformMatrix2x4dvEXT MANGLE(ProgramUniformMatrix2x4dvEXT)
|
||||
#define glProgramUniformMatrix2x4fvEXT MANGLE(ProgramUniformMatrix2x4fvEXT)
|
||||
#define glProgramUniformMatrix3dvEXT MANGLE(ProgramUniformMatrix3dvEXT)
|
||||
#define glProgramUniformMatrix3fvEXT MANGLE(ProgramUniformMatrix3fvEXT)
|
||||
#define glProgramUniformMatrix3x2dvEXT MANGLE(ProgramUniformMatrix3x2dvEXT)
|
||||
#define glProgramUniformMatrix3x2fvEXT MANGLE(ProgramUniformMatrix3x2fvEXT)
|
||||
#define glProgramUniformMatrix3x4dvEXT MANGLE(ProgramUniformMatrix3x4dvEXT)
|
||||
#define glProgramUniformMatrix3x4fvEXT MANGLE(ProgramUniformMatrix3x4fvEXT)
|
||||
#define glProgramUniformMatrix4dvEXT MANGLE(ProgramUniformMatrix4dvEXT)
|
||||
#define glProgramUniformMatrix4fvEXT MANGLE(ProgramUniformMatrix4fvEXT)
|
||||
#define glProgramUniformMatrix4x2dvEXT MANGLE(ProgramUniformMatrix4x2dvEXT)
|
||||
#define glProgramUniformMatrix4x2fvEXT MANGLE(ProgramUniformMatrix4x2fvEXT)
|
||||
#define glProgramUniformMatrix4x3dvEXT MANGLE(ProgramUniformMatrix4x3dvEXT)
|
||||
#define glProgramUniformMatrix4x3fvEXT MANGLE(ProgramUniformMatrix4x3fvEXT)
|
||||
#define glProgramUniformui64NV MANGLE(ProgramUniformui64NV)
|
||||
#define glProgramUniformui64vNV MANGLE(ProgramUniformui64vNV)
|
||||
@@ -1274,6 +1344,7 @@
|
||||
#define glPushClientAttrib MANGLE(PushClientAttrib)
|
||||
#define glPushMatrix MANGLE(PushMatrix)
|
||||
#define glPushName MANGLE(PushName)
|
||||
#define glQueryCounter MANGLE(QueryCounter)
|
||||
#define glRasterPos2d MANGLE(RasterPos2d)
|
||||
#define glRasterPos2dv MANGLE(RasterPos2dv)
|
||||
#define glRasterPos2f MANGLE(RasterPos2f)
|
||||
@@ -1345,6 +1416,7 @@
|
||||
#define glResetMinmaxEXT MANGLE(ResetMinmaxEXT)
|
||||
#define glResetMinmax MANGLE(ResetMinmax)
|
||||
#define glResizeBuffersMESA MANGLE(ResizeBuffersMESA)
|
||||
#define glResumeTransformFeedback MANGLE(ResumeTransformFeedback)
|
||||
#define glResumeTransformFeedbackNV MANGLE(ResumeTransformFeedbackNV)
|
||||
#define glRotated MANGLE(Rotated)
|
||||
#define glRotatef MANGLE(Rotatef)
|
||||
@@ -1357,6 +1429,12 @@
|
||||
#define glSampleMaskSGIS MANGLE(SampleMaskSGIS)
|
||||
#define glSamplePatternEXT MANGLE(SamplePatternEXT)
|
||||
#define glSamplePatternSGIS MANGLE(SamplePatternSGIS)
|
||||
#define glSamplerParameterf MANGLE(SamplerParameterf)
|
||||
#define glSamplerParameterfv MANGLE(SamplerParameterfv)
|
||||
#define glSamplerParameterIiv MANGLE(SamplerParameterIiv)
|
||||
#define glSamplerParameteri MANGLE(SamplerParameteri)
|
||||
#define glSamplerParameterIuiv MANGLE(SamplerParameterIuiv)
|
||||
#define glSamplerParameteriv MANGLE(SamplerParameteriv)
|
||||
#define glScaled MANGLE(Scaled)
|
||||
#define glScalef MANGLE(Scalef)
|
||||
#define glScissor MANGLE(Scissor)
|
||||
@@ -1395,6 +1473,8 @@
|
||||
#define glSecondaryColor3usvEXT MANGLE(SecondaryColor3usvEXT)
|
||||
#define glSecondaryColor3usv MANGLE(SecondaryColor3usv)
|
||||
#define glSecondaryColorFormatNV MANGLE(SecondaryColorFormatNV)
|
||||
#define glSecondaryColorP3ui MANGLE(SecondaryColorP3ui)
|
||||
#define glSecondaryColorP3uiv MANGLE(SecondaryColorP3uiv)
|
||||
#define glSecondaryColorPointerEXT MANGLE(SecondaryColorPointerEXT)
|
||||
#define glSecondaryColorPointerListIBM MANGLE(SecondaryColorPointerListIBM)
|
||||
#define glSecondaryColorPointer MANGLE(SecondaryColorPointer)
|
||||
@@ -1509,6 +1589,14 @@
|
||||
#define glTexCoord4s MANGLE(TexCoord4s)
|
||||
#define glTexCoord4sv MANGLE(TexCoord4sv)
|
||||
#define glTexCoordFormatNV MANGLE(TexCoordFormatNV)
|
||||
#define glTexCoordP1ui MANGLE(TexCoordP1ui)
|
||||
#define glTexCoordP1uiv MANGLE(TexCoordP1uiv)
|
||||
#define glTexCoordP2ui MANGLE(TexCoordP2ui)
|
||||
#define glTexCoordP2uiv MANGLE(TexCoordP2uiv)
|
||||
#define glTexCoordP3ui MANGLE(TexCoordP3ui)
|
||||
#define glTexCoordP3uiv MANGLE(TexCoordP3uiv)
|
||||
#define glTexCoordP4ui MANGLE(TexCoordP4ui)
|
||||
#define glTexCoordP4uiv MANGLE(TexCoordP4uiv)
|
||||
#define glTexCoordPointerEXT MANGLE(TexCoordPointerEXT)
|
||||
#define glTexCoordPointerListIBM MANGLE(TexCoordPointerListIBM)
|
||||
#define glTexCoordPointer MANGLE(TexCoordPointer)
|
||||
@@ -1574,6 +1662,8 @@
|
||||
#define glTransformFeedbackVaryingsNV MANGLE(TransformFeedbackVaryingsNV)
|
||||
#define glTranslated MANGLE(Translated)
|
||||
#define glTranslatef MANGLE(Translatef)
|
||||
#define glUniform1d MANGLE(Uniform1d)
|
||||
#define glUniform1dv MANGLE(Uniform1dv)
|
||||
#define glUniform1fARB MANGLE(Uniform1fARB)
|
||||
#define glUniform1f MANGLE(Uniform1f)
|
||||
#define glUniform1fvARB MANGLE(Uniform1fvARB)
|
||||
@@ -1586,6 +1676,8 @@
|
||||
#define glUniform1ui MANGLE(Uniform1ui)
|
||||
#define glUniform1uivEXT MANGLE(Uniform1uivEXT)
|
||||
#define glUniform1uiv MANGLE(Uniform1uiv)
|
||||
#define glUniform2d MANGLE(Uniform2d)
|
||||
#define glUniform2dv MANGLE(Uniform2dv)
|
||||
#define glUniform2fARB MANGLE(Uniform2fARB)
|
||||
#define glUniform2f MANGLE(Uniform2f)
|
||||
#define glUniform2fvARB MANGLE(Uniform2fvARB)
|
||||
@@ -1598,6 +1690,8 @@
|
||||
#define glUniform2ui MANGLE(Uniform2ui)
|
||||
#define glUniform2uivEXT MANGLE(Uniform2uivEXT)
|
||||
#define glUniform2uiv MANGLE(Uniform2uiv)
|
||||
#define glUniform3d MANGLE(Uniform3d)
|
||||
#define glUniform3dv MANGLE(Uniform3dv)
|
||||
#define glUniform3fARB MANGLE(Uniform3fARB)
|
||||
#define glUniform3f MANGLE(Uniform3f)
|
||||
#define glUniform3fvARB MANGLE(Uniform3fvARB)
|
||||
@@ -1610,6 +1704,8 @@
|
||||
#define glUniform3ui MANGLE(Uniform3ui)
|
||||
#define glUniform3uivEXT MANGLE(Uniform3uivEXT)
|
||||
#define glUniform3uiv MANGLE(Uniform3uiv)
|
||||
#define glUniform4d MANGLE(Uniform4d)
|
||||
#define glUniform4dv MANGLE(Uniform4dv)
|
||||
#define glUniform4fARB MANGLE(Uniform4fARB)
|
||||
#define glUniform4f MANGLE(Uniform4f)
|
||||
#define glUniform4fvARB MANGLE(Uniform4fvARB)
|
||||
@@ -1624,18 +1720,28 @@
|
||||
#define glUniform4uiv MANGLE(Uniform4uiv)
|
||||
#define glUniformBlockBinding MANGLE(UniformBlockBinding)
|
||||
#define glUniformBufferEXT MANGLE(UniformBufferEXT)
|
||||
#define glUniformMatrix2dv MANGLE(UniformMatrix2dv)
|
||||
#define glUniformMatrix2fvARB MANGLE(UniformMatrix2fvARB)
|
||||
#define glUniformMatrix2fv MANGLE(UniformMatrix2fv)
|
||||
#define glUniformMatrix2x3dv MANGLE(UniformMatrix2x3dv)
|
||||
#define glUniformMatrix2x3fv MANGLE(UniformMatrix2x3fv)
|
||||
#define glUniformMatrix2x4dv MANGLE(UniformMatrix2x4dv)
|
||||
#define glUniformMatrix2x4fv MANGLE(UniformMatrix2x4fv)
|
||||
#define glUniformMatrix3dv MANGLE(UniformMatrix3dv)
|
||||
#define glUniformMatrix3fvARB MANGLE(UniformMatrix3fvARB)
|
||||
#define glUniformMatrix3fv MANGLE(UniformMatrix3fv)
|
||||
#define glUniformMatrix3x2dv MANGLE(UniformMatrix3x2dv)
|
||||
#define glUniformMatrix3x2fv MANGLE(UniformMatrix3x2fv)
|
||||
#define glUniformMatrix3x4dv MANGLE(UniformMatrix3x4dv)
|
||||
#define glUniformMatrix3x4fv MANGLE(UniformMatrix3x4fv)
|
||||
#define glUniformMatrix4dv MANGLE(UniformMatrix4dv)
|
||||
#define glUniformMatrix4fvARB MANGLE(UniformMatrix4fvARB)
|
||||
#define glUniformMatrix4fv MANGLE(UniformMatrix4fv)
|
||||
#define glUniformMatrix4x2dv MANGLE(UniformMatrix4x2dv)
|
||||
#define glUniformMatrix4x2fv MANGLE(UniformMatrix4x2fv)
|
||||
#define glUniformMatrix4x3dv MANGLE(UniformMatrix4x3dv)
|
||||
#define glUniformMatrix4x3fv MANGLE(UniformMatrix4x3fv)
|
||||
#define glUniformSubroutinesuiv MANGLE(UniformSubroutinesuiv)
|
||||
#define glUniformui64NV MANGLE(Uniformui64NV)
|
||||
#define glUniformui64vNV MANGLE(Uniformui64vNV)
|
||||
#define glUnlockArraysEXT MANGLE(UnlockArraysEXT)
|
||||
@@ -1844,6 +1950,14 @@
|
||||
#define glVertexAttribIFormatNV MANGLE(VertexAttribIFormatNV)
|
||||
#define glVertexAttribIPointerEXT MANGLE(VertexAttribIPointerEXT)
|
||||
#define glVertexAttribIPointer MANGLE(VertexAttribIPointer)
|
||||
#define glVertexAttribP1ui MANGLE(VertexAttribP1ui)
|
||||
#define glVertexAttribP1uiv MANGLE(VertexAttribP1uiv)
|
||||
#define glVertexAttribP2ui MANGLE(VertexAttribP2ui)
|
||||
#define glVertexAttribP2uiv MANGLE(VertexAttribP2uiv)
|
||||
#define glVertexAttribP3ui MANGLE(VertexAttribP3ui)
|
||||
#define glVertexAttribP3uiv MANGLE(VertexAttribP3uiv)
|
||||
#define glVertexAttribP4ui MANGLE(VertexAttribP4ui)
|
||||
#define glVertexAttribP4uiv MANGLE(VertexAttribP4uiv)
|
||||
#define glVertexAttribPointerARB MANGLE(VertexAttribPointerARB)
|
||||
#define glVertexAttribPointer MANGLE(VertexAttribPointer)
|
||||
#define glVertexAttribPointerNV MANGLE(VertexAttribPointerNV)
|
||||
@@ -1868,6 +1982,12 @@
|
||||
#define glVertexBlendEnvfATI MANGLE(VertexBlendEnvfATI)
|
||||
#define glVertexBlendEnviATI MANGLE(VertexBlendEnviATI)
|
||||
#define glVertexFormatNV MANGLE(VertexFormatNV)
|
||||
#define glVertexP2ui MANGLE(VertexP2ui)
|
||||
#define glVertexP2uiv MANGLE(VertexP2uiv)
|
||||
#define glVertexP3ui MANGLE(VertexP3ui)
|
||||
#define glVertexP3uiv MANGLE(VertexP3uiv)
|
||||
#define glVertexP4ui MANGLE(VertexP4ui)
|
||||
#define glVertexP4uiv MANGLE(VertexP4uiv)
|
||||
#define glVertexPointerEXT MANGLE(VertexPointerEXT)
|
||||
#define glVertexPointerListIBM MANGLE(VertexPointerListIBM)
|
||||
#define glVertexPointer MANGLE(VertexPointer)
|
||||
|
3806
include/GL/glext.h
3806
include/GL/glext.h
File diff suppressed because it is too large
Load Diff
@@ -124,6 +124,10 @@ extern "C" {
|
||||
#define GLX_SAMPLES_ARB 100001
|
||||
#endif
|
||||
|
||||
#ifndef GLX_ARB_vertex_buffer_object
|
||||
#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095
|
||||
#endif
|
||||
|
||||
#ifndef GLX_ARB_fbconfig_float
|
||||
#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9
|
||||
#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
|
||||
|
@@ -158,7 +158,7 @@ static void printhelp(void)
|
||||
glRasterPos2i(60,240);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"l - Increase rain length");
|
||||
glRasterPos2i(60,210);
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"k - Increase rain length");
|
||||
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"k - Decrease rain length");
|
||||
}
|
||||
|
||||
static void drawrain(void)
|
||||
|
@@ -4,7 +4,7 @@ TOP = ../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
INCLUDE_DIRS = -I$(TOP)/include
|
||||
INCLUDE_DIRS = -I$(TOP)/include $(X11_CFLAGS)
|
||||
|
||||
HEADERS = $(TOP)/include/GLES/egl.h
|
||||
LIB_DEP = $(TOP)/$(LIB_DIR)/libEGL.so
|
||||
@@ -57,13 +57,13 @@ peglgears: peglgears.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
|
||||
|
||||
xeglgears: xeglgears.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm -L$(libdir) -lX11
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
|
||||
|
||||
xeglthreads: xeglthreads.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm -L$(libdir) -lX11
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm -lpthread $(X11_LIBS)
|
||||
|
||||
xegl_tri: xegl_tri.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm -L$(libdir) -lX11
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lm $(X11_LIBS)
|
||||
|
||||
clean:
|
||||
-rm -f *.o *~
|
||||
|
@@ -5,7 +5,7 @@ include $(TOP)/configs/current
|
||||
|
||||
INCDIR = $(TOP)/include
|
||||
|
||||
OSMESA_LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -l$(OSMESA_LIB) $(APP_LIB_DEPS)
|
||||
OSMESA_LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(OSMESA_LIB) $(APP_LIB_DEPS)
|
||||
|
||||
OSMESA16_LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -lOSMesa16 -l$(GLU_LIB) \
|
||||
-l$(GL_LIB) $(APP_LIB_DEPS)
|
||||
|
@@ -399,7 +399,11 @@ test(GLenum type, GLint bits, const char *filename)
|
||||
|
||||
/* sanity checks */
|
||||
glGetIntegerv(GL_RED_BITS, &cBits);
|
||||
assert(cBits == bits);
|
||||
if (cBits != bits) {
|
||||
fprintf(stderr, "Unable to create %d-bit/channel renderbuffer.\n", bits);
|
||||
fprintf(stderr, "May need to recompile Mesa with CHAN_BITS=16 or 32.\n");
|
||||
return 0;
|
||||
}
|
||||
glGetIntegerv(GL_GREEN_BITS, &cBits);
|
||||
assert(cBits == bits);
|
||||
glGetIntegerv(GL_BLUE_BITS, &cBits);
|
||||
|
@@ -102,6 +102,19 @@ static void Display(void)
|
||||
|
||||
/* read back scaled depth image */
|
||||
glReadPixels(100, 0, 400, 400, GL_DEPTH_COMPONENT, GL_FLOAT, depth2);
|
||||
|
||||
/* debug */
|
||||
if (0) {
|
||||
int i;
|
||||
float *z = depth2 + 400 * 200;
|
||||
printf("z at y=200:\n");
|
||||
for (i = 0; i < 400; i++) {
|
||||
printf("%5.3f ", z[i]);
|
||||
if ((i + 1) % 12 == 0)
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* draw as luminance */
|
||||
glPixelZoom(1.0, 1.0);
|
||||
glWindowPos2i(100, 0);
|
||||
|
@@ -9,9 +9,9 @@ INCDIR = $(TOP)/include
|
||||
LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
|
||||
|
||||
# Add X11 and pthread libs to satisfy GNU gold.
|
||||
APP_LIB_DEPS += -lX11 -lpthread
|
||||
APP_LIB_DEPS += $(X11_LIBS) -lpthread
|
||||
|
||||
LIBS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -L$(libdir) $(APP_LIB_DEPS)
|
||||
LIBS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) $(APP_LIB_DEPS)
|
||||
|
||||
PROGS = \
|
||||
corender \
|
||||
|
@@ -706,7 +706,8 @@ dri2_initialize(_EGLDriver *drv, _EGLDisplay *disp,
|
||||
dri2_dpy->fd = open(dri2_dpy->device_name, O_RDWR);
|
||||
if (dri2_dpy->fd == -1) {
|
||||
_eglLog(_EGL_FATAL,
|
||||
"DRI2: could not open %s (%s)", path, strerror(errno));
|
||||
"DRI2: could not open %s (%s)", dri2_dpy->device_name,
|
||||
strerror(errno));
|
||||
goto cleanup_driver;
|
||||
}
|
||||
|
||||
@@ -1330,6 +1331,7 @@ _eglMain(const char *args)
|
||||
if (!dri2_drv)
|
||||
return NULL;
|
||||
|
||||
memset(dri2_drv, 0, sizeof *dri2_drv);
|
||||
_eglInitDriverFallbacks(&dri2_drv->base);
|
||||
dri2_drv->base.API.Initialize = dri2_initialize;
|
||||
dri2_drv->base.API.Terminate = dri2_terminate;
|
||||
|
@@ -10,7 +10,7 @@ EGL_INCLUDES = \
|
||||
-I$(TOP)/include \
|
||||
-I$(TOP)/src/egl/main
|
||||
|
||||
EGL_CFLAGS =
|
||||
EGL_LIBS = -lX11 -lGL
|
||||
EGL_CFLAGS = $(X11_CFLAGS)
|
||||
EGL_LIBS = $(X11_LIBS) -lGL
|
||||
|
||||
include ../Makefile.template
|
||||
|
@@ -7,7 +7,7 @@ include $(TOP)/configs/current
|
||||
EGL_MAJOR = 1
|
||||
EGL_MINOR = 0
|
||||
|
||||
INCLUDE_DIRS = -I$(TOP)/include
|
||||
INCLUDE_DIRS = -I$(TOP)/include $(X11_CFLAGS)
|
||||
|
||||
HEADERS = \
|
||||
eglcompiler.h \
|
||||
|
@@ -31,6 +31,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_math.h"
|
||||
#include "draw_context.h"
|
||||
@@ -38,7 +39,7 @@
|
||||
#include "draw_gs.h"
|
||||
|
||||
|
||||
struct draw_context *draw_create( void )
|
||||
struct draw_context *draw_create( struct pipe_context *pipe )
|
||||
{
|
||||
struct draw_context *draw = CALLOC_STRUCT( draw_context );
|
||||
if (draw == NULL)
|
||||
@@ -68,6 +69,8 @@ struct draw_context *draw_create( void )
|
||||
if (!draw_gs_init( draw ))
|
||||
goto fail;
|
||||
|
||||
draw->pipe = pipe;
|
||||
|
||||
return draw;
|
||||
|
||||
fail:
|
||||
@@ -78,10 +81,21 @@ fail:
|
||||
|
||||
void draw_destroy( struct draw_context *draw )
|
||||
{
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
int i, j;
|
||||
|
||||
if (!draw)
|
||||
return;
|
||||
|
||||
|
||||
/* free any rasterizer CSOs that we may have created.
|
||||
*/
|
||||
for (i = 0; i < 2; i++) {
|
||||
for (j = 0; j < 2; j++) {
|
||||
if (draw->rasterizer_no_cull[i][j]) {
|
||||
pipe->delete_rasterizer_state(pipe, draw->rasterizer_no_cull[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Not so fast -- we're just borrowing this at the moment.
|
||||
*
|
||||
@@ -123,12 +137,17 @@ void draw_set_mrd(struct draw_context *draw, double mrd)
|
||||
* This causes the drawing pipeline to be rebuilt.
|
||||
*/
|
||||
void draw_set_rasterizer_state( struct draw_context *draw,
|
||||
const struct pipe_rasterizer_state *raster )
|
||||
const struct pipe_rasterizer_state *raster,
|
||||
void *rast_handle )
|
||||
{
|
||||
draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
|
||||
if (!draw->suspend_flushing) {
|
||||
draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
|
||||
|
||||
draw->rasterizer = raster;
|
||||
draw->bypass_clipping = draw->driver.bypass_clipping;
|
||||
draw->rasterizer = raster;
|
||||
draw->rast_handle = rast_handle;
|
||||
|
||||
draw->bypass_clipping = draw->driver.bypass_clipping;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -481,3 +500,37 @@ draw_current_shader_position_output(const struct draw_context *draw)
|
||||
return draw->gs.position_output;
|
||||
return draw->vs.position_output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return a pointer/handle for a driver/CSO rasterizer object which
|
||||
* disabled culling, stippling, unfilled tris, etc.
|
||||
* This is used by some pipeline stages (such as wide_point, aa_line
|
||||
* and aa_point) which convert points/lines into triangles. In those
|
||||
* cases we don't want to accidentally cull the triangles.
|
||||
*
|
||||
* \param scissor should the rasterizer state enable scissoring?
|
||||
* \param flatshade should the rasterizer state use flat shading?
|
||||
* \return rasterizer CSO handle
|
||||
*/
|
||||
void *
|
||||
draw_get_rasterizer_no_cull( struct draw_context *draw,
|
||||
boolean scissor,
|
||||
boolean flatshade )
|
||||
{
|
||||
if (!draw->rasterizer_no_cull[scissor][flatshade]) {
|
||||
/* create now */
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
struct pipe_rasterizer_state rast;
|
||||
|
||||
memset(&rast, 0, sizeof(rast));
|
||||
rast.scissor = scissor;
|
||||
rast.flatshade = flatshade;
|
||||
rast.front_winding = PIPE_WINDING_CCW;
|
||||
rast.gl_rasterization_rules = draw->rasterizer->gl_rasterization_rules;
|
||||
|
||||
draw->rasterizer_no_cull[scissor][flatshade] =
|
||||
pipe->create_rasterizer_state(pipe, &rast);
|
||||
}
|
||||
return draw->rasterizer_no_cull[scissor][flatshade];
|
||||
}
|
||||
|
@@ -49,7 +49,7 @@ struct draw_geometry_shader;
|
||||
struct tgsi_sampler;
|
||||
|
||||
|
||||
struct draw_context *draw_create( void );
|
||||
struct draw_context *draw_create( struct pipe_context *pipe );
|
||||
|
||||
void draw_destroy( struct draw_context *draw );
|
||||
|
||||
@@ -60,7 +60,8 @@ void draw_set_clip_state( struct draw_context *pipe,
|
||||
const struct pipe_clip_state *clip );
|
||||
|
||||
void draw_set_rasterizer_state( struct draw_context *draw,
|
||||
const struct pipe_rasterizer_state *raster );
|
||||
const struct pipe_rasterizer_state *raster,
|
||||
void *rast_handle );
|
||||
|
||||
void draw_set_rasterize_stage( struct draw_context *draw,
|
||||
struct draw_stage *stage );
|
||||
|
@@ -113,8 +113,6 @@ struct aaline_stage
|
||||
void **);
|
||||
void (*driver_set_sampler_textures)(struct pipe_context *, unsigned,
|
||||
struct pipe_texture **);
|
||||
|
||||
struct pipe_context *pipe;
|
||||
};
|
||||
|
||||
|
||||
@@ -339,6 +337,7 @@ aa_transform_inst(struct tgsi_transform_context *ctx,
|
||||
static boolean
|
||||
generate_aaline_fs(struct aaline_stage *aaline)
|
||||
{
|
||||
struct pipe_context *pipe = aaline->stage.draw->pipe;
|
||||
const struct pipe_shader_state *orig_fs = &aaline->fs->state;
|
||||
struct pipe_shader_state aaline_fs;
|
||||
struct aa_transform_context transform;
|
||||
@@ -371,7 +370,7 @@ generate_aaline_fs(struct aaline_stage *aaline)
|
||||
aaline->fs->sampler_unit = transform.freeSampler;
|
||||
|
||||
aaline->fs->aaline_fs
|
||||
= aaline->driver_create_fs_state(aaline->pipe, &aaline_fs);
|
||||
= aaline->driver_create_fs_state(pipe, &aaline_fs);
|
||||
if (aaline->fs->aaline_fs == NULL)
|
||||
goto fail;
|
||||
|
||||
@@ -391,7 +390,7 @@ fail:
|
||||
static boolean
|
||||
aaline_create_texture(struct aaline_stage *aaline)
|
||||
{
|
||||
struct pipe_context *pipe = aaline->pipe;
|
||||
struct pipe_context *pipe = aaline->stage.draw->pipe;
|
||||
struct pipe_screen *screen = pipe->screen;
|
||||
struct pipe_texture texTemp;
|
||||
uint level;
|
||||
@@ -464,7 +463,7 @@ static boolean
|
||||
aaline_create_sampler(struct aaline_stage *aaline)
|
||||
{
|
||||
struct pipe_sampler_state sampler;
|
||||
struct pipe_context *pipe = aaline->pipe;
|
||||
struct pipe_context *pipe = aaline->stage.draw->pipe;
|
||||
|
||||
memset(&sampler, 0, sizeof(sampler));
|
||||
sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
|
||||
@@ -493,13 +492,14 @@ static boolean
|
||||
bind_aaline_fragment_shader(struct aaline_stage *aaline)
|
||||
{
|
||||
struct draw_context *draw = aaline->stage.draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
if (!aaline->fs->aaline_fs &&
|
||||
!generate_aaline_fs(aaline))
|
||||
return FALSE;
|
||||
|
||||
draw->suspend_flushing = TRUE;
|
||||
aaline->driver_bind_fs_state(aaline->pipe, aaline->fs->aaline_fs);
|
||||
aaline->driver_bind_fs_state(pipe, aaline->fs->aaline_fs);
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
return TRUE;
|
||||
@@ -639,8 +639,10 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
|
||||
{
|
||||
auto struct aaline_stage *aaline = aaline_stage(stage);
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = aaline->pipe;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
const struct pipe_rasterizer_state *rast = draw->rasterizer;
|
||||
uint num_samplers;
|
||||
void *r;
|
||||
|
||||
assert(draw->rasterizer->line_smooth);
|
||||
|
||||
@@ -679,6 +681,11 @@ aaline_first_line(struct draw_stage *stage, struct prim_header *header)
|
||||
draw->suspend_flushing = TRUE;
|
||||
aaline->driver_bind_sampler_states(pipe, num_samplers, aaline->state.sampler);
|
||||
aaline->driver_set_sampler_textures(pipe, num_samplers, aaline->state.texture);
|
||||
|
||||
/* Disable triangle culling, stippling, unfilled mode etc. */
|
||||
r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
|
||||
pipe->bind_rasterizer_state(pipe, r);
|
||||
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
/* now really draw first line */
|
||||
@@ -692,7 +699,7 @@ aaline_flush(struct draw_stage *stage, unsigned flags)
|
||||
{
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct aaline_stage *aaline = aaline_stage(stage);
|
||||
struct pipe_context *pipe = aaline->pipe;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
stage->line = aaline_first_line;
|
||||
stage->next->flush( stage->next, flags );
|
||||
@@ -704,6 +711,12 @@ aaline_flush(struct draw_stage *stage, unsigned flags)
|
||||
aaline->state.sampler);
|
||||
aaline->driver_set_sampler_textures(pipe, aaline->num_textures,
|
||||
aaline->state.texture);
|
||||
|
||||
/* restore original rasterizer state */
|
||||
if (draw->rast_handle) {
|
||||
pipe->bind_rasterizer_state(pipe, draw->rast_handle);
|
||||
}
|
||||
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
draw->extra_shader_outputs.slot = 0;
|
||||
@@ -721,6 +734,7 @@ static void
|
||||
aaline_destroy(struct draw_stage *stage)
|
||||
{
|
||||
struct aaline_stage *aaline = aaline_stage(stage);
|
||||
struct pipe_context *pipe = stage->draw->pipe;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
|
||||
@@ -728,7 +742,7 @@ aaline_destroy(struct draw_stage *stage)
|
||||
}
|
||||
|
||||
if (aaline->sampler_cso)
|
||||
aaline->pipe->delete_sampler_state(aaline->pipe, aaline->sampler_cso);
|
||||
pipe->delete_sampler_state(pipe, aaline->sampler_cso);
|
||||
|
||||
if (aaline->texture)
|
||||
pipe_texture_reference(&aaline->texture, NULL);
|
||||
@@ -787,13 +801,14 @@ aaline_create_fs_state(struct pipe_context *pipe,
|
||||
{
|
||||
struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);
|
||||
struct aaline_fragment_shader *aafs = CALLOC_STRUCT(aaline_fragment_shader);
|
||||
|
||||
if (aafs == NULL)
|
||||
return NULL;
|
||||
|
||||
aafs->state = *fs;
|
||||
|
||||
/* pass-through */
|
||||
aafs->driver_fs = aaline->driver_create_fs_state(aaline->pipe, fs);
|
||||
aafs->driver_fs = aaline->driver_create_fs_state(pipe, fs);
|
||||
|
||||
return aafs;
|
||||
}
|
||||
@@ -808,8 +823,7 @@ aaline_bind_fs_state(struct pipe_context *pipe, void *fs)
|
||||
/* save current */
|
||||
aaline->fs = aafs;
|
||||
/* pass-through */
|
||||
aaline->driver_bind_fs_state(aaline->pipe,
|
||||
(aafs ? aafs->driver_fs : NULL));
|
||||
aaline->driver_bind_fs_state(pipe, (aafs ? aafs->driver_fs : NULL));
|
||||
}
|
||||
|
||||
|
||||
@@ -818,11 +832,12 @@ aaline_delete_fs_state(struct pipe_context *pipe, void *fs)
|
||||
{
|
||||
struct aaline_stage *aaline = aaline_stage_from_pipe(pipe);
|
||||
struct aaline_fragment_shader *aafs = (struct aaline_fragment_shader *) fs;
|
||||
|
||||
/* pass-through */
|
||||
aaline->driver_delete_fs_state(aaline->pipe, aafs->driver_fs);
|
||||
aaline->driver_delete_fs_state(pipe, aafs->driver_fs);
|
||||
|
||||
if (aafs->aaline_fs)
|
||||
aaline->driver_delete_fs_state(aaline->pipe, aafs->aaline_fs);
|
||||
aaline->driver_delete_fs_state(pipe, aafs->aaline_fs);
|
||||
|
||||
FREE(aafs);
|
||||
}
|
||||
@@ -839,7 +854,7 @@ aaline_bind_sampler_states(struct pipe_context *pipe,
|
||||
aaline->num_samplers = num;
|
||||
|
||||
/* pass-through */
|
||||
aaline->driver_bind_sampler_states(aaline->pipe, num, sampler);
|
||||
aaline->driver_bind_sampler_states(pipe, num, sampler);
|
||||
}
|
||||
|
||||
|
||||
@@ -860,7 +875,7 @@ aaline_set_sampler_textures(struct pipe_context *pipe,
|
||||
aaline->num_textures = num;
|
||||
|
||||
/* pass-through */
|
||||
aaline->driver_set_sampler_textures(aaline->pipe, num, texture);
|
||||
aaline->driver_set_sampler_textures(pipe, num, texture);
|
||||
}
|
||||
|
||||
|
||||
@@ -883,8 +898,6 @@ draw_install_aaline_stage(struct draw_context *draw, struct pipe_context *pipe)
|
||||
if (!aaline)
|
||||
goto fail;
|
||||
|
||||
aaline->pipe = pipe;
|
||||
|
||||
/* create special texture, sampler state */
|
||||
if (!aaline_create_texture(aaline))
|
||||
goto fail;
|
||||
|
@@ -107,8 +107,6 @@ struct aapoint_stage
|
||||
const struct pipe_shader_state *);
|
||||
void (*driver_bind_fs_state)(struct pipe_context *, void *);
|
||||
void (*driver_delete_fs_state)(struct pipe_context *, void *);
|
||||
|
||||
struct pipe_context *pipe;
|
||||
};
|
||||
|
||||
|
||||
@@ -499,6 +497,7 @@ generate_aapoint_fs(struct aapoint_stage *aapoint)
|
||||
struct pipe_shader_state aapoint_fs;
|
||||
struct aa_transform_context transform;
|
||||
const uint newLen = tgsi_num_tokens(orig_fs->tokens) + NUM_NEW_TOKENS;
|
||||
struct pipe_context *pipe = aapoint->stage.draw->pipe;
|
||||
|
||||
aapoint_fs = *orig_fs; /* copy to init */
|
||||
aapoint_fs.tokens = tgsi_alloc_tokens(newLen);
|
||||
@@ -527,7 +526,7 @@ generate_aapoint_fs(struct aapoint_stage *aapoint)
|
||||
#endif
|
||||
|
||||
aapoint->fs->aapoint_fs
|
||||
= aapoint->driver_create_fs_state(aapoint->pipe, &aapoint_fs);
|
||||
= aapoint->driver_create_fs_state(pipe, &aapoint_fs);
|
||||
if (aapoint->fs->aapoint_fs == NULL)
|
||||
goto fail;
|
||||
|
||||
@@ -549,13 +548,14 @@ static boolean
|
||||
bind_aapoint_fragment_shader(struct aapoint_stage *aapoint)
|
||||
{
|
||||
struct draw_context *draw = aapoint->stage.draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
if (!aapoint->fs->aapoint_fs &&
|
||||
!generate_aapoint_fs(aapoint))
|
||||
return FALSE;
|
||||
|
||||
draw->suspend_flushing = TRUE;
|
||||
aapoint->driver_bind_fs_state(aapoint->pipe, aapoint->fs->aapoint_fs);
|
||||
aapoint->driver_bind_fs_state(pipe, aapoint->fs->aapoint_fs);
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
return TRUE;
|
||||
@@ -679,6 +679,9 @@ aapoint_first_point(struct draw_stage *stage, struct prim_header *header)
|
||||
{
|
||||
auto struct aapoint_stage *aapoint = aapoint_stage(stage);
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
const struct pipe_rasterizer_state *rast = draw->rasterizer;
|
||||
void *r;
|
||||
|
||||
assert(draw->rasterizer->point_smooth);
|
||||
|
||||
@@ -716,6 +719,14 @@ aapoint_first_point(struct draw_stage *stage, struct prim_header *header)
|
||||
}
|
||||
}
|
||||
|
||||
draw->suspend_flushing = TRUE;
|
||||
|
||||
/* Disable triangle culling, stippling, unfilled mode etc. */
|
||||
r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
|
||||
pipe->bind_rasterizer_state(pipe, r);
|
||||
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
/* now really draw first point */
|
||||
stage->point = aapoint_point;
|
||||
stage->point(stage, header);
|
||||
@@ -727,7 +738,7 @@ aapoint_flush(struct draw_stage *stage, unsigned flags)
|
||||
{
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct aapoint_stage *aapoint = aapoint_stage(stage);
|
||||
struct pipe_context *pipe = aapoint->pipe;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
stage->point = aapoint_first_point;
|
||||
stage->next->flush( stage->next, flags );
|
||||
@@ -735,6 +746,12 @@ aapoint_flush(struct draw_stage *stage, unsigned flags)
|
||||
/* restore original frag shader */
|
||||
draw->suspend_flushing = TRUE;
|
||||
aapoint->driver_bind_fs_state(pipe, aapoint->fs->driver_fs);
|
||||
|
||||
/* restore original rasterizer state */
|
||||
if (draw->rast_handle) {
|
||||
pipe->bind_rasterizer_state(pipe, draw->rast_handle);
|
||||
}
|
||||
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
draw->extra_shader_outputs.slot = 0;
|
||||
@@ -811,7 +828,7 @@ aapoint_create_fs_state(struct pipe_context *pipe,
|
||||
aafs->state = *fs;
|
||||
|
||||
/* pass-through */
|
||||
aafs->driver_fs = aapoint->driver_create_fs_state(aapoint->pipe, fs);
|
||||
aafs->driver_fs = aapoint->driver_create_fs_state(pipe, fs);
|
||||
|
||||
return aafs;
|
||||
}
|
||||
@@ -825,7 +842,7 @@ aapoint_bind_fs_state(struct pipe_context *pipe, void *fs)
|
||||
/* save current */
|
||||
aapoint->fs = aafs;
|
||||
/* pass-through */
|
||||
aapoint->driver_bind_fs_state(aapoint->pipe,
|
||||
aapoint->driver_bind_fs_state(pipe,
|
||||
(aafs ? aafs->driver_fs : NULL));
|
||||
}
|
||||
|
||||
@@ -837,10 +854,10 @@ aapoint_delete_fs_state(struct pipe_context *pipe, void *fs)
|
||||
struct aapoint_fragment_shader *aafs = (struct aapoint_fragment_shader *) fs;
|
||||
|
||||
/* pass-through */
|
||||
aapoint->driver_delete_fs_state(aapoint->pipe, aafs->driver_fs);
|
||||
aapoint->driver_delete_fs_state(pipe, aafs->driver_fs);
|
||||
|
||||
if (aafs->aapoint_fs)
|
||||
aapoint->driver_delete_fs_state(aapoint->pipe, aafs->aapoint_fs);
|
||||
aapoint->driver_delete_fs_state(pipe, aafs->aapoint_fs);
|
||||
|
||||
FREE(aafs);
|
||||
}
|
||||
@@ -857,8 +874,6 @@ draw_install_aapoint_stage(struct draw_context *draw,
|
||||
{
|
||||
struct aapoint_stage *aapoint;
|
||||
|
||||
pipe->draw = (void *) draw;
|
||||
|
||||
/*
|
||||
* Create / install AA point drawing / prim stage
|
||||
*/
|
||||
@@ -866,8 +881,6 @@ draw_install_aapoint_stage(struct draw_context *draw,
|
||||
if (aapoint == NULL)
|
||||
return FALSE;
|
||||
|
||||
aapoint->pipe = pipe;
|
||||
|
||||
/* save original driver functions */
|
||||
aapoint->driver_create_fs_state = pipe->create_fs_state;
|
||||
aapoint->driver_bind_fs_state = pipe->bind_fs_state;
|
||||
|
@@ -28,6 +28,7 @@
|
||||
/* Authors: Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
#include "util/u_math.h"
|
||||
@@ -142,9 +143,40 @@ static void wideline_line( struct draw_stage *stage,
|
||||
}
|
||||
|
||||
|
||||
static void wideline_first_line( struct draw_stage *stage,
|
||||
struct prim_header *header )
|
||||
{
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
const struct pipe_rasterizer_state *rast = draw->rasterizer;
|
||||
void *r;
|
||||
|
||||
/* Disable triangle culling, stippling, unfilled mode etc. */
|
||||
r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
|
||||
draw->suspend_flushing = TRUE;
|
||||
pipe->bind_rasterizer_state(pipe, r);
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
stage->line = wideline_line;
|
||||
|
||||
wideline_line(stage, header);
|
||||
}
|
||||
|
||||
|
||||
static void wideline_flush( struct draw_stage *stage, unsigned flags )
|
||||
{
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
stage->line = wideline_first_line;
|
||||
stage->next->flush( stage->next, flags );
|
||||
|
||||
/* restore original rasterizer state */
|
||||
if (draw->rast_handle) {
|
||||
draw->suspend_flushing = TRUE;
|
||||
pipe->bind_rasterizer_state(pipe, draw->rast_handle);
|
||||
draw->suspend_flushing = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -171,7 +203,7 @@ struct draw_stage *draw_wide_line_stage( struct draw_context *draw )
|
||||
wide->stage.name = "wide-line";
|
||||
wide->stage.next = NULL;
|
||||
wide->stage.point = draw_pipe_passthrough_point;
|
||||
wide->stage.line = wideline_line;
|
||||
wide->stage.line = wideline_first_line;
|
||||
wide->stage.tri = draw_pipe_passthrough_tri;
|
||||
wide->stage.flush = wideline_flush;
|
||||
wide->stage.reset_stipple_counter = wideline_reset_stipple_counter;
|
||||
|
@@ -52,6 +52,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "pipe/p_defines.h"
|
||||
@@ -213,6 +214,9 @@ static void widepoint_first_point( struct draw_stage *stage,
|
||||
{
|
||||
struct widepoint_stage *wide = widepoint_stage(stage);
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
const struct pipe_rasterizer_state *rast = draw->rasterizer;
|
||||
void *r;
|
||||
|
||||
wide->half_point_size = 0.5f * draw->rasterizer->point_size;
|
||||
wide->xbias = 0.0;
|
||||
@@ -222,6 +226,12 @@ static void widepoint_first_point( struct draw_stage *stage,
|
||||
wide->xbias = 0.125;
|
||||
}
|
||||
|
||||
/* Disable triangle culling, stippling, unfilled mode etc. */
|
||||
r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade);
|
||||
draw->suspend_flushing = TRUE;
|
||||
pipe->bind_rasterizer_state(pipe, r);
|
||||
draw->suspend_flushing = FALSE;
|
||||
|
||||
/* XXX we won't know the real size if it's computed by the vertex shader! */
|
||||
if ((draw->rasterizer->point_size > draw->pipeline.wide_point_threshold) ||
|
||||
(draw->rasterizer->sprite_coord_enable && draw->pipeline.point_sprite)) {
|
||||
@@ -277,9 +287,19 @@ static void widepoint_first_point( struct draw_stage *stage,
|
||||
|
||||
static void widepoint_flush( struct draw_stage *stage, unsigned flags )
|
||||
{
|
||||
struct draw_context *draw = stage->draw;
|
||||
struct pipe_context *pipe = draw->pipe;
|
||||
|
||||
stage->point = widepoint_first_point;
|
||||
stage->next->flush( stage->next, flags );
|
||||
stage->draw->extra_shader_outputs.slot = 0;
|
||||
|
||||
/* restore original rasterizer state */
|
||||
if (draw->rast_handle) {
|
||||
draw->suspend_flushing = TRUE;
|
||||
pipe->bind_rasterizer_state(pipe, draw->rast_handle);
|
||||
draw->suspend_flushing = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -82,6 +82,8 @@ struct vertex_header {
|
||||
*/
|
||||
struct draw_context
|
||||
{
|
||||
struct pipe_context *pipe;
|
||||
|
||||
/** Drawing/primitive pipeline stages */
|
||||
struct {
|
||||
struct draw_stage *first; /**< one of the following */
|
||||
@@ -174,8 +176,14 @@ struct draw_context
|
||||
|
||||
double mrd; /**< minimum resolvable depth value, for polygon offset */
|
||||
|
||||
/* pipe state that we need: */
|
||||
/** Current rasterizer state given to us by the driver */
|
||||
const struct pipe_rasterizer_state *rasterizer;
|
||||
/** Driver CSO handle for the current rasterizer state */
|
||||
void *rast_handle;
|
||||
|
||||
/** Rasterizer CSOs without culling/stipple/etc */
|
||||
void *rasterizer_no_cull[2][2];
|
||||
|
||||
struct pipe_viewport_state viewport;
|
||||
boolean identity_viewport;
|
||||
|
||||
@@ -345,5 +353,10 @@ void draw_do_flush( struct draw_context *draw, unsigned flags );
|
||||
|
||||
|
||||
|
||||
void *
|
||||
draw_get_rasterizer_no_cull( struct draw_context *draw,
|
||||
boolean scissor,
|
||||
boolean flatshade );
|
||||
|
||||
|
||||
#endif /* DRAW_PRIVATE_H */
|
||||
|
@@ -125,7 +125,7 @@ vs_ppc_run_linear( struct draw_vertex_shader *base,
|
||||
*/
|
||||
shader->func(inputs_soa, outputs_soa, temps_soa,
|
||||
(float (*)[4]) shader->base.immediates,
|
||||
(const float (*)[4])constants[0],
|
||||
(float (*)[4]) constants[0],
|
||||
ppc_builtin_constants);
|
||||
|
||||
/* convert (up to) four output verts from SoA back to AoS format */
|
||||
|
2
src/gallium/auxiliary/indices/.gitignore
vendored
Normal file
2
src/gallium/auxiliary/indices/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
u_indices_gen.c
|
||||
u_unfilled_gen.c
|
File diff suppressed because it is too large
Load Diff
@@ -1,992 +0,0 @@
|
||||
/* File automatically generated by u_unfilled_gen.py */
|
||||
|
||||
/*
|
||||
* Copyright 2009 VMware, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
||||
* the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
* VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Functions to translate and generate index lists
|
||||
*/
|
||||
|
||||
#include "indices/u_indices.h"
|
||||
#include "indices/u_indices_priv.h"
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "util/u_memory.h"
|
||||
|
||||
|
||||
static unsigned out_size_idx( unsigned index_size )
|
||||
{
|
||||
switch (index_size) {
|
||||
case 4: return OUT_UINT;
|
||||
case 2: return OUT_USHORT;
|
||||
default: assert(0); return OUT_USHORT;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned in_size_idx( unsigned index_size )
|
||||
{
|
||||
switch (index_size) {
|
||||
case 4: return IN_UINT;
|
||||
case 2: return IN_USHORT;
|
||||
case 1: return IN_UBYTE;
|
||||
default: assert(0); return IN_UBYTE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static u_generate_func generate_line[OUT_COUNT][PRIM_COUNT];
|
||||
static u_translate_func translate_line[IN_COUNT][OUT_COUNT][PRIM_COUNT];
|
||||
|
||||
|
||||
static void generate_tris_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (ushort)(i);
|
||||
(out+j)[1] = (ushort)(i+1);
|
||||
(out+j+2)[0] = (ushort)(i+1);
|
||||
(out+j+2)[1] = (ushort)(i+2);
|
||||
(out+j+4)[0] = (ushort)(i+2);
|
||||
(out+j+4)[1] = (ushort)(i);
|
||||
}
|
||||
}
|
||||
static void generate_tristrip_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)(i);
|
||||
(out+j)[1] = (ushort)(i+1/*+(i&1)*/);
|
||||
(out+j+2)[0] = (ushort)(i+1/*+(i&1)*/);
|
||||
(out+j+2)[1] = (ushort)(i+2/*-(i&1)*/);
|
||||
(out+j+4)[0] = (ushort)(i+2/*-(i&1)*/);
|
||||
(out+j+4)[1] = (ushort)(i);
|
||||
}
|
||||
}
|
||||
static void generate_trifan_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)(0);
|
||||
(out+j)[1] = (ushort)(i+1);
|
||||
(out+j+2)[0] = (ushort)(i+1);
|
||||
(out+j+2)[1] = (ushort)(i+2);
|
||||
(out+j+4)[0] = (ushort)(i+2);
|
||||
(out+j+4)[1] = (ushort)(0);
|
||||
}
|
||||
}
|
||||
static void generate_quads_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (ushort)(i+0);
|
||||
(out+j)[1] = (ushort)(i+1);
|
||||
(out+j+2)[0] = (ushort)(i+1);
|
||||
(out+j+2)[1] = (ushort)(i+2);
|
||||
(out+j+4)[0] = (ushort)(i+2);
|
||||
(out+j+4)[1] = (ushort)(i+3);
|
||||
(out+j+6)[0] = (ushort)(i+3);
|
||||
(out+j+6)[1] = (ushort)(i+0);
|
||||
}
|
||||
}
|
||||
static void generate_quadstrip_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (ushort)(i+2);
|
||||
(out+j)[1] = (ushort)(i+0);
|
||||
(out+j+2)[0] = (ushort)(i+0);
|
||||
(out+j+2)[1] = (ushort)(i+1);
|
||||
(out+j+4)[0] = (ushort)(i+1);
|
||||
(out+j+4)[1] = (ushort)(i+3);
|
||||
(out+j+6)[0] = (ushort)(i+3);
|
||||
(out+j+6)[1] = (ushort)(i+2);
|
||||
}
|
||||
}
|
||||
static void generate_polygon_ushort(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)(0);
|
||||
(out+j)[1] = (ushort)(i+1);
|
||||
(out+j+2)[0] = (ushort)(i+1);
|
||||
(out+j+2)[1] = (ushort)(i+2);
|
||||
(out+j+4)[0] = (ushort)(i+2);
|
||||
(out+j+4)[1] = (ushort)(0);
|
||||
}
|
||||
}
|
||||
static void generate_tris_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (uint)(i);
|
||||
(out+j)[1] = (uint)(i+1);
|
||||
(out+j+2)[0] = (uint)(i+1);
|
||||
(out+j+2)[1] = (uint)(i+2);
|
||||
(out+j+4)[0] = (uint)(i+2);
|
||||
(out+j+4)[1] = (uint)(i);
|
||||
}
|
||||
}
|
||||
static void generate_tristrip_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)(i);
|
||||
(out+j)[1] = (uint)(i+1/*+(i&1)*/);
|
||||
(out+j+2)[0] = (uint)(i+1/*+(i&1)*/);
|
||||
(out+j+2)[1] = (uint)(i+2/*-(i&1)*/);
|
||||
(out+j+4)[0] = (uint)(i+2/*-(i&1)*/);
|
||||
(out+j+4)[1] = (uint)(i);
|
||||
}
|
||||
}
|
||||
static void generate_trifan_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)(0);
|
||||
(out+j)[1] = (uint)(i+1);
|
||||
(out+j+2)[0] = (uint)(i+1);
|
||||
(out+j+2)[1] = (uint)(i+2);
|
||||
(out+j+4)[0] = (uint)(i+2);
|
||||
(out+j+4)[1] = (uint)(0);
|
||||
}
|
||||
}
|
||||
static void generate_quads_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (uint)(i+0);
|
||||
(out+j)[1] = (uint)(i+1);
|
||||
(out+j+2)[0] = (uint)(i+1);
|
||||
(out+j+2)[1] = (uint)(i+2);
|
||||
(out+j+4)[0] = (uint)(i+2);
|
||||
(out+j+4)[1] = (uint)(i+3);
|
||||
(out+j+6)[0] = (uint)(i+3);
|
||||
(out+j+6)[1] = (uint)(i+0);
|
||||
}
|
||||
}
|
||||
static void generate_quadstrip_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (uint)(i+2);
|
||||
(out+j)[1] = (uint)(i+0);
|
||||
(out+j+2)[0] = (uint)(i+0);
|
||||
(out+j+2)[1] = (uint)(i+1);
|
||||
(out+j+4)[0] = (uint)(i+1);
|
||||
(out+j+4)[1] = (uint)(i+3);
|
||||
(out+j+6)[0] = (uint)(i+3);
|
||||
(out+j+6)[1] = (uint)(i+2);
|
||||
}
|
||||
}
|
||||
static void generate_polygon_uint(
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)(0);
|
||||
(out+j)[1] = (uint)(i+1);
|
||||
(out+j+2)[0] = (uint)(i+1);
|
||||
(out+j+2)[1] = (uint)(i+2);
|
||||
(out+j+4)[0] = (uint)(i+2);
|
||||
(out+j+4)[1] = (uint)(0);
|
||||
}
|
||||
}
|
||||
static void translate_tris_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (ushort)in[i+0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (ushort)in[i+2];
|
||||
(out+j)[1] = (ushort)in[i+0];
|
||||
(out+j+2)[0] = (ushort)in[i+0];
|
||||
(out+j+2)[1] = (ushort)in[i+1];
|
||||
(out+j+4)[0] = (ushort)in[i+1];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_ubyte2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_tris_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (uint)in[i+0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (uint)in[i+2];
|
||||
(out+j)[1] = (uint)in[i+0];
|
||||
(out+j+2)[0] = (uint)in[i+0];
|
||||
(out+j+2)[1] = (uint)in[i+1];
|
||||
(out+j+4)[0] = (uint)in[i+1];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_ubyte2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ubyte*in = (const ubyte*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_tris_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (ushort)in[i+0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (ushort)in[i+2];
|
||||
(out+j)[1] = (ushort)in[i+0];
|
||||
(out+j+2)[0] = (ushort)in[i+0];
|
||||
(out+j+2)[1] = (ushort)in[i+1];
|
||||
(out+j+4)[0] = (ushort)in[i+1];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_ushort2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_tris_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (uint)in[i+0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (uint)in[i+2];
|
||||
(out+j)[1] = (uint)in[i+0];
|
||||
(out+j+2)[0] = (uint)in[i+0];
|
||||
(out+j+2)[1] = (uint)in[i+1];
|
||||
(out+j+4)[0] = (uint)in[i+1];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_ushort2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const ushort*in = (const ushort*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_tris_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[i];
|
||||
(out+j)[1] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (ushort)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (ushort)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (ushort)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (ushort)in[i+0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (ushort)in[i+2];
|
||||
(out+j)[1] = (ushort)in[i+0];
|
||||
(out+j+2)[0] = (ushort)in[i+0];
|
||||
(out+j+2)[1] = (ushort)in[i+1];
|
||||
(out+j+4)[0] = (ushort)in[i+1];
|
||||
(out+j+4)[1] = (ushort)in[i+3];
|
||||
(out+j+6)[0] = (ushort)in[i+3];
|
||||
(out+j+6)[1] = (ushort)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_uint2ushort(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
ushort *out = (ushort*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (ushort)in[0];
|
||||
(out+j)[1] = (ushort)in[i+1];
|
||||
(out+j+2)[0] = (ushort)in[i+1];
|
||||
(out+j+2)[1] = (ushort)in[i+2];
|
||||
(out+j+4)[0] = (ushort)in[i+2];
|
||||
(out+j+4)[1] = (ushort)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_tris_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i+=3) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_tristrip_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[i];
|
||||
(out+j)[1] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[0] = (uint)in[i+1/*+(i&1)*/];
|
||||
(out+j+2)[1] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[0] = (uint)in[i+2/*-(i&1)*/];
|
||||
(out+j+4)[1] = (uint)in[i];
|
||||
}
|
||||
}
|
||||
static void translate_trifan_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
static void translate_quads_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=4) {
|
||||
(out+j)[0] = (uint)in[i+0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+0];
|
||||
}
|
||||
}
|
||||
static void translate_quadstrip_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=8, i+=2) {
|
||||
(out+j)[0] = (uint)in[i+2];
|
||||
(out+j)[1] = (uint)in[i+0];
|
||||
(out+j+2)[0] = (uint)in[i+0];
|
||||
(out+j+2)[1] = (uint)in[i+1];
|
||||
(out+j+4)[0] = (uint)in[i+1];
|
||||
(out+j+4)[1] = (uint)in[i+3];
|
||||
(out+j+6)[0] = (uint)in[i+3];
|
||||
(out+j+6)[1] = (uint)in[i+2];
|
||||
}
|
||||
}
|
||||
static void translate_polygon_uint2uint(
|
||||
const void * _in,
|
||||
unsigned nr,
|
||||
void *_out )
|
||||
{
|
||||
const uint*in = (const uint*)_in;
|
||||
uint *out = (uint*)_out;
|
||||
unsigned i, j;
|
||||
(void)j;
|
||||
for (j = i = 0; j < nr; j+=6, i++) {
|
||||
(out+j)[0] = (uint)in[0];
|
||||
(out+j)[1] = (uint)in[i+1];
|
||||
(out+j+2)[0] = (uint)in[i+1];
|
||||
(out+j+2)[1] = (uint)in[i+2];
|
||||
(out+j+4)[0] = (uint)in[i+2];
|
||||
(out+j+4)[1] = (uint)in[0];
|
||||
}
|
||||
}
|
||||
void u_unfilled_init( void )
|
||||
{
|
||||
static int firsttime = 1;
|
||||
if (!firsttime) return;
|
||||
firsttime = 0;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_TRIANGLES] = generate_tris_ushort;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_TRIANGLE_FAN] = generate_trifan_ushort;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_TRIANGLE_STRIP] = generate_tristrip_ushort;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_QUADS] = generate_quads_ushort;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_QUAD_STRIP] = generate_quadstrip_ushort;
|
||||
generate_line[OUT_USHORT][PIPE_PRIM_POLYGON] = generate_polygon_ushort;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_TRIANGLES] = generate_tris_uint;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_TRIANGLE_FAN] = generate_trifan_uint;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_TRIANGLE_STRIP] = generate_tristrip_uint;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_QUADS] = generate_quads_uint;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_QUAD_STRIP] = generate_quadstrip_uint;
|
||||
generate_line[OUT_UINT][PIPE_PRIM_POLYGON] = generate_polygon_uint;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_TRIANGLES] = translate_tris_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_QUADS] = translate_quads_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_USHORT][PIPE_PRIM_POLYGON] = translate_polygon_ubyte2ushort;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_TRIANGLES] = translate_tris_ubyte2uint;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_ubyte2uint;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_ubyte2uint;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_QUADS] = translate_quads_ubyte2uint;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_ubyte2uint;
|
||||
translate_line[IN_UBYTE][OUT_UINT][PIPE_PRIM_POLYGON] = translate_polygon_ubyte2uint;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_TRIANGLES] = translate_tris_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_QUADS] = translate_quads_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_USHORT][PIPE_PRIM_POLYGON] = translate_polygon_ushort2ushort;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_TRIANGLES] = translate_tris_ushort2uint;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_ushort2uint;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_ushort2uint;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_QUADS] = translate_quads_ushort2uint;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_ushort2uint;
|
||||
translate_line[IN_USHORT][OUT_UINT][PIPE_PRIM_POLYGON] = translate_polygon_ushort2uint;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_TRIANGLES] = translate_tris_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_QUADS] = translate_quads_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_USHORT][PIPE_PRIM_POLYGON] = translate_polygon_uint2ushort;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_TRIANGLES] = translate_tris_uint2uint;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_TRIANGLE_FAN] = translate_trifan_uint2uint;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_TRIANGLE_STRIP] = translate_tristrip_uint2uint;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_QUADS] = translate_quads_uint2uint;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_QUAD_STRIP] = translate_quadstrip_uint2uint;
|
||||
translate_line[IN_UINT][OUT_UINT][PIPE_PRIM_POLYGON] = translate_polygon_uint2uint;
|
||||
}
|
||||
#include "indices/u_unfilled_indices.c"
|
@@ -1757,6 +1757,8 @@ void (*x86_get_func( struct x86_function *p ))(void)
|
||||
|
||||
#else
|
||||
|
||||
void x86sse_dummy( void );
|
||||
|
||||
void x86sse_dummy( void )
|
||||
{
|
||||
}
|
||||
|
@@ -1489,6 +1489,12 @@ const struct tgsi_token *ureg_get_tokens( struct ureg_program *ureg,
|
||||
}
|
||||
|
||||
|
||||
void ureg_free_tokens( const struct tgsi_token *tokens )
|
||||
{
|
||||
FREE((struct tgsi_token *)tokens);
|
||||
}
|
||||
|
||||
|
||||
struct ureg_program *ureg_create( unsigned processor )
|
||||
{
|
||||
struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
|
||||
|
@@ -104,6 +104,10 @@ ureg_get_tokens( struct ureg_program *ureg,
|
||||
unsigned *nr_tokens );
|
||||
|
||||
|
||||
/* Free the tokens created by ureg_get_tokens() */
|
||||
void ureg_free_tokens( const struct tgsi_token *tokens );
|
||||
|
||||
|
||||
void
|
||||
ureg_destroy( struct ureg_program * );
|
||||
|
||||
|
@@ -29,6 +29,8 @@
|
||||
#define PIPE_ATOMIC_ASM_MSVC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86
|
||||
#elif (defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86_64))
|
||||
#define PIPE_ATOMIC_ASM_GCC_X86_64
|
||||
#elif defined(PIPE_CC_GCC) && (PIPE_CC_GCC_VERSION >= 401)
|
||||
#define PIPE_ATOMIC_GCC_INTRINSIC
|
||||
#else
|
||||
@@ -36,6 +38,51 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86_64)
|
||||
#define PIPE_ATOMIC "GCC x86_64 assembly"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define p_atomic_set(_v, _i) (*(_v) = (_i))
|
||||
#define p_atomic_read(_v) (*(_v))
|
||||
|
||||
static INLINE boolean
|
||||
p_atomic_dec_zero(int32_t *v)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
__asm__ __volatile__("lock; decl %0; sete %1":"+m"(*v), "=qm"(c)
|
||||
::"memory");
|
||||
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_inc(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; incl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
p_atomic_dec(int32_t *v)
|
||||
{
|
||||
__asm__ __volatile__("lock; decl %0":"+m"(*v));
|
||||
}
|
||||
|
||||
static INLINE int32_t
|
||||
p_atomic_cmpxchg(int32_t *v, int32_t old, int32_t _new)
|
||||
{
|
||||
return __sync_val_compare_and_swap(v, old, _new);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* PIPE_ATOMIC_ASM_GCC_X86_64 */
|
||||
|
||||
|
||||
#if defined(PIPE_ATOMIC_ASM_GCC_X86)
|
||||
|
||||
|
@@ -74,7 +74,7 @@ cell_destroy_context( struct pipe_context *pipe )
|
||||
static struct draw_context *
|
||||
cell_draw_create(struct cell_context *cell)
|
||||
{
|
||||
struct draw_context *draw = draw_create();
|
||||
struct draw_context *draw = draw_create(&cell->pipe);
|
||||
|
||||
#if 0 /* broken */
|
||||
if (getenv("GALLIUM_CELL_VS")) {
|
||||
|
@@ -92,7 +92,6 @@ cell_add_buffer_to_list(struct cell_context *cell,
|
||||
struct cell_buffer_list *list,
|
||||
struct pipe_buffer *buffer)
|
||||
{
|
||||
struct pipe_screen *ps = cell->pipe.screen;
|
||||
struct cell_buffer_node *node = CALLOC_STRUCT(cell_buffer_node);
|
||||
/* create new list node which references the buffer, insert at head */
|
||||
if (node) {
|
||||
|
@@ -197,7 +197,7 @@ cell_bind_rasterizer_state(struct pipe_context *pipe, void *rast)
|
||||
struct cell_context *cell = cell_context(pipe);
|
||||
|
||||
/* pass-through to draw module */
|
||||
draw_set_rasterizer_state(cell->draw, rasterizer);
|
||||
draw_set_rasterizer_state(cell->draw, rasterizer, rast);
|
||||
|
||||
cell->rasterizer = rasterizer;
|
||||
|
||||
|
@@ -210,7 +210,7 @@ i915_create_context(struct pipe_screen *screen, void *priv)
|
||||
/*
|
||||
* Create drawing context and plug our rendering stage into it.
|
||||
*/
|
||||
i915->draw = draw_create();
|
||||
i915->draw = draw_create(&i915->base);
|
||||
assert(i915->draw);
|
||||
if (!debug_get_bool_option("I915_NO_VBUF", FALSE)) {
|
||||
draw_set_rasterize_stage(i915->draw, i915_draw_vbuf_stage(i915));
|
||||
|
@@ -243,7 +243,7 @@ uint i915_emit_texld( struct i915_fp_compile *p,
|
||||
}
|
||||
else {
|
||||
assert(GET_UREG_TYPE(dest) != REG_TYPE_CONST);
|
||||
assert(dest = UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest)));
|
||||
assert(dest == UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest)));
|
||||
|
||||
/* is the sampler coord a texcoord input reg? */
|
||||
if (GET_UREG_TYPE(coord) != REG_TYPE_T) {
|
||||
|
@@ -714,7 +714,8 @@ static void i915_bind_rasterizer_state( struct pipe_context *pipe,
|
||||
|
||||
/* pass-through to draw module */
|
||||
draw_set_rasterizer_state(i915->draw,
|
||||
(i915->rasterizer ? i915->rasterizer->templ : NULL));
|
||||
(i915->rasterizer ? i915->rasterizer->templ : NULL),
|
||||
raster);
|
||||
|
||||
i915->dirty |= I915_NEW_RASTERIZER;
|
||||
}
|
||||
|
@@ -174,7 +174,7 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
|
||||
/*
|
||||
* Create drawing context and plug our rendering stage into it.
|
||||
*/
|
||||
llvmpipe->draw = draw_create();
|
||||
llvmpipe->draw = draw_create(&llvmpipe->pipe);
|
||||
if (!llvmpipe->draw)
|
||||
goto fail;
|
||||
|
||||
|
@@ -38,19 +38,26 @@ void *
|
||||
llvmpipe_create_rasterizer_state(struct pipe_context *pipe,
|
||||
const struct pipe_rasterizer_state *rast)
|
||||
{
|
||||
/* We do nothing special with rasterizer state.
|
||||
* The CSO handle is just a pointer to a pipe_rasterizer_state object.
|
||||
*/
|
||||
return mem_dup(rast, sizeof(*rast));
|
||||
}
|
||||
|
||||
void llvmpipe_bind_rasterizer_state(struct pipe_context *pipe,
|
||||
void *rasterizer)
|
||||
|
||||
|
||||
void
|
||||
llvmpipe_bind_rasterizer_state(struct pipe_context *pipe, void *handle)
|
||||
{
|
||||
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
|
||||
const struct pipe_rasterizer_state *rasterizer =
|
||||
(const struct pipe_rasterizer_state *) handle;
|
||||
|
||||
if (llvmpipe->rasterizer == rasterizer)
|
||||
return;
|
||||
|
||||
/* pass-through to draw module */
|
||||
draw_set_rasterizer_state(llvmpipe->draw, rasterizer);
|
||||
draw_set_rasterizer_state(llvmpipe->draw, rasterizer, handle);
|
||||
|
||||
llvmpipe->rasterizer = rasterizer;
|
||||
|
||||
@@ -68,6 +75,7 @@ void llvmpipe_bind_rasterizer_state(struct pipe_context *pipe,
|
||||
llvmpipe->dirty |= LP_NEW_RASTERIZER;
|
||||
}
|
||||
|
||||
|
||||
void llvmpipe_delete_rasterizer_state(struct pipe_context *pipe,
|
||||
void *rasterizer)
|
||||
{
|
||||
|
@@ -76,7 +76,7 @@ nv30_create(struct pipe_screen *pscreen, void *priv)
|
||||
nv30_init_state_functions(nv30);
|
||||
|
||||
/* Create, configure, and install fallback swtnl path */
|
||||
nv30->draw = draw_create();
|
||||
nv30->draw = draw_create(&nv30->pipe);
|
||||
draw_wide_point_threshold(nv30->draw, 9999999.0);
|
||||
draw_wide_line_threshold(nv30->draw, 9999999.0);
|
||||
draw_enable_line_stipple(nv30->draw, FALSE);
|
||||
|
@@ -76,7 +76,7 @@ nv40_create(struct pipe_screen *pscreen, void *priv)
|
||||
nv40_init_state_functions(nv40);
|
||||
|
||||
/* Create, configure, and install fallback swtnl path */
|
||||
nv40->draw = draw_create();
|
||||
nv40->draw = draw_create(&nv40->pipe);
|
||||
draw_wide_point_threshold(nv40->draw, 9999999.0);
|
||||
draw_wide_line_threshold(nv40->draw, 9999999.0);
|
||||
draw_enable_line_stipple(nv40->draw, FALSE);
|
||||
|
@@ -164,7 +164,7 @@ nv40_state_validate_swtnl(struct nv40_context *nv40)
|
||||
draw_bind_vertex_shader(draw, nv40->vertprog->draw);
|
||||
|
||||
if (nv40->draw_dirty & NV40_NEW_RAST)
|
||||
draw_set_rasterizer_state(draw, &nv40->rasterizer->pipe);
|
||||
draw_set_rasterizer_state(draw, &nv40->rasterizer->pipe, nv40->rasterizer);
|
||||
|
||||
if (nv40->draw_dirty & NV40_NEW_UCP)
|
||||
draw_set_clip_state(draw, &nv40->clip);
|
||||
|
@@ -129,7 +129,7 @@ nv50_create(struct pipe_screen *pscreen, void *priv)
|
||||
nv50_init_state_functions(nv50);
|
||||
nv50_init_query_functions(nv50);
|
||||
|
||||
nv50->draw = draw_create();
|
||||
nv50->draw = draw_create(&nv50->pipe);
|
||||
assert(nv50->draw);
|
||||
draw_set_rasterize_stage(nv50->draw, nv50_draw_render_stage(nv50));
|
||||
|
||||
|
@@ -181,7 +181,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
|
||||
r300->context.draw_range_elements = r300_swtcl_draw_range_elements;
|
||||
|
||||
/* Create a Draw. This is used for SW TCL. */
|
||||
r300->draw = draw_create();
|
||||
r300->draw = draw_create(&r300->context);
|
||||
/* Enable our renderer. */
|
||||
draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300));
|
||||
/* Enable Draw's clipping. */
|
||||
|
@@ -810,7 +810,7 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
|
||||
|
||||
if (r300->draw) {
|
||||
draw_flush(r300->draw);
|
||||
draw_set_rasterizer_state(r300->draw, &rs->rs);
|
||||
draw_set_rasterizer_state(r300->draw, &rs->rs, state);
|
||||
}
|
||||
|
||||
if (rs) {
|
||||
|
@@ -298,7 +298,7 @@ softpipe_create_context( struct pipe_screen *screen,
|
||||
/*
|
||||
* Create drawing context and plug our rendering stage into it.
|
||||
*/
|
||||
softpipe->draw = draw_create();
|
||||
softpipe->draw = draw_create(&softpipe->pipe);
|
||||
if (!softpipe->draw)
|
||||
goto fail;
|
||||
|
||||
|
@@ -669,17 +669,17 @@ static void setup_tri_edges( struct setup_context *setup )
|
||||
|
||||
setup->emaj.sy = ceilf(vmin_y);
|
||||
setup->emaj.lines = (int) ceilf(vmax_y - setup->emaj.sy);
|
||||
setup->emaj.dxdy = setup->emaj.dx / setup->emaj.dy;
|
||||
setup->emaj.dxdy = setup->emaj.dy ? setup->emaj.dx / setup->emaj.dy : .0f;
|
||||
setup->emaj.sx = vmin_x + (setup->emaj.sy - vmin_y) * setup->emaj.dxdy;
|
||||
|
||||
setup->etop.sy = ceilf(vmid_y);
|
||||
setup->etop.lines = (int) ceilf(vmax_y - setup->etop.sy);
|
||||
setup->etop.dxdy = setup->etop.dx / setup->etop.dy;
|
||||
setup->etop.dxdy = setup->etop.dy ? setup->etop.dx / setup->etop.dy : .0f;
|
||||
setup->etop.sx = vmid_x + (setup->etop.sy - vmid_y) * setup->etop.dxdy;
|
||||
|
||||
setup->ebot.sy = ceilf(vmin_y);
|
||||
setup->ebot.lines = (int) ceilf(vmid_y - setup->ebot.sy);
|
||||
setup->ebot.dxdy = setup->ebot.dx / setup->ebot.dy;
|
||||
setup->ebot.dxdy = setup->ebot.dy ? setup->ebot.dx / setup->ebot.dy : .0f;
|
||||
setup->ebot.sx = vmin_x + (setup->ebot.sy - vmin_y) * setup->ebot.dxdy;
|
||||
}
|
||||
|
||||
|
@@ -49,7 +49,7 @@ void softpipe_bind_rasterizer_state(struct pipe_context *pipe,
|
||||
return;
|
||||
|
||||
/* pass-through to draw module */
|
||||
draw_set_rasterizer_state(softpipe->draw, rasterizer);
|
||||
draw_set_rasterizer_state(softpipe->draw, rasterizer, rasterizer);
|
||||
|
||||
softpipe->rasterizer = rasterizer;
|
||||
|
||||
|
@@ -222,7 +222,8 @@ static void svga_bind_rasterizer_state( struct pipe_context *pipe,
|
||||
|
||||
svga->curr.rast = raster;
|
||||
|
||||
draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL);
|
||||
draw_set_rasterizer_state(svga->swtnl.draw, raster ? &raster->templ : NULL,
|
||||
state);
|
||||
|
||||
svga->dirty |= SVGA_NEW_RAST;
|
||||
}
|
||||
|
@@ -134,7 +134,7 @@ boolean svga_init_swtnl( struct svga_context *svga )
|
||||
/*
|
||||
* Create drawing context and plug our rendering stage into it.
|
||||
*/
|
||||
svga->swtnl.draw = draw_create();
|
||||
svga->swtnl.draw = draw_create(&svga->pipe);
|
||||
if (svga->swtnl.draw == NULL)
|
||||
goto fail;
|
||||
|
||||
|
@@ -113,7 +113,8 @@ static int update_swtnl_draw( struct svga_context *svga,
|
||||
|
||||
if (dirty & SVGA_NEW_RAST)
|
||||
draw_set_rasterizer_state(svga->swtnl.draw,
|
||||
&svga->curr.rast->templ);
|
||||
&svga->curr.rast->templ,
|
||||
(void *) svga->curr.rast);
|
||||
|
||||
if (dirty & SVGA_NEW_FRAME_BUFFER)
|
||||
draw_set_mrd(svga->swtnl.draw,
|
||||
|
@@ -16,6 +16,7 @@ x11_INCLUDES = \
|
||||
-I$(TOP)/src/gallium/drivers \
|
||||
-I$(TOP)/src/glx \
|
||||
-I$(TOP)/src/mesa \
|
||||
$(X11_CFLAGS) \
|
||||
$(shell pkg-config --cflags-only-I libdrm)
|
||||
|
||||
x11_SOURCES = $(wildcard x11/*.c) \
|
||||
|
@@ -16,6 +16,8 @@
|
||||
|
||||
#include "glxinit.h"
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
typedef struct GLXGenericGetString
|
||||
{
|
||||
CARD8 reqType;
|
||||
@@ -680,3 +682,5 @@ __glXInitialize(Display * dpy)
|
||||
|
||||
return dpyPriv;
|
||||
}
|
||||
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
||||
|
@@ -37,6 +37,8 @@
|
||||
#include "native_x11.h"
|
||||
#include "x11_screen.h"
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
enum dri2_surface_type {
|
||||
DRI2_SURFACE_TYPE_WINDOW,
|
||||
DRI2_SURFACE_TYPE_PIXMAP,
|
||||
@@ -878,3 +880,15 @@ x11_create_dri2_display(EGLNativeDisplayType dpy,
|
||||
|
||||
return &dri2dpy->base;
|
||||
}
|
||||
|
||||
#else /* GLX_DIRECT_RENDERING */
|
||||
|
||||
struct native_display *
|
||||
x11_create_dri2_display(EGLNativeDisplayType dpy,
|
||||
struct native_event_handler *event_handler,
|
||||
struct drm_api *api)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
||||
|
@@ -70,7 +70,9 @@ native_create_probe(EGLNativeDisplayType dpy)
|
||||
xscr = x11_screen_create(xdpy, scr);
|
||||
if (xscr) {
|
||||
if (x11_screen_support(xscr, X11_SCREEN_EXTENSION_DRI2)) {
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
driver_name = x11_screen_probe_dri2(xscr, NULL, NULL);
|
||||
#endif
|
||||
if (driver_name)
|
||||
nprobe->data = strdup(driver_name);
|
||||
}
|
||||
|
@@ -39,8 +39,10 @@
|
||||
#include "glxinit.h"
|
||||
|
||||
struct x11_screen {
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
/* dummy base class */
|
||||
struct __GLXDRIdisplayRec base;
|
||||
#endif
|
||||
|
||||
Display *dpy;
|
||||
int number;
|
||||
@@ -103,15 +105,19 @@ x11_screen_destroy(struct x11_screen *xscr)
|
||||
if (xscr->dri_device)
|
||||
Xfree(xscr->dri_device);
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
/* xscr->glx_dpy will be destroyed with the X display */
|
||||
if (xscr->glx_dpy)
|
||||
xscr->glx_dpy->dri2Display = NULL;
|
||||
#endif
|
||||
|
||||
if (xscr->visuals)
|
||||
XFree(xscr->visuals);
|
||||
free(xscr);
|
||||
}
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
static boolean
|
||||
x11_screen_init_dri2(struct x11_screen *xscr)
|
||||
{
|
||||
@@ -133,6 +139,8 @@ x11_screen_init_glx(struct x11_screen *xscr)
|
||||
return (xscr->glx_dpy != NULL);
|
||||
}
|
||||
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
||||
|
||||
/**
|
||||
* Return true if the screen supports the extension.
|
||||
*/
|
||||
@@ -145,12 +153,14 @@ x11_screen_support(struct x11_screen *xscr, enum x11_screen_extension ext)
|
||||
case X11_SCREEN_EXTENSION_XSHM:
|
||||
supported = XShmQueryExtension(xscr->dpy);
|
||||
break;
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
case X11_SCREEN_EXTENSION_GLX:
|
||||
supported = x11_screen_init_glx(xscr);
|
||||
break;
|
||||
case X11_SCREEN_EXTENSION_DRI2:
|
||||
supported = x11_screen_init_dri2(xscr);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -233,6 +243,39 @@ x11_screen_convert_visual(struct x11_screen *xscr, const XVisualInfo *visual,
|
||||
mode->xRenderable = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the depth of a drawable.
|
||||
*
|
||||
* Unlike other drawable functions, the drawable needs not be a DRI2 drawable.
|
||||
*/
|
||||
uint
|
||||
x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable)
|
||||
{
|
||||
unsigned int depth;
|
||||
|
||||
if (drawable != xscr->last_drawable) {
|
||||
Window root;
|
||||
int x, y;
|
||||
unsigned int w, h, border;
|
||||
Status ok;
|
||||
|
||||
ok = XGetGeometry(xscr->dpy, drawable, &root,
|
||||
&x, &y, &w, &h, &border, &depth);
|
||||
if (!ok)
|
||||
depth = 0;
|
||||
|
||||
xscr->last_drawable = drawable;
|
||||
xscr->last_depth = depth;
|
||||
}
|
||||
else {
|
||||
depth = xscr->last_depth;
|
||||
}
|
||||
|
||||
return depth;
|
||||
}
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
/**
|
||||
* Return the GLX fbconfigs.
|
||||
*/
|
||||
@@ -391,37 +434,6 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable,
|
||||
return (struct x11_drawable_buffer *) dri2bufs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the depth of a drawable.
|
||||
*
|
||||
* Unlike other drawable functions, the drawable needs not be a DRI2 drawable.
|
||||
*/
|
||||
uint
|
||||
x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable)
|
||||
{
|
||||
unsigned int depth;
|
||||
|
||||
if (drawable != xscr->last_drawable) {
|
||||
Window root;
|
||||
int x, y;
|
||||
unsigned int w, h, border;
|
||||
Status ok;
|
||||
|
||||
ok = XGetGeometry(xscr->dpy, drawable, &root,
|
||||
&x, &y, &w, &h, &border, &depth);
|
||||
if (!ok)
|
||||
depth = 0;
|
||||
|
||||
xscr->last_drawable = drawable;
|
||||
xscr->last_depth = depth;
|
||||
}
|
||||
else {
|
||||
depth = xscr->last_depth;
|
||||
}
|
||||
|
||||
return depth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a mode list of the given size.
|
||||
*/
|
||||
@@ -489,3 +501,5 @@ dri2InvalidateBuffers(Display *dpy, XID drawable)
|
||||
|
||||
xscr->dri_invalidate_buffers(xscr, drawable, xscr->dri_user_data);
|
||||
}
|
||||
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
||||
|
@@ -68,20 +68,18 @@ void
|
||||
x11_screen_convert_visual(struct x11_screen *xscr, const XVisualInfo *visual,
|
||||
__GLcontextModes *mode);
|
||||
|
||||
uint
|
||||
x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable);
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
/* GLX */
|
||||
const __GLcontextModes *
|
||||
x11_screen_get_glx_configs(struct x11_screen *xscr);
|
||||
|
||||
const __GLcontextModes *
|
||||
x11_screen_get_glx_visuals(struct x11_screen *xscr);
|
||||
|
||||
const char *
|
||||
x11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor);
|
||||
|
||||
int
|
||||
x11_screen_enable_dri2(struct x11_screen *xscr,
|
||||
x11_drawable_invalidate_buffers invalidate_buffers,
|
||||
void *user_data);
|
||||
|
||||
__GLcontextModes *
|
||||
x11_context_modes_create(unsigned count);
|
||||
|
||||
@@ -91,6 +89,15 @@ x11_context_modes_destroy(__GLcontextModes *modes);
|
||||
unsigned
|
||||
x11_context_modes_count(const __GLcontextModes *modes);
|
||||
|
||||
/* DRI2 */
|
||||
const char *
|
||||
x11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor);
|
||||
|
||||
int
|
||||
x11_screen_enable_dri2(struct x11_screen *xscr,
|
||||
x11_drawable_invalidate_buffers invalidate_buffers,
|
||||
void *user_data);
|
||||
|
||||
void
|
||||
x11_drawable_enable_dri2(struct x11_screen *xscr,
|
||||
Drawable drawable, boolean on);
|
||||
@@ -105,7 +112,6 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable,
|
||||
int *width, int *height, unsigned int *attachments,
|
||||
boolean with_format, int num_ins, int *num_outs);
|
||||
|
||||
uint
|
||||
x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable);
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
||||
|
||||
#endif /* _X11_SCREEN_H_ */
|
||||
|
@@ -5,7 +5,8 @@ LIBNAME = xlib
|
||||
|
||||
LIBRARY_INCLUDES = \
|
||||
-I$(TOP)/include \
|
||||
-I$(TOP)/src/mesa
|
||||
-I$(TOP)/src/mesa \
|
||||
$(X11_CFLAGS)
|
||||
|
||||
C_SOURCES = \
|
||||
glx_api.c \
|
||||
|
@@ -11,7 +11,7 @@
|
||||
|
||||
EGL_DRIVER_OBJECTS = $(EGL_DRIVER_SOURCES:.c=.o)
|
||||
|
||||
common_LIBS = -ldrm -lm -ldl
|
||||
common_LIBS = -ldrm -lm $(DLOPEN_LIBS)
|
||||
|
||||
x11_ST = $(TOP)/src/gallium/state_trackers/egl/libeglx11.a
|
||||
x11_LIBS = $(common_LIBS) -lX11 -lXext -lXfixes
|
||||
|
@@ -20,7 +20,8 @@ INCLUDE_DIRS = \
|
||||
-I$(TOP)/src/gallium/include \
|
||||
-I$(TOP)/src/gallium/drivers \
|
||||
-I$(TOP)/src/gallium/state_trackers/glx/xlib \
|
||||
-I$(TOP)/src/gallium/auxiliary
|
||||
-I$(TOP)/src/gallium/auxiliary \
|
||||
$(X11_CFLAGS)
|
||||
|
||||
DEFINES += \
|
||||
-DGALLIUM_SOFTPIPE
|
||||
|
@@ -17,7 +17,7 @@ OBJECTS = $(GLW_SOURCES:.c=.o)
|
||||
##### RULES #####
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCDIRS) $(CFLAGS) $<
|
||||
$(CC) -c $(INCDIRS) $(CFLAGS) $(GLW_CFLAGS) $<
|
||||
|
||||
|
||||
|
||||
|
@@ -90,7 +90,7 @@ install: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
|
||||
|
||||
# Remove .o and backup files
|
||||
clean:
|
||||
-rm -f $(TOP)/$(LIB_DIR)/libGL.so*
|
||||
-rm -f $(TOP)/$(LIB_DIR)/$(GL_LIB_GLOB)
|
||||
-rm -f *.o *~
|
||||
-rm -f depend depend.bak
|
||||
|
||||
|
@@ -36,7 +36,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
/* THIS IS NOT AN X CONSORTIUM STANDARD */
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
||||
|
||||
#define NEED_REPLIES
|
||||
#include <X11/Xlibint.h>
|
||||
|
4
src/glx/apple/.gitignore
vendored
Normal file
4
src/glx/apple/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
apple_xgl_api.[hc]
|
||||
exports.list
|
||||
stage.[1234]
|
||||
|
10
src/glx/apple/GL_aliases
Normal file
10
src/glx/apple/GL_aliases
Normal file
@@ -0,0 +1,10 @@
|
||||
#GL_EXT_texture_object
|
||||
alias AreTexturesResidentEXT AreTexturesResident
|
||||
alias BindTextureEXT BindTexture
|
||||
alias DeleteTexturesEXT DeleteTextures
|
||||
alias GenTexturesEXT GenTextures
|
||||
alias IsTextureEXT IsTexture
|
||||
alias PrioritizeTexturesEXT PrioritizeTextures
|
||||
|
||||
# Due to type conflicts, we handle this differently
|
||||
#alias TexImage3DEXT TexImage3D
|
106
src/glx/apple/GL_extensions
Normal file
106
src/glx/apple/GL_extensions
Normal file
@@ -0,0 +1,106 @@
|
||||
extension ARB_transpose_matrix
|
||||
extension ARB_vertex_program
|
||||
extension ARB_vertex_blend
|
||||
extension ARB_window_pos
|
||||
extension ARB_shader_objects
|
||||
extension ARB_vertex_shader
|
||||
extension ARB_shading_language_100
|
||||
extension ARB_imaging
|
||||
extension ARB_point_parameters
|
||||
extension ARB_texture_env_crossbar
|
||||
extension ARB_texture_border_clamp
|
||||
extension ARB_multitexture
|
||||
extension ARB_texture_env_add
|
||||
extension ARB_texture_cube_map
|
||||
extension ARB_texture_env_dot3
|
||||
extension ARB_multisample
|
||||
extension ARB_texture_env_combine
|
||||
extension ARB_texture_compression
|
||||
extension ARB_texture_mirrored_repeat
|
||||
extension ARB_shadow
|
||||
extension ARB_depth_texture
|
||||
extension ARB_shadow_ambient
|
||||
extension ARB_fragment_program
|
||||
extension ARB_fragment_program_shadow
|
||||
extension ARB_fragment_shader
|
||||
extension ARB_occlusion_query
|
||||
extension ARB_point_sprite
|
||||
extension ARB_texture_non_power_of_two
|
||||
extension ARB_vertex_buffer_object
|
||||
extension ARB_pixel_buffer_object
|
||||
extension ARB_draw_buffers
|
||||
extension ARB_shader_texture_lod
|
||||
extension ARB_texture_rectangle
|
||||
extension ARB_texture_float
|
||||
extension ARB_half_float_pixel
|
||||
|
||||
extension EXT_multi_draw_arrays
|
||||
extension EXT_clip_volume_hint
|
||||
extension EXT_rescale_normal
|
||||
extension EXT_draw_range_elements
|
||||
extension EXT_fog_coord
|
||||
extension EXT_gpu_program_parameters
|
||||
extension EXT_geometry_shader4
|
||||
|
||||
#The gl.spec has the wrong arguments for GetTransformFeedbackVaryingEXT
|
||||
#extension EXT_transform_feedback
|
||||
extension EXT_compiled_vertex_array
|
||||
extension EXT_framebuffer_object
|
||||
extension EXT_framebuffer_blit
|
||||
extension EXT_framebuffer_multisample
|
||||
extension EXT_texture_rectangle
|
||||
extension EXT_texture_env_add
|
||||
extension EXT_blend_color
|
||||
extension EXT_blend_minmax
|
||||
extension EXT_blend_subtract
|
||||
extension EXT_texture_lod_bias
|
||||
extension EXT_abgr
|
||||
extension EXT_bgra
|
||||
extension EXT_stencil_wrap
|
||||
extension EXT_texture_filter_anisotropic
|
||||
extension EXT_separate_specular_color
|
||||
extension EXT_secondary_color
|
||||
extension EXT_blend_func_separate
|
||||
extension EXT_shadow_funcs
|
||||
extension EXT_stencil_two_side
|
||||
extension EXT_texture_compression_s3tc
|
||||
extension EXT_texture_compression_dxt1
|
||||
extension EXT_texture_sRGB
|
||||
extension EXT_blend_equation_separate
|
||||
extension EXT_texture_mirror_clamp
|
||||
extension EXT_packed_depth_stencil
|
||||
|
||||
extension APPLE_client_storage
|
||||
extension APPLE_specular_vector
|
||||
extension APPLE_transform_hint
|
||||
extension APPLE_packed_pixels
|
||||
#The gl.spec has different argument types for this:
|
||||
#extension APPLE_fence
|
||||
extension APPLE_vertex_array_object
|
||||
extension APPLE_vertex_program_evaluators
|
||||
extension APPLE_element_array
|
||||
extension APPLE_flush_render
|
||||
extension APPLE_aux_depth_stencil
|
||||
extension APPLE_flush_buffer_range
|
||||
extension APPLE_ycbcr_422
|
||||
#The gl.spec has different argument types for this:
|
||||
#extension APPLE_vertex_array_range
|
||||
extension APPLE_texture_range
|
||||
extension APPLE_float_pixels
|
||||
extension APPLE_pixel_buffer
|
||||
extension APPLE_object_purgeable
|
||||
|
||||
#The OpenGL framework has moved this to the core OpenGL, and eliminated EXT_convolution listing.
|
||||
#extension EXT_convolution
|
||||
|
||||
#Leopard supports these according to nm.
|
||||
#Applications should use the GL_EXTENSIONS list to determine capabilities.
|
||||
extension EXT_paletted_texture
|
||||
extension APPLE_fence
|
||||
extension NV_vertex_program4
|
||||
extension EXT_draw_buffers2
|
||||
extension EXT_gpu_shader4
|
||||
extension ATI_pn_triangles
|
||||
extension NV_register_combiners
|
||||
extension EXT_depth_bounds_test
|
||||
|
15
src/glx/apple/GL_noop
Normal file
15
src/glx/apple/GL_noop
Normal file
@@ -0,0 +1,15 @@
|
||||
#These are for compatibility with the old libGL.
|
||||
noop SGI_color_table
|
||||
noop EXT_convolution
|
||||
noop EXT_cull_vertex
|
||||
noop NV_fence
|
||||
noop SGIS_detail_texture
|
||||
noop SGIX_fragment_lighting
|
||||
noop SGIX_flush_raster
|
||||
noop EXT_vertex_array
|
||||
noop SGIX_instruments
|
||||
noop EXT_histogram
|
||||
noop NV_vertex_program
|
||||
noop PGI_misc_hints
|
||||
noop SGIS_multisample
|
||||
noop EXT_multisample
|
4
src/glx/apple/GL_promoted
Normal file
4
src/glx/apple/GL_promoted
Normal file
@@ -0,0 +1,4 @@
|
||||
promoted MESA_window_pos
|
||||
promoted ARB_window_pos
|
||||
promoted EXT_copy_texture
|
||||
promoted ARB_vertex_program
|
129
src/glx/apple/Makefile
Normal file
129
src/glx/apple/Makefile
Normal file
@@ -0,0 +1,129 @@
|
||||
TOP = ../../..
|
||||
|
||||
include $(TOP)/configs/current
|
||||
|
||||
#CC=gcc
|
||||
#GL_CFLAGS=-Wall -ggdb3 -Os -DPTHREADS -D_REENTRANT $(RC_CFLAGS) $(CFLAGS)
|
||||
#GL_LDFLAGS=-L$(INSTALL_DIR)/lib -L$(X11_DIR)/lib $(LDFLAGS) -Wl,-single_module
|
||||
|
||||
TCLSH=tclsh8.5
|
||||
MKDIR=mkdir
|
||||
INSTALL=install
|
||||
LN=ln
|
||||
RM=rm
|
||||
|
||||
#INCLUDE=-I. -Iinclude -I.. -DGLX_ALIAS_UNSUPPORTED -I$(INSTALL_DIR)/include -I$(X11_DIR)/include
|
||||
|
||||
#COMPILE=$(CC) $(INCLUDE) $(GL_CFLAGS) -c
|
||||
|
||||
#The directory with the final binaries.
|
||||
BUILD_DIR=builds
|
||||
|
||||
all: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
|
||||
|
||||
SOURCES = \
|
||||
apple_cgl.c \
|
||||
apple_glx.c \
|
||||
apple_glx_context.c \
|
||||
apple_glx_drawable.c \
|
||||
apple_glx_pbuffer.c \
|
||||
apple_glx_pixmap.c \
|
||||
apple_glx_surface.c \
|
||||
apple_visual.c \
|
||||
apple_xgl_api.c \
|
||||
apple_xgl_api_additional.c \
|
||||
apple_xgl_api_read.c \
|
||||
apple_xgl_api_stereo.c \
|
||||
apple_xgl_api_viewport.c \
|
||||
appledri.c \
|
||||
../clientattrib.c \
|
||||
../compsize.c \
|
||||
../glcontextmodes.c \
|
||||
glx_empty.c \
|
||||
glx_error.c \
|
||||
../glx_pbuffer.c \
|
||||
../glx_query.c \
|
||||
../glxcmds.c \
|
||||
../glxcurrent.c \
|
||||
../glxext.c \
|
||||
../glxextensions.c \
|
||||
glxreply.c \
|
||||
../pixel.c \
|
||||
../xfont.c
|
||||
|
||||
include $(TOP)/src/mesa/sources.mak
|
||||
|
||||
LDFLAGS += -lXplugin -framework ApplicationServices -framework CoreFoundation
|
||||
|
||||
MESA_GLAPI_ASM_SOURCES = $(addprefix $(TOP)/src/mesa/, $(GLAPI_ASM_SOURCES))
|
||||
MESA_GLAPI_SOURCES = $(addprefix $(TOP)/src/mesa/, $(GLAPI_SOURCES))
|
||||
MESA_GLAPI_OBJECTS = $(addprefix $(TOP)/src/mesa/, $(GLAPI_OBJECTS))
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o) # $(MESA_GLAPI_OBJECTS)
|
||||
|
||||
INCLUDES = -I. -Iinclude -I..\
|
||||
-I$(TOP)/include \
|
||||
-I$(TOP)/include/GL/internal \
|
||||
-I$(TOP)/src/mesa \
|
||||
-I$(TOP)/src/mesa/glapi \
|
||||
$(LIBDRM_CFLAGS) \
|
||||
$(DRI2PROTO_CFLAGS) \
|
||||
$(X11_INCLUDES)
|
||||
|
||||
##### RULES #####
|
||||
|
||||
$(OBJECTS) : apple_xgl_api.h
|
||||
|
||||
apple_xgl_api.c : apple_xgl_api.h
|
||||
|
||||
apple_xgl_api.h : gen_api_header.tcl gen_api_library.tcl gen_code.tcl gen_defs.tcl gen_exports.tcl gen_funcs.tcl gen_types.tcl
|
||||
$(TCLSH) gen_code.tcl
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(EXTRA_DEFINES) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $(EXTRA_DEFINES) $< -o $@
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default: depend $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
|
||||
|
||||
# Make libGL
|
||||
$(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(OBJECTS) Makefile
|
||||
$(MKLIB) -o $(GL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \
|
||||
-major 1 -minor 2 $(MKLIB_OPTIONS) \
|
||||
-install $(TOP)/$(LIB_DIR) -id $(INSTALL_LIB_DIR)/lib$(GL_LIB).1.dylib \
|
||||
$(GL_LIB_DEPS) $(OBJECTS)
|
||||
|
||||
depend: $(SOURCES) $(MESA_GLAPI_SOURCES) $(MESA_GLAPI_ASM_SOURCES) Makefile
|
||||
rm -f depend
|
||||
touch depend
|
||||
$(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) \
|
||||
$(MESA_GLAPI_SOURCES) $(MESA_GLAPI_ASM_SOURCES)
|
||||
|
||||
# Emacs tags
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find $(TOP)/include`
|
||||
|
||||
install_headers: include/GL/gl.h
|
||||
$(INSTALL) -d $(DESTDIR)$(INSTALL_DIR)/include/GL
|
||||
$(INSTALL) -m 644 include/GL/gl.h $(DESTDIR)$(INSTALL_DIR)/include/GL
|
||||
|
||||
install_libraries: $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME)
|
||||
$(MAKE) -C $(TOP)/src/mesa install-libgl
|
||||
|
||||
install: install_libraries
|
||||
|
||||
# Remove .o and backup files
|
||||
clean:
|
||||
-rm -f *.o *.a *~
|
||||
-rm -f *.c~ *.h~
|
||||
-rm -f apple_xgl_api.h apple_xgl_api.c
|
||||
-rm -f *.dylib
|
||||
-rm -f include/GL/gl.h
|
||||
-rm -f $(TOP)/$(LIB_DIR)/$(GL_LIB_GLOB)
|
||||
-rm -f *.o *~
|
||||
-rm -f depend depend.bak
|
||||
|
||||
-include depend
|
18
src/glx/apple/OVERALL_DESIGN
Normal file
18
src/glx/apple/OVERALL_DESIGN
Normal file
@@ -0,0 +1,18 @@
|
||||
A lot of the code is automatically generated.
|
||||
|
||||
The following are generated based on specs/gl.spec and specs/enum.spec (from OpenGL.org):
|
||||
|
||||
apple_xgl_api.h
|
||||
apple_xgl_api.c
|
||||
exports.list
|
||||
include/GL/gl.h
|
||||
include/GL/glext.h (includes the OpenGL framework glext.h)
|
||||
|
||||
The gen_code.tcl script is what executes the various gen_*.tcl scripts to produce those.
|
||||
|
||||
You will need Tcl 8.5 for the gen_code.tcl script.
|
||||
|
||||
The tests/ directory contains some tests that are built in testbuilds.
|
||||
|
||||
The tests built in testbuilds don't require installation of the library.
|
||||
|
8
src/glx/apple/README_UPDATING
Normal file
8
src/glx/apple/README_UPDATING
Normal file
@@ -0,0 +1,8 @@
|
||||
The design of most of this code is such that we extend the GLX structures
|
||||
with a void * named apple.
|
||||
|
||||
The GLX functions that need to do Apple-specific things are passed
|
||||
&s->apple in order to initialize the private structures.
|
||||
|
||||
Thus when updating, just run a diff against glxext.c or glxcmds.c, and
|
||||
manually merge from there as needed.
|
71
src/glx/apple/RELEASE_NOTES
Normal file
71
src/glx/apple/RELEASE_NOTES
Normal file
@@ -0,0 +1,71 @@
|
||||
AppleSGLX Release Notes
|
||||
|
||||
o OpenGL Support
|
||||
|
||||
AppleSGLX supports the same version of OpenGL as Leopard (OpenGL 2.1).
|
||||
Many extensions from the OpenGL framework are now builtin.
|
||||
|
||||
This adds support for GLSL, and a variety of other features.
|
||||
|
||||
o Thread Support
|
||||
|
||||
Thread support has been improved since the libGL in XQuartz 2.3.2.1.
|
||||
|
||||
o GLX 1.4 Support
|
||||
|
||||
The GLX 1.3 and 1.4 functions should all work with a few exceptions
|
||||
as outlined in this document.
|
||||
|
||||
o glXMakeContextCurrent (a GLX 1.3 feature)
|
||||
|
||||
glXMakeContextCurrent should work with the readable drawable. The
|
||||
OpenGL functions: glReadPixels, glCopyPixels, and glCopyColorTable,
|
||||
should use the readable drawable if it's different than the rendering
|
||||
drawable.
|
||||
|
||||
o glXGetProcAddress (a GLX 1.4 feature and ARB extension)
|
||||
|
||||
glXGetProcAddress should work and allow getting the address of any
|
||||
extension functions you may need from the X11 libGL, or OpenGL framework
|
||||
libGL. Previous versions of the X11 libGL didn't allow getting the newer
|
||||
OpenGL framework addresses.
|
||||
|
||||
o GLXPixmaps
|
||||
|
||||
New support for GLXPixmaps works well with mixed X11 and OpenGL drawing
|
||||
operations. You can create them using glXCreateGLXPixmap or
|
||||
glXCreatePixmap.
|
||||
|
||||
o GLXPbuffers
|
||||
|
||||
Support for GLXPbuffers has been added. These are drawables that are
|
||||
not possible to render to with X11, which is allowed by the spec.
|
||||
A GLXPbuffer will never generate a clobber event, however
|
||||
glXSelectEvent and glXGetSelectedEvent should operate normally.
|
||||
|
||||
Clobber events are not generated due to low-level architectural
|
||||
differences. The contents of your pbuffers will not be clobbered.
|
||||
|
||||
o Shared Contexts
|
||||
|
||||
Due to basic low-level architectural differences the usage of shared
|
||||
contexts requires a similar visual or GLXFBConfig be used in the
|
||||
creation of a shared context. It's best if you specify the same
|
||||
visual. This is due to a CGL design difference, and not something
|
||||
that is easily worked around. UPDATE: some changes made seem to
|
||||
help resolve this issue in many cases, so you may be able to use a
|
||||
shared context without this restriction.
|
||||
|
||||
|
||||
o Indirect
|
||||
|
||||
The X server supports indirect fairly well, so OpenGL applications
|
||||
can be run remotely and displayed by XQuartz. This means you can run
|
||||
applications from a remote host on an XQuartz X server.
|
||||
|
||||
AppleSGLX does not support indirect rendering. Any indirect context
|
||||
created will appear to glXIsDirect as an indirect context, but it
|
||||
does not actually support indirect rendering to a remote X server.
|
||||
|
||||
AppleSGLX supports GLXPixmaps and GLXPbuffers with direct and indirect
|
||||
contexts, though they are all direct contexts by definition (see above).
|
26
src/glx/apple/TODO
Normal file
26
src/glx/apple/TODO
Normal file
@@ -0,0 +1,26 @@
|
||||
Test shared contexts!
|
||||
|
||||
Go over every glxcmd in glxcmds.c and make sure we have them working.
|
||||
Verify the XError behavior of GLXPixmap support functions.
|
||||
|
||||
Test GLXPixmap support with various pixmap depths.
|
||||
|
||||
Test GLXPixmap support with invalid pixmaps (to stress the protocol code).
|
||||
|
||||
-- Feb 10, 2009
|
||||
|
||||
Test glXCopyContext.
|
||||
|
||||
-- Dec 12 2008
|
||||
|
||||
TEST glXCopyContext needs some work and additional code in apple_glx.c.
|
||||
|
||||
----
|
||||
|
||||
Make sure we report the proper list of GLX extensions available. Apple direct may not support some
|
||||
that Mesa does, and vice-versa.
|
||||
|
||||
Modify create_destroy_context and create a new test called create_destroy_context_thread_race.
|
||||
Where 2 threads are doing the same sort of path of create and destroy. The locking should protect
|
||||
us there, but we need to verify nothing goes wrong.
|
||||
|
128
src/glx/apple/apple_cgl.c
Normal file
128
src/glx/apple/apple_cgl.c
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
Copyright (c) 2008 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include "apple_cgl.h"
|
||||
#include "apple_glx.h"
|
||||
|
||||
#ifndef OPENGL_FRAMEWORK_PATH
|
||||
#define OPENGL_FRAMEWORK_PATH "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL"
|
||||
#endif
|
||||
|
||||
static void *dl_handle = NULL;
|
||||
|
||||
struct apple_cgl_api apple_cgl;
|
||||
|
||||
static bool initialized = false;
|
||||
|
||||
static void *
|
||||
sym(void *h, const char *name)
|
||||
{
|
||||
void *s;
|
||||
|
||||
s = dlsym(h, name);
|
||||
|
||||
if (NULL == s) {
|
||||
fprintf(stderr, "error: %s\n", dlerror());
|
||||
abort();
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void
|
||||
apple_cgl_init(void)
|
||||
{
|
||||
void *h;
|
||||
GLint major = 0, minor = 0;
|
||||
const char *opengl_framework_path;
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
opengl_framework_path = getenv("OPENGL_FRAMEWORK_PATH");
|
||||
if (!opengl_framework_path) {
|
||||
opengl_framework_path = OPENGL_FRAMEWORK_PATH;
|
||||
}
|
||||
|
||||
(void) dlerror(); /*drain dlerror */
|
||||
h = dlopen(opengl_framework_path, RTLD_NOW);
|
||||
|
||||
if (NULL == h) {
|
||||
fprintf(stderr, "error: unable to dlopen %s : %s\n",
|
||||
opengl_framework_path, dlerror());
|
||||
abort();
|
||||
}
|
||||
|
||||
dl_handle = h;
|
||||
|
||||
apple_cgl.get_version = sym(h, "CGLGetVersion");
|
||||
|
||||
apple_cgl.get_version(&major, &minor);
|
||||
|
||||
apple_glx_diagnostic("CGL major %d minor %d\n", major, minor);
|
||||
|
||||
if (1 != major) {
|
||||
fprintf(stderr, "WARNING: the CGL major version has changed!\n"
|
||||
"libGL may be incompatible!\n");
|
||||
}
|
||||
|
||||
apple_cgl.choose_pixel_format = sym(h, "CGLChoosePixelFormat");
|
||||
apple_cgl.destroy_pixel_format = sym(h, "CGLDestroyPixelFormat");
|
||||
|
||||
apple_cgl.clear_drawable = sym(h, "CGLClearDrawable");
|
||||
apple_cgl.flush_drawable = sym(h, "CGLFlushDrawable");
|
||||
|
||||
apple_cgl.create_context = sym(h, "CGLCreateContext");
|
||||
apple_cgl.destroy_context = sym(h, "CGLDestroyContext");
|
||||
|
||||
apple_cgl.set_current_context = sym(h, "CGLSetCurrentContext");
|
||||
apple_cgl.get_current_context = sym(h, "CGLGetCurrentContext");
|
||||
apple_cgl.error_string = sym(h, "CGLErrorString");
|
||||
|
||||
apple_cgl.set_off_screen = sym(h, "CGLSetOffScreen");
|
||||
|
||||
apple_cgl.copy_context = sym(h, "CGLCopyContext");
|
||||
|
||||
apple_cgl.create_pbuffer = sym(h, "CGLCreatePBuffer");
|
||||
apple_cgl.destroy_pbuffer = sym(h, "CGLDestroyPBuffer");
|
||||
apple_cgl.set_pbuffer = sym(h, "CGLSetPBuffer");
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
void *
|
||||
apple_cgl_get_dl_handle(void)
|
||||
{
|
||||
return dl_handle;
|
||||
}
|
86
src/glx/apple/apple_cgl.h
Normal file
86
src/glx/apple/apple_cgl.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#ifndef APPLE_CGL_H
|
||||
#define APPLE_CGL_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <OpenGL/CGLCurrent.h>
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
|
||||
/* For GLint and GLsizei on Tiger */
|
||||
#include <OpenGL/gl.h>
|
||||
|
||||
struct apple_cgl_api
|
||||
{
|
||||
void (*get_version) (GLint * majorvers, GLint * minorvers);
|
||||
|
||||
CGLError(*choose_pixel_format) (const CGLPixelFormatAttribute * attribs,
|
||||
CGLPixelFormatObj * pix, GLint * npix);
|
||||
CGLError(*destroy_pixel_format) (CGLPixelFormatObj pix);
|
||||
|
||||
CGLError(*clear_drawable) (CGLContextObj ctx);
|
||||
CGLError(*flush_drawable) (CGLContextObj ctx);
|
||||
|
||||
CGLError(*create_context) (CGLPixelFormatObj pix, CGLContextObj share,
|
||||
CGLContextObj * ctx);
|
||||
CGLError(*destroy_context) (CGLContextObj pix);
|
||||
|
||||
CGLError(*set_current_context) (CGLContextObj ctx);
|
||||
CGLContextObj(*get_current_context) (void);
|
||||
const char *(*error_string) (CGLError error);
|
||||
|
||||
CGLError(*set_off_screen) (CGLContextObj ctx,
|
||||
GLsizei width, GLsizei height, GLint rowbytes,
|
||||
void *baseaddr);
|
||||
|
||||
CGLError(*copy_context) (CGLContextObj src, CGLContextObj dst,
|
||||
GLbitfield mask);
|
||||
|
||||
CGLError(*create_pbuffer) (GLsizei width,
|
||||
GLsizei height,
|
||||
GLenum target,
|
||||
GLenum internalFormat,
|
||||
GLint max_level, CGLPBufferObj * pbuffer);
|
||||
|
||||
CGLError(*destroy_pbuffer) (CGLPBufferObj pbuffer);
|
||||
|
||||
CGLError(*set_pbuffer) (CGLContextObj ctx,
|
||||
CGLPBufferObj pbuffer,
|
||||
GLenum face, GLint level, GLint screen);
|
||||
};
|
||||
|
||||
extern struct apple_cgl_api apple_cgl;
|
||||
|
||||
extern void apple_cgl_init(void);
|
||||
|
||||
extern void *apple_cgl_get_dl_handle(void);
|
||||
|
||||
#endif
|
623
src/glx/apple/apple_exports.list
Normal file
623
src/glx/apple/apple_exports.list
Normal file
@@ -0,0 +1,623 @@
|
||||
_glAccum
|
||||
_glAlphaFunc
|
||||
_glAreTexturesResident
|
||||
_glArrayElement
|
||||
_glBegin
|
||||
_glBindTexture
|
||||
_glBitmap
|
||||
_glBlendColor
|
||||
_glBlendEquation
|
||||
_glBlendEquationSeparate
|
||||
_glBlendFunc
|
||||
_glCallList
|
||||
_glCallLists
|
||||
_glClear
|
||||
_glClearAccum
|
||||
_glClearColor
|
||||
_glClearDepth
|
||||
_glClearIndex
|
||||
_glClearStencil
|
||||
_glClipPlane
|
||||
_glColor3b
|
||||
_glColor3bv
|
||||
_glColor3d
|
||||
_glColor3dv
|
||||
_glColor3f
|
||||
_glColor3fv
|
||||
_glColor3i
|
||||
_glColor3iv
|
||||
_glColor3s
|
||||
_glColor3sv
|
||||
_glColor3ub
|
||||
_glColor3ubv
|
||||
_glColor3ui
|
||||
_glColor3uiv
|
||||
_glColor3us
|
||||
_glColor3usv
|
||||
_glColor4b
|
||||
_glColor4bv
|
||||
_glColor4d
|
||||
_glColor4dv
|
||||
_glColor4f
|
||||
_glColor4fv
|
||||
_glColor4i
|
||||
_glColor4iv
|
||||
_glColor4s
|
||||
_glColor4sv
|
||||
_glColor4ub
|
||||
_glColor4ubv
|
||||
_glColor4ui
|
||||
_glColor4uiv
|
||||
_glColor4us
|
||||
_glColor4usv
|
||||
_glColorMask
|
||||
_glColorMaterial
|
||||
_glColorPointer
|
||||
_glColorSubTable
|
||||
_glColorTable
|
||||
_glColorTableParameterfv
|
||||
_glColorTableParameteriv
|
||||
_glConvolutionFilter1D
|
||||
_glConvolutionFilter2D
|
||||
_glConvolutionParameterf
|
||||
_glConvolutionParameterfv
|
||||
_glConvolutionParameteri
|
||||
_glConvolutionParameteriv
|
||||
_glCopyColorSubTable
|
||||
_glCopyColorTable
|
||||
_glCopyConvolutionFilter1D
|
||||
_glCopyConvolutionFilter2D
|
||||
_glCopyPixels
|
||||
_glCopyTexImage1D
|
||||
_glCopyTexImage2D
|
||||
_glCopyTexSubImage1D
|
||||
_glCopyTexSubImage2D
|
||||
_glCopyTexSubImage3D
|
||||
_glCullFace
|
||||
_glDeleteLists
|
||||
_glDeleteTextures
|
||||
_glDepthFunc
|
||||
_glDepthMask
|
||||
_glDepthRange
|
||||
_glDisable
|
||||
_glDisableClientState
|
||||
_glDrawArrays
|
||||
_glDrawBuffer
|
||||
_glDrawElements
|
||||
_glDrawPixels
|
||||
_glDrawRangeElements
|
||||
_glEdgeFlag
|
||||
_glEdgeFlagPointer
|
||||
_glEdgeFlagv
|
||||
_glEnable
|
||||
_glEnableClientState
|
||||
_glEnd
|
||||
_glEndList
|
||||
_glEvalCoord1d
|
||||
_glEvalCoord1dv
|
||||
_glEvalCoord1f
|
||||
_glEvalCoord1fv
|
||||
_glEvalCoord2d
|
||||
_glEvalCoord2dv
|
||||
_glEvalCoord2f
|
||||
_glEvalCoord2fv
|
||||
_glEvalMesh1
|
||||
_glEvalMesh2
|
||||
_glEvalPoint1
|
||||
_glEvalPoint2
|
||||
_glFeedbackBuffer
|
||||
_glFinish
|
||||
_glFlush
|
||||
_glFogf
|
||||
_glFogfv
|
||||
_glFogi
|
||||
_glFogiv
|
||||
_glFrontFace
|
||||
_glFrustum
|
||||
_glGenLists
|
||||
_glGenTextures
|
||||
_glGetBooleanv
|
||||
_glGetClipPlane
|
||||
_glGetColorTable
|
||||
_glGetColorTableParameterfv
|
||||
_glGetColorTableParameteriv
|
||||
_glGetConvolutionFilter
|
||||
_glGetConvolutionParameterfv
|
||||
_glGetConvolutionParameteriv
|
||||
_glGetDoublev
|
||||
_glGetError
|
||||
_glGetFloatv
|
||||
_glGetHistogram
|
||||
_glGetHistogramParameterfv
|
||||
_glGetHistogramParameteriv
|
||||
_glGetIntegerv
|
||||
_glGetLightfv
|
||||
_glGetLightiv
|
||||
_glGetMapdv
|
||||
_glGetMapfv
|
||||
_glGetMapiv
|
||||
_glGetMaterialfv
|
||||
_glGetMaterialiv
|
||||
_glGetMinmax
|
||||
_glGetMinmaxParameterfv
|
||||
_glGetMinmaxParameteriv
|
||||
_glGetPixelMapfv
|
||||
_glGetPixelMapuiv
|
||||
_glGetPixelMapusv
|
||||
_glGetPointerv
|
||||
_glGetPolygonStipple
|
||||
_glGetSeparableFilter
|
||||
_glGetString
|
||||
_glGetTexEnvfv
|
||||
_glGetTexEnviv
|
||||
_glGetTexGendv
|
||||
_glGetTexGenfv
|
||||
_glGetTexGeniv
|
||||
_glGetTexImage
|
||||
_glGetTexLevelParameterfv
|
||||
_glGetTexLevelParameteriv
|
||||
_glGetTexParameterfv
|
||||
_glGetTexParameteriv
|
||||
_glHint
|
||||
_glHistogram
|
||||
_glIndexMask
|
||||
_glIndexPointer
|
||||
_glIndexd
|
||||
_glIndexdv
|
||||
_glIndexf
|
||||
_glIndexfv
|
||||
_glIndexi
|
||||
_glIndexiv
|
||||
_glIndexs
|
||||
_glIndexsv
|
||||
_glIndexub
|
||||
_glIndexubv
|
||||
_glInitNames
|
||||
_glInterleavedArrays
|
||||
_glIsEnabled
|
||||
_glIsList
|
||||
_glIsTexture
|
||||
_glLightModelf
|
||||
_glLightModelfv
|
||||
_glLightModeli
|
||||
_glLightModeliv
|
||||
_glLightf
|
||||
_glLightfv
|
||||
_glLighti
|
||||
_glLightiv
|
||||
_glLineStipple
|
||||
_glLineWidth
|
||||
_glListBase
|
||||
_glLoadIdentity
|
||||
_glLoadMatrixd
|
||||
_glLoadMatrixf
|
||||
_glLoadName
|
||||
_glLogicOp
|
||||
_glMap1d
|
||||
_glMap1f
|
||||
_glMap2d
|
||||
_glMap2f
|
||||
_glMapGrid1d
|
||||
_glMapGrid1f
|
||||
_glMapGrid2d
|
||||
_glMapGrid2f
|
||||
_glMaterialf
|
||||
_glMaterialfv
|
||||
_glMateriali
|
||||
_glMaterialiv
|
||||
_glMatrixMode
|
||||
_glMinmax
|
||||
_glMultMatrixd
|
||||
_glMultMatrixf
|
||||
_glNewList
|
||||
_glNormal3b
|
||||
_glNormal3bv
|
||||
_glNormal3d
|
||||
_glNormal3dv
|
||||
_glNormal3f
|
||||
_glNormal3fv
|
||||
_glNormal3i
|
||||
_glNormal3iv
|
||||
_glNormal3s
|
||||
_glNormal3sv
|
||||
_glNormalPointer
|
||||
_glOrtho
|
||||
_glPassThrough
|
||||
_glPixelMapfv
|
||||
_glPixelMapuiv
|
||||
_glPixelMapusv
|
||||
_glPixelStoref
|
||||
_glPixelStorei
|
||||
_glPixelTransferf
|
||||
_glPixelTransferi
|
||||
_glPixelZoom
|
||||
_glPointSize
|
||||
_glPolygonMode
|
||||
_glPolygonOffset
|
||||
_glPolygonStipple
|
||||
_glPopAttrib
|
||||
_glPopClientAttrib
|
||||
_glPopMatrix
|
||||
_glPopName
|
||||
_glPrioritizeTextures
|
||||
_glPushAttrib
|
||||
_glPushClientAttrib
|
||||
_glPushMatrix
|
||||
_glPushName
|
||||
_glRasterPos2d
|
||||
_glRasterPos2dv
|
||||
_glRasterPos2f
|
||||
_glRasterPos2fv
|
||||
_glRasterPos2i
|
||||
_glRasterPos2iv
|
||||
_glRasterPos2s
|
||||
_glRasterPos2sv
|
||||
_glRasterPos3d
|
||||
_glRasterPos3dv
|
||||
_glRasterPos3f
|
||||
_glRasterPos3fv
|
||||
_glRasterPos3i
|
||||
_glRasterPos3iv
|
||||
_glRasterPos3s
|
||||
_glRasterPos3sv
|
||||
_glRasterPos4d
|
||||
_glRasterPos4dv
|
||||
_glRasterPos4f
|
||||
_glRasterPos4fv
|
||||
_glRasterPos4i
|
||||
_glRasterPos4iv
|
||||
_glRasterPos4s
|
||||
_glRasterPos4sv
|
||||
_glReadBuffer
|
||||
_glReadPixels
|
||||
_glRectd
|
||||
_glRectdv
|
||||
_glRectf
|
||||
_glRectfv
|
||||
_glRecti
|
||||
_glRectiv
|
||||
_glRects
|
||||
_glRectsv
|
||||
_glRenderMode
|
||||
_glResetHistogram
|
||||
_glResetMinmax
|
||||
_glRotated
|
||||
_glRotatef
|
||||
_glScaled
|
||||
_glScalef
|
||||
_glScissor
|
||||
_glSelectBuffer
|
||||
_glSeparableFilter2D
|
||||
_glShadeModel
|
||||
_glStencilFunc
|
||||
_glStencilMask
|
||||
_glStencilOp
|
||||
_glTexCoord1d
|
||||
_glTexCoord1dv
|
||||
_glTexCoord1f
|
||||
_glTexCoord1fv
|
||||
_glTexCoord1i
|
||||
_glTexCoord1iv
|
||||
_glTexCoord1s
|
||||
_glTexCoord1sv
|
||||
_glTexCoord2d
|
||||
_glTexCoord2dv
|
||||
_glTexCoord2f
|
||||
_glTexCoord2fv
|
||||
_glTexCoord2i
|
||||
_glTexCoord2iv
|
||||
_glTexCoord2s
|
||||
_glTexCoord2sv
|
||||
_glTexCoord3d
|
||||
_glTexCoord3dv
|
||||
_glTexCoord3f
|
||||
_glTexCoord3fv
|
||||
_glTexCoord3i
|
||||
_glTexCoord3iv
|
||||
_glTexCoord3s
|
||||
_glTexCoord3sv
|
||||
_glTexCoord4d
|
||||
_glTexCoord4dv
|
||||
_glTexCoord4f
|
||||
_glTexCoord4fv
|
||||
_glTexCoord4i
|
||||
_glTexCoord4iv
|
||||
_glTexCoord4s
|
||||
_glTexCoord4sv
|
||||
_glTexCoordPointer
|
||||
_glTexEnvf
|
||||
_glTexEnvfv
|
||||
_glTexEnvi
|
||||
_glTexEnviv
|
||||
_glTexGend
|
||||
_glTexGendv
|
||||
_glTexGenf
|
||||
_glTexGenfv
|
||||
_glTexGeni
|
||||
_glTexGeniv
|
||||
_glTexImage1D
|
||||
_glTexImage2D
|
||||
_glTexImage3D
|
||||
_glTexParameterf
|
||||
_glTexParameterfv
|
||||
_glTexParameteri
|
||||
_glTexParameteriv
|
||||
_glTexSubImage1D
|
||||
_glTexSubImage2D
|
||||
_glTexSubImage3D
|
||||
_glTranslated
|
||||
_glTranslatef
|
||||
_glVertex2d
|
||||
_glVertex2dv
|
||||
_glVertex2f
|
||||
_glVertex2fv
|
||||
_glVertex2i
|
||||
_glVertex2iv
|
||||
_glVertex2s
|
||||
_glVertex2sv
|
||||
_glVertex3d
|
||||
_glVertex3dv
|
||||
_glVertex3f
|
||||
_glVertex3fv
|
||||
_glVertex3i
|
||||
_glVertex3iv
|
||||
_glVertex3s
|
||||
_glVertex3sv
|
||||
_glVertex4d
|
||||
_glVertex4dv
|
||||
_glVertex4f
|
||||
_glVertex4fv
|
||||
_glVertex4i
|
||||
_glVertex4iv
|
||||
_glVertex4s
|
||||
_glVertex4sv
|
||||
_glVertexPointer
|
||||
_glViewport
|
||||
_glSampleCoverage
|
||||
_glSamplePass
|
||||
_glLoadTransposeMatrixf
|
||||
_glLoadTransposeMatrixd
|
||||
_glMultTransposeMatrixf
|
||||
_glMultTransposeMatrixd
|
||||
_glCompressedTexImage3D
|
||||
_glCompressedTexImage2D
|
||||
_glCompressedTexImage1D
|
||||
_glCompressedTexSubImage3D
|
||||
_glCompressedTexSubImage2D
|
||||
_glCompressedTexSubImage1D
|
||||
_glGetCompressedTexImage
|
||||
_glActiveTexture
|
||||
_glClientActiveTexture
|
||||
_glMultiTexCoord1d
|
||||
_glMultiTexCoord1dv
|
||||
_glMultiTexCoord1f
|
||||
_glMultiTexCoord1fv
|
||||
_glMultiTexCoord1i
|
||||
_glMultiTexCoord1iv
|
||||
_glMultiTexCoord1s
|
||||
_glMultiTexCoord1sv
|
||||
_glMultiTexCoord2d
|
||||
_glMultiTexCoord2dv
|
||||
_glMultiTexCoord2f
|
||||
_glMultiTexCoord2fv
|
||||
_glMultiTexCoord2i
|
||||
_glMultiTexCoord2iv
|
||||
_glMultiTexCoord2s
|
||||
_glMultiTexCoord2sv
|
||||
_glMultiTexCoord3d
|
||||
_glMultiTexCoord3dv
|
||||
_glMultiTexCoord3f
|
||||
_glMultiTexCoord3fv
|
||||
_glMultiTexCoord3i
|
||||
_glMultiTexCoord3iv
|
||||
_glMultiTexCoord3s
|
||||
_glMultiTexCoord3sv
|
||||
_glMultiTexCoord4d
|
||||
_glMultiTexCoord4dv
|
||||
_glMultiTexCoord4f
|
||||
_glMultiTexCoord4fv
|
||||
_glMultiTexCoord4i
|
||||
_glMultiTexCoord4iv
|
||||
_glMultiTexCoord4s
|
||||
_glMultiTexCoord4sv
|
||||
_glFogCoordf
|
||||
_glFogCoordfv
|
||||
_glFogCoordd
|
||||
_glFogCoorddv
|
||||
_glFogCoordPointer
|
||||
_glSecondaryColor3b
|
||||
_glSecondaryColor3bv
|
||||
_glSecondaryColor3d
|
||||
_glSecondaryColor3dv
|
||||
_glSecondaryColor3f
|
||||
_glSecondaryColor3fv
|
||||
_glSecondaryColor3i
|
||||
_glSecondaryColor3iv
|
||||
_glSecondaryColor3s
|
||||
_glSecondaryColor3sv
|
||||
_glSecondaryColor3ub
|
||||
_glSecondaryColor3ubv
|
||||
_glSecondaryColor3ui
|
||||
_glSecondaryColor3uiv
|
||||
_glSecondaryColor3us
|
||||
_glSecondaryColor3usv
|
||||
_glSecondaryColorPointer
|
||||
_glPointParameterf
|
||||
_glPointParameterfv
|
||||
_glPointParameteri
|
||||
_glPointParameteriv
|
||||
_glBlendFuncSeparate
|
||||
_glMultiDrawArrays
|
||||
_glMultiDrawElements
|
||||
_glWindowPos2d
|
||||
_glWindowPos2dv
|
||||
_glWindowPos2f
|
||||
_glWindowPos2fv
|
||||
_glWindowPos2i
|
||||
_glWindowPos2iv
|
||||
_glWindowPos2s
|
||||
_glWindowPos2sv
|
||||
_glWindowPos3d
|
||||
_glWindowPos3dv
|
||||
_glWindowPos3f
|
||||
_glWindowPos3fv
|
||||
_glWindowPos3i
|
||||
_glWindowPos3iv
|
||||
_glWindowPos3s
|
||||
_glWindowPos3sv
|
||||
_glGenQueries
|
||||
_glDeleteQueries
|
||||
_glIsQuery
|
||||
_glBeginQuery
|
||||
_glEndQuery
|
||||
_glGetQueryiv
|
||||
_glGetQueryObjectiv
|
||||
_glGetQueryObjectuiv
|
||||
_glBindBuffer
|
||||
_glDeleteBuffers
|
||||
_glGenBuffers
|
||||
_glIsBuffer
|
||||
_glBufferData
|
||||
_glBufferSubData
|
||||
_glGetBufferSubData
|
||||
_glMapBuffer
|
||||
_glUnmapBuffer
|
||||
_glGetBufferParameteriv
|
||||
_glGetBufferPointerv
|
||||
_glDrawBuffers
|
||||
_glVertexAttrib1d
|
||||
_glVertexAttrib1dv
|
||||
_glVertexAttrib1f
|
||||
_glVertexAttrib1fv
|
||||
_glVertexAttrib1s
|
||||
_glVertexAttrib1sv
|
||||
_glVertexAttrib2d
|
||||
_glVertexAttrib2dv
|
||||
_glVertexAttrib2f
|
||||
_glVertexAttrib2fv
|
||||
_glVertexAttrib2s
|
||||
_glVertexAttrib2sv
|
||||
_glVertexAttrib3d
|
||||
_glVertexAttrib3dv
|
||||
_glVertexAttrib3f
|
||||
_glVertexAttrib3fv
|
||||
_glVertexAttrib3s
|
||||
_glVertexAttrib3sv
|
||||
_glVertexAttrib4Nbv
|
||||
_glVertexAttrib4Niv
|
||||
_glVertexAttrib4Nsv
|
||||
_glVertexAttrib4Nub
|
||||
_glVertexAttrib4Nubv
|
||||
_glVertexAttrib4Nuiv
|
||||
_glVertexAttrib4Nusv
|
||||
_glVertexAttrib4bv
|
||||
_glVertexAttrib4d
|
||||
_glVertexAttrib4dv
|
||||
_glVertexAttrib4f
|
||||
_glVertexAttrib4fv
|
||||
_glVertexAttrib4iv
|
||||
_glVertexAttrib4s
|
||||
_glVertexAttrib4sv
|
||||
_glVertexAttrib4ubv
|
||||
_glVertexAttrib4uiv
|
||||
_glVertexAttrib4usv
|
||||
_glVertexAttribPointer
|
||||
_glEnableVertexAttribArray
|
||||
_glDisableVertexAttribArray
|
||||
_glGetVertexAttribdv
|
||||
_glGetVertexAttribfv
|
||||
_glGetVertexAttribiv
|
||||
_glGetVertexAttribPointerv
|
||||
_glDeleteShader
|
||||
_glDetachShader
|
||||
_glCreateShader
|
||||
_glShaderSource
|
||||
_glCompileShader
|
||||
_glCreateProgram
|
||||
_glAttachShader
|
||||
_glLinkProgram
|
||||
_glUseProgram
|
||||
_glDeleteProgram
|
||||
_glValidateProgram
|
||||
_glUniform1f
|
||||
_glUniform2f
|
||||
_glUniform3f
|
||||
_glUniform4f
|
||||
_glUniform1i
|
||||
_glUniform2i
|
||||
_glUniform3i
|
||||
_glUniform4i
|
||||
_glUniform1fv
|
||||
_glUniform2fv
|
||||
_glUniform3fv
|
||||
_glUniform4fv
|
||||
_glUniform1iv
|
||||
_glUniform2iv
|
||||
_glUniform3iv
|
||||
_glUniform4iv
|
||||
_glUniformMatrix2fv
|
||||
_glUniformMatrix3fv
|
||||
_glUniformMatrix4fv
|
||||
_glIsShader
|
||||
_glIsProgram
|
||||
_glGetShaderiv
|
||||
_glGetProgramiv
|
||||
_glGetAttachedShaders
|
||||
_glGetShaderInfoLog
|
||||
_glGetProgramInfoLog
|
||||
_glGetUniformLocation
|
||||
_glGetActiveUniform
|
||||
_glGetUniformfv
|
||||
_glGetUniformiv
|
||||
_glGetShaderSource
|
||||
_glBindAttribLocation
|
||||
_glGetActiveAttrib
|
||||
_glGetAttribLocation
|
||||
_glStencilFuncSeparate
|
||||
_glStencilOpSeparate
|
||||
_glStencilMaskSeparate
|
||||
_glUniformMatrix2x3fv
|
||||
_glUniformMatrix3x2fv
|
||||
_glUniformMatrix2x4fv
|
||||
_glUniformMatrix4x2fv
|
||||
_glUniformMatrix3x4fv
|
||||
_glUniformMatrix4x3fv
|
||||
_glXChooseVisual
|
||||
_glXCreateContext
|
||||
_glXDestroyContext
|
||||
_glXMakeCurrent
|
||||
_glXCopyContext
|
||||
_glXSwapBuffers
|
||||
_glXCreateGLXPixmap
|
||||
_glXDestroyGLXPixmap
|
||||
_glXQueryExtension
|
||||
_glXQueryVersion
|
||||
_glXIsDirect
|
||||
_glXGetConfig
|
||||
_glXGetCurrentContext
|
||||
_glXGetCurrentDrawable
|
||||
_glXWaitGL
|
||||
_glXWaitX
|
||||
_glXUseXFont
|
||||
_glXQueryExtensionsString
|
||||
_glXQueryServerString
|
||||
_glXGetClientString
|
||||
_glXGetCurrentDisplay
|
||||
_glXChooseFBConfig
|
||||
_glXGetFBConfigAttrib
|
||||
_glXGetFBConfigs
|
||||
_glXGetVisualFromFBConfig
|
||||
_glXCreateWindow
|
||||
_glXDestroyWindow
|
||||
_glXCreatePixmap
|
||||
_glXDestroyPixmap
|
||||
_glXCreatePbuffer
|
||||
_glXDestroyPbuffer
|
||||
_glXQueryDrawable
|
||||
_glXCreateNewContext
|
||||
_glXMakeContextCurrent
|
||||
_glXGetCurrentReadDrawable
|
||||
_glXQueryContext
|
||||
_glXSelectEvent
|
||||
_glXGetSelectedEvent
|
||||
_glXGetProcAddress
|
214
src/glx/apple/apple_glx.c
Normal file
214
src/glx/apple/apple_glx.c
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <dlfcn.h>
|
||||
#include "appledri.h"
|
||||
#include "apple_glx.h"
|
||||
#include "apple_glx_context.h"
|
||||
#include "apple_cgl.h"
|
||||
#include "apple_xgl_api.h"
|
||||
|
||||
static bool initialized = false;
|
||||
static int dri_event_base = 0;
|
||||
|
||||
const GLuint __glXDefaultPixelStore[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 1 };
|
||||
|
||||
#ifndef OPENGL_LIB_PATH
|
||||
#define OPENGL_LIB_PATH "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
|
||||
#endif
|
||||
|
||||
static void *libgl_handle = NULL;
|
||||
|
||||
static bool diagnostic = false;
|
||||
|
||||
void
|
||||
apple_glx_diagnostic(const char *fmt, ...)
|
||||
{
|
||||
va_list vl;
|
||||
|
||||
if (diagnostic) {
|
||||
fprintf(stderr, "DIAG: ");
|
||||
|
||||
va_start(vl, fmt);
|
||||
vfprintf(stderr, fmt, vl);
|
||||
va_end(vl);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
apple_get_dri_event_base(void)
|
||||
{
|
||||
if (!initialized) {
|
||||
fprintf(stderr,
|
||||
"error: dri_event_base called before apple_init_glx!\n");
|
||||
abort();
|
||||
}
|
||||
return dri_event_base;
|
||||
}
|
||||
|
||||
static void
|
||||
surface_notify_handler(Display * dpy, unsigned int uid, int kind)
|
||||
{
|
||||
|
||||
switch (kind) {
|
||||
case AppleDRISurfaceNotifyDestroyed:
|
||||
apple_glx_diagnostic("%s: surface destroyed %u\n", __func__, uid);
|
||||
apple_glx_surface_destroy(uid);
|
||||
break;
|
||||
|
||||
case AppleDRISurfaceNotifyChanged:{
|
||||
int updated;
|
||||
|
||||
updated = apple_glx_context_surface_changed(uid, pthread_self());
|
||||
|
||||
apple_glx_diagnostic("surface notify updated %d\n", updated);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "unhandled kind of event: %d in %s\n", kind, __func__);
|
||||
}
|
||||
}
|
||||
|
||||
xp_client_id
|
||||
apple_glx_get_client_id(void)
|
||||
{
|
||||
static xp_client_id id;
|
||||
|
||||
if (0 == id) {
|
||||
if ((XP_Success != xp_init(XP_IN_BACKGROUND)) ||
|
||||
(Success != xp_get_client_id(&id))) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
/* Return true if an error occured. */
|
||||
bool
|
||||
apple_init_glx(Display * dpy)
|
||||
{
|
||||
int eventBase, errorBase;
|
||||
int major, minor, patch;
|
||||
|
||||
if (!XAppleDRIQueryExtension(dpy, &eventBase, &errorBase))
|
||||
return true;
|
||||
|
||||
if (!XAppleDRIQueryVersion(dpy, &major, &minor, &patch))
|
||||
return true;
|
||||
|
||||
if (initialized)
|
||||
return false;
|
||||
|
||||
if (getenv("LIBGL_DIAGNOSTIC")) {
|
||||
printf("initializing libGL in %s\n", __func__);
|
||||
diagnostic = true;
|
||||
}
|
||||
|
||||
apple_cgl_init();
|
||||
apple_xgl_init_direct();
|
||||
libgl_handle = dlopen(OPENGL_LIB_PATH, RTLD_LAZY);
|
||||
(void) apple_glx_get_client_id();
|
||||
|
||||
XAppleDRISetSurfaceNotifyHandler(surface_notify_handler);
|
||||
|
||||
/* This should really be per display. */
|
||||
dri_event_base = eventBase;
|
||||
initialized = true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
apple_glx_swap_buffers(void *ptr)
|
||||
{
|
||||
struct apple_glx_context *ac = ptr;
|
||||
|
||||
/* This may not be needed with CGLFlushDrawable: */
|
||||
glFlush();
|
||||
apple_cgl.flush_drawable(ac->context_obj);
|
||||
}
|
||||
|
||||
void *
|
||||
apple_glx_get_proc_address(const GLubyte * procname)
|
||||
{
|
||||
size_t len;
|
||||
void *h, *s;
|
||||
char *pname = (char *) procname;
|
||||
|
||||
assert(NULL != procname);
|
||||
len = strlen(pname);
|
||||
|
||||
if (len < 3) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((pname != strstr(pname, "glX")) && (pname != strstr(pname, "gl"))) {
|
||||
fprintf(stderr,
|
||||
"warning: get proc address request is not for a gl or glX function");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Search using the default symbols first. */
|
||||
(void) dlerror(); /*drain dlerror */
|
||||
h = dlopen(NULL, RTLD_NOW);
|
||||
if (NULL == h) {
|
||||
fprintf(stderr, "warning: get proc address: %s\n", dlerror());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
s = dlsym(h, pname);
|
||||
|
||||
if (NULL == s) {
|
||||
/* Try the libGL.dylib from the OpenGL.framework. */
|
||||
s = dlsym(libgl_handle, pname);
|
||||
}
|
||||
|
||||
dlclose(h);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void
|
||||
apple_glx_waitx(Display * dpy, void *ptr)
|
||||
{
|
||||
struct apple_private_context *ac = ptr;
|
||||
|
||||
(void) ac;
|
||||
|
||||
glFlush();
|
||||
glFinish();
|
||||
XSync(dpy, False);
|
||||
}
|
49
src/glx/apple/apple_glx.h
Normal file
49
src/glx/apple/apple_glx.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
Copyright (c) 2008 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#ifndef APPLE_GLX_H
|
||||
#define APPLE_GLX_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glxint.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#define XP_NO_X_HEADERS
|
||||
#include <Xplugin.h>
|
||||
|
||||
void apple_glx_diagnostic(const char *fmt, ...);
|
||||
xp_client_id apple_glx_get_client_id(void);
|
||||
bool apple_init_glx(Display * dpy);
|
||||
void apple_glx_swap_buffers(void *ptr);
|
||||
void *apple_glx_get_proc_address(const GLubyte * procname);
|
||||
void apple_glx_waitx(Display * dpy, void *ptr);
|
||||
int apple_get_dri_event_base(void);
|
||||
|
||||
#endif
|
616
src/glx/apple/apple_glx_context.c
Normal file
616
src/glx/apple/apple_glx_context.c
Normal file
@@ -0,0 +1,616 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// Get the newer glext.h first
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
#include <OpenGL/CGLCurrent.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
|
||||
#include "glxclient.h"
|
||||
|
||||
#include "apple_glx.h"
|
||||
#include "apple_glx_context.h"
|
||||
#include "appledri.h"
|
||||
#include "apple_visual.h"
|
||||
#include "apple_cgl.h"
|
||||
#include "apple_glx_drawable.h"
|
||||
|
||||
static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
/*
|
||||
* This should be locked on creation and destruction of the
|
||||
* apple_glx_contexts.
|
||||
*
|
||||
* It's also locked when the surface_notify_handler is searching
|
||||
* for a uid associated with a surface.
|
||||
*/
|
||||
static struct apple_glx_context *context_list = NULL;
|
||||
|
||||
/* This guards the context_list above. */
|
||||
static void
|
||||
lock_context_list(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_lock(&context_lock);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_lock failure in %s: %d\n",
|
||||
__func__, err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
unlock_context_list(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_unlock(&context_lock);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_unlock failure in %s: %d\n",
|
||||
__func__, err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
is_context_valid(struct apple_glx_context *ac)
|
||||
{
|
||||
struct apple_glx_context *i;
|
||||
|
||||
lock_context_list();
|
||||
|
||||
for (i = context_list; i; i = i->next) {
|
||||
if (ac == i) {
|
||||
unlock_context_list();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_context_list();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* This creates an apple_private_context struct.
|
||||
*
|
||||
* It's typically called to save the struct in a GLXContext.
|
||||
*
|
||||
* This is also where the CGLContextObj is created, and the CGLPixelFormatObj.
|
||||
*/
|
||||
bool
|
||||
apple_glx_create_context(void **ptr, Display * dpy, int screen,
|
||||
const void *mode, void *sharedContext,
|
||||
int *errorptr, bool * x11errorptr)
|
||||
{
|
||||
struct apple_glx_context *ac;
|
||||
struct apple_glx_context *sharedac = sharedContext;
|
||||
CGLError error;
|
||||
|
||||
*ptr = NULL;
|
||||
|
||||
ac = malloc(sizeof *ac);
|
||||
|
||||
if (NULL == ac) {
|
||||
*errorptr = BadAlloc;
|
||||
*x11errorptr = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (sharedac && !is_context_valid(sharedac)) {
|
||||
*errorptr = GLXBadContext;
|
||||
*x11errorptr = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
ac->context_obj = NULL;
|
||||
ac->pixel_format_obj = NULL;
|
||||
ac->drawable = NULL;
|
||||
ac->thread_id = pthread_self();
|
||||
ac->screen = screen;
|
||||
ac->double_buffered = false;
|
||||
ac->uses_stereo = false;
|
||||
ac->need_update = false;
|
||||
ac->is_current = false;
|
||||
ac->made_current = false;
|
||||
ac->last_surface_window = None;
|
||||
|
||||
apple_visual_create_pfobj(&ac->pixel_format_obj, mode,
|
||||
&ac->double_buffered, &ac->uses_stereo,
|
||||
/*offscreen */ false);
|
||||
|
||||
error = apple_cgl.create_context(ac->pixel_format_obj,
|
||||
sharedac ? sharedac->context_obj : NULL,
|
||||
&ac->context_obj);
|
||||
|
||||
|
||||
if (error) {
|
||||
(void) apple_cgl.destroy_pixel_format(ac->pixel_format_obj);
|
||||
|
||||
free(ac);
|
||||
|
||||
if (kCGLBadMatch == error) {
|
||||
*errorptr = BadMatch;
|
||||
*x11errorptr = true;
|
||||
}
|
||||
else {
|
||||
*errorptr = GLXBadContext;
|
||||
*x11errorptr = false;
|
||||
}
|
||||
|
||||
if (getenv("LIBGL_DIAGNOSTIC"))
|
||||
fprintf(stderr, "error: %s\n", apple_cgl.error_string(error));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* The context creation succeeded, so we can link in the new context. */
|
||||
lock_context_list();
|
||||
|
||||
if (context_list)
|
||||
context_list->previous = ac;
|
||||
|
||||
ac->previous = NULL;
|
||||
ac->next = context_list;
|
||||
context_list = ac;
|
||||
|
||||
*ptr = ac;
|
||||
|
||||
apple_glx_diagnostic("%s: ac %p ac->context_obj %p\n",
|
||||
__func__, (void *) ac, (void *) ac->context_obj);
|
||||
|
||||
unlock_context_list();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
apple_glx_destroy_context(void **ptr, Display * dpy)
|
||||
{
|
||||
struct apple_glx_context *ac = *ptr;
|
||||
|
||||
if (NULL == ac)
|
||||
return;
|
||||
|
||||
apple_glx_diagnostic("%s: ac %p ac->context_obj %p\n",
|
||||
__func__, (void *) ac, (void *) ac->context_obj);
|
||||
|
||||
if (apple_cgl.get_current_context() == ac->context_obj) {
|
||||
apple_glx_diagnostic("%s: context ac->context_obj %p "
|
||||
"is still current!\n", __func__,
|
||||
(void *) ac->context_obj);
|
||||
if (apple_cgl.set_current_context(NULL)) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove ac from the context_list as soon as possible. */
|
||||
lock_context_list();
|
||||
|
||||
if (ac->previous) {
|
||||
ac->previous->next = ac->next;
|
||||
}
|
||||
else {
|
||||
context_list = ac->next;
|
||||
}
|
||||
|
||||
if (ac->next) {
|
||||
ac->next->previous = ac->previous;
|
||||
}
|
||||
|
||||
unlock_context_list();
|
||||
|
||||
|
||||
if (apple_cgl.clear_drawable(ac->context_obj)) {
|
||||
fprintf(stderr, "error: while clearing drawable!\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
/*
|
||||
* This potentially causes surface_notify_handler to be called in
|
||||
* apple_glx.c...
|
||||
* We can NOT have a lock held at this point. It would result in
|
||||
* an abort due to an attempted deadlock. This is why we earlier
|
||||
* removed the ac pointer from the double-linked list.
|
||||
*/
|
||||
if (ac->drawable) {
|
||||
ac->drawable->destroy(ac->drawable);
|
||||
}
|
||||
|
||||
if (apple_cgl.destroy_pixel_format(ac->pixel_format_obj)) {
|
||||
fprintf(stderr, "error: destroying pixel format in %s\n", __func__);
|
||||
abort();
|
||||
}
|
||||
|
||||
if (apple_cgl.destroy_context(ac->context_obj)) {
|
||||
fprintf(stderr, "error: destroying context_obj in %s\n", __func__);
|
||||
abort();
|
||||
}
|
||||
|
||||
free(ac);
|
||||
|
||||
*ptr = NULL;
|
||||
|
||||
apple_glx_garbage_collect_drawables(dpy);
|
||||
}
|
||||
|
||||
|
||||
/* Return true if an error occured. */
|
||||
bool
|
||||
apple_glx_make_current_context(Display * dpy, void *oldptr, void *ptr,
|
||||
GLXDrawable drawable)
|
||||
{
|
||||
struct apple_glx_context *oldac = oldptr;
|
||||
struct apple_glx_context *ac = ptr;
|
||||
struct apple_glx_drawable *newagd = NULL;
|
||||
CGLError cglerr;
|
||||
bool same_drawable = false;
|
||||
|
||||
#if 0
|
||||
apple_glx_diagnostic("%s: oldac %p ac %p drawable 0x%lx\n",
|
||||
__func__, (void *) oldac, (void *) ac, drawable);
|
||||
|
||||
apple_glx_diagnostic("%s: oldac->context_obj %p ac->context_obj %p\n",
|
||||
__func__,
|
||||
(void *) (oldac ? oldac->context_obj : NULL),
|
||||
(void *) (ac ? ac->context_obj : NULL));
|
||||
#endif
|
||||
|
||||
/* This a common path for GLUT and other apps, so special case it. */
|
||||
if (ac && ac->drawable && ac->drawable->drawable == drawable) {
|
||||
same_drawable = true;
|
||||
|
||||
if (ac->is_current)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Reset the is_current state of the old context, if non-NULL. */
|
||||
if (oldac && (ac != oldac))
|
||||
oldac->is_current = false;
|
||||
|
||||
if (NULL == ac) {
|
||||
/*Clear the current context for this thread. */
|
||||
apple_cgl.set_current_context(NULL);
|
||||
|
||||
if (oldac) {
|
||||
oldac->is_current = false;
|
||||
|
||||
if (oldac->drawable) {
|
||||
oldac->drawable->destroy(oldac->drawable);
|
||||
oldac->drawable = NULL;
|
||||
}
|
||||
|
||||
/* Invalidate this to prevent surface recreation. */
|
||||
oldac->last_surface_window = None;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (None == drawable) {
|
||||
bool error = false;
|
||||
|
||||
/* Clear the current drawable for this context_obj. */
|
||||
|
||||
if (apple_cgl.set_current_context(ac->context_obj))
|
||||
error = true;
|
||||
|
||||
if (apple_cgl.clear_drawable(ac->context_obj))
|
||||
error = true;
|
||||
|
||||
if (ac->drawable) {
|
||||
ac->drawable->destroy(ac->drawable);
|
||||
ac->drawable = NULL;
|
||||
}
|
||||
|
||||
/* Invalidate this to prevent surface recreation. */
|
||||
ac->last_surface_window = None;
|
||||
|
||||
apple_glx_diagnostic("%s: drawable is None, error is: %d\n",
|
||||
__func__, error);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/* This is an optimisation to avoid searching for the current drawable. */
|
||||
if (ac->drawable && ac->drawable->drawable == drawable) {
|
||||
newagd = ac->drawable;
|
||||
}
|
||||
else {
|
||||
/* Find the drawable if possible, and retain a reference to it. */
|
||||
newagd =
|
||||
apple_glx_drawable_find(drawable, APPLE_GLX_DRAWABLE_REFERENCE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to destroy the old drawable, so long as the new one
|
||||
* isn't the old.
|
||||
*/
|
||||
if (ac->drawable && !same_drawable) {
|
||||
ac->drawable->destroy(ac->drawable);
|
||||
ac->drawable = NULL;
|
||||
}
|
||||
|
||||
if (NULL == newagd) {
|
||||
if (apple_glx_surface_create(dpy, ac->screen, drawable, &newagd))
|
||||
return true;
|
||||
|
||||
/* The drawable is referenced once by apple_glx_surface_create. */
|
||||
|
||||
/*
|
||||
* FIXME: We actually need 2 references to prevent premature surface
|
||||
* destruction. The problem is that the surface gets destroyed in
|
||||
* the case of the context being reused for another window, and
|
||||
* we then lose the surface contents. Wait for destruction of a
|
||||
* window to destroy a surface.
|
||||
*
|
||||
* Note: this may leave around surfaces we don't want around, if
|
||||
* say we are using X for raster drawing after OpenGL rendering,
|
||||
* but it will be compatible with the old libGL's behavior.
|
||||
*
|
||||
* Someday the X11 and OpenGL rendering must be unified at some
|
||||
* layer. I suspect we can do that via shared memory and
|
||||
* multiple threads in the X server (1 for each context created
|
||||
* by a client). This would also allow users to render from
|
||||
* multiple clients to the same OpenGL surface. In fact it could
|
||||
* all be OpenGL.
|
||||
*
|
||||
*/
|
||||
newagd->reference(newagd);
|
||||
|
||||
/* Save the new drawable with the context structure. */
|
||||
ac->drawable = newagd;
|
||||
}
|
||||
else {
|
||||
/* We are reusing an existing drawable structure. */
|
||||
|
||||
if (same_drawable) {
|
||||
assert(ac->drawable == newagd);
|
||||
/* The drawable_find above retained a reference for us. */
|
||||
}
|
||||
else {
|
||||
ac->drawable = newagd;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Avoid this costly path if this is the same drawable and the
|
||||
* context is already current.
|
||||
*/
|
||||
|
||||
if (same_drawable && ac->is_current) {
|
||||
apple_glx_diagnostic("%s: same_drawable and ac->is_current\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
cglerr = apple_cgl.set_current_context(ac->context_obj);
|
||||
|
||||
if (kCGLNoError != cglerr) {
|
||||
fprintf(stderr, "set current error: %s\n",
|
||||
apple_cgl.error_string(cglerr));
|
||||
return true;
|
||||
}
|
||||
|
||||
ac->is_current = true;
|
||||
|
||||
assert(NULL != ac->context_obj);
|
||||
assert(NULL != ac->drawable);
|
||||
|
||||
ac->thread_id = pthread_self();
|
||||
|
||||
/* This will be set if the pending_destroy code indicates it should be: */
|
||||
ac->last_surface_window = None;
|
||||
|
||||
switch (ac->drawable->type) {
|
||||
case APPLE_GLX_DRAWABLE_PBUFFER:
|
||||
case APPLE_GLX_DRAWABLE_SURFACE:
|
||||
case APPLE_GLX_DRAWABLE_PIXMAP:
|
||||
if (ac->drawable->callbacks.make_current) {
|
||||
if (ac->drawable->callbacks.make_current(ac, ac->drawable))
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "internal error: invalid drawable type: %d\n",
|
||||
ac->drawable->type);
|
||||
abort();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_is_current_drawable(Display * dpy, void *ptr, GLXDrawable drawable)
|
||||
{
|
||||
struct apple_glx_context *ac = ptr;
|
||||
|
||||
if (ac->drawable && ac->drawable->drawable == drawable) {
|
||||
return true;
|
||||
}
|
||||
else if (NULL == ac->drawable && None != ac->last_surface_window) {
|
||||
apple_glx_context_update(dpy, ac);
|
||||
|
||||
return (ac->drawable && ac->drawable->drawable == drawable);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_copy_context(void *currentptr, void *srcptr, void *destptr,
|
||||
unsigned long mask, int *errorptr, bool * x11errorptr)
|
||||
{
|
||||
struct apple_glx_context *src, *dest;
|
||||
CGLError err;
|
||||
|
||||
src = srcptr;
|
||||
dest = destptr;
|
||||
|
||||
if (src->screen != dest->screen) {
|
||||
*errorptr = BadMatch;
|
||||
*x11errorptr = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dest == currentptr || dest->is_current) {
|
||||
*errorptr = BadAccess;
|
||||
*x11errorptr = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* If srcptr is the current context then we should do an implicit glFlush.
|
||||
*/
|
||||
if (currentptr == srcptr)
|
||||
glFlush();
|
||||
|
||||
err = apple_cgl.copy_context(src->context_obj, dest->context_obj,
|
||||
(GLbitfield) mask);
|
||||
|
||||
if (kCGLNoError != err) {
|
||||
*errorptr = GLXBadContext;
|
||||
*x11errorptr = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* The value returned is the total number of contexts set to update.
|
||||
* It's meant for debugging/introspection.
|
||||
*/
|
||||
int
|
||||
apple_glx_context_surface_changed(unsigned int uid, pthread_t caller)
|
||||
{
|
||||
struct apple_glx_context *ac;
|
||||
int updated = 0;
|
||||
|
||||
lock_context_list();
|
||||
|
||||
for (ac = context_list; ac; ac = ac->next) {
|
||||
if (ac->drawable && APPLE_GLX_DRAWABLE_SURFACE == ac->drawable->type
|
||||
&& ac->drawable->types.surface.uid == uid) {
|
||||
|
||||
if (caller == ac->thread_id) {
|
||||
apple_glx_diagnostic("caller is the same thread for uid %u\n",
|
||||
uid);
|
||||
|
||||
xp_update_gl_context(ac->context_obj);
|
||||
}
|
||||
else {
|
||||
ac->need_update = true;
|
||||
++updated;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlock_context_list();
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
void
|
||||
apple_glx_context_update(Display * dpy, void *ptr)
|
||||
{
|
||||
struct apple_glx_context *ac = ptr;
|
||||
|
||||
if (NULL == ac->drawable && None != ac->last_surface_window) {
|
||||
bool failed;
|
||||
|
||||
/* Attempt to recreate the surface for a destroyed drawable. */
|
||||
failed =
|
||||
apple_glx_make_current_context(dpy, ac, ac, ac->last_surface_window);
|
||||
|
||||
apple_glx_diagnostic("%s: surface recreation failed? %s\n", __func__,
|
||||
failed ? "YES" : "NO");
|
||||
}
|
||||
|
||||
if (ac->need_update) {
|
||||
xp_update_gl_context(ac->context_obj);
|
||||
ac->need_update = false;
|
||||
|
||||
apple_glx_diagnostic("%s: updating context %p\n", __func__, ptr);
|
||||
}
|
||||
|
||||
if (ac->drawable && APPLE_GLX_DRAWABLE_SURFACE == ac->drawable->type
|
||||
&& ac->drawable->types.surface.pending_destroy) {
|
||||
apple_glx_diagnostic("%s: clearing drawable %p\n", __func__, ptr);
|
||||
apple_cgl.clear_drawable(ac->context_obj);
|
||||
|
||||
if (ac->drawable) {
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
apple_glx_diagnostic("%s: attempting to destroy drawable %p\n",
|
||||
__func__, ptr);
|
||||
apple_glx_diagnostic("%s: ac->drawable->drawable is 0x%lx\n",
|
||||
__func__, ac->drawable->drawable);
|
||||
|
||||
d = ac->drawable;
|
||||
|
||||
ac->last_surface_window = d->drawable;
|
||||
|
||||
ac->drawable = NULL;
|
||||
|
||||
/*
|
||||
* This will destroy the surface drawable if there are
|
||||
* no references to it.
|
||||
* It also subtracts 1 from the reference_count.
|
||||
* If there are references to it, then it's probably made
|
||||
* current in another context.
|
||||
*/
|
||||
d->destroy(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_context_uses_stereo(void *ptr)
|
||||
{
|
||||
struct apple_glx_context *ac = ptr;
|
||||
|
||||
return ac->uses_stereo;
|
||||
}
|
93
src/glx/apple/apple_glx_context.h
Normal file
93
src/glx/apple/apple_glx_context.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
#ifndef APPLE_GLX_CONTEXT_H
|
||||
#define APPLE_GLX_CONTEXT_H
|
||||
|
||||
/* <rdar://problem/6953344> */
|
||||
#define glTexImage1D glTexImage1D_OSX
|
||||
#define glTexImage2D glTexImage2D_OSX
|
||||
#define glTexImage3D glTexImage3D_OSX
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
#include <OpenGL/CGLContext.h>
|
||||
#undef glTexImage1D
|
||||
#undef glTexImage2D
|
||||
#undef glTexImage3D
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <GL/glx.h>
|
||||
#define XP_NO_X_HEADERS
|
||||
#include <Xplugin.h>
|
||||
#undef XP_NO_X_HEADERS
|
||||
|
||||
#include "apple_glx_drawable.h"
|
||||
|
||||
struct apple_glx_context
|
||||
{
|
||||
CGLContextObj context_obj;
|
||||
CGLPixelFormatObj pixel_format_obj;
|
||||
struct apple_glx_drawable *drawable;
|
||||
pthread_t thread_id;
|
||||
int screen;
|
||||
bool double_buffered;
|
||||
bool uses_stereo;
|
||||
bool need_update;
|
||||
bool is_current; /* True if the context is current in some thread. */
|
||||
bool made_current; /* True if the context has ever been made current. */
|
||||
|
||||
/*
|
||||
* last_surface is set by the pending_destroy code handler for a drawable.
|
||||
* Due to a CG difference, we have to recreate a surface if the window
|
||||
* is unmapped and mapped again.
|
||||
*/
|
||||
Window last_surface_window;
|
||||
struct apple_glx_context *previous, *next;
|
||||
};
|
||||
|
||||
bool apple_glx_create_context(void **ptr, Display * dpy, int screen,
|
||||
const void *mode, void *sharedContext,
|
||||
int *errorptr, bool * x11errorptr);
|
||||
void apple_glx_destroy_context(void **ptr, Display * dpy);
|
||||
|
||||
bool apple_glx_make_current_context(Display * dpy, void *oldptr, void *ptr,
|
||||
GLXDrawable drawable);
|
||||
bool apple_glx_is_current_drawable(Display * dpy, void *ptr,
|
||||
GLXDrawable drawable);
|
||||
|
||||
bool apple_glx_copy_context(void *currentptr, void *srcptr, void *destptr,
|
||||
unsigned long mask, int *errorptr,
|
||||
bool * x11errorptr);
|
||||
|
||||
int apple_glx_context_surface_changed(unsigned int uid, pthread_t caller);
|
||||
|
||||
void apple_glx_context_update(Display * dpy, void *ptr);
|
||||
|
||||
bool apple_glx_context_uses_stereo(void *ptr);
|
||||
|
||||
#endif /*APPLE_GLX_CONTEXT_H */
|
542
src/glx/apple/apple_glx_drawable.c
Normal file
542
src/glx/apple/apple_glx_drawable.c
Normal file
@@ -0,0 +1,542 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <pthread.h>
|
||||
#include "apple_glx.h"
|
||||
#include "apple_glx_context.h"
|
||||
#include "apple_glx_drawable.h"
|
||||
#include "appledri.h"
|
||||
|
||||
static pthread_mutex_t drawables_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static struct apple_glx_drawable *drawables_list = NULL;
|
||||
|
||||
static void
|
||||
lock_drawables_list(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_lock(&drawables_lock);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_lock failure in %s: %d\n",
|
||||
__func__, err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
unlock_drawables_list(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_unlock(&drawables_lock);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_unlock failure in %s: %d\n",
|
||||
__func__, err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
struct apple_glx_drawable *
|
||||
apple_glx_find_drawable(Display * dpy, GLXDrawable drawable)
|
||||
{
|
||||
struct apple_glx_drawable *i, *agd = NULL;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (i = drawables_list; i; i = i->next) {
|
||||
if (i->drawable == drawable) {
|
||||
agd = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return agd;
|
||||
}
|
||||
|
||||
static void
|
||||
drawable_lock(struct apple_glx_drawable *agd)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_lock(&agd->mutex);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_lock error: %d\n", err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
drawable_unlock(struct apple_glx_drawable *d)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = pthread_mutex_unlock(&d->mutex);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_unlock error: %d\n", err);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
reference_drawable(struct apple_glx_drawable *d)
|
||||
{
|
||||
d->lock(d);
|
||||
d->reference_count++;
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
static void
|
||||
release_drawable(struct apple_glx_drawable *d)
|
||||
{
|
||||
d->lock(d);
|
||||
d->reference_count--;
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
/* The drawables list must be locked prior to calling this. */
|
||||
/* Return true if the drawable was destroyed. */
|
||||
static bool
|
||||
destroy_drawable(struct apple_glx_drawable *d)
|
||||
{
|
||||
|
||||
d->lock(d);
|
||||
|
||||
if (d->reference_count > 0) {
|
||||
d->unlock(d);
|
||||
return false;
|
||||
}
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
if (d->previous) {
|
||||
d->previous->next = d->next;
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* The item must be at the head of the list, if it
|
||||
* has no previous pointer.
|
||||
*/
|
||||
drawables_list = d->next;
|
||||
}
|
||||
|
||||
if (d->next)
|
||||
d->next->previous = d->previous;
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
if (d->callbacks.destroy) {
|
||||
/*
|
||||
* Warning: this causes other routines to be called (potentially)
|
||||
* from surface_notify_handler. It's probably best to not have
|
||||
* any locks at this point locked.
|
||||
*/
|
||||
d->callbacks.destroy(d->display, d);
|
||||
}
|
||||
|
||||
apple_glx_diagnostic("%s: freeing %p\n", __func__, (void *) d);
|
||||
|
||||
free(d);
|
||||
|
||||
/* So that the locks are balanced and the caller correctly unlocks. */
|
||||
lock_drawables_list();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is typically called when a context is destroyed or the current
|
||||
* drawable is made None.
|
||||
*/
|
||||
static bool
|
||||
destroy_drawable_callback(struct apple_glx_drawable *d)
|
||||
{
|
||||
bool result;
|
||||
|
||||
d->lock(d);
|
||||
|
||||
apple_glx_diagnostic("%s: %p ->reference_count before -- %d\n", __func__,
|
||||
(void *) d, d->reference_count);
|
||||
|
||||
d->reference_count--;
|
||||
|
||||
if (d->reference_count > 0) {
|
||||
d->unlock(d);
|
||||
return false;
|
||||
}
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
result = destroy_drawable(d);
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_pbuffer(struct apple_glx_drawable *d)
|
||||
{
|
||||
return APPLE_GLX_DRAWABLE_PBUFFER == d->type;
|
||||
}
|
||||
|
||||
static bool
|
||||
is_pixmap(struct apple_glx_drawable *d)
|
||||
{
|
||||
return APPLE_GLX_DRAWABLE_PIXMAP == d->type;
|
||||
}
|
||||
|
||||
static void
|
||||
common_init(Display * dpy, GLXDrawable drawable, struct apple_glx_drawable *d)
|
||||
{
|
||||
int err;
|
||||
pthread_mutexattr_t attr;
|
||||
|
||||
d->display = dpy;
|
||||
d->reference_count = 0;
|
||||
d->drawable = drawable;
|
||||
d->type = -1;
|
||||
|
||||
err = pthread_mutexattr_init(&attr);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutexattr_init error: %d\n", err);
|
||||
abort();
|
||||
}
|
||||
|
||||
/*
|
||||
* There are some patterns that require a recursive mutex,
|
||||
* when working with locks that protect the apple_glx_drawable,
|
||||
* and reference functions like ->reference, and ->release.
|
||||
*/
|
||||
err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "error: setting pthread mutex type: %d\n", err);
|
||||
abort();
|
||||
}
|
||||
|
||||
err = pthread_mutex_init(&d->mutex, &attr);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr, "pthread_mutex_init error: %d\n", err);
|
||||
abort();
|
||||
}
|
||||
|
||||
(void) pthread_mutexattr_destroy(&attr);
|
||||
|
||||
d->lock = drawable_lock;
|
||||
d->unlock = drawable_unlock;
|
||||
|
||||
d->reference = reference_drawable;
|
||||
d->release = release_drawable;
|
||||
|
||||
d->destroy = destroy_drawable_callback;
|
||||
|
||||
d->is_pbuffer = is_pbuffer;
|
||||
d->is_pixmap = is_pixmap;
|
||||
|
||||
d->width = -1;
|
||||
d->height = -1;
|
||||
d->row_bytes = 0;
|
||||
d->path[0] = '\0';
|
||||
d->fd = -1;
|
||||
d->buffer = NULL;
|
||||
d->buffer_length = 0;
|
||||
|
||||
d->previous = NULL;
|
||||
d->next = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
link_tail(struct apple_glx_drawable *agd)
|
||||
{
|
||||
lock_drawables_list();
|
||||
|
||||
/* Link the new drawable into the global list. */
|
||||
agd->next = drawables_list;
|
||||
|
||||
if (drawables_list)
|
||||
drawables_list->previous = agd;
|
||||
|
||||
drawables_list = agd;
|
||||
|
||||
unlock_drawables_list();
|
||||
}
|
||||
|
||||
/*WARNING: this returns a locked and referenced object. */
|
||||
bool
|
||||
apple_glx_drawable_create(Display * dpy,
|
||||
int screen,
|
||||
GLXDrawable drawable,
|
||||
struct apple_glx_drawable **agdResult,
|
||||
struct apple_glx_drawable_callbacks *callbacks)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
d = calloc(1, sizeof *d);
|
||||
|
||||
if (NULL == d) {
|
||||
perror("malloc");
|
||||
return true;
|
||||
}
|
||||
|
||||
common_init(dpy, drawable, d);
|
||||
d->type = callbacks->type;
|
||||
d->callbacks = *callbacks;
|
||||
|
||||
d->reference(d);
|
||||
d->lock(d);
|
||||
|
||||
link_tail(d);
|
||||
|
||||
apple_glx_diagnostic("%s: new drawable %p\n", __func__, (void *) d);
|
||||
|
||||
*agdResult = d;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int error_count = 0;
|
||||
|
||||
static int
|
||||
error_handler(Display * dpy, XErrorEvent * err)
|
||||
{
|
||||
if (err->error_code == BadWindow) {
|
||||
++error_count;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
apple_glx_garbage_collect_drawables(Display * dpy)
|
||||
{
|
||||
struct apple_glx_drawable *d, *dnext;
|
||||
Window root;
|
||||
int x, y;
|
||||
unsigned int width, height, bd, depth;
|
||||
int (*old_handler) (Display *, XErrorEvent *);
|
||||
|
||||
|
||||
if (NULL == drawables_list)
|
||||
return;
|
||||
|
||||
old_handler = XSetErrorHandler(error_handler);
|
||||
|
||||
XSync(dpy, False);
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d;) {
|
||||
dnext = d->next;
|
||||
|
||||
d->lock(d);
|
||||
|
||||
if (d->reference_count > 0) {
|
||||
/*
|
||||
* Skip this, because some context still retains a reference
|
||||
* to the drawable.
|
||||
*/
|
||||
d->unlock(d);
|
||||
d = dnext;
|
||||
continue;
|
||||
}
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
error_count = 0;
|
||||
|
||||
/*
|
||||
* Mesa uses XGetWindowAttributes, but some of these things are
|
||||
* most definitely not Windows, and that's against the rules.
|
||||
* XGetGeometry on the other hand is legal with a Pixmap and Window.
|
||||
*/
|
||||
XGetGeometry(dpy, d->drawable, &root, &x, &y, &width, &height, &bd,
|
||||
&depth);
|
||||
|
||||
if (error_count > 0) {
|
||||
/*
|
||||
* Note: this may not actually destroy the drawable.
|
||||
* If another context retains a reference to the drawable
|
||||
* after the reference count test above.
|
||||
*/
|
||||
(void) destroy_drawable(d);
|
||||
error_count = 0;
|
||||
}
|
||||
|
||||
d = dnext;
|
||||
}
|
||||
|
||||
XSetErrorHandler(old_handler);
|
||||
|
||||
unlock_drawables_list();
|
||||
}
|
||||
|
||||
unsigned int
|
||||
apple_glx_get_drawable_count(void)
|
||||
{
|
||||
unsigned int result = 0;
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d; d = d->next)
|
||||
++result;
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct apple_glx_drawable *
|
||||
apple_glx_drawable_find_by_type(GLXDrawable drawable, int type, int flags)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d; d = d->next) {
|
||||
if (d->type == type && d->drawable == drawable) {
|
||||
if (flags & APPLE_GLX_DRAWABLE_REFERENCE)
|
||||
d->reference(d);
|
||||
|
||||
if (flags & APPLE_GLX_DRAWABLE_LOCK)
|
||||
d->lock(d);
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct apple_glx_drawable *
|
||||
apple_glx_drawable_find(GLXDrawable drawable, int flags)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d; d = d->next) {
|
||||
if (d->drawable == drawable) {
|
||||
if (flags & APPLE_GLX_DRAWABLE_REFERENCE)
|
||||
d->reference(d);
|
||||
|
||||
if (flags & APPLE_GLX_DRAWABLE_LOCK)
|
||||
d->lock(d);
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Return true if the type is valid for the drawable. */
|
||||
bool
|
||||
apple_glx_drawable_destroy_by_type(Display * dpy,
|
||||
GLXDrawable drawable, int type)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d; d = d->next) {
|
||||
if (drawable == d->drawable && type == d->type) {
|
||||
/*
|
||||
* The user has requested that we destroy this resource.
|
||||
* However, there may be references in the contexts to it, so
|
||||
* release it, and call destroy_drawable which doesn't destroy
|
||||
* if the reference_count is > 0.
|
||||
*/
|
||||
d->release(d);
|
||||
|
||||
apple_glx_diagnostic("%s d->reference_count %d\n",
|
||||
__func__, d->reference_count);
|
||||
|
||||
destroy_drawable(d);
|
||||
unlock_drawables_list();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct apple_glx_drawable *
|
||||
apple_glx_drawable_find_by_uid(unsigned int uid, int flags)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
lock_drawables_list();
|
||||
|
||||
for (d = drawables_list; d; d = d->next) {
|
||||
/* Only surfaces have a uid. */
|
||||
if (APPLE_GLX_DRAWABLE_SURFACE == d->type) {
|
||||
if (d->types.surface.uid == uid) {
|
||||
if (flags & APPLE_GLX_DRAWABLE_REFERENCE)
|
||||
d->reference(d);
|
||||
|
||||
if (flags & APPLE_GLX_DRAWABLE_LOCK)
|
||||
d->lock(d);
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unlock_drawables_list();
|
||||
|
||||
return NULL;
|
||||
}
|
227
src/glx/apple/apple_glx_drawable.h
Normal file
227
src/glx/apple/apple_glx_drawable.h
Normal file
@@ -0,0 +1,227 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
#ifndef APPLE_GLX_DRAWABLE_H
|
||||
#define APPLE_GLX_DRAWABLE_H
|
||||
|
||||
/* Must be first for:
|
||||
* <rdar://problem/6953344>
|
||||
*/
|
||||
#include "apple_glx_context.h"
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <limits.h>
|
||||
#include <GL/glx.h>
|
||||
#define XP_NO_X_HEADERS
|
||||
#include <Xplugin.h>
|
||||
#undef XP_NO_X_HEADERS
|
||||
|
||||
enum
|
||||
{
|
||||
APPLE_GLX_DRAWABLE_SURFACE = 1,
|
||||
APPLE_GLX_DRAWABLE_PBUFFER,
|
||||
APPLE_GLX_DRAWABLE_PIXMAP
|
||||
};
|
||||
|
||||
/* The flag for the find routine. */
|
||||
enum
|
||||
{
|
||||
APPLE_GLX_DRAWABLE_LOCK = 2,
|
||||
APPLE_GLX_DRAWABLE_REFERENCE = 4
|
||||
};
|
||||
|
||||
struct apple_glx_context;
|
||||
struct apple_glx_drawable;
|
||||
|
||||
struct apple_glx_surface
|
||||
{
|
||||
xp_surface_id surface_id;
|
||||
unsigned int uid;
|
||||
bool pending_destroy;
|
||||
};
|
||||
|
||||
struct apple_glx_pbuffer
|
||||
{
|
||||
GLXPbuffer xid; /* our pixmap */
|
||||
int width, height;
|
||||
GLint fbconfigID;
|
||||
CGLPBufferObj buffer_obj;
|
||||
unsigned long event_mask;
|
||||
};
|
||||
|
||||
struct apple_glx_pixmap
|
||||
{
|
||||
GLXPixmap xpixmap;
|
||||
void *buffer;
|
||||
int width, height, pitch, /*bytes per pixel */ bpp;
|
||||
size_t size;
|
||||
char path[PATH_MAX];
|
||||
int fd;
|
||||
CGLPixelFormatObj pixel_format_obj;
|
||||
CGLContextObj context_obj;
|
||||
GLint fbconfigID;
|
||||
};
|
||||
|
||||
struct apple_glx_drawable_callbacks
|
||||
{
|
||||
int type;
|
||||
bool(*make_current) (struct apple_glx_context * ac,
|
||||
struct apple_glx_drawable * d);
|
||||
void (*destroy) (Display * dpy, struct apple_glx_drawable * d);
|
||||
};
|
||||
|
||||
struct apple_glx_drawable
|
||||
{
|
||||
Display *display;
|
||||
int reference_count;
|
||||
GLXDrawable drawable;
|
||||
int type; /* APPLE_GLX_DRAWABLE_* */
|
||||
|
||||
union
|
||||
{
|
||||
struct apple_glx_pixmap pixmap;
|
||||
struct apple_glx_pbuffer pbuffer;
|
||||
struct apple_glx_surface surface;
|
||||
} types;
|
||||
|
||||
struct apple_glx_drawable_callbacks callbacks;
|
||||
|
||||
/*
|
||||
* This mutex protects the reference count and any other drawable data.
|
||||
* It's used to prevent an early release of a drawable.
|
||||
*/
|
||||
pthread_mutex_t mutex;
|
||||
void (*lock) (struct apple_glx_drawable * agd);
|
||||
void (*unlock) (struct apple_glx_drawable * agd);
|
||||
|
||||
void (*reference) (struct apple_glx_drawable * agd);
|
||||
void (*release) (struct apple_glx_drawable * agd);
|
||||
|
||||
bool(*destroy) (struct apple_glx_drawable * agd);
|
||||
|
||||
bool(*is_pbuffer) (struct apple_glx_drawable * agd);
|
||||
|
||||
bool(*is_pixmap) (struct apple_glx_drawable * agd);
|
||||
|
||||
/*BEGIN These are used for the mixed mode drawing... */
|
||||
int width, height;
|
||||
int row_bytes;
|
||||
char path[PATH_MAX];
|
||||
int fd; /* The file descriptor for this drawable's shared memory. */
|
||||
void *buffer; /* The memory for the drawable. Typically shared memory. */
|
||||
size_t buffer_length;
|
||||
/*END*/ struct apple_glx_drawable *previous, *next;
|
||||
};
|
||||
|
||||
struct apple_glx_context;
|
||||
|
||||
/* May return NULL if not found */
|
||||
struct apple_glx_drawable *apple_glx_find_drawable(Display * dpy,
|
||||
GLXDrawable drawable);
|
||||
|
||||
/* Returns true on error and locks the agd result with a reference. */
|
||||
bool apple_glx_drawable_create(Display * dpy,
|
||||
int screen,
|
||||
GLXDrawable drawable,
|
||||
struct apple_glx_drawable **agd,
|
||||
struct apple_glx_drawable_callbacks
|
||||
*callbacks);
|
||||
|
||||
/* Returns true on error */
|
||||
bool apple_glx_create_drawable(Display * dpy,
|
||||
struct apple_glx_context *ac,
|
||||
GLXDrawable drawable,
|
||||
struct apple_glx_drawable **agd);
|
||||
|
||||
void apple_glx_garbage_collect_drawables(Display * dpy);
|
||||
|
||||
/*
|
||||
* This returns the total number of drawables.
|
||||
* It's mostly intended for debugging and introspection.
|
||||
*/
|
||||
unsigned int apple_glx_get_drawable_count(void);
|
||||
|
||||
struct apple_glx_drawable *apple_glx_drawable_find_by_type(GLXDrawable
|
||||
drawable, int type,
|
||||
int flags);
|
||||
|
||||
struct apple_glx_drawable *apple_glx_drawable_find(GLXDrawable drawable,
|
||||
int flags);
|
||||
|
||||
|
||||
bool apple_glx_drawable_destroy_by_type(Display * dpy, GLXDrawable drawable,
|
||||
int type);
|
||||
|
||||
struct apple_glx_drawable *apple_glx_drawable_find_by_uid(unsigned int uid,
|
||||
int flags);
|
||||
|
||||
/* Surfaces */
|
||||
|
||||
bool apple_glx_surface_create(Display * dpy, int screen, GLXDrawable drawable,
|
||||
struct apple_glx_drawable **resultptr);
|
||||
|
||||
void apple_glx_surface_destroy(unsigned int uid);
|
||||
|
||||
/* Pbuffers */
|
||||
|
||||
/* Returns true if an error occurred. */
|
||||
bool apple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
|
||||
int width, int height, int *errorcode,
|
||||
GLXPbuffer * pbuf);
|
||||
|
||||
/* Returns true if the pbuffer was invalid. */
|
||||
bool apple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf);
|
||||
|
||||
/* Returns true if the pbuffer was valid and the attribute. */
|
||||
bool apple_glx_pbuffer_query(GLXDrawable d, int attribute,
|
||||
unsigned int *value);
|
||||
|
||||
/* Returns true if the GLXDrawable is a valid GLXPbuffer, and the mask is set. */
|
||||
bool apple_glx_pbuffer_set_event_mask(GLXDrawable d, unsigned long mask);
|
||||
|
||||
/* Returns true if the GLXDrawable is a valid GLXPbuffer, and the *mask is set. */
|
||||
bool apple_glx_pbuffer_get_event_mask(GLXDrawable d, unsigned long *mask);
|
||||
|
||||
|
||||
/* Pixmaps */
|
||||
|
||||
/* mode is a __GLcontextModes * */
|
||||
/* Returns true if an error occurred. */
|
||||
bool apple_glx_pixmap_create(Display * dpy, int screen, Pixmap pixmap,
|
||||
const void *mode);
|
||||
|
||||
/* Returns true if an error occurred. */
|
||||
bool apple_glx_pixmap_destroy(Display * dpy, Pixmap pixmap);
|
||||
|
||||
bool apple_glx_pixmap_query(GLXPixmap pixmap, int attribute,
|
||||
unsigned int *value);
|
||||
|
||||
|
||||
|
||||
#endif
|
348
src/glx/apple/apple_glx_pbuffer.c
Normal file
348
src/glx/apple/apple_glx_pbuffer.c
Normal file
@@ -0,0 +1,348 @@
|
||||
/*
|
||||
Copyright (c) 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
/* Must be before OpenGL.framework is included. Remove once fixed:
|
||||
* <rdar://problem/7872773>
|
||||
*/
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#define __gltypes_h_ 1
|
||||
|
||||
/* Must be first for:
|
||||
* <rdar://problem/6953344>
|
||||
*/
|
||||
#include "apple_glx_context.h"
|
||||
#include "apple_glx_drawable.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <assert.h>
|
||||
#include "apple_glx.h"
|
||||
#include "glcontextmodes.h"
|
||||
#include "apple_cgl.h"
|
||||
|
||||
/* mesa defines in glew.h, Apple in glext.h.
|
||||
* Due to namespace nightmares, just do it here.
|
||||
*/
|
||||
#ifndef GL_TEXTURE_RECTANGLE_EXT
|
||||
#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
|
||||
#endif
|
||||
|
||||
static bool pbuffer_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d);
|
||||
|
||||
static void pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d);
|
||||
|
||||
static struct apple_glx_drawable_callbacks callbacks = {
|
||||
.type = APPLE_GLX_DRAWABLE_PBUFFER,
|
||||
.make_current = pbuffer_make_current,
|
||||
.destroy = pbuffer_destroy
|
||||
};
|
||||
|
||||
|
||||
/* Return true if an error occurred. */
|
||||
bool
|
||||
pbuffer_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
|
||||
CGLError cglerr;
|
||||
|
||||
assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
|
||||
|
||||
cglerr = apple_cgl.set_pbuffer(ac->context_obj, pbuf->buffer_obj, 0, 0, 0);
|
||||
|
||||
if (kCGLNoError != cglerr) {
|
||||
fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!ac->made_current) {
|
||||
glViewport(0, 0, pbuf->width, pbuf->height);
|
||||
glScissor(0, 0, pbuf->width, pbuf->height);
|
||||
ac->made_current = true;
|
||||
}
|
||||
|
||||
apple_glx_diagnostic("made pbuffer drawable 0x%lx current\n", d->drawable);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
pbuffer_destroy(Display * dpy, struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_pbuffer *pbuf = &d->types.pbuffer;
|
||||
|
||||
assert(APPLE_GLX_DRAWABLE_PBUFFER == d->type);
|
||||
|
||||
apple_glx_diagnostic("destroying pbuffer for drawable 0x%lx\n",
|
||||
d->drawable);
|
||||
|
||||
apple_cgl.destroy_pbuffer(pbuf->buffer_obj);
|
||||
XFreePixmap(dpy, pbuf->xid);
|
||||
}
|
||||
|
||||
/* Return true if an error occurred. */
|
||||
bool
|
||||
apple_glx_pbuffer_destroy(Display * dpy, GLXPbuffer pbuf)
|
||||
{
|
||||
return !apple_glx_drawable_destroy_by_type(dpy, pbuf,
|
||||
APPLE_GLX_DRAWABLE_PBUFFER);
|
||||
}
|
||||
|
||||
/* Return true if an error occurred. */
|
||||
bool
|
||||
apple_glx_pbuffer_create(Display * dpy, GLXFBConfig config,
|
||||
int width, int height, int *errorcode,
|
||||
GLXPbuffer * result)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
struct apple_glx_pbuffer *pbuf = NULL;
|
||||
CGLError err;
|
||||
Window root;
|
||||
int screen;
|
||||
Pixmap xid;
|
||||
__GLcontextModes *modes = (__GLcontextModes *) config;
|
||||
|
||||
root = DefaultRootWindow(dpy);
|
||||
screen = DefaultScreen(dpy);
|
||||
|
||||
/*
|
||||
* This pixmap is only used for a persistent XID.
|
||||
* The XC-MISC extension cleans up XIDs and reuses them transparently,
|
||||
* so we need to retain a server-side reference.
|
||||
*/
|
||||
xid = XCreatePixmap(dpy, root, (unsigned int) 1,
|
||||
(unsigned int) 1, DefaultDepth(dpy, screen));
|
||||
|
||||
if (None == xid) {
|
||||
*errorcode = BadAlloc;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (apple_glx_drawable_create(dpy, screen, xid, &d, &callbacks)) {
|
||||
*errorcode = BadAlloc;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* The lock is held in d from create onward. */
|
||||
pbuf = &d->types.pbuffer;
|
||||
|
||||
pbuf->xid = xid;
|
||||
pbuf->width = width;
|
||||
pbuf->height = height;
|
||||
|
||||
err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT,
|
||||
(modes->alphaBits > 0) ? GL_RGBA : GL_RGB,
|
||||
0, &pbuf->buffer_obj);
|
||||
|
||||
if (kCGLNoError != err) {
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
*errorcode = BadMatch;
|
||||
return true;
|
||||
}
|
||||
|
||||
pbuf->fbconfigID = modes->fbconfigID;
|
||||
|
||||
pbuf->event_mask = 0;
|
||||
|
||||
*result = pbuf->xid;
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Return true if an error occurred. */
|
||||
static bool
|
||||
get_max_size(int *widthresult, int *heightresult)
|
||||
{
|
||||
CGLContextObj oldcontext;
|
||||
GLint ar[2];
|
||||
|
||||
oldcontext = apple_cgl.get_current_context();
|
||||
|
||||
if (!oldcontext) {
|
||||
/*
|
||||
* There is no current context, so we need to make one in order
|
||||
* to call glGetInteger.
|
||||
*/
|
||||
CGLPixelFormatObj pfobj;
|
||||
CGLError err;
|
||||
CGLPixelFormatAttribute attr[10];
|
||||
int c = 0;
|
||||
GLint vsref = 0;
|
||||
CGLContextObj newcontext;
|
||||
|
||||
attr[c++] = kCGLPFAColorSize;
|
||||
attr[c++] = 32;
|
||||
attr[c++] = 0;
|
||||
|
||||
err = apple_cgl.choose_pixel_format(attr, &pfobj, &vsref);
|
||||
if (kCGLNoError != err) {
|
||||
if (getenv("LIBGL_DIAGNOSTIC")) {
|
||||
printf("choose_pixel_format error in %s: %s\n", __func__,
|
||||
apple_cgl.error_string(err));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
err = apple_cgl.create_context(pfobj, NULL, &newcontext);
|
||||
|
||||
if (kCGLNoError != err) {
|
||||
if (getenv("LIBGL_DIAGNOSTIC")) {
|
||||
printf("create_context error in %s: %s\n", __func__,
|
||||
apple_cgl.error_string(err));
|
||||
}
|
||||
|
||||
apple_cgl.destroy_pixel_format(pfobj);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
err = apple_cgl.set_current_context(newcontext);
|
||||
|
||||
if (kCGLNoError != err) {
|
||||
printf("set_current_context error in %s: %s\n", __func__,
|
||||
apple_cgl.error_string(err));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
|
||||
|
||||
apple_cgl.set_current_context(oldcontext);
|
||||
apple_cgl.destroy_context(newcontext);
|
||||
apple_cgl.destroy_pixel_format(pfobj);
|
||||
}
|
||||
else {
|
||||
/* We have a valid context. */
|
||||
|
||||
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar);
|
||||
}
|
||||
|
||||
*widthresult = ar[0];
|
||||
*heightresult = ar[1];
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value)
|
||||
{
|
||||
bool result = false;
|
||||
struct apple_glx_drawable *d;
|
||||
struct apple_glx_pbuffer *pbuf;
|
||||
|
||||
d = apple_glx_drawable_find_by_type(p, APPLE_GLX_DRAWABLE_PBUFFER,
|
||||
APPLE_GLX_DRAWABLE_LOCK);
|
||||
|
||||
if (d) {
|
||||
pbuf = &d->types.pbuffer;
|
||||
|
||||
switch (attr) {
|
||||
case GLX_WIDTH:
|
||||
*value = pbuf->width;
|
||||
result = true;
|
||||
break;
|
||||
|
||||
case GLX_HEIGHT:
|
||||
*value = pbuf->height;
|
||||
result = true;
|
||||
break;
|
||||
|
||||
case GLX_PRESERVED_CONTENTS:
|
||||
*value = true;
|
||||
result = true;
|
||||
break;
|
||||
|
||||
case GLX_LARGEST_PBUFFER:{
|
||||
int width, height;
|
||||
if (get_max_size(&width, &height)) {
|
||||
fprintf(stderr, "internal error: "
|
||||
"unable to find the largest pbuffer!\n");
|
||||
}
|
||||
else {
|
||||
*value = width;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GLX_FBCONFIG_ID:
|
||||
*value = pbuf->fbconfigID;
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_pbuffer_set_event_mask(GLXDrawable drawable, unsigned long mask)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
bool result = false;
|
||||
|
||||
d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
|
||||
APPLE_GLX_DRAWABLE_LOCK);
|
||||
|
||||
if (d) {
|
||||
d->types.pbuffer.event_mask = mask;
|
||||
result = true;
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_pbuffer_get_event_mask(GLXDrawable drawable, unsigned long *mask)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
bool result = false;
|
||||
|
||||
d = apple_glx_drawable_find_by_type(drawable, APPLE_GLX_DRAWABLE_PBUFFER,
|
||||
APPLE_GLX_DRAWABLE_LOCK);
|
||||
if (d) {
|
||||
*mask = d->types.pbuffer.event_mask;
|
||||
result = true;
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
230
src/glx/apple/apple_glx_pixmap.c
Normal file
230
src/glx/apple/apple_glx_pixmap.c
Normal file
@@ -0,0 +1,230 @@
|
||||
/*
|
||||
Copyright (c) 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include "apple_glx.h"
|
||||
#include "apple_cgl.h"
|
||||
#include "apple_visual.h"
|
||||
#include "apple_glx_drawable.h"
|
||||
#include "appledri.h"
|
||||
#include "glcontextmodes.h"
|
||||
|
||||
static bool pixmap_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d);
|
||||
|
||||
static void pixmap_destroy(Display * dpy, struct apple_glx_drawable *d);
|
||||
|
||||
static struct apple_glx_drawable_callbacks callbacks = {
|
||||
.type = APPLE_GLX_DRAWABLE_PIXMAP,
|
||||
.make_current = pixmap_make_current,
|
||||
.destroy = pixmap_destroy
|
||||
};
|
||||
|
||||
static bool
|
||||
pixmap_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d)
|
||||
{
|
||||
CGLError cglerr;
|
||||
struct apple_glx_pixmap *p = &d->types.pixmap;
|
||||
|
||||
assert(APPLE_GLX_DRAWABLE_PIXMAP == d->type);
|
||||
|
||||
cglerr = apple_cgl.set_current_context(p->context_obj);
|
||||
|
||||
if (kCGLNoError != cglerr) {
|
||||
fprintf(stderr, "set current context: %s\n",
|
||||
apple_cgl.error_string(cglerr));
|
||||
return true;
|
||||
}
|
||||
|
||||
cglerr = apple_cgl.set_off_screen(p->context_obj, p->width, p->height,
|
||||
p->pitch, p->buffer);
|
||||
|
||||
if (kCGLNoError != cglerr) {
|
||||
fprintf(stderr, "set off screen: %s\n", apple_cgl.error_string(cglerr));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!ac->made_current) {
|
||||
glViewport(0, 0, p->width, p->height);
|
||||
glScissor(0, 0, p->width, p->height);
|
||||
ac->made_current = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
pixmap_destroy(Display * dpy, struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_pixmap *p = &d->types.pixmap;
|
||||
|
||||
if (p->pixel_format_obj)
|
||||
(void) apple_cgl.destroy_pixel_format(p->pixel_format_obj);
|
||||
|
||||
if (p->context_obj)
|
||||
(void) apple_cgl.destroy_context(p->context_obj);
|
||||
|
||||
XAppleDRIDestroyPixmap(dpy, p->xpixmap);
|
||||
|
||||
if (p->buffer) {
|
||||
if (munmap(p->buffer, p->size))
|
||||
perror("munmap");
|
||||
|
||||
if (-1 == close(p->fd))
|
||||
perror("close");
|
||||
|
||||
if (shm_unlink(p->path))
|
||||
perror("shm_unlink");
|
||||
}
|
||||
|
||||
apple_glx_diagnostic("destroyed pixmap buffer for: 0x%lx\n", d->drawable);
|
||||
}
|
||||
|
||||
/* Return true if an error occurred. */
|
||||
bool
|
||||
apple_glx_pixmap_create(Display * dpy, int screen, Pixmap pixmap,
|
||||
const void *mode)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
struct apple_glx_pixmap *p;
|
||||
bool double_buffered;
|
||||
bool uses_stereo;
|
||||
CGLError error;
|
||||
const __GLcontextModes *cmodes = mode;
|
||||
|
||||
if (apple_glx_drawable_create(dpy, screen, pixmap, &d, &callbacks))
|
||||
return true;
|
||||
|
||||
/* d is locked and referenced at this point. */
|
||||
|
||||
p = &d->types.pixmap;
|
||||
|
||||
p->xpixmap = pixmap;
|
||||
p->buffer = NULL;
|
||||
|
||||
if (!XAppleDRICreatePixmap(dpy, screen, pixmap,
|
||||
&p->width, &p->height, &p->pitch, &p->bpp,
|
||||
&p->size, p->path, PATH_MAX)) {
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
return true;
|
||||
}
|
||||
|
||||
p->fd = shm_open(p->path, O_RDWR, 0);
|
||||
|
||||
if (p->fd < 0) {
|
||||
perror("shm_open");
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
return true;
|
||||
}
|
||||
|
||||
p->buffer = mmap(NULL, p->size, PROT_READ | PROT_WRITE,
|
||||
MAP_FILE | MAP_SHARED, p->fd, 0);
|
||||
|
||||
if (MAP_FAILED == p->buffer) {
|
||||
perror("mmap");
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
return true;
|
||||
}
|
||||
|
||||
apple_visual_create_pfobj(&p->pixel_format_obj, mode, &double_buffered,
|
||||
&uses_stereo, /*offscreen */ true);
|
||||
|
||||
error = apple_cgl.create_context(p->pixel_format_obj, NULL,
|
||||
&p->context_obj);
|
||||
|
||||
if (kCGLNoError != error) {
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
return true;
|
||||
}
|
||||
|
||||
p->fbconfigID = cmodes->fbconfigID;
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
apple_glx_diagnostic("created: pixmap buffer for 0x%lx\n", d->drawable);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
apple_glx_pixmap_query(GLXPixmap pixmap, int attr, unsigned int *value)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
struct apple_glx_pixmap *p;
|
||||
bool result = false;
|
||||
|
||||
d = apple_glx_drawable_find_by_type(pixmap, APPLE_GLX_DRAWABLE_PIXMAP,
|
||||
APPLE_GLX_DRAWABLE_LOCK);
|
||||
|
||||
if (d) {
|
||||
p = &d->types.pixmap;
|
||||
|
||||
switch (attr) {
|
||||
case GLX_WIDTH:
|
||||
*value = p->width;
|
||||
result = true;
|
||||
break;
|
||||
|
||||
case GLX_HEIGHT:
|
||||
*value = p->height;
|
||||
result = true;
|
||||
break;
|
||||
|
||||
case GLX_FBCONFIG_ID:
|
||||
*value = p->fbconfigID;
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
|
||||
d->unlock(d);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Return true if the type is valid for pixmap. */
|
||||
bool
|
||||
apple_glx_pixmap_destroy(Display * dpy, GLXPixmap pixmap)
|
||||
{
|
||||
return !apple_glx_drawable_destroy_by_type(dpy, pixmap,
|
||||
APPLE_GLX_DRAWABLE_PIXMAP);
|
||||
}
|
224
src/glx/apple/apple_glx_surface.c
Normal file
224
src/glx/apple/apple_glx_surface.c
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
Copyright (c) 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include "glxclient.h"
|
||||
#include "apple_glx.h"
|
||||
#include "appledri.h"
|
||||
#include "apple_glx_drawable.h"
|
||||
|
||||
static bool surface_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d);
|
||||
|
||||
static void surface_destroy(Display * dpy, struct apple_glx_drawable *d);
|
||||
|
||||
|
||||
static struct apple_glx_drawable_callbacks callbacks = {
|
||||
.type = APPLE_GLX_DRAWABLE_SURFACE,
|
||||
.make_current = surface_make_current,
|
||||
.destroy = surface_destroy
|
||||
};
|
||||
|
||||
static void
|
||||
update_viewport_and_scissor(Display * dpy, GLXDrawable drawable)
|
||||
{
|
||||
Window root;
|
||||
int x, y;
|
||||
unsigned int width = 0, height = 0, bd, depth;
|
||||
|
||||
XGetGeometry(dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth);
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
glScissor(0, 0, width, height);
|
||||
}
|
||||
|
||||
static bool
|
||||
surface_make_current(struct apple_glx_context *ac,
|
||||
struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_surface *s = &d->types.surface;
|
||||
xp_error error;
|
||||
|
||||
assert(APPLE_GLX_DRAWABLE_SURFACE == d->type);
|
||||
|
||||
apple_glx_diagnostic("%s: ac->context_obj %p s->surface_id %u\n",
|
||||
__func__, (void *) ac->context_obj, s->surface_id);
|
||||
|
||||
error = xp_attach_gl_context(ac->context_obj, s->surface_id);
|
||||
|
||||
if (error) {
|
||||
fprintf(stderr, "error: xp_attach_gl_context returned: %d\n", error);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if (!ac->made_current) {
|
||||
/*
|
||||
* The first time a new context is made current the glViewport
|
||||
* and glScissor should be updated.
|
||||
*/
|
||||
update_viewport_and_scissor(ac->drawable->display,
|
||||
ac->drawable->drawable);
|
||||
ac->made_current = true;
|
||||
}
|
||||
|
||||
apple_glx_diagnostic("%s: drawable 0x%lx\n", __func__, d->drawable);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
surface_destroy(Display * dpy, struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_surface *s = &d->types.surface;
|
||||
|
||||
apple_glx_diagnostic("%s: s->surface_id %u\n", __func__, s->surface_id);
|
||||
|
||||
xp_error error = xp_destroy_surface(s->surface_id);
|
||||
|
||||
if (error) {
|
||||
fprintf(stderr, "xp_destroy_surface error: %d\n", (int) error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if this surface destroy came from the surface being destroyed
|
||||
* on the server. If s->pending_destroy is true, then it did, and
|
||||
* we don't want to try to destroy the surface on the server.
|
||||
*/
|
||||
if (!s->pending_destroy) {
|
||||
/*
|
||||
* Warning: this causes other routines to be called (potentially)
|
||||
* from surface_notify_handler. It's probably best to not have
|
||||
* any locks at this point locked.
|
||||
*/
|
||||
XAppleDRIDestroySurface(d->display, DefaultScreen(d->display),
|
||||
d->drawable);
|
||||
|
||||
apple_glx_diagnostic
|
||||
("%s: destroyed a surface for drawable 0x%lx uid %u\n", __func__,
|
||||
d->drawable, s->uid);
|
||||
}
|
||||
}
|
||||
|
||||
/* Return true if an error occured. */
|
||||
static bool
|
||||
create_surface(Display * dpy, int screen, struct apple_glx_drawable *d)
|
||||
{
|
||||
struct apple_glx_surface *s = &d->types.surface;
|
||||
unsigned int key[2];
|
||||
xp_client_id id;
|
||||
|
||||
id = apple_glx_get_client_id();
|
||||
if (0 == id)
|
||||
return true;
|
||||
|
||||
assert(None != d->drawable);
|
||||
|
||||
s->pending_destroy = false;
|
||||
|
||||
if (XAppleDRICreateSurface(dpy, screen, d->drawable, id, key, &s->uid)) {
|
||||
xp_error error;
|
||||
|
||||
error = xp_import_surface(key, &s->surface_id);
|
||||
|
||||
if (error) {
|
||||
fprintf(stderr, "error: xp_import_surface returned: %d\n", error);
|
||||
return true;
|
||||
}
|
||||
|
||||
apple_glx_diagnostic("%s: created a surface for drawable 0x%lx"
|
||||
" with uid %u\n", __func__, d->drawable, s->uid);
|
||||
return false; /*success */
|
||||
}
|
||||
|
||||
return true; /* unable to create a surface. */
|
||||
}
|
||||
|
||||
/* Return true if an error occured. */
|
||||
/* This returns a referenced object via resultptr. */
|
||||
bool
|
||||
apple_glx_surface_create(Display * dpy, int screen,
|
||||
GLXDrawable drawable,
|
||||
struct apple_glx_drawable ** resultptr)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
if (apple_glx_drawable_create(dpy, screen, drawable, &d, &callbacks))
|
||||
return true;
|
||||
|
||||
/* apple_glx_drawable_create creates a locked and referenced object. */
|
||||
|
||||
if (create_surface(dpy, screen, d)) {
|
||||
d->unlock(d);
|
||||
d->destroy(d);
|
||||
return true;
|
||||
}
|
||||
|
||||
*resultptr = d;
|
||||
|
||||
d->unlock(d);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* All surfaces are reference counted, and surfaces are only created
|
||||
* when the window is made current. When all contexts no longer reference
|
||||
* a surface drawable the apple_glx_drawable gets destroyed, and thus
|
||||
* its surface is destroyed.
|
||||
*
|
||||
* However we can make the destruction occur a bit sooner by setting
|
||||
* pending_destroy, which is then checked for in glViewport by
|
||||
* apple_glx_context_update.
|
||||
*/
|
||||
void
|
||||
apple_glx_surface_destroy(unsigned int uid)
|
||||
{
|
||||
struct apple_glx_drawable *d;
|
||||
|
||||
d = apple_glx_drawable_find_by_uid(uid, APPLE_GLX_DRAWABLE_REFERENCE
|
||||
| APPLE_GLX_DRAWABLE_LOCK);
|
||||
|
||||
if (d) {
|
||||
d->types.surface.pending_destroy = true;
|
||||
d->release(d);
|
||||
/*
|
||||
* We release 2 references to the surface. One was acquired by
|
||||
* the find, and the other was leftover from a context, or
|
||||
* the surface being displayed, so the destroy() will decrease it
|
||||
* once more.
|
||||
*
|
||||
* If the surface is in a context, it will take one d->destroy(d);
|
||||
* to actually destroy it when the pending_destroy is processed
|
||||
* by a glViewport callback (see apple_glx_context_update()).
|
||||
*/
|
||||
d->destroy(d);
|
||||
|
||||
d->unlock(d);
|
||||
}
|
||||
}
|
153
src/glx/apple/apple_visual.c
Normal file
153
src/glx/apple/apple_visual.c
Normal file
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <GL/gl.h>
|
||||
|
||||
/* <rdar://problem/6953344> */
|
||||
#define glTexImage1D glTexImage1D_OSX
|
||||
#define glTexImage2D glTexImage2D_OSX
|
||||
#define glTexImage3D glTexImage3D_OSX
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <OpenGL/CGLContext.h>
|
||||
#include <OpenGL/CGLRenderers.h>
|
||||
#undef glTexImage1D
|
||||
#undef glTexImage2D
|
||||
#undef glTexImage3D
|
||||
|
||||
#include "apple_cgl.h"
|
||||
#include "apple_visual.h"
|
||||
#include "apple_glx.h"
|
||||
#include "glcontextmodes.h"
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_ATTR = 60
|
||||
};
|
||||
|
||||
/*mode is a __GlcontextModes*/
|
||||
void
|
||||
apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
|
||||
bool * double_buffered, bool * uses_stereo,
|
||||
bool offscreen)
|
||||
{
|
||||
CGLPixelFormatAttribute attr[MAX_ATTR];
|
||||
const __GLcontextModes *c = mode;
|
||||
int numattr = 0;
|
||||
GLint vsref = 0;
|
||||
CGLError error = 0;
|
||||
|
||||
if (offscreen) {
|
||||
apple_glx_diagnostic
|
||||
("offscreen rendering enabled. Using kCGLPFAOffScreen\n");
|
||||
|
||||
attr[numattr++] = kCGLPFAOffScreen;
|
||||
attr[numattr++] = kCGLPFAColorSize;
|
||||
attr[numattr++] = 32;
|
||||
}
|
||||
else if (getenv("LIBGL_ALWAYS_SOFTWARE") != NULL) {
|
||||
apple_glx_diagnostic
|
||||
("Software rendering requested. Using kCGLRendererGenericFloatID.\n");
|
||||
attr[numattr++] = kCGLPFARendererID;
|
||||
attr[numattr++] = kCGLRendererGenericFloatID;
|
||||
}
|
||||
else if (getenv("LIBGL_ALLOW_SOFTWARE") != NULL) {
|
||||
apple_glx_diagnostic
|
||||
("Software rendering is not being excluded. Not using kCGLPFAAccelerated.\n");
|
||||
}
|
||||
else {
|
||||
attr[numattr++] = kCGLPFAAccelerated;
|
||||
}
|
||||
|
||||
/*
|
||||
* The program chose a config based on the fbconfigs or visuals.
|
||||
* Those are based on the attributes from CGL, so we probably
|
||||
* do want the closest match for the color, depth, and accum.
|
||||
*/
|
||||
attr[numattr++] = kCGLPFAClosestPolicy;
|
||||
|
||||
if (c->stereoMode) {
|
||||
attr[numattr++] = kCGLPFAStereo;
|
||||
*uses_stereo = true;
|
||||
}
|
||||
else {
|
||||
*uses_stereo = false;
|
||||
}
|
||||
|
||||
if (c->doubleBufferMode) {
|
||||
attr[numattr++] = kCGLPFADoubleBuffer;
|
||||
*double_buffered = true;
|
||||
}
|
||||
else {
|
||||
*double_buffered = false;
|
||||
}
|
||||
|
||||
attr[numattr++] = kCGLPFAColorSize;
|
||||
attr[numattr++] = c->redBits + c->greenBits + c->blueBits;
|
||||
attr[numattr++] = kCGLPFAAlphaSize;
|
||||
attr[numattr++] = c->alphaBits;
|
||||
|
||||
if ((c->accumRedBits + c->accumGreenBits + c->accumBlueBits) > 0) {
|
||||
attr[numattr++] = kCGLPFAAccumSize;
|
||||
attr[numattr++] = c->accumRedBits + c->accumGreenBits +
|
||||
c->accumBlueBits + c->accumAlphaBits;
|
||||
}
|
||||
|
||||
if (c->depthBits > 0) {
|
||||
attr[numattr++] = kCGLPFADepthSize;
|
||||
attr[numattr++] = c->depthBits;
|
||||
}
|
||||
|
||||
if (c->stencilBits > 0) {
|
||||
attr[numattr++] = kCGLPFAStencilSize;
|
||||
attr[numattr++] = c->stencilBits;
|
||||
}
|
||||
|
||||
if (c->sampleBuffers > 0) {
|
||||
attr[numattr++] = kCGLPFAMultisample;
|
||||
attr[numattr++] = kCGLPFASampleBuffers;
|
||||
attr[numattr++] = c->sampleBuffers;
|
||||
attr[numattr++] = kCGLPFASamples;
|
||||
attr[numattr++] = c->samples;
|
||||
}
|
||||
|
||||
attr[numattr++] = 0;
|
||||
|
||||
assert(numattr < MAX_ATTR);
|
||||
|
||||
error = apple_cgl.choose_pixel_format(attr, pfobj, &vsref);
|
||||
|
||||
if (error) {
|
||||
fprintf(stderr, "error: %s\n", apple_cgl.error_string(error));
|
||||
abort();
|
||||
}
|
||||
}
|
41
src/glx/apple/apple_visual.h
Normal file
41
src/glx/apple/apple_visual.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
Copyright (c) 2008 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#ifndef APPLE_VISUAL_H
|
||||
#define APPLE_VISUAL_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
|
||||
/* mode is expected to be of type __GLcontextModes. */
|
||||
void apple_visual_create_pfobj(CGLPixelFormatObj * pfobj, const void *mode,
|
||||
bool * double_buffered, bool * uses_stereo,
|
||||
bool offscreen);
|
||||
|
||||
#endif
|
37
src/glx/apple/apple_xgl_api_additional.c
Normal file
37
src/glx/apple/apple_xgl_api_additional.c
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <GL/gl.h>
|
||||
|
||||
GLAPI void APIENTRY glTexImage3DEXT(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei
|
||||
depth, GLint border, GLenum format, GLenum type, const void * pixels) {
|
||||
glTexImage3D(target, level, (GLint)internalformat, width, height, depth, border, format, type, pixels);
|
||||
}
|
||||
|
133
src/glx/apple/apple_xgl_api_read.c
Normal file
133
src/glx/apple/apple_xgl_api_read.c
Normal file
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
Copyright (c) 2008, 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file works with the glXMakeContextCurrent readable drawable.
|
||||
*
|
||||
* The way it works is by swapping the currentDrawable for the currentReadable
|
||||
* drawable if they are different.
|
||||
*/
|
||||
#include <stdbool.h>
|
||||
#include "glxclient.h"
|
||||
#include "apple_glx_context.h"
|
||||
#include "apple_xgl_api.h"
|
||||
|
||||
extern struct apple_xgl_api __gl_api;
|
||||
|
||||
struct apple_xgl_saved_state
|
||||
{
|
||||
bool swapped;
|
||||
};
|
||||
|
||||
static void
|
||||
SetRead(struct apple_xgl_saved_state *saved)
|
||||
{
|
||||
GLXContext gc = __glXGetCurrentContext();
|
||||
|
||||
/*
|
||||
* By default indicate that the state was not swapped, so that UnsetRead
|
||||
* functions correctly.
|
||||
*/
|
||||
saved->swapped = false;
|
||||
|
||||
/*
|
||||
* If the readable drawable isn't the same as the drawable then
|
||||
* the user has requested a readable drawable with glXMakeContextCurrent().
|
||||
* We emulate this behavior by switching the current drawable.
|
||||
*/
|
||||
if (None != gc->currentReadable
|
||||
&& gc->currentReadable != gc->currentDrawable) {
|
||||
Display *dpy = glXGetCurrentDisplay();
|
||||
|
||||
saved->swapped = true;
|
||||
|
||||
if (apple_glx_make_current_context(dpy, gc->driContext, gc->driContext,
|
||||
gc->currentReadable)) {
|
||||
/* An error occurred, so try to restore the old context state. */
|
||||
(void) apple_glx_make_current_context(dpy, gc->driContext, gc->driContext,
|
||||
gc->currentDrawable);
|
||||
saved->swapped = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
UnsetRead(struct apple_xgl_saved_state *saved)
|
||||
{
|
||||
if (saved->swapped) {
|
||||
GLXContext gc = __glXGetCurrentContext();
|
||||
Display *dpy = glXGetCurrentDisplay();
|
||||
|
||||
if (apple_glx_make_current_context(dpy, gc->driContext, gc->driContext,
|
||||
gc->currentDrawable)) {
|
||||
/*
|
||||
* An error occurred restoring the drawable.
|
||||
* It's unclear what to do about that.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
|
||||
GLenum format, GLenum type, void *pixels)
|
||||
{
|
||||
struct apple_xgl_saved_state saved;
|
||||
|
||||
SetRead(&saved);
|
||||
|
||||
__gl_api.ReadPixels(x, y, width, height, format, type, pixels);
|
||||
|
||||
UnsetRead(&saved);
|
||||
}
|
||||
|
||||
void
|
||||
glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
|
||||
{
|
||||
struct apple_xgl_saved_state saved;
|
||||
|
||||
SetRead(&saved);
|
||||
|
||||
__gl_api.CopyPixels(x, y, width, height, type);
|
||||
|
||||
UnsetRead(&saved);
|
||||
}
|
||||
|
||||
void
|
||||
glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y,
|
||||
GLsizei width)
|
||||
{
|
||||
struct apple_xgl_saved_state saved;
|
||||
|
||||
SetRead(&saved);
|
||||
|
||||
__gl_api.CopyColorTable(target, internalformat, x, y, width);
|
||||
|
||||
UnsetRead(&saved);
|
||||
}
|
128
src/glx/apple/apple_xgl_api_stereo.c
Normal file
128
src/glx/apple/apple_xgl_api_stereo.c
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
Copyright (c) 2009 Apple Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
|
||||
HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name(s) of the above
|
||||
copyright holders shall not be used in advertising or otherwise to
|
||||
promote the sale, use or other dealings in this Software without
|
||||
prior written authorization.
|
||||
*/
|
||||
|
||||
/* This should be removed once stereo hardware bugs are fixed
|
||||
* <rdar://problem/6729006>
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
|
||||
#include "glxclient.h"
|
||||
#include "apple_glx_context.h"
|
||||
#include "apple_xgl_api.h"
|
||||
|
||||
extern struct apple_xgl_api __gl_api;
|
||||
/*
|
||||
* These are special functions for stereoscopic support
|
||||
* differences in MacOS X.
|
||||
*/
|
||||
void
|
||||
glDrawBuffer(GLenum mode)
|
||||
{
|
||||
GLXContext gc = glXGetCurrentContext();
|
||||
|
||||
if (gc && apple_glx_context_uses_stereo(gc->driContext)) {
|
||||
GLenum buf[2];
|
||||
GLsizei n = 0;
|
||||
|
||||
switch (mode) {
|
||||
case GL_BACK:
|
||||
buf[0] = GL_BACK_LEFT;
|
||||
buf[1] = GL_BACK_RIGHT;
|
||||
n = 2;
|
||||
break;
|
||||
case GL_FRONT:
|
||||
buf[0] = GL_FRONT_LEFT;
|
||||
buf[1] = GL_FRONT_RIGHT;
|
||||
n = 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
buf[0] = mode;
|
||||
n = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
__gl_api.DrawBuffers(n, buf);
|
||||
}
|
||||
else {
|
||||
__gl_api.DrawBuffer(mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
glDrawBuffers(GLsizei n, const GLenum * bufs)
|
||||
{
|
||||
GLXContext gc = glXGetCurrentContext();
|
||||
|
||||
if (gc && apple_glx_context_uses_stereo(gc->driContext)) {
|
||||
GLenum newbuf[n + 2];
|
||||
GLsizei i, outi = 0;
|
||||
bool have_back = false;
|
||||
bool have_front = false;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (GL_BACK == bufs[i]) {
|
||||
have_back = true;
|
||||
}
|
||||
else if (GL_FRONT == bufs[i]) {
|
||||
have_back = true;
|
||||
}
|
||||
else {
|
||||
newbuf[outi++] = bufs[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (have_back) {
|
||||
newbuf[outi++] = GL_BACK_LEFT;
|
||||
newbuf[outi++] = GL_BACK_RIGHT;
|
||||
}
|
||||
|
||||
if (have_front) {
|
||||
newbuf[outi++] = GL_FRONT_LEFT;
|
||||
newbuf[outi++] = GL_FRONT_RIGHT;
|
||||
}
|
||||
|
||||
__gl_api.DrawBuffers(outi, newbuf);
|
||||
}
|
||||
else {
|
||||
__gl_api.DrawBuffers(n, bufs);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
glDrawBuffersARB(GLsizei n, const GLenum * bufs)
|
||||
{
|
||||
glDrawBuffers(n, bufs);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user