mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 18:40:13 +01:00
Merge branch 'master' into gallium-sampler-view
Conflicts: src/gallium/auxiliary/Makefile src/gallium/auxiliary/SConscript src/gallium/auxiliary/tgsi/tgsi_exec.c src/gallium/auxiliary/util/u_blitter.c src/gallium/drivers/i915/i915_context.h src/gallium/drivers/i965/brw_context.h src/gallium/drivers/llvmpipe/lp_context.h src/gallium/drivers/nv50/nv50_context.h src/gallium/drivers/nv50/nv50_state_validate.c src/gallium/drivers/nv50/nv50_tex.c src/gallium/drivers/r300/r300_blit.c src/gallium/drivers/r300/r300_context.h src/gallium/drivers/r300/r300_emit.c src/gallium/drivers/r300/r300_state.c src/gallium/drivers/softpipe/sp_context.h src/gallium/drivers/svga/svga_context.h src/gallium/drivers/svga/svga_pipe_sampler.c
This commit is contained in:
commit
3ce4375912
1468 changed files with 32769 additions and 185092 deletions
51
Makefile
51
Makefile
|
|
@ -48,7 +48,7 @@ install:
|
|||
done
|
||||
|
||||
|
||||
.PHONY: default doxygen clean realclean distclean install linux-directfb-install
|
||||
.PHONY: default doxygen clean realclean distclean install
|
||||
|
||||
# If there's no current configuration file
|
||||
$(TOP)/configs/current:
|
||||
|
|
@ -109,7 +109,6 @@ linux-alpha-static \
|
|||
linux-cell \
|
||||
linux-cell-debug \
|
||||
linux-debug \
|
||||
linux-directfb \
|
||||
linux-dri \
|
||||
linux-dri-debug \
|
||||
linux-dri-x86 \
|
||||
|
|
@ -119,7 +118,6 @@ linux-dri-xcb \
|
|||
linux-egl \
|
||||
linux-indirect \
|
||||
linux-fbdev \
|
||||
linux-glide \
|
||||
linux-ia64-icc \
|
||||
linux-ia64-icc-static \
|
||||
linux-icc \
|
||||
|
|
@ -135,9 +133,6 @@ linux-osmesa32 \
|
|||
linux-ppc \
|
||||
linux-ppc-static \
|
||||
linux-profile \
|
||||
linux-solo \
|
||||
linux-solo-x86 \
|
||||
linux-solo-ia64 \
|
||||
linux-sparc \
|
||||
linux-sparc5 \
|
||||
linux-static \
|
||||
|
|
@ -150,7 +145,6 @@ linux-x86-64 \
|
|||
linux-x86-64-debug \
|
||||
linux-x86-64-profile \
|
||||
linux-x86-64-static \
|
||||
linux-x86-glide \
|
||||
linux-x86-profile \
|
||||
linux-x86-static \
|
||||
netbsd \
|
||||
|
|
@ -186,7 +180,7 @@ ultrix-gcc:
|
|||
|
||||
# Rules for making release tarballs
|
||||
|
||||
VERSION=7.7
|
||||
VERSION=7.9-devel
|
||||
DIRECTORY = Mesa-$(VERSION)
|
||||
LIB_NAME = MesaLib-$(VERSION)
|
||||
DEMO_NAME = MesaDemos-$(VERSION)
|
||||
|
|
@ -211,8 +205,6 @@ MAIN_FILES = \
|
|||
$(DIRECTORY)/docs/RELNOTES* \
|
||||
$(DIRECTORY)/docs/*.spec \
|
||||
$(DIRECTORY)/include/GL/internal/glcore.h \
|
||||
$(DIRECTORY)/include/GL/dmesa.h \
|
||||
$(DIRECTORY)/include/GL/ggimesa.h \
|
||||
$(DIRECTORY)/include/GL/gl.h \
|
||||
$(DIRECTORY)/include/GL/glext.h \
|
||||
$(DIRECTORY)/include/GL/gl_mangle.h \
|
||||
|
|
@ -223,16 +215,16 @@ MAIN_FILES = \
|
|||
$(DIRECTORY)/include/GL/glx_mangle.h \
|
||||
$(DIRECTORY)/include/GL/glfbdev.h \
|
||||
$(DIRECTORY)/include/GL/mesa_wgl.h \
|
||||
$(DIRECTORY)/include/GL/mglmesa.h \
|
||||
$(DIRECTORY)/include/GL/osmesa.h \
|
||||
$(DIRECTORY)/include/GL/svgamesa.h \
|
||||
$(DIRECTORY)/include/GL/vms_x_fix.h \
|
||||
$(DIRECTORY)/include/GL/wglext.h \
|
||||
$(DIRECTORY)/include/GL/wmesa.h \
|
||||
$(DIRECTORY)/include/VG/*.h \
|
||||
$(DIRECTORY)/include/KHR/*.h \
|
||||
$(DIRECTORY)/src/glsl/Makefile \
|
||||
$(DIRECTORY)/src/glsl/Makefile.template \
|
||||
$(DIRECTORY)/src/glsl/SConscript \
|
||||
$(DIRECTORY)/src/glsl/*/Makefile \
|
||||
$(DIRECTORY)/src/glsl/*/SConscript \
|
||||
$(DIRECTORY)/src/glsl/*/*.[ch] \
|
||||
$(DIRECTORY)/src/Makefile \
|
||||
$(DIRECTORY)/src/mesa/Makefile* \
|
||||
|
|
@ -253,7 +245,6 @@ MAIN_FILES = \
|
|||
$(DIRECTORY)/src/mesa/shader/slang/descrip.mms \
|
||||
$(DIRECTORY)/src/mesa/shader/slang/library/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/shader/slang/library/*.gc \
|
||||
$(DIRECTORY)/src/mesa/shader/slang/library/*.syn \
|
||||
$(DIRECTORY)/src/mesa/shader/slang/library/Makefile \
|
||||
$(DIRECTORY)/src/mesa/swrast/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/swrast/descrip.mms \
|
||||
|
|
@ -271,25 +262,13 @@ MAIN_FILES = \
|
|||
$(DIRECTORY)/src/mesa/drivers/beos/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/common/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/common/descrip.mms \
|
||||
$(DIRECTORY)/src/mesa/drivers/directfb/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/directfb/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/dos/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/fbdev/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/fbdev/glfbdev.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/ggimesa.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/genkgi.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/fbdev.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/*.h \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.win \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/descrip.mms \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/osmesa.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/svga/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*/*.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/x11/Makefile \
|
||||
|
|
@ -314,9 +293,9 @@ MAIN_FILES = \
|
|||
ES_FILES = \
|
||||
$(DIRECTORY)/include/GLES/*.h \
|
||||
$(DIRECTORY)/include/GLES2/*.h \
|
||||
$(DIRECTORY)/src/mesa/glapi/*.xml \
|
||||
$(DIRECTORY)/src/mesa/glapi/*.py \
|
||||
$(DIRECTORY)/src/mesa/glapi/*.dtd \
|
||||
$(DIRECTORY)/src/mesa/glapi/gen/*.xml \
|
||||
$(DIRECTORY)/src/mesa/glapi/gen/*.py \
|
||||
$(DIRECTORY)/src/mesa/glapi/gen/*.dtd \
|
||||
$(DIRECTORY)/src/mesa/es/glapi/Makefile \
|
||||
$(DIRECTORY)/src/mesa/es/glapi/*.xml \
|
||||
$(DIRECTORY)/src/mesa/es/glapi/*.py \
|
||||
|
|
@ -332,6 +311,7 @@ EGL_FILES = \
|
|||
$(DIRECTORY)/include/EGL/*.h \
|
||||
$(DIRECTORY)/src/egl/Makefile \
|
||||
$(DIRECTORY)/src/egl/*/Makefile \
|
||||
$(DIRECTORY)/src/egl/*/Makefile.template \
|
||||
$(DIRECTORY)/src/egl/*/*.[ch] \
|
||||
$(DIRECTORY)/src/egl/*/*/Makefile \
|
||||
$(DIRECTORY)/src/egl/*/*/*.[ch] \
|
||||
|
|
@ -458,11 +438,7 @@ DEMO_FILES = \
|
|||
$(DIRECTORY)/progs/glsl/*.c \
|
||||
$(DIRECTORY)/progs/glsl/*.frag \
|
||||
$(DIRECTORY)/progs/glsl/*.vert \
|
||||
$(DIRECTORY)/progs/glsl/*.shtest \
|
||||
$(DIRECTORY)/progs/windml/Makefile.ugl \
|
||||
$(DIRECTORY)/progs/windml/*.c \
|
||||
$(DIRECTORY)/progs/windml/*.bmp \
|
||||
$(DIRECTORY)/progs/ggi/*.c
|
||||
$(DIRECTORY)/progs/glsl/*.shtest
|
||||
|
||||
GLUT_FILES = \
|
||||
$(DIRECTORY)/include/GL/glut.h \
|
||||
|
|
@ -475,17 +451,10 @@ GLUT_FILES = \
|
|||
$(DIRECTORY)/src/glut/beos/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/beos/*.cpp \
|
||||
$(DIRECTORY)/src/glut/beos/Makefile \
|
||||
$(DIRECTORY)/src/glut/dos/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/dos/PC_HW/*.[chS] \
|
||||
$(DIRECTORY)/src/glut/ggi/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/ggi/Makefile \
|
||||
$(DIRECTORY)/src/glut/fbdev/Makefile \
|
||||
$(DIRECTORY)/src/glut/fbdev/*[ch] \
|
||||
$(DIRECTORY)/src/glut/mini/*[ch] \
|
||||
$(DIRECTORY)/src/glut/mini/glut.pc.in \
|
||||
$(DIRECTORY)/src/glut/directfb/Makefile \
|
||||
$(DIRECTORY)/src/glut/directfb/NOTES \
|
||||
$(DIRECTORY)/src/glut/directfb/*[ch]
|
||||
|
||||
DEPEND_FILES = \
|
||||
$(TOP)/src/mesa/depend \
|
||||
|
|
|
|||
|
|
@ -110,12 +110,19 @@ Export([
|
|||
#######################################################################
|
||||
# Environment setup
|
||||
|
||||
# Always build trace and identity drivers
|
||||
if 'trace' not in env['drivers']:
|
||||
env['drivers'].append('trace')
|
||||
if 'identity' not in env['drivers']:
|
||||
env['drivers'].append('identity')
|
||||
|
||||
# Includes
|
||||
env.Append(CPPPATH = [
|
||||
'#/include',
|
||||
'#/src/gallium/include',
|
||||
'#/src/gallium/auxiliary',
|
||||
'#/src/gallium/drivers',
|
||||
'#/src/gallium/winsys',
|
||||
])
|
||||
|
||||
if env['msvc']:
|
||||
|
|
|
|||
53
bin/mklib
53
bin/mklib
|
|
@ -25,8 +25,14 @@
|
|||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
# Clear CDPATH as the 'cd' command will echo stuff
|
||||
# to stdout if it is set
|
||||
unset CDPATH
|
||||
|
||||
# Given a list of files, look for .a archives and unpack them.
|
||||
# Return the original list of files minus the .a files plus the unpacked files.
|
||||
# first param: name of a temp directory (to be deleted when finished)
|
||||
# remaining params: list of .o and .a files
|
||||
expand_archives() {
|
||||
DIR=$1
|
||||
shift
|
||||
|
|
@ -60,27 +66,6 @@ expand_archives() {
|
|||
}
|
||||
|
||||
|
||||
# Given a list of files, look for .a archives and return a list of all objects
|
||||
# in the .a archives.
|
||||
contents_of_archives() {
|
||||
FILES=$@
|
||||
NEWFILES=""
|
||||
for FILE in $FILES ; do
|
||||
case $FILE in
|
||||
*.a)
|
||||
# get list of members in this .a archive
|
||||
MEMBERS=`ar t $FILE`
|
||||
NEWFILES="$NEWFILES $MEMBERS"
|
||||
;;
|
||||
*)
|
||||
# skip other file types
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo $NEWFILES
|
||||
}
|
||||
|
||||
|
||||
# Make static library with 'ar'
|
||||
# params:
|
||||
# options to ar
|
||||
|
|
@ -758,12 +743,20 @@ case $ARCH in
|
|||
if [ $STATIC = 1 ] ; then
|
||||
LIBNAME="lib${LIBNAME}.a"
|
||||
echo "mklib: Making Darwin static library: " ${LIBNAME}
|
||||
LINK="ar"
|
||||
OPTS="-ruvs"
|
||||
if [ "${ALTOPTS}" ] ; then
|
||||
OPTS=${ALTOPTS}
|
||||
fi
|
||||
${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
|
||||
|
||||
# expand .a into .o files
|
||||
NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
|
||||
|
||||
# make static lib
|
||||
FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
|
||||
|
||||
# remove temporary extracted .o files
|
||||
rm -rf ${LIBNAME}.obj
|
||||
|
||||
FINAL_LIBS=${LIBNAME}
|
||||
else
|
||||
# On Darwin a .bundle is used for a library that you want to dlopen
|
||||
|
|
@ -955,7 +948,14 @@ case $ARCH in
|
|||
if [ "${ALTOPTS}" ] ; then
|
||||
OPTS=${ALTOPTS}
|
||||
fi
|
||||
FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${OBJECTS}`
|
||||
|
||||
# expand .a into .o files
|
||||
NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
|
||||
|
||||
FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
|
||||
|
||||
# remove temporary extracted .o files
|
||||
rm -rf ${LIBNAME}.obj
|
||||
else
|
||||
OPTS="-shared -Wl,--enable-auto-image-base -Wl,-export-all -Wl,--out-implib=${LIBNAME}-${MAJOR}.dll.a"
|
||||
if [ "${ALTOPTS}" ] ; then
|
||||
|
|
@ -977,6 +977,11 @@ case $ARCH in
|
|||
|
||||
# make lib
|
||||
${LINK} ${OPTS} ${LDFLAGS} -o ${CYGNAME}-${MAJOR}.dll ${OBJECTS} ${DEPS}
|
||||
# make build fail if link failed
|
||||
es=$?
|
||||
if [ "$es" -ne "0" ]; then
|
||||
exit $es
|
||||
fi
|
||||
# make usual symlinks
|
||||
ln -s ${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a
|
||||
# finish up
|
||||
|
|
|
|||
366
bin/raw2png.py
366
bin/raw2png.py
|
|
@ -1,366 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
##########################################################################
|
||||
#
|
||||
# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sub license, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice (including the
|
||||
# next paragraph) shall be included in all copies or substantial portions
|
||||
# of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
##########################################################################
|
||||
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
import struct
|
||||
import Image # http://www.pythonware.com/products/pil/
|
||||
|
||||
PIPE_FORMAT_LAYOUT_RGBAZS = 0
|
||||
PIPE_FORMAT_LAYOUT_YCBCR = 1
|
||||
PIPE_FORMAT_LAYOUT_DXT = 2
|
||||
PIPE_FORMAT_LAYOUT_MIXED = 3
|
||||
|
||||
PIPE_FORMAT_COMP_R = 0
|
||||
PIPE_FORMAT_COMP_G = 1
|
||||
PIPE_FORMAT_COMP_B = 2
|
||||
PIPE_FORMAT_COMP_A = 3
|
||||
PIPE_FORMAT_COMP_0 = 4
|
||||
PIPE_FORMAT_COMP_1 = 5
|
||||
PIPE_FORMAT_COMP_Z = 6
|
||||
PIPE_FORMAT_COMP_S = 7
|
||||
|
||||
PIPE_FORMAT_TYPE_UNKNOWN = 0
|
||||
PIPE_FORMAT_TYPE_FLOAT = 1
|
||||
PIPE_FORMAT_TYPE_UNORM = 2
|
||||
PIPE_FORMAT_TYPE_SNORM = 3
|
||||
PIPE_FORMAT_TYPE_USCALED = 4
|
||||
PIPE_FORMAT_TYPE_SSCALED = 5
|
||||
PIPE_FORMAT_TYPE_SRGB = 6
|
||||
PIPE_FORMAT_TYPE_FIXED = 7
|
||||
|
||||
def _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, EXP2, TYPE ):
|
||||
return ((PIPE_FORMAT_LAYOUT_RGBAZS << 0) |\
|
||||
((SWZ) << 2) |\
|
||||
((SIZEX) << 14) |\
|
||||
((SIZEY) << 17) |\
|
||||
((SIZEZ) << 20) |\
|
||||
((SIZEW) << 23) |\
|
||||
((EXP2) << 26) |\
|
||||
((TYPE) << 29) )
|
||||
|
||||
def _PIPE_FORMAT_SWZ( SWZX, SWZY, SWZZ, SWZW ):
|
||||
return (((SWZX) << 0) | ((SWZY) << 3) | ((SWZZ) << 6) | ((SWZW) << 9))
|
||||
|
||||
def _PIPE_FORMAT_RGBAZS_1( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE ):
|
||||
return _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 0, TYPE )
|
||||
|
||||
def _PIPE_FORMAT_RGBAZS_2( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE ):
|
||||
_PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 1, TYPE )
|
||||
|
||||
def _PIPE_FORMAT_RGBAZS_8( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE ):
|
||||
return _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 3, TYPE )
|
||||
|
||||
def _PIPE_FORMAT_RGBAZS_64( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE ):
|
||||
return _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 6, TYPE )
|
||||
|
||||
def _PIPE_FORMAT_MIXED( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, SIGNX, SIGNY, SIGNZ, SIGNW, NORMALIZED, SCALE8 ):
|
||||
return ((PIPE_FORMAT_LAYOUT_MIXED << 0) |\
|
||||
((SWZ) << 2) |\
|
||||
((SIZEX) << 14) |\
|
||||
((SIZEY) << 17) |\
|
||||
((SIZEZ) << 20) |\
|
||||
((SIZEW) << 23) |\
|
||||
((SIGNX) << 26) |\
|
||||
((SIGNY) << 27) |\
|
||||
((SIGNZ) << 28) |\
|
||||
((SIGNW) << 29) |\
|
||||
((NORMALIZED) << 30) |\
|
||||
((SCALE8) << 31) )
|
||||
|
||||
|
||||
_PIPE_FORMAT_R001 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 )
|
||||
_PIPE_FORMAT_RG01 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 )
|
||||
_PIPE_FORMAT_RGB1 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_1 )
|
||||
_PIPE_FORMAT_RGBA = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_A )
|
||||
_PIPE_FORMAT_ARGB = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_A, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B )
|
||||
_PIPE_FORMAT_ABGR = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_A, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R )
|
||||
_PIPE_FORMAT_BGRA = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_A )
|
||||
_PIPE_FORMAT_1RGB = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_1, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B )
|
||||
_PIPE_FORMAT_1BGR = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_1, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R )
|
||||
_PIPE_FORMAT_BGR1 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )
|
||||
_PIPE_FORMAT_0000 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
_PIPE_FORMAT_000R = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_R )
|
||||
_PIPE_FORMAT_RRR1 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )
|
||||
_PIPE_FORMAT_RRRR = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R )
|
||||
_PIPE_FORMAT_RRRG = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G )
|
||||
_PIPE_FORMAT_Z000 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
_PIPE_FORMAT_0Z00 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
_PIPE_FORMAT_SZ00 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
_PIPE_FORMAT_ZS00 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
_PIPE_FORMAT_S000 = _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
|
||||
|
||||
def _PIPE_FORMAT_YCBCR( REV ):
|
||||
return ((PIPE_FORMAT_LAYOUT_YCBCR << 0) |\
|
||||
((REV) << 2) )
|
||||
|
||||
def _PIPE_FORMAT_DXT( LEVEL, RSIZE, GSIZE, BSIZE, ASIZE ):
|
||||
return ((PIPE_FORMAT_LAYOUT_DXT << 0) | \
|
||||
((LEVEL) << 2) | \
|
||||
((RSIZE) << 5) | \
|
||||
((GSIZE) << 8) | \
|
||||
((BSIZE) << 11) | \
|
||||
((ASIZE) << 14) )
|
||||
|
||||
PIPE_FORMAT_NONE = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_0000, 0, 0, 0, 0, PIPE_FORMAT_TYPE_UNKNOWN )
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ARGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_1RGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_A1R5G5B5_UNORM = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 1, 5, 5, 5, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_A4R4G4B4_UNORM = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R5G6B5_UNORM = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_RGB1, 5, 6, 5, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_A2B10G10R10_UNORM = _PIPE_FORMAT_RGBAZS_2 ( _PIPE_FORMAT_ABGR, 1, 5, 5, 5, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_L8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_A8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_000R, 0, 0, 0, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_I8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRR, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_A8L8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_L16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_YCBCR = _PIPE_FORMAT_YCBCR( 0 )
|
||||
PIPE_FORMAT_YCBCR_REV = _PIPE_FORMAT_YCBCR( 1 )
|
||||
PIPE_FORMAT_Z16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_Z32_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_Z32_FLOAT = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_S8Z24_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_SZ00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_Z24S8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ZS00, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_X8Z24_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_0Z00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_Z24X8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_S8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_S000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R64_FLOAT = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R64G64_FLOAT = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R64G64B64_FLOAT = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R64G64B64A64_FLOAT = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R32_FLOAT = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R32G32_FLOAT = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R32G32B32_FLOAT = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R32G32B32A32_FLOAT = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_FLOAT )
|
||||
PIPE_FORMAT_R32_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R32G32_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R32G32B32_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R32G32B32A32_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R32_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R32G32_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R32G32B32_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R32G32B32A32_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R32_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R32G32_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R32G32B32_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R32G32B32A32_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R32_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R32G32_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R32G32B32_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R32G32B32A32_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R16G16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R16G16B16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R16G16B16A16_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R16_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R16G16_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R16G16B16_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R16G16B16A16_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R16_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R16G16_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R16G16B16_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R16G16B16A16_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R16_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R16G16_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R16G16B16_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R16G16B16A16_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R8G8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R8G8B8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R8G8B8A8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R8G8B8X8_UNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM )
|
||||
PIPE_FORMAT_R8_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R8G8_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R8G8B8_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R8G8B8A8_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R8G8B8X8_USCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED )
|
||||
PIPE_FORMAT_R8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R8G8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R8G8B8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R8G8B8A8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R8G8B8X8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_B6G5R5_SNORM = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_BGR1, 6, 5, 5, 0, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_A8B8G8R8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_X8B8G8R8_SNORM = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM )
|
||||
PIPE_FORMAT_R8_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R8G8_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R8G8B8_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R8G8B8A8_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R8G8B8X8_SSCALED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED )
|
||||
PIPE_FORMAT_R32_FIXED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FIXED )
|
||||
PIPE_FORMAT_R32G32_FIXED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FIXED )
|
||||
PIPE_FORMAT_R32G32B32_FIXED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FIXED )
|
||||
PIPE_FORMAT_R32G32B32A32_FIXED = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_FIXED )
|
||||
PIPE_FORMAT_L8_SRGB = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB )
|
||||
PIPE_FORMAT_A8_L8_SRGB = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB )
|
||||
PIPE_FORMAT_R8G8B8_SRGB = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB )
|
||||
PIPE_FORMAT_R8G8B8A8_SRGB = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB )
|
||||
PIPE_FORMAT_R8G8B8X8_SRGB = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB )
|
||||
PIPE_FORMAT_X8UB8UG8SR8S_NORM = _PIPE_FORMAT_MIXED( _PIPE_FORMAT_1BGR, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 )
|
||||
PIPE_FORMAT_B6UG5SR5S_NORM = _PIPE_FORMAT_MIXED( _PIPE_FORMAT_BGR1, 6, 5, 5, 0, 0, 1, 1, 0, 1, 0 )
|
||||
PIPE_FORMAT_DXT1_RGB = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 0 )
|
||||
PIPE_FORMAT_DXT1_RGBA = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 8 )
|
||||
PIPE_FORMAT_DXT3_RGBA = _PIPE_FORMAT_DXT( 3, 8, 8, 8, 8 )
|
||||
PIPE_FORMAT_DXT5_RGBA = _PIPE_FORMAT_DXT( 5, 8, 8, 8, 8 )
|
||||
|
||||
|
||||
formats = {}
|
||||
for name, value in globals().items():
|
||||
if name.startswith("PIPE_FORMAT_") and isinstance(value, int):
|
||||
formats[value] = name
|
||||
|
||||
|
||||
def clip(g):
|
||||
return min(max(g, 0), 255)
|
||||
|
||||
|
||||
def yuv2rgb(y, u, v):
|
||||
C = y - 16
|
||||
D = u - 128
|
||||
E = v - 128
|
||||
|
||||
r = clip(( 298 * C + 409 * E + 128) >> 8)
|
||||
g = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
|
||||
b = clip(( 298 * C + 516 * D + 128) >> 8)
|
||||
|
||||
return r, g, b
|
||||
|
||||
|
||||
def translate_r5g6b5(data):
|
||||
value, = struct.unpack_from("H", data)
|
||||
r = ((value >> 11) & 0x1f)*0xff/0x1f
|
||||
g = ((value >> 5) & 0x3f)*0xff/0x3f
|
||||
b = ((value >> 0) & 0x1f)*0xff/0x1f
|
||||
a = 255
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
def translate_a8r8g8b8(data):
|
||||
b, g, r, a = struct.unpack_from("BBBB", data)
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
|
||||
def translate_x8r8g8b8(data):
|
||||
b, g, r, x = struct.unpack_from("BBBB", data)
|
||||
a = 255
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
def translate_r8g8b8a8(data):
|
||||
r, g, b, a = struct.unpack_from("BBBB", data)
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
def translate_ycbcr(data):
|
||||
y1, u, y2, v = struct.unpack_from("BBBB", data)
|
||||
r1, g1, b1 = yuv2rgb(y1, u, v)
|
||||
r2, g2, b2 = yuv2rgb(y1, u, v)
|
||||
return [[(r1, g1, b1, 255), (r2, g2, b2, 255)]]
|
||||
|
||||
def translate_ycbcr_rev(data):
|
||||
v, y2, u, y1 = struct.unpack_from("BBBB", data)
|
||||
r1, g1, b1 = yuv2rgb(y1, u, v)
|
||||
r2, g2, b2 = yuv2rgb(y1, u, v)
|
||||
return [[(r1, g1, b1, 255), (r2, g2, b2, 255)]]
|
||||
|
||||
def translate_x8z24(data):
|
||||
value, = struct.unpack_from("I", data)
|
||||
r = g = b = (value & 0xffffff)*0xff/0xffffff
|
||||
a = 255
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
def translate_s8z24(data):
|
||||
value, = struct.unpack_from("I", data)
|
||||
r = (value & 0xffffff)*0xff/0xffffff
|
||||
g = value >> 24
|
||||
b = 0
|
||||
a = 255
|
||||
return [[(r, g, b, a)]]
|
||||
|
||||
|
||||
translate = {
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM: (4, 1, 1, translate_a8r8g8b8),
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM: (4, 1, 1, translate_x8r8g8b8),
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM: (4, 1, 1, translate_r8g8b8a8),
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM: (4, 1, 1, translate_r8g8b8a8),
|
||||
PIPE_FORMAT_A8B8G8R8_SNORM: (4, 1, 1, translate_r8g8b8a8),
|
||||
PIPE_FORMAT_R5G6B5_UNORM: (2, 1, 1, translate_r5g6b5),
|
||||
PIPE_FORMAT_YCBCR: (4, 2, 1, translate_ycbcr),
|
||||
PIPE_FORMAT_YCBCR_REV: (4, 2, 1, translate_ycbcr_rev),
|
||||
PIPE_FORMAT_S8Z24_UNORM: (4, 1, 1, translate_s8z24),
|
||||
PIPE_FORMAT_X8Z24_UNORM: (4, 1, 1, translate_x8z24),
|
||||
}
|
||||
|
||||
def read_header(infile):
|
||||
header_fmt = "IIII"
|
||||
header = infile.read(struct.calcsize(header_fmt))
|
||||
return struct.unpack_from(header_fmt, header)
|
||||
|
||||
def process(infilename, outfilename):
|
||||
sys.stderr.write("%s -> %s\n" % (infilename, outfilename))
|
||||
infile = open(infilename, "rb")
|
||||
format, cpp, width, height = read_header(infile)
|
||||
sys.stderr.write(" %ux%ux%ubpp %s\n" % (width, height, cpp*8, formats[format]))
|
||||
outimage = Image.new(
|
||||
mode='RGB',
|
||||
size=(width, height),
|
||||
color=(0,0,0))
|
||||
outpixels = outimage.load()
|
||||
try:
|
||||
bsize, bwidth, bheight, translate_func = translate[format]
|
||||
except KeyError:
|
||||
sys.stderr.write('error: unsupported format %s\n' % formats[format])
|
||||
return
|
||||
for y in range(0, height, bheight):
|
||||
for x in range(0, width, bwidth):
|
||||
indata = infile.read(bsize)
|
||||
outdata = translate_func(indata)
|
||||
for j in range(bheight):
|
||||
for i in range(bwidth):
|
||||
r, g, b, a = outdata[j][i]
|
||||
outpixels[x+i, y+j] = r, g, b
|
||||
outimage.save(outfilename, "PNG")
|
||||
|
||||
|
||||
def main():
|
||||
if sys.platform == 'win32':
|
||||
# wildcard expansion
|
||||
from glob import glob
|
||||
args = []
|
||||
for arg in sys.argv[1:]:
|
||||
args.extend(glob(arg))
|
||||
else:
|
||||
args = sys.argv[1:]
|
||||
for infilename in args:
|
||||
root, ext = os.path.splitext(infilename)
|
||||
outfilename = root + ".png"
|
||||
process(infilename, outfilename)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
@ -73,6 +73,7 @@ EGL_DRIVERS_DIRS = @EGL_DRIVERS_DIRS@
|
|||
GALLIUM_DIRS = @GALLIUM_DIRS@
|
||||
GALLIUM_DRIVERS_DIRS = @GALLIUM_DRIVERS_DIRS@
|
||||
GALLIUM_WINSYS_DIRS = @GALLIUM_WINSYS_DIRS@
|
||||
GALLIUM_TARGET_DIRS = @GALLIUM_TARGET_DIRS@
|
||||
GALLIUM_WINSYS_DRM_DIRS = @GALLIUM_WINSYS_DRM_DIRS@
|
||||
GALLIUM_STATE_TRACKERS_DIRS = @GALLIUM_STATE_TRACKERS_DIRS@
|
||||
GALLIUM_AUXILIARIES = $(TOP)/src/gallium/auxiliary/libgallium.a
|
||||
|
|
@ -83,7 +84,6 @@ PROGRAM_DIRS = @PROGRAM_DIRS@
|
|||
|
||||
# Driver specific build vars
|
||||
DRI_DIRS = @DRI_DIRS@
|
||||
WINDOW_SYSTEM = @WINDOW_SYSTEM@
|
||||
EGL_DISPLAYS = @EGL_DISPLAYS@
|
||||
|
||||
# Dependencies
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ CONFIG_NAME = default
|
|||
|
||||
# Version info
|
||||
MESA_MAJOR=7
|
||||
MESA_MINOR=8
|
||||
MESA_MINOR=9
|
||||
MESA_TINY=0
|
||||
MESA_VERSION = $(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY)
|
||||
|
||||
|
|
@ -86,7 +86,7 @@ MOTIF_CFLAGS = -I/usr/include/Motif1.2
|
|||
|
||||
# Directories to build
|
||||
LIB_DIR = lib
|
||||
SRC_DIRS = glsl mesa gallium egl gallium/winsys glu glut/glx glew glw
|
||||
SRC_DIRS = glsl mesa gallium egl gallium/winsys gallium/targets glu glut/glx glew glw
|
||||
GLU_DIRS = sgi
|
||||
DRIVER_DIRS = x11 osmesa
|
||||
# Which subdirs under $(TOP)/progs/ to enter:
|
||||
|
|
@ -100,7 +100,8 @@ GALLIUM_DIRS = auxiliary drivers state_trackers
|
|||
GALLIUM_AUXILIARIES = $(TOP)/src/gallium/auxiliary/libgallium.a
|
||||
GALLIUM_DRIVERS_DIRS = softpipe failover svga i915 i965 r300 trace identity
|
||||
GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVERS_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a)
|
||||
GALLIUM_WINSYS_DIRS = drm xlib
|
||||
GALLIUM_WINSYS_DIRS = drm null xlib
|
||||
GALLIUM_TARGET_DIRS = libgl-xlib
|
||||
GALLIUM_WINSYS_DRM_DIRS = swrast
|
||||
GALLIUM_STATE_TRACKERS_DIRS = glx vega
|
||||
|
||||
|
|
|
|||
|
|
@ -44,12 +44,9 @@ GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -L/usr/local/lib -lGL -lXt -lX11
|
|||
SRC_DIRS = glx gallium mesa glu glut/glx glew glw
|
||||
DRIVER_DIRS = dri
|
||||
PROGRAM_DIRS =
|
||||
WINDOW_SYSTEM=dri
|
||||
|
||||
DRM_SOURCE_PATH=$(TOP)/../drm
|
||||
|
||||
# ffb and gamma are missing because they have not been converted to use the new
|
||||
# interface.
|
||||
DRI_DIRS = i810 i915 i965 mach64 mga r128 r200 r300 radeon tdfx \
|
||||
unichrome savage sis
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ CXXFLAGS = $(COMMON_C_CPP_FLAGS)
|
|||
|
||||
|
||||
# Omitting glw here:
|
||||
SRC_DIRS = glsl mesa gallium gallium/winsys glu glut/glx glew
|
||||
SRC_DIRS = glsl mesa gallium gallium/winsys gallium/targets glu glut/glx glew
|
||||
|
||||
# Build no traditional Mesa drivers:
|
||||
DRIVER_DIRS =
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
# Configuration for DirectFB
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-directfb
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -Wall -O3 -ffast-math -fPIC -std=c99 -D_GNU_SOURCE -D_POSIX_SOURCE -D_SVID_SOURCE \
|
||||
-D_POSIX_C_SOURCE=199309L -D_BSD_SOURCE -DPTHREADS
|
||||
|
||||
CXXFLAGS = -Wall -O3 -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
||||
# Work around aliasing bugs - developers should comment this out
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
CXXFLAGS += -fno-strict-aliasing
|
||||
|
||||
HAVE_X86 = $(shell uname -m | grep 'i[3-6]86' >/dev/null && echo yes)
|
||||
ifeq ($(HAVE_X86), yes)
|
||||
CFLAGS += -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM
|
||||
CXXFLAGS += -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM
|
||||
MESA_ASM_SOURCES = $(X86_SOURCES)
|
||||
GLAPI_ASM_SOURCES = $(X86_API)
|
||||
endif
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = gallium mesa glu glut/directfb glew
|
||||
GLU_DIRS = sgi
|
||||
DRIVER_DIRS = directfb
|
||||
PROGRAM_DIRS = demos directfb
|
||||
|
||||
# Library/program dependencies
|
||||
GL_LIB_DEPS = -lm -lpthread
|
||||
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -l$(GLU_LIB)
|
||||
APP_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -l$(GLU_LIB) -l$(GLUT_LIB)
|
||||
|
||||
|
|
@ -58,13 +58,13 @@ PROGRAM_DIRS := egl $(PROGRAM_DIRS)
|
|||
EGL_DRIVERS_DIRS = glx
|
||||
|
||||
DRIVER_DIRS = dri
|
||||
WINDOW_SYSTEM = dri
|
||||
GALLIUM_WINSYS_DIRS = drm
|
||||
GALLIUM_TARGET_DIRS =
|
||||
GALLIUM_WINSYS_DRM_DIRS = vmware intel i965
|
||||
GALLIUM_STATE_TRACKERS_DIRS = egl
|
||||
|
||||
DRI_DIRS = i810 i915 i965 mach64 mga r128 r200 r300 radeon \
|
||||
savage sis tdfx unichrome ffb swrast
|
||||
savage sis tdfx unichrome swrast
|
||||
|
||||
INTEL_LIBS = `pkg-config --libs libdrm_intel`
|
||||
INTEL_CFLAGS = `pkg-config --cflags libdrm_intel`
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ LIB_DIR = lib64
|
|||
# Library/program dependencies
|
||||
EXTRA_LIB_PATH=-L/usr/X11R6/lib64
|
||||
|
||||
# ffb, gamma, and sis are missing because they have not be converted to use
|
||||
# sis is missing because it has not been converted to use
|
||||
# the new interface. i810 are missing because there is no x86-64
|
||||
# system where they could *ever* be used.
|
||||
#
|
||||
|
|
|
|||
|
|
@ -51,9 +51,5 @@ SRC_DIRS = glx gallium mesa glu glut/glx glew glw
|
|||
PROGRAM_DIRS = xdemos
|
||||
|
||||
DRIVER_DIRS = dri
|
||||
WINDOW_SYSTEM=dri
|
||||
|
||||
# gamma are missing because they have not been converted to use the new
|
||||
# interface.
|
||||
DRI_DIRS = i810 i915 mach64 mga r128 r200 r300 radeon \
|
||||
savage sis tdfx unichrome ffb
|
||||
savage sis tdfx unichrome
|
||||
|
|
|
|||
|
|
@ -47,13 +47,11 @@ GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
|
|||
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = gallium mesa gallium/winsys glu egl
|
||||
SRC_DIRS = gallium mesa gallium/winsys gallium/targets glu egl
|
||||
PROGRAM_DIRS = egl
|
||||
|
||||
DRIVER_DIRS = dri
|
||||
WINDOW_SYSTEM = dri
|
||||
GALLIUM_WINSYS_DIRS = egl_drm
|
||||
GALLIUM_TARGET_DIRS =
|
||||
|
||||
# gamma are missing because they have not been converted to use the new
|
||||
# interface.
|
||||
DRI_DIRS = intel
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
# Configuration for generic Linux with 3Dfx Glide driver
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-glide
|
||||
|
||||
# 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 -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include -DFX -I/usr/include/glide -I/usr/local/glide/include
|
||||
CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
# Work around aliasing bugs - developers should comment this out
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
CXXFLAGS += -fno-strict-aliasing
|
||||
|
||||
# Library/program dependencies
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -L/usr/local/glide/lib -lglide3x -lm -lpthread
|
||||
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib -lXt -lX11
|
||||
APP_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/local/glide/lib -lglide3x -lm
|
||||
|
|
@ -6,3 +6,4 @@ CONFIG_NAME = linux-i965
|
|||
|
||||
GALLIUM_DRIVER_DIRS = i965
|
||||
GALLIUM_WINSYS_DIRS = drm/i965/xlib
|
||||
GALLIUM_TARGET_DIRS =
|
||||
|
|
|
|||
|
|
@ -50,4 +50,3 @@ GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lXxf86vm -lm -lpthread -ldl
|
|||
SRC_DIRS = glx glu glut/glx glew glw
|
||||
DRIVER_DIRS =
|
||||
PROGRAM_DIRS =
|
||||
WINDOW_SYSTEM=dri
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ CONFIG_NAME = linux-opengl-es
|
|||
|
||||
# Directories to build
|
||||
LIB_DIR = lib
|
||||
SRC_DIRS = egl glsl mesa/es gallium gallium/winsys
|
||||
SRC_DIRS = egl glsl mesa/es gallium gallium/winsys gallium/targets
|
||||
PROGRAM_DIRS = es1/screen es1/xegl es2/xegl
|
||||
|
||||
# egl st needs this
|
||||
|
|
|
|||
|
|
@ -1,54 +0,0 @@
|
|||
# Configuration for linux-solo: Linux DRI hardware drivers for fbdev
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-solo
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
WARN_FLAGS = -Wall -Wundef
|
||||
OPT_FLAGS = -O3 -g
|
||||
PIC_FLAGS = -fPIC
|
||||
|
||||
# Add '-DGLX_USE_TLS' to ARCH_FLAGS to enable TLS support.
|
||||
ARCH_FLAGS ?=
|
||||
|
||||
# DRM and pciaccess
|
||||
LIBDRM_CFLAGS = $(shell pkg-config --cflags libdrm)
|
||||
LIBDRM_LIB = $(shell pkg-config --libs libdrm)
|
||||
PCIACCESS_CFLAGS = $(shell pkg-config --cflags pciaccess)
|
||||
PCIACCESS_LIB = $(shell pkg-config --libs pciaccess)
|
||||
|
||||
|
||||
DEFINES = -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE \
|
||||
-D_BSD_SOURCE -D_GNU_SOURCE -DHAVE_POSIX_MEMALIGN \
|
||||
-DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER \
|
||||
-DHAVE_ALIAS
|
||||
|
||||
CFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(DEFINES) \
|
||||
$(ASM_FLAGS) -std=c99 -ffast-math
|
||||
|
||||
CXXFLAGS = $(WARN_FLAGS) $(OPT_FLAGS) $(PIC_FLAGS) $(ARCH_FLAGS) $(DEFINES)
|
||||
|
||||
# Work around aliasing bugs - developers should comment this out
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
CXXFLAGS += -fno-strict-aliasing
|
||||
|
||||
MESA_ASM_SOURCES =
|
||||
|
||||
# Library/program dependencies
|
||||
DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl -L$(TOP)/$(LIB_DIR) $(PCIACCESS_LIB)
|
||||
GL_LIB_DEPS = -lm -lpthread -ldl
|
||||
GLU_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -lm
|
||||
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -lm
|
||||
APP_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -lm -lpthread
|
||||
|
||||
# Directories
|
||||
SRC_DIRS = glx/mini gallium mesa glu glut/mini glew
|
||||
DRIVER_DIRS = dri
|
||||
PROGRAM_DIRS = miniglx
|
||||
|
||||
#DRI_DIRS = ffb gamma sis savage tdfx unichrome fb
|
||||
DRI_DIRS = i810 i915tex i915 mach64 mga r128 r200 radeon
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
# Configuration for linux-solo-ia64: Linux DRI hardware drivers for fbdev
|
||||
|
||||
include $(TOP)/configs/linux-solo
|
||||
|
||||
CONFIG_NAME = linux-solo-ia64
|
||||
|
||||
DRI_DIRS = fb mach64 mga r128 r200 radeon sis tdfx unichrome
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
# -*-makefile-*-
|
||||
# Configuration for linux-solo-x86: Linux hardware drivers for fbdev for x86
|
||||
|
||||
include $(TOP)/configs/linux-solo
|
||||
|
||||
CONFIG_NAME = linux-solo-x86
|
||||
|
||||
ASM_FLAGS = -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM
|
||||
MESA_ASM_SOURCES = $(X86_SOURCES)
|
||||
GLAPI_ASM_SOURCES = $(X86_API)
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# Configuration for Linux with 3Dfx Glide driver and x86 optimizations
|
||||
|
||||
include $(TOP)/configs/default
|
||||
|
||||
CONFIG_NAME = linux-x86-glide
|
||||
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
|
||||
CFLAGS = -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DPTHREADS -I/usr/X11R6/include -DFX -I/usr/include/glide -I/usr/local/glide/include
|
||||
|
||||
CXXFLAGS = -Wall -O3 -ansi -pedantic -fPIC -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE
|
||||
|
||||
GLUT_CFLAGS = -fexceptions
|
||||
|
||||
# Work around aliasing bugs - developers should comment this out
|
||||
CFLAGS += -fno-strict-aliasing
|
||||
CXXFLAGS += -fno-strict-aliasing
|
||||
|
||||
MESA_ASM_SOURCES = $(X86_SOURCES)
|
||||
GLAPI_ASM_SOURCES = $(X86_API)
|
||||
|
||||
# Library/program dependencies
|
||||
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -L/usr/local/glide/lib -lglide3x -lm -lpthread
|
||||
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm
|
||||
GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -L/usr/X11R6/lib -lXt -lX11
|
||||
APP_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/local/glide/lib -lglide3x -lm
|
||||
45
configure.ac
45
configure.ac
|
|
@ -46,6 +46,28 @@ solaris*)
|
|||
;;
|
||||
esac
|
||||
|
||||
dnl If we're using GCC, make sure that it is at least version 3.3.0. Older
|
||||
dnl versions are explictly not supported.
|
||||
if test "x$GCC" = xyes; then
|
||||
AC_MSG_CHECKING([whether gcc version is sufficient])
|
||||
major=0
|
||||
minor=0
|
||||
|
||||
GCC_VERSION=`$CC -dumpversion`
|
||||
if test $? -eq 0; then
|
||||
major=`echo $GCC_VERSION | cut -d. -f1`
|
||||
minor=`echo $GCC_VERSION | cut -d. -f1`
|
||||
fi
|
||||
|
||||
if test $major -lt 3 -o $major -eq 3 -a $minor -lt 3 ; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([If using GCC, version 3.3.0 or later is required.])
|
||||
else
|
||||
AC_MSG_RESULT([yes])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
MKDEP_OPTIONS=-fdepend
|
||||
dnl Ask gcc where it's keeping its secret headers
|
||||
if test "x$GCC" = xyes; then
|
||||
|
|
@ -92,6 +114,9 @@ linux*|*-gnu*|gnu*)
|
|||
solaris*)
|
||||
DEFINES="$DEFINES -DPTHREADS -DSVR4"
|
||||
;;
|
||||
cygwin*)
|
||||
DEFINES="$DEFINES -DPTHREADS"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Add flags for gcc and g++
|
||||
|
|
@ -392,7 +417,7 @@ fi
|
|||
|
||||
dnl
|
||||
dnl Driver configuration. Options are xlib, dri and osmesa right now.
|
||||
dnl More later: directfb, fbdev, ...
|
||||
dnl More later: fbdev, ...
|
||||
dnl
|
||||
default_driver="xlib"
|
||||
|
||||
|
|
@ -432,7 +457,6 @@ CORE_DIRS="glsl mesa"
|
|||
|
||||
SRC_DIRS="glew"
|
||||
GLU_DIRS="sgi"
|
||||
WINDOW_SYSTEM=""
|
||||
GALLIUM_DIRS="auxiliary drivers state_trackers"
|
||||
GALLIUM_WINSYS_DIRS=""
|
||||
GALLIUM_WINSYS_DRM_DIRS=""
|
||||
|
|
@ -447,7 +471,6 @@ xlib)
|
|||
dri)
|
||||
SRC_DIRS="$SRC_DIRS glx"
|
||||
DRIVER_DIRS="dri"
|
||||
WINDOW_SYSTEM="dri"
|
||||
GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS drm"
|
||||
;;
|
||||
osmesa)
|
||||
|
|
@ -457,7 +480,6 @@ esac
|
|||
AC_SUBST([SRC_DIRS])
|
||||
AC_SUBST([GLU_DIRS])
|
||||
AC_SUBST([DRIVER_DIRS])
|
||||
AC_SUBST([WINDOW_SYSTEM])
|
||||
AC_SUBST([GALLIUM_DIRS])
|
||||
AC_SUBST([GALLIUM_WINSYS_DIRS])
|
||||
AC_SUBST([GALLIUM_WINSYS_DRM_DIRS])
|
||||
|
|
@ -717,10 +739,9 @@ if test "$mesa_driver" = dri; then
|
|||
|
||||
case "$host_cpu" in
|
||||
x86_64)
|
||||
# ffb, gamma, and sis are missing because they have not be
|
||||
# converted to use the new interface. i810 are missing
|
||||
# because there is no x86-64 system where they could *ever*
|
||||
# be used.
|
||||
# sis is missing because they have not be converted to use
|
||||
# the new interface. i810 are missing because there is no
|
||||
# x86-64 system where they could *ever* be used.
|
||||
if test "x$DRI_DIRS" = "xyes"; then
|
||||
DRI_DIRS="i915 i965 mach64 mga r128 r200 r300 r600 radeon \
|
||||
savage tdfx unichrome swrast"
|
||||
|
|
@ -736,7 +757,7 @@ if test "$mesa_driver" = dri; then
|
|||
sparc*)
|
||||
# Build only the drivers for cards that exist on sparc`
|
||||
if test "x$DRI_DIRS" = "xyes"; then
|
||||
DRI_DIRS="mach64 r128 r200 r300 r600 radeon ffb swrast"
|
||||
DRI_DIRS="mach64 r128 r200 r300 r600 radeon swrast"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
|
@ -752,8 +773,6 @@ if test "$mesa_driver" = dri; then
|
|||
CXXFLAGS="$CXXFLAGS -ansi -pedantic"
|
||||
fi
|
||||
|
||||
# ffb and gamma are missing because they have not been converted
|
||||
# to use the new interface.
|
||||
if test "x$DRI_DIRS" = "xyes"; then
|
||||
DRI_DIRS="i810 i915 i965 mach64 mga r128 r200 r300 r600 radeon tdfx \
|
||||
unichrome savage sis swrast"
|
||||
|
|
@ -775,7 +794,7 @@ if test "$mesa_driver" = dri; then
|
|||
# default drivers
|
||||
if test "x$DRI_DIRS" = "xyes"; then
|
||||
DRI_DIRS="i810 i915 i965 mach64 mga r128 r200 r300 r600 radeon \
|
||||
savage sis tdfx unichrome ffb swrast"
|
||||
savage sis tdfx unichrome swrast"
|
||||
fi
|
||||
|
||||
DRI_DIRS=`echo "$DRI_DIRS" | $SED 's/ */ /g'`
|
||||
|
|
@ -804,7 +823,7 @@ AC_SUBST([DRI_LIB_DEPS])
|
|||
|
||||
case $DRI_DIRS in
|
||||
*i915*|*i965*)
|
||||
PKG_CHECK_MODULES([INTEL], [libdrm_intel])
|
||||
PKG_CHECK_MODULES([INTEL], [libdrm_intel >= 2.4.19])
|
||||
;;
|
||||
esac
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Framebuffer objects (GL_EXT_framebuffer_object) DONE
|
|||
Half-float some infrastructure done
|
||||
Multisample blit DONE
|
||||
Non-normalized Integer texture/framebuffer formats not started
|
||||
1D/2D Texture arrays mostly done
|
||||
1D/2D Texture arrays core Mesa, swrast done
|
||||
Packed depth/stencil formats DONE
|
||||
Per-buffer blend and masks (GL_EXT_draw_buffers2) DONE
|
||||
GL_EXT_texture_compression_rgtc not started
|
||||
|
|
|
|||
|
|
@ -1,534 +0,0 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>Mini GLX Specification</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>
|
||||
<center>Mini GLX Specification</center>
|
||||
</h1>
|
||||
<h2>
|
||||
<center>Tungsten Graphics, Inc.<br>
|
||||
<br>
|
||||
January 20, 2003<br>
|
||||
<br>
|
||||
</center>
|
||||
</h2>
|
||||
<p> Copyright © 2002-2003 by Tungsten Graphics, Inc., Cedar Park,
|
||||
Texas. All Rights Reserved. <br>
|
||||
<br>
|
||||
Permission is granted to make and distribute verbatim copies of this
|
||||
document provided the copyright notice and this permission notice are
|
||||
preserved on all copies.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h1>1. Introduction</h1>
|
||||
<p>The Mini GLX interface facilitates OpenGL rendering on embedded
|
||||
devices. The interface is a subset of the GLX interface, plus a minimal
|
||||
set of Xlib-like functions.</p>
|
||||
<p>Programs written to the Mini GLX specification should run unchanged
|
||||
on systems with the X Window System and the GLX extension. The intention
|
||||
is to allow flexibility for prototyping and testing.</p>
|
||||
<p>This document serves as both the reference guide and programming
|
||||
guide for Mini GLX.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h1>2. Mini GLX Concepts</h1>
|
||||
<p>The OpenGL specification does not describe how OpenGL rendering
|
||||
contexts and drawing surfaces (i.e. the frame buffer) are created and
|
||||
managed. Rather, this is handled by an OpenGL window system interface,
|
||||
such as Mini GLX.</p>
|
||||
<p>There are three main datatypes or resources managed by Mini GLX. The
|
||||
resources and their corresponding GLX or Xlib data types are:</p>
|
||||
<table cellspacing="10" align="center">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><u>Resource</u></td>
|
||||
<td><u>Data type</u></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>pixel formats</td>
|
||||
<td>X Visual and XVisualInfo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>drawing surfaces</td>
|
||||
<td>X Window or GLXDrawable</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>rendering contexts</td>
|
||||
<td>GLXContext</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Pixel formats or X Visuals describe the per-pixel attributes of the
|
||||
frame buffer. For example, bits per color component, Z buffer size,
|
||||
stencil size, TrueColor vs PseudoColor, etc.</p>
|
||||
<p>Drawing surfaces or X Windows typically describe a spatial
|
||||
allocation of the frame buffer (i.e. the position and size of a
|
||||
rectangular region of pixels). Since MiniGLX doesn't really support a
|
||||
window system, the window is effectively the entire frame buffer.</p>
|
||||
<p>A rendering context represents the current OpenGL state such as
|
||||
current drawing color, line width, blending mode, texture parameters,
|
||||
etc. Several rendering contexts can be created but only one can be in
|
||||
use at any given time.</p>
|
||||
<p>The Mini GLX interface provides all the functions needed for
|
||||
choosing pixel formats, create drawing surfaces, creating rendering
|
||||
contexts and binding rendering contexts to drawing surfaces.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h1>3. Using Mini GLX</h1>
|
||||
<p>To use the Mini GLX interface in your application, include the
|
||||
GL/miniglx.h header file at compile time:</p>
|
||||
<blockquote><code> #include <GL/miniglx.h><br>
|
||||
</code></blockquote>
|
||||
<code></code>Applications should link with libGL.so (i.e. <code>gcc
|
||||
myprogram.o -lGL -o myprogram</code>). libGL.so implements the
|
||||
MiniGLX API functions and, in turn, loads a hardware-specific device
|
||||
driver (such as <code>radeon_dri.so</code>) at runtime. The
|
||||
environment variable <code>LIBGL_DRIVERS_PATH</code> should name the
|
||||
directory where these modules are located.<br>
|
||||
<br>
|
||||
The remainder of this section describes the MiniGLX API functions.<br>
|
||||
<br>
|
||||
<h2>3.1 Initialization</h2>
|
||||
<p>The XOpenDisplay function is used to initialize the graphics system:</p>
|
||||
<blockquote>
|
||||
<pre>Display *XOpenDisplay(const char *displayname)<br></pre>
|
||||
</blockquote>
|
||||
<p>The <code>displayName</code> parameter is currently ignored in Mini
|
||||
GLX. It is recommended that <code>NULL</code> be passed as the<code>displayName</code>
|
||||
parameter.</p>
|
||||
<p>If XOpenDisplay is able to initialize the graphics system a pointer
|
||||
to a Display will be returned. Otherwise, NULL will be returned.</p>
|
||||
<h2>3.2 Choosing a Visual</h2>
|
||||
<p>A visual (i.e. pixel format) must be chosen before a drawing surface
|
||||
or rendering context can be created. This is done with the
|
||||
glXChooseVisual function:</p>
|
||||
<blockquote>
|
||||
<pre>XVisualInfo *glXChooseVisual(Display *dpy, int screen, const int *attribList)<br></pre>
|
||||
</blockquote>
|
||||
<p><code>dpy</code> is a pointer to the display returned by
|
||||
XOpenDisplay. </p>
|
||||
<p><code>screen</code> is currently ignored by Mini GLX and should be
|
||||
zero. </p>
|
||||
<p><code>attribList</code> is a list of GLX attributes which describe
|
||||
the desired pixel format. It is terminated by the token <code>None</code>.
|
||||
The attributes are as follows:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>GLX_USE_GL</code></dt>
|
||||
<dd>This attribute should always be present in order to maintain
|
||||
compatibility with GLX.</dd>
|
||||
<dt><code>GLX_RGBA</code></dt>
|
||||
<dd>If present, only RGBA pixel formats will be considered.
|
||||
Otherwise, only color index formats are considered.</dd>
|
||||
<dt><code>GLX_DOUBLEBUFFER</code></dt>
|
||||
<dd>if present, only double-buffered pixel formats will be chosen.</dd>
|
||||
<dt><code>GLX_RED_SIZE n</code></dt>
|
||||
<dd>Must be followed by a non-negative integer indicating the
|
||||
minimum number of bits per red pixel component that is acceptable.</dd>
|
||||
<dt><code>GLX_GREEN_SIZE n</code></dt>
|
||||
<dd>Must be followed by a non-negative integer indicating the
|
||||
minimum number of bits per green pixel component that is acceptable.</dd>
|
||||
<dt><code>GLX_BLUE_SIZE n</code></dt>
|
||||
<dd>Must be followed by a non-negative integer indicating the
|
||||
minimum number of bits per blue pixel component that is acceptable.</dd>
|
||||
<dt><code>GLX_ALPHA_SIZE n</code></dt>
|
||||
<dd>Must be followed by a non-negative integer indicating the
|
||||
minimum number of bits per alpha pixel component that is acceptable.</dd>
|
||||
<dt><code>GLX_STENCIL_SIZE n</code></dt>
|
||||
<dd>Must be followed by a non-negative integer indicating the
|
||||
minimum number of bits per stencil value that is acceptable.</dd>
|
||||
<dt><code>None</code></dt>
|
||||
<dd>This token is used to terminate the attribute list.</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<p>glXChooseVisual will return a pointer to an XVisualInfo object which
|
||||
most closely matches the requirements of the attribute list. If there
|
||||
is no visual which matches the request, NULL will be returned.</p>
|
||||
<p>Note that visuals with accumulation buffers and depth buffers are
|
||||
not available.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h2>3.3 Creating a Drawing Surface</h2>
|
||||
<p>Drawing surfaces are created as X windows. For Mini GLX,
|
||||
windows are <i>full-screen</i>; they cover the entire frame buffer.
|
||||
Also, Mini GLX imposes a limit of one window. A second window
|
||||
cannot be created until the first one is destroyed.</p>
|
||||
<h3>3.3.1 Window Creation</h3>
|
||||
<p>The XCreateWindow function is used to create a drawing surface:</p>
|
||||
<blockquote>
|
||||
<pre>Window XCreateWindow( Display *display,<br> Window parent,<br> int x, int y,<br> unsigned int width, unsigned int height,<br> unsigned int borderWidth,<br> int depth,<br> unsigned int class,<br> Visual *visual,<br> unsigned long valuemask,<br> XSetWindowAttributes *attributes )<br></pre>
|
||||
</blockquote>
|
||||
<p>The parameters are as follows:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>display</code></dt>
|
||||
<dd>A Display pointer, as returned by XOpenDisplay.</dd>
|
||||
<dt><code>parent</code></dt>
|
||||
<dd>The parent window for the new window. For Mini GLX, this
|
||||
should be<code>RootWindow(dpy, 0)</code>.</dd>
|
||||
<dt><code>x, y</code></dt>
|
||||
<dd>The position of the window. For Mini GLX, both values should
|
||||
be zero.</dd>
|
||||
<dt><code>width, height</code></dt>
|
||||
<dd>The size of the window. For Mini GLX, this specifies the
|
||||
desired screen size such as 1024, 768 or 1280, 1024.</dd>
|
||||
<dt><code>borderWidth</code></dt>
|
||||
<dd>This parameter should be zero.</dd>
|
||||
<dt><code>depth</code></dt>
|
||||
<dd>The pixel depth for the window. For Mini GLX this should be
|
||||
the depth found in the XVisualInfo object returned by <code>glxChooseVisual</code>.</dd>
|
||||
<dt><code>class</code></dt>
|
||||
<dd>The window class. For Mini GLX this value should be <code>InputOutput</code>.</dd>
|
||||
<dt><code>visual</code></dt>
|
||||
<dd>This parameter should be the <code>visual</code> field of the <code>XVisualInfo</code>
|
||||
object returned by <code>glxChooseVisual</code>.</dd>
|
||||
<dt><code>valuemask</code></dt>
|
||||
<dd>This parameter indicates which fields of the <code>XSetWindowAttributes</code>
|
||||
are to be used. For Mini GLX this is typically the bitmask<code>CWBackPixel
|
||||
| CWBorderPixel | CWColormap</code>.</dd>
|
||||
<dt><code>attributes</code></dt>
|
||||
<dd>Initial window attributes. Of the fields in the <code>XSetWindowAttributes</code>
|
||||
structure, the<code>background_pixel</code>, <code>border_pixel</code>
|
||||
and <code>colormap</code> fields should be set. See the discussion
|
||||
below regarding colormaps.</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<p><code>XCreateWindow</code> will return a window handle if it succeeds
|
||||
or zero if it fails.</p>
|
||||
<h3>3.3.2 Window Mapping</h3>
|
||||
<p>To display the window the XMapWindow function must be called:</p>
|
||||
<blockquote>
|
||||
<pre>void XMapWindow(Display *dpy, Window w)</pre>
|
||||
</blockquote>
|
||||
<p>This function does nothing in Mini GLX but is required for Xlib/GLX
|
||||
compatibility</p>
|
||||
<h3>3.3.3 Colormaps<br>
|
||||
</h3>
|
||||
<p>Xlib requires specification of a colormap when creating a window.
|
||||
For purposes of interoperability, Mini GLX requires this as well,
|
||||
though the colormap is not actually used. The XCreateColormap
|
||||
function is used to create a colormap:</p>
|
||||
<blockquote><code>Colormap XCreateColormap(Display *dpy, Window window,
|
||||
Visual *visual, int alloc)</code><br>
|
||||
<code></code></blockquote>
|
||||
<p>The parameters are as follows:<br>
|
||||
</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>dpy</code></dt>
|
||||
<dd>The display handle as returned by XOpenDisplay.</dd>
|
||||
<dt><code>window</code></dt>
|
||||
<dd> This parameter is ignored by Mini GLX but should be the value
|
||||
returned by the <code>RootWindow(dpy, 0)</code> macro.<br>
|
||||
</dd>
|
||||
<dt><code>visual</code></dt>
|
||||
<dd>This parameter is ignored by Mini GLX but should be the visual
|
||||
field of the XVisualInfo object returned by glXChooseVisual. </dd>
|
||||
<dt><code>alloc</code></dt>
|
||||
<dd>This parameter is ignored by Mini GLX but should be set to <code>AllocNone</code>.</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<br>
|
||||
<h2>3.4 Creating a Rendering Context</h2>
|
||||
<p>An OpenGL rendering context is created with the <code>glXCreateContext</code>
|
||||
function:</p>
|
||||
<blockquote>
|
||||
<pre>GLXContext glXCreateContext(Display *dpy, XVisualInfo *visInfo, GLXContext shareList, Bool direct)<br></pre>
|
||||
</blockquote>
|
||||
<p>The parameters are as follows:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>dpy</code></dt>
|
||||
<dd>The display handle as returned by XOpenDisplay.</dd>
|
||||
<dt><code>visInfo</code></dt>
|
||||
<dd>The visual as returned by glXChooseVisual.</dd>
|
||||
<dt><code>shareList</code></dt>
|
||||
<dd>If non-zero, texture objects and display lists are shared with
|
||||
the named rendering context. If zero, texture objects and display lists
|
||||
will (initially) be private to this context. They may be shared when a
|
||||
subsequent context is created.</dd>
|
||||
<dt><code>direct</code></dt>
|
||||
<dd>Specifies whether direct or indirect rendering is desired. For
|
||||
Mini GLX this value is ignored but it should be set to <code>True</code>.</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<p><code>glXCreateContext</code> will return a GLXContext handle if it
|
||||
succeeds or zero if it fails due to invalid parameter or insufficient
|
||||
resources.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h2>3.5 Binding a Rendering Context</h2>
|
||||
<p>The final step before beginning OpenGL rendering is to bind (i.e.
|
||||
activate) a rendering context and drawing surface with the
|
||||
glXMakeCurrent function:</p>
|
||||
<blockquote>
|
||||
<pre>Bool glXMakeCurrent(Display *dpy, GLXDrawable drawable, GLXContext ctx)<br></pre>
|
||||
</blockquote>
|
||||
<p>The parameters are as follows:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>dpy</code></dt>
|
||||
<dd>The display handle, as returned by XOpenDisplay.</dd>
|
||||
<dt><code>drawable</code></dt>
|
||||
<dd>The window or drawable to bind to the rendering context. This
|
||||
should be the value returned by XCreateWindow.</dd>
|
||||
<dt><code>ctx</code></dt>
|
||||
<dd>The rendering context to bind, as returned by glXCreateContext.</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<p>If glXMakeCurrent succeeds True is returned. Otherwise False is
|
||||
returned to indicate an invalid display, window or context parameter.</p>
|
||||
<p>After the rendering context has been bound to the drawing surface
|
||||
OpenGL rendering can begin.</p>
|
||||
<p>The current rendering context may be unbound by calling
|
||||
glXMakeCurrent with the window and context parameters set to zero.</p>
|
||||
<p>An application may create any number of rendering contexts and bind
|
||||
them as needed. Note that binding a rendering context is generally not a
|
||||
light-weight operation. Most simple OpenGL applications create
|
||||
only one rendering context.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h2>3.6 Color Buffer Swapping</h2>
|
||||
<p>A double buffered window has two color buffers: a front buffer and a
|
||||
back buffer. Normally, rendering is directed to the back buffer while
|
||||
the front buffer is displayed. When rendering of a frame is finished
|
||||
the front and back buffers are swapped to provide the illusion of
|
||||
instanteous screen updates.</p>
|
||||
<p>The color buffers for a particular window (i.e. drawable) may be
|
||||
swapped with the glXSwapBuffers command:</p>
|
||||
<blockquote>
|
||||
<pre>void glXSwapBuffers(Display *dpy, GLXDrawable drawable)<br></pre>
|
||||
</blockquote>
|
||||
Any pending rendering commands will be completed before the buffer swap
|
||||
takes place.<br>
|
||||
<br>
|
||||
Calling glXSwapBuffers on a window which is single-buffered has no
|
||||
effect.<br>
|
||||
<br>
|
||||
<h2>3.7 Releasing Resources</h2>
|
||||
<h3>3.7.1 Releasing Rendering Contexts</h3>
|
||||
<p>A rendering context may be destroyed by calling glXDestroyContext:</p>
|
||||
<blockquote>
|
||||
<pre>void glXDestroyContext(Display *dpy, GLXContext ctx)<br></pre>
|
||||
</blockquote>
|
||||
<h3>3.7.2 Releasing Windows</h3>
|
||||
<p>A window may be destroyed by calling XDestroyWindow:</p>
|
||||
<blockquote>
|
||||
<pre>void XDestroyWindow(Display *dpy, Window window)<br></pre>
|
||||
</blockquote>
|
||||
<h3>3.7.3 Releasing Visuals</h3>
|
||||
<p>An XVisualInfo object may be freed by calling XFree:</p>
|
||||
<blockquote>
|
||||
<pre>void XFree(void *data)<br></pre>
|
||||
</blockquote>
|
||||
<h3>3.7.4 Releasing Colormaps</h3>
|
||||
<p>A colormap may be freed by calling XFreeColormap:</p>
|
||||
<blockquote>
|
||||
<pre>void XFreeColormap(Display *dpy, Colormap colormap)<br></pre>
|
||||
</blockquote>
|
||||
<h3>3.7.4 Releasing Display Resources</h3>
|
||||
<p>When the application is about to exit, the resources associated with
|
||||
the graphics system can be released by calling XCloseDisplay:</p>
|
||||
<blockquote>
|
||||
<pre>void XCloseDisplay(Display *dpy)<br></pre>
|
||||
</blockquote>
|
||||
<p>The display handle becomes invalid at this point.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h2>3.8 Query Functions</h2>
|
||||
<h3>3.8.1 Querying Available Visuals</h3>
|
||||
A list of all available visuals can be obtained with the XGetVisualInfo
|
||||
function:<br>
|
||||
<br>
|
||||
<div style="margin-left: 40px;"><code>XVisualInfo
|
||||
*XGetVisualInfo(Display *dpy, long vinfo_mask, XVisualInfo
|
||||
*vinfo_template, int *nitems_return)<br>
|
||||
</code></div>
|
||||
<br>
|
||||
The parameters are as follows:<br>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>dpy</code></dt>
|
||||
<dd>The display handle, as returned by XOpenDisplay.</dd>
|
||||
<dt><code>vinfo_mask</code></dt>
|
||||
<dd>A bitmask indicating which fields of the vinfo_template are to
|
||||
be matched. The value must be VisualScreenMask.</dd>
|
||||
<dt><code>vinfo_template</code></dt>
|
||||
<dd>A template whose fields indicate which visual attributes must
|
||||
be matched by the results. The screen field of this structure must
|
||||
be zero.</dd>
|
||||
<dt><code>nitems_return</code></dt>
|
||||
<dd>Returns the number of visuals returned. </dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
The return value is the address of an array of all available visuals.<br>
|
||||
<br>
|
||||
An example of using XGetVisualInfo to get all available visuals follows:<br>
|
||||
<br>
|
||||
<div style="margin-left: 40px;"><code>XVisualInfo visTemplate, *results;</code><br>
|
||||
<code>int numVisuals;</code><br>
|
||||
<code>Display *dpy = XOpenDisplay(NULL);</code><br>
|
||||
<code>visTemplate.screen = 0;</code><br>
|
||||
<code>results = XGetVisualInfo(dpy, VisualScreenMask, &visTemplate,
|
||||
&numVisuals);</code><br>
|
||||
<code></code></div>
|
||||
<br>
|
||||
<h3>3.8.2 Querying Visual Attributes</h3>
|
||||
<p>The GLX attributes of an X visual may be queried with the
|
||||
glXGetConfig function:</p>
|
||||
<blockquote>
|
||||
<pre>int glXGetConfig(Display *dpy, XVisualInfo *vis, int attribute, int *value)<br></pre>
|
||||
</blockquote>
|
||||
<p>The parameters are as follows:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>dpy</code></dt>
|
||||
<dd>The display handle, as returned by XOpenDisplay.</dd>
|
||||
<dt><code>vis</code></dt>
|
||||
<dd>The visual, as returned by glXChooseVisual.</dd>
|
||||
<dt><code>attribute</code></dt>
|
||||
<dd>The attribute to query. The attributes are listed below.</dd>
|
||||
<dt><code>value</code></dt>
|
||||
<dd>Pointer to an integer in which the result of the query will be
|
||||
stored. </dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<p>The return value will be zero if no error occurs.<code>
|
||||
GLX_INVALID_ATTRIBUTE</code> will be returned if the attribute
|
||||
parameter is invalid.<code> GLX_BAD_VISUAL</code> will be returned
|
||||
if the XVisualInfo parameter is invalid.</p>
|
||||
<p>The following attributes may be queried:</p>
|
||||
<blockquote>
|
||||
<dl>
|
||||
<dt><code>GLX_USE_GL</code></dt>
|
||||
<dd>The result will be <code>True</code> or <code>False</code> to
|
||||
indicate if OpenGL rendering is supported with the visual. Mini GLX
|
||||
always return <code>True</code>.</dd>
|
||||
<dt><code>GLX_RGBA</code></dt>
|
||||
<dd>The result will be <code>True</code> for RGBA visuals or <code>False</code>
|
||||
for color index visuals.</dd>
|
||||
<dt><code>GLX_DOUBLEBUFFER</code></dt>
|
||||
<dd>The result will be <code>True</code> if the visual has two
|
||||
color buffers or <code>False</code> if the visual has one color buffer.</dd>
|
||||
<dt><code>GLX_RED_SIZE</code></dt>
|
||||
<dd>The result will be the number of red bits per pixel.</dd>
|
||||
<dt><code>GLX_GREEN_SIZE</code></dt>
|
||||
<dd>The result will be the number of green bits per pixel.</dd>
|
||||
<dt><code>GLX_BLUE_SIZE</code></dt>
|
||||
<dd>The result will be the number of blue bits per pixel.</dd>
|
||||
<dt><code>GLX_ALPHA_SIZE</code></dt>
|
||||
<dd>The result will be the number of alpha bits per pixel.</dd>
|
||||
<dt><code>GLX_DEPTH_SIZE</code></dt>
|
||||
<dd>The result will be the number of bits per Z value.</dd>
|
||||
<dt><code>GLX_STENCIL_SIZE</code></dt>
|
||||
<dd>The result will be the number of bits per stencil value.<br>
|
||||
<br>
|
||||
</dd>
|
||||
</dl>
|
||||
</blockquote>
|
||||
<h3>3.8.3 Querying the Current Rendering Context</h3>
|
||||
<p>The current rendering context can be queried with
|
||||
glXGetCurrentContext: </p>
|
||||
<blockquote>
|
||||
<pre>GLXContext glXGetCurrentContext(void)<br></pre>
|
||||
</blockquote>
|
||||
<p>Zero will be returned if no context is currently bound.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h3>3.8.4 Querying the Current Drawable</h3>
|
||||
<p>The current drawable (i.e. window or drawing surface) can be queried
|
||||
with glXGetCurrentDrawable:</p>
|
||||
<blockquote>
|
||||
<pre>GLXDrawable glXGetCurrentDrawable(void)<br></pre>
|
||||
</blockquote>
|
||||
<p>Zero will be returned if no drawable is currently bound.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h3>3.8.5 Function Address Queries</h3>
|
||||
<p>The glXGetProcAddress function will return the address of any
|
||||
available OpenGL or Mini GLX function:</p>
|
||||
<blockquote>
|
||||
<pre>void *glXGetProcAddress(const GLubyte *procName)<br></pre>
|
||||
</blockquote>
|
||||
<p>If <code>procName</code> is a valid function name, a pointer to that
|
||||
function will be returned. Otherwise, NULL will be returned.</p>
|
||||
<p>The purpose of glXGetProcAddress is to facilitate using future
|
||||
extensions to OpenGL or Mini GLX. If a future version of the library
|
||||
adds new extension functions they'll be accessible via
|
||||
glXGetProcAddress. The alternative is to hard-code calls to the new
|
||||
functions in the application but doing so will prevent linking the
|
||||
application with older versions of the library.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h2>3.9 Versioning</h2>
|
||||
The Mini GLX version can be queried at run time with glXQueryVersion:
|
||||
<blockquote>
|
||||
<pre>Bool glXQueryVersion(Display *dpy, int *major, int *minor)<br></pre>
|
||||
</blockquote>
|
||||
<p><code>major</code> will be set to the major version number and<code>minor</code>
|
||||
will be set to the minor version number.<code>True</code> will be
|
||||
returned if the function succeeds. <code>False</code> will be returned
|
||||
if the function fails due to invalid parameters. The <code>dpy</code>
|
||||
argument is currently ignored, but should be the value returned by
|
||||
XOpenDisplay.</p>
|
||||
<p>At compile time, the Mini GLX interface version can be tested with
|
||||
the MINI_GLX_VERSION_1_<i>x</i> preprocessor tokens. For example, if
|
||||
version 1.0 of Mini GLX is supported, then<code> MINI_GLX_VERSION_1_0</code>
|
||||
will be defined. If version 1.1 of Mini GLX is supported, then<code>
|
||||
MINI_GLX_VERSION_1_1</code> will be defined.</p>
|
||||
<p>At the time of writing the current Mini GLX version is 1.0.<br>
|
||||
<br>
|
||||
</p>
|
||||
<h1>4.0 Interoperability with GLX and Xlib</h1>
|
||||
While Mini GLX strives to be compatible with GLX and Xlib there are
|
||||
some unavoidable differences which must be taken into consideration.<br>
|
||||
<h2>4.1 Public vs Private Structures</h2>
|
||||
The structure of many X data types is public. For example, the <code>Display</code>
|
||||
data type is defined as a structure in /usr/include/X11/Xlib.h and
|
||||
programmers may access any fields of that structure at will. Mini
|
||||
GLX also defines a Display data type but its fields are hidden and not
|
||||
visiblein <code>miniglx.h</code>. Duplicating the Xlib
|
||||
declaration for the <code>Display</code> data type in minigl.h would
|
||||
require defining a large number of other superfluous Xlib datatypes.<br>
|
||||
<br>
|
||||
Mini GLX users are discouraged from directly accessing the fields of
|
||||
Xlib data types to maximize portability - though this is unavoidable to
|
||||
some extent. For example, the <code>XVisualInfo</code> and <code>XSetWindowAtttributes</code>
|
||||
data types must be completely public.
|
||||
<h2>4.2 Macros</h2>
|
||||
In some cases, Xlib defines macros which are meant to be used instead
|
||||
of direct structure accesses. For example, the <code>RootWindow(dpy,
|
||||
screen)</code> macro returns the root window for a given screen on a
|
||||
given display. Unfortunately, macros do nothing to aid in ABI
|
||||
compatibility since they are resolved at compile time instead of at
|
||||
link/run time.<br>
|
||||
<br>
|
||||
Mini GLX also defines a <code>RootWindow</code> macro since it's
|
||||
essential for creating windows. But the implementation of this
|
||||
macro by Xlib and Mini GLX is completely different.<br>
|
||||
<h2>4.3 Summary</h2>
|
||||
Because Xlib and Mini GLX define data types and macros differently,
|
||||
Mini GLX applications must be recompiled when retargeting Mini GLX or
|
||||
native Xlib/GLX. That is, applications can't simply be re-linked
|
||||
because of ABI incompatibilities.<br>
|
||||
<br>
|
||||
Nevertheless, the fact that Mini GLX programs can be recompiled for
|
||||
Xlib and GLX increases portability and flexibility for testing and
|
||||
prototyping.<br>
|
||||
<br>
|
||||
<h1>5.0 Example Program</h1>
|
||||
<p>This section shows an example program which uses the Mini GLX
|
||||
interface. The program simply draws several frames of a rotating square.<br>
|
||||
</p>
|
||||
<p>The program may be compiled for use with Xlib/GLX or Mini GLX by
|
||||
setting the <code>USE_MINIGLX</code> token to 0 or 1, respectively.
|
||||
Note that the only difference is the header files which are
|
||||
included.<br>
|
||||
</p>
|
||||
<p> </p>
|
||||
<pre><code><br></code>#define USE_MINIGLX 1 /* 1 = use Mini GLX, 0 = use Xlib/GLX */<br><br>#include <stdio.h><br>#include <stdlib.h><br>#include <GL/gl.h><br><br>#if USE_MINIGLX<br>#include <GL/miniglx.h><br>#else<br>#include <GL/glx.h><br>#include <X11/Xlib.h><br>#endif<br><br><code>/*<br> * Create a simple double-buffered RGBA window.<br> */<br>static Window<br>MakeWindow(Display * dpy, unsigned int width, unsigned int height)<br>{<br> int visAttributes[] = {<br> GLX_RGBA,<br> GLX_RED_SIZE, 1,<br> GLX_GREEN_SIZE, 1,<br> GLX_BLUE_SIZE, 1,<br> GLX_DOUBLEBUFFER,<br> None<br> };<br> XSetWindowAttributes attr;<br> unsigned long attrMask;<br> Window root;<br> Window win;<br> GLXContext ctx;<br> XVisualInfo *visinfo;<br><br> root = RootWindow(dpy, 0);<br><br> /* Choose GLX visual / pixel format */<br> visinfo = glXChooseVisual(dpy, 0, visAttributes);<br> if (!visinfo) {<br> printf("Error: couldn't get an RGB, Double-buffered visual\n");<br> exit(1);<br> }<br><br> /* Create the window */<br> attr.background_pixel = 0;<br> attr.border_pixel = 0;<br> attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);<br> attrMask = CWBackPixel | CWBorderPixel | CWColormap;<br> win = XCreateWindow(dpy, root, 0, 0, width, height,<br> 0, visinfo->depth, InputOutput,<br> visinfo->visual, attrMask, &attr);<br> if (!win) {<br> printf("Error: XCreateWindow failed\n");<br> exit(1);<br> }<br><br> /* Display the window */<br> XMapWindow(dpy, win);<br><br> /* Create GLX rendering context */<br> ctx = glXCreateContext(dpy, visinfo, NULL, True);<br> if (!ctx) {<br> printf("Error: glXCreateContext failed\n");<br> exit(1);<br> }<br><br> /* Bind the rendering context and window */<br> glXMakeCurrent(dpy, win, ctx);<br><br> return win;<br>}<br><br><br>/*<br> * Draw a few frames of a rotating square.<br> */<br>static void<br>DrawFrames(Display * dpy, Window win)<br>{<br> int angle;<br> glShadeModel(GL_FLAT);<br> glClearColor(0.5, 0.5, 0.5, 1.0);<br> for (angle = 0; angle < 360; angle += 10) {<br> glClear(GL_COLOR_BUFFER_BIT);<br> glColor3f(1.0, 1.0, 0.0);<br> glPushMatrix();<br> glRotatef(angle, 0, 0, 1);<br> glRectf(-0.8, -0.8, 0.8, 0.8);<br> glPopMatrix();<br> glXSwapBuffers(dpy, win);<br> }<br>}<br><br><br>int<br>main(int argc, char *argv[])<br>{<br> Display *dpy;<br> Window win;<br><br> dpy = XOpenDisplay(NULL);<br> if (!dpy) {<br> printf("Error: XOpenDisplay failed\n");<br> return 1;<br> }<br><br> win = MakeWindow(dpy, 300, 300);<br><br> DrawFrames(dpy, win);<br><br> return 0;<br>}<br></code></pre>
|
||||
<br>
|
||||
</body>
|
||||
</html>
|
||||
124
docs/README.D3D
124
docs/README.D3D
|
|
@ -1,124 +0,0 @@
|
|||
|
||||
DirectX 6 Driver for Mesa 3.0
|
||||
|
||||
|
||||
This software is distributed under the terms of the GNU Library
|
||||
General Public License, see the LICENSE file for details.
|
||||
|
||||
|
||||
|
||||
What do you need ?
|
||||
------------------
|
||||
|
||||
- A PC with a DirectX 6 video driver installed.
|
||||
|
||||
- Mesa 3.0
|
||||
|
||||
- The 3Dfx Glide library 2.3 or later for your OS (the 2.4 works fine).
|
||||
The Voodoo2 requires the Glide library 2.51. The Glide 3.0 is not
|
||||
compatible with the Glide 2.x so it doesn't work with the current
|
||||
version of the driver;
|
||||
|
||||
- Visual C++ 5.0 is only compiler test but others should be ok with
|
||||
changes to the makefiles (CFLAGS/LFLAGS).
|
||||
|
||||
- DirectX 6 SDK (was a MS download but not sure if still available).
|
||||
|
||||
- SoftIce or another debugger that will get DPF's is nice.
|
||||
|
||||
|
||||
Tested on:
|
||||
----------
|
||||
Windows 95
|
||||
Windows 98
|
||||
Windows NT 5.0 (beta 2)
|
||||
|
||||
|
||||
What is able to do ?
|
||||
--------------------
|
||||
|
||||
- the driver will try and use DirectX to rasterize the OpenGL primitives
|
||||
that are sent to the driver. The driver will fall back to SW if the rendering
|
||||
context is too big. The fallback to SW still uses DirectDraw. If the driver
|
||||
fails to support and operation (accum, stencil, etc) then it will try and get
|
||||
Mesa to render it in SW. DirectX 6 features that are unsupported by the
|
||||
installed DirectX 6 driver will be mapped to some other best fit feature.
|
||||
|
||||
|
||||
How to compile:
|
||||
---------------
|
||||
|
||||
These instructions assume you have Visual C++ installed.
|
||||
|
||||
You might need to increase you enviroment space. You can do this by
|
||||
adding the following statement to you config.sys.
|
||||
|
||||
shell=C:\COMMAND.COM C:\ /p /e:8198
|
||||
|
||||
Next setup you compiler enviroment by running vcvars32.bat in the Visual C++
|
||||
'bin' directoy.
|
||||
|
||||
c:\DevStudio\VC\bin\vcvars32.bat
|
||||
|
||||
Modify the D3D makefile to point at your SDK install. Example has the SDK
|
||||
installed on my 'f' drive in the root.
|
||||
|
||||
file: \Mesa-3.0\src\makefile.d3d
|
||||
|
||||
SDKROOT=f:\mssdk
|
||||
|
||||
Now you can simply make the project. If you look in the makefile you can see
|
||||
I have some different targets like 'install'.
|
||||
|
||||
nmake /f makefile.d3d
|
||||
|
||||
|
||||
FAQ:
|
||||
----
|
||||
|
||||
1) I don't think the driver is using my DirectX driver.
|
||||
|
||||
This maybe true as the current version will only select the Primary D3D driver
|
||||
installed. If you 3D card is the secondary (3dfx) then your out of luck for this
|
||||
release.
|
||||
|
||||
2) The driver seems like its not HW accelerated.
|
||||
|
||||
If you have a video card with limited memory then you might want to try and
|
||||
change your destop resolution to a low setting (640x480x16) so that the 3D part
|
||||
of the card has more resources. Remeber the driver can't make the card better...
|
||||
|
||||
3) Nothing works.
|
||||
|
||||
Make sure you have a DirectX '6' driver installed. Check you driver docs for this
|
||||
info or use the SDK info utilities.
|
||||
The final 'dll' is named opengl32.dll and is either in the same directory as the
|
||||
OpenGL program or in your system directory (x:\windows\system or x:\winnt\system32).
|
||||
Check your destop resolution. Most DirectX 6 drivers will only support 16bit and
|
||||
32bit color depth. To find out for sure you can check the DirectX Info Viewer in
|
||||
the SDK.
|
||||
|
||||
|
||||
4) Rendering doesn't look right.
|
||||
|
||||
Sometimes this is because the card doesn't support a feature that that is required.
|
||||
This is usually due to unsupported alpha functions (test/blend) or texture mapping.
|
||||
Some cards suffer from too small of an alpha channel. The driver does its best to
|
||||
fallback on unsupported features. This is not to say the driver may not have a bug(s).
|
||||
|
||||
5) Textures look bad.
|
||||
|
||||
No mipmapping in this release.
|
||||
|
||||
|
||||
Thanks to:
|
||||
----------
|
||||
|
||||
Brian Paul
|
||||
|
||||
|
||||
|
||||
|
||||
Leigh McRae (leigh@altsoftware.com)
|
||||
February 9, 1999
|
||||
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
|
||||
Mesa DirectFB Information
|
||||
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
To build Mesa with DirectFB (DirectFBGL) support you need:
|
||||
- DirectFB at least 1.0.0 (http://directfb.org)
|
||||
- pkg-config at least 0.9 (http://pkgconfig.sf.net)
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
Run
|
||||
|
||||
make linux-directfb
|
||||
|
||||
to build Mesa and DirectFBGL module,
|
||||
|
||||
make install
|
||||
|
||||
to install OpenGL libraries and
|
||||
|
||||
cd src/mesa/drivers/directfb ; make install
|
||||
|
||||
to install DirectFBGL module in the proper location.
|
||||
Actually, that last command may not be needed. Please provide feedback.
|
||||
|
||||
|
|
@ -92,7 +92,6 @@ a:visited {
|
|||
<li><a href="modelers.html" target="MainFrame">Modeling and Rendering</a>
|
||||
<li><a href="science.html" target="MainFrame">Science and Technical</a>
|
||||
<li><a href="utility.html" target="MainFrame">Utilities</a>
|
||||
<li><a href="demos.html" target="MainFrame">Demos / other</a>
|
||||
</ul>
|
||||
|
||||
<b>Hosted by:</b>
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
<HTML>
|
||||
|
||||
<TITLE>Demos</TITLE>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<H1>Demos</H1>
|
||||
|
||||
|
||||
<ul>
|
||||
<li><a href="http://www.geocities.com/shobhand/homepage.html">Shobhan Dutta's Geartrain and Walkthrough Demos</a>
|
||||
</li></ul>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -107,7 +107,7 @@ Global variables are not allowed.
|
|||
Function name examples:
|
||||
</p>
|
||||
<pre>
|
||||
glFooBar() - a public GL entry point (in dispatch.c)
|
||||
glFooBar() - a public GL entry point (in glapi_dispatch.c)
|
||||
_mesa_FooBar() - the internal immediate mode function
|
||||
save_FooBar() - retained mode (display list) function in dlist.c
|
||||
foo_bar() - a static (private) function
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@ few preprocessor defines.</p>
|
|||
<li>If <tt>GLX_USE_TLS</tt> is defined, method #4 is used.</li>
|
||||
<li>If <tt>PTHREADS</tt> is defined, method #3 is used.</li>
|
||||
<li>If any of <tt>PTHREADS</tt>,
|
||||
<tt>SOLARIS_THREADS</tt>, <tt>WIN32_THREADS</tt>, or <tt>BEOS_THREADS</tt>
|
||||
<tt>WIN32_THREADS</tt>, or <tt>BEOS_THREADS</tt>
|
||||
is defined, method #2 is used.</li>
|
||||
<li>If none of the preceeding are defined, method #1 is used.</li>
|
||||
</ul>
|
||||
|
|
@ -244,8 +244,8 @@ isn't a significant problem.</p>
|
|||
system. There are two steps to this. The file must first be added to
|
||||
<tt>src/mesa/sources</tt>. That gets the file built and linked. The second
|
||||
step is to add the correct <tt>#ifdef</tt> magic to
|
||||
<tt>src/mesa/main/dispatch.c</tt> to prevent the C version of the dispatch
|
||||
functions from being built.</p>
|
||||
<tt>src/mesa/glapi/glapi_dispatch.c</tt> to prevent the C version of the
|
||||
dispatch functions from being built.</p>
|
||||
|
||||
<A NAME="fixedsize"/>
|
||||
<H3>3.4. Fixed-Length Dispatch Stubs</H3>
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ To build Mesa with SCons for Windows on Linux using the MinGW crosscompiler tool
|
|||
This will create:
|
||||
</p>
|
||||
<ul>
|
||||
<li>build/windows-x86-debug/gallium/winsys/gdi/opengl32.dll — Mesa + Gallium + softpipe, binary compatible with Windows's opengl32.dll
|
||||
<li>build/windows-x86-debug/gallium/targets/libgl-gdi/opengl32.dll — Mesa + Gallium + softpipe, binary compatible with Windows's opengl32.dll
|
||||
<li>build/windows-x86-debug/glut/glx/glut32.dll
|
||||
<li>progs/build/windows-x86-debug/wgl/wglinfo.exe
|
||||
<li>progs/build/windows-x86-debug/trivial/tri.exe
|
||||
|
|
|
|||
|
|
@ -36,7 +36,9 @@ tbd
|
|||
<ul>
|
||||
<li>GL_NV_conditional_render extension (swrast driver only)
|
||||
<li>GL_EXT_draw_buffers2 extension (swrast and i965 driver only)
|
||||
<li>GL_ARB_fragment_coord_conventions extension (for swrast and Gallium drivers)
|
||||
<li>GL_ARB_fragment_coord_conventions extension (for swrast, i965, and Gallium drivers)
|
||||
<li>GL_EXT_texture_array extension (swrast driver only)
|
||||
<li>GL_APPLE_object_purgeable extension (swrast and i945/i965 DRI drivers)
|
||||
<li>Much improved support for <a href="egl.html">EGL in Mesa</a>
|
||||
<li>New state trackers for <a href="opengles.html">OpenGL ES 1.1 and 2.0</a>
|
||||
<li>Dedicated documentation for Gallium
|
||||
|
|
@ -52,7 +54,8 @@ tbd
|
|||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
<li>TBD
|
||||
<li>Removed support for color-index rendering</li>
|
||||
<li>Removed support for GCC versions earlier than 3.3.0.</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
|
|
|
|||
50
docs/relnotes-7.9.html
Normal file
50
docs/relnotes-7.9.html
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.9 Release Notes / date TBD</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.9 is a new development release.
|
||||
People who are concerned with stability and reliability should stick
|
||||
with a previous release or wait for Mesa 7.9.1.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.9 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>
|
||||
tbd
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<ul>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Changes</h2>
|
||||
<ul>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -13,7 +13,6 @@ The release notes summarize what's new or changed in each Mesa release.
|
|||
</p>
|
||||
|
||||
<UL>
|
||||
<<<<<<< HEAD:docs/relnotes.html
|
||||
<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>
|
||||
<LI><A HREF="relnotes-7.7.html">7.7 release notes</A>
|
||||
|
|
|
|||
|
|
@ -22,8 +22,7 @@ full: $(FULL:.doxy=.tag)
|
|||
|
||||
SUBSET = \
|
||||
main.doxy \
|
||||
math.doxy \
|
||||
miniglx.doxy
|
||||
math.doxy
|
||||
|
||||
subset: $(SUBSET:.doxy=.tag)
|
||||
$(foreach FILE,$(SUBSET),doxygen $(FILE);)
|
||||
|
|
|
|||
|
|
@ -1,179 +0,0 @@
|
|||
# Doxyfile 0.1
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# General configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
PROJECT_NAME = "MiniGLX"
|
||||
PROJECT_NUMBER =
|
||||
OUTPUT_DIRECTORY =
|
||||
OUTPUT_LANGUAGE = English
|
||||
EXTRACT_ALL = NO
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = YES
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = NO
|
||||
STRIP_FROM_PATH =
|
||||
INTERNAL_DOCS = YES
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
CASE_SENSE_NAMES = YES
|
||||
SHORT_NAMES = NO
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
VERBATIM_HEADERS = NO
|
||||
SHOW_INCLUDE_FILES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
INHERIT_DOCS = YES
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = NO
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
TAB_SIZE = 8
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
ALIASES =
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
SHOW_USED_FILES = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = YES
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = NO
|
||||
WARN_FORMAT =
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = ../src/glx/mini/ ../include/GL/miniglx.h
|
||||
FILE_PATTERNS = *.h *.c
|
||||
RECURSIVE = NO
|
||||
EXCLUDE = ../src/glx/mini/glapi.c
|
||||
EXCLUDE_PATTERNS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH =
|
||||
INPUT_FILTER =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
REFERENCED_BY_RELATION = YES
|
||||
REFERENCES_RELATION = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = miniglx
|
||||
HTML_HEADER = header_subset.html
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
GENERATE_HTMLHELP = NO
|
||||
GENERATE_CHI = NO
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = NO
|
||||
TREEVIEW_WIDTH = 250
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = NO
|
||||
LATEX_OUTPUT =
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = NO
|
||||
USE_PDFLATEX = NO
|
||||
LATEX_BATCHMODE = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT =
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT =
|
||||
MAN_EXTENSION =
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH = ../include/
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED =
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::addtions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES = \
|
||||
core_subset.tag=../core_subset \
|
||||
math_subset.tag=../math_subset
|
||||
GENERATE_TAGFILE = miniglx.tag
|
||||
ALLEXTERNALS = NO
|
||||
PERL_PATH =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = NO
|
||||
HAVE_DOT = NO
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
TEMPLATE_RELATIONS = YES
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS =
|
||||
MAX_DOT_GRAPH_WIDTH = 1024
|
||||
MAX_DOT_GRAPH_HEIGHT = 1024
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::addtions related to the search engine
|
||||
#---------------------------------------------------------------------------
|
||||
SEARCHENGINE = NO
|
||||
CGI_NAME =
|
||||
CGI_URL =
|
||||
DOC_URL =
|
||||
DOC_ABSPATH =
|
||||
BIN_ABSPATH =
|
||||
EXT_DOC_PATHS =
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
GLincludedir = $(includedir)/GL
|
||||
|
||||
INC_GGI = ggimesa.h
|
||||
INC_OSMESA = osmesa.h
|
||||
INC_SVGA = svgamesa.h
|
||||
INC_X11 = glx.h glxext.h glx_mangle.h
|
||||
INC_GLUT = glut.h glutf90.h
|
||||
|
||||
if HAVE_GGI
|
||||
sel_inc_ggi = $(INC_GGI)
|
||||
endif
|
||||
|
||||
if HAVE_OSMESA
|
||||
sel_inc_osmesa = $(INC_OSMESA)
|
||||
endif
|
||||
|
||||
if HAVE_SVGA
|
||||
sel_inc_svga = $(INC_SVGA)
|
||||
endif
|
||||
|
||||
if HAVE_X11
|
||||
sel_inc_x11 = $(INC_X11)
|
||||
endif
|
||||
|
||||
if NEED_GLUT
|
||||
sel_inc_glut = $(INC_GLUT)
|
||||
endif
|
||||
|
||||
EXTRA_HEADERS = amesa.h dosmesa.h foomesa.h glut_h.dja mesa_wgl.h mglmesa.h \
|
||||
vms_x_fix.h wmesa.h \
|
||||
$(INC_GGI) $(INC_OSMESA) $(INC_SVGA) $(INC_X11) $(INC_GLUT)
|
||||
|
||||
GLinclude_HEADERS = gl.h glext.h gl_mangle.h glu.h glu_mangle.h \
|
||||
$(sel_inc_ggi) $(sel_inc_osmesa) $(sel_inc_svga) \
|
||||
$(sel_inc_x11) $(sel_inc_glut)
|
||||
include $(top_srcdir)/common_rules.make
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
/*
|
||||
(c) Copyright 2001 convergence integrated media GmbH.
|
||||
All rights reserved.
|
||||
|
||||
Written by Denis Oliver Kropp <dok@convergence.de> and
|
||||
Andreas Hundt <andi@convergence.de>.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __DIRECTFBGL_H__
|
||||
#define __DIRECTFBGL_H__
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
int buffer_size;
|
||||
int depth_size;
|
||||
int stencil_size;
|
||||
int aux_buffers;
|
||||
|
||||
int red_size;
|
||||
int green_size;
|
||||
int blue_size;
|
||||
int alpha_size;
|
||||
|
||||
int accum_red_size;
|
||||
int accum_green_size;
|
||||
int accum_blue_size;
|
||||
int accum_alpha_size;
|
||||
|
||||
DFBBoolean double_buffer;
|
||||
DFBBoolean stereo;
|
||||
} DFBGLAttributes;
|
||||
|
||||
|
||||
DEFINE_INTERFACE( IDirectFBGL,
|
||||
|
||||
/** Context handling **/
|
||||
|
||||
/*
|
||||
* Acquire the hardware lock.
|
||||
*/
|
||||
DFBResult (*Lock) (
|
||||
IDirectFBGL *thiz
|
||||
);
|
||||
|
||||
/*
|
||||
* Release the lock.
|
||||
*/
|
||||
DFBResult (*Unlock) (
|
||||
IDirectFBGL *thiz
|
||||
);
|
||||
|
||||
/*
|
||||
* Query the OpenGL attributes.
|
||||
*/
|
||||
DFBResult (*GetAttributes) (
|
||||
IDirectFBGL *thiz,
|
||||
DFBGLAttributes *attributes
|
||||
);
|
||||
)
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.1
|
||||
*
|
||||
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, 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
|
||||
* BRIAN PAUL 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver for Mesa
|
||||
*
|
||||
* Author: Daniel Borca
|
||||
* Email : dborca@users.sourceforge.net
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#ifndef DMESA_H_included
|
||||
#define DMESA_H_included
|
||||
|
||||
#define DMESA_MAJOR_VERSION 6
|
||||
#define DMESA_MINOR_VERSION 5
|
||||
|
||||
/* Sample Usage:
|
||||
*
|
||||
* 1. Call DMesaCreateVisual() to initialize graphics.
|
||||
* 2. Call DMesaCreateContext() to create a DMesa rendering context.
|
||||
* 3. Call DMesaCreateBuffer() to define the window.
|
||||
* 4. Call DMesaMakeCurrent() to bind the DMesaBuffer to a DMesaContext.
|
||||
* 5. Make gl* calls to render your graphics.
|
||||
* 6. Use DMesaSwapBuffers() when double buffering to swap front/back buffers.
|
||||
* 7. Before exiting, destroy DMesaBuffer, DMesaContext and DMesaVisual.
|
||||
*/
|
||||
|
||||
typedef struct dmesa_context *DMesaContext;
|
||||
typedef struct dmesa_visual *DMesaVisual;
|
||||
typedef struct dmesa_buffer *DMesaBuffer;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Create a new Visual and set graphics mode.
|
||||
*/
|
||||
DMesaVisual DMesaCreateVisual (GLint width, /* X res */
|
||||
GLint height, /* Y res */
|
||||
GLint colDepth, /* BPP */
|
||||
GLint refresh, /* refresh rate: 0=default */
|
||||
GLboolean dbFlag, /* double-buffered */
|
||||
GLboolean rgbFlag, /* RGB mode */
|
||||
GLint alphaSize, /* requested bits/alpha */
|
||||
GLint depthSize, /* requested bits/depth */
|
||||
GLint stencilSize, /* requested bits/stencil */
|
||||
GLint accumSize); /* requested bits/accum */
|
||||
|
||||
/*
|
||||
* Destroy Visual and restore screen.
|
||||
*/
|
||||
void DMesaDestroyVisual (DMesaVisual v);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Create a new Context for rendering.
|
||||
*/
|
||||
DMesaContext DMesaCreateContext (DMesaVisual visual, DMesaContext share);
|
||||
|
||||
/*
|
||||
* Destroy Context.
|
||||
*/
|
||||
void DMesaDestroyContext (DMesaContext c);
|
||||
|
||||
/*
|
||||
* Return a handle to the current context.
|
||||
*/
|
||||
DMesaContext DMesaGetCurrentContext (void);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Create a new Buffer (window).
|
||||
*/
|
||||
DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
|
||||
GLint xpos, GLint ypos,
|
||||
GLint width, GLint height);
|
||||
|
||||
/*
|
||||
* Destroy Buffer.
|
||||
*/
|
||||
void DMesaDestroyBuffer (DMesaBuffer b);
|
||||
|
||||
/*
|
||||
* Return a handle to the current buffer.
|
||||
*/
|
||||
DMesaBuffer DMesaGetCurrentBuffer (void);
|
||||
|
||||
/*
|
||||
* Swap the front and back buffers for the given Buffer.
|
||||
* No action is taken if the buffer is not double buffered.
|
||||
*/
|
||||
void DMesaSwapBuffers (DMesaBuffer b);
|
||||
|
||||
/*
|
||||
* Bind Buffer to Context and make the Context the current one.
|
||||
*/
|
||||
GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Move/Resize current Buffer.
|
||||
*/
|
||||
GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos);
|
||||
GLboolean DMesaResizeBuffer (GLint width, GLint height);
|
||||
|
||||
/*
|
||||
* Set palette index, using normalized values.
|
||||
*/
|
||||
void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue);
|
||||
|
||||
/*
|
||||
* DMesa functions
|
||||
*/
|
||||
typedef void (*DMesaProc) ();
|
||||
DMesaProc DMesaGetProcAddress (const char *name);
|
||||
|
||||
/*
|
||||
* DMesa state retrieval.
|
||||
*/
|
||||
#define DMESA_GET_SCREEN_SIZE 0x0100
|
||||
#define DMESA_GET_DRIVER_CAPS 0x0200
|
||||
#define DMESA_GET_VIDEO_MODES 0x0300
|
||||
#define DMESA_GET_BUFFER_ADDR 0x0400
|
||||
|
||||
#define DMESA_DRIVER_DBL_BIT 0x1 /* double-buffered */
|
||||
#define DMESA_DRIVER_YUP_BIT 0x2 /* lower-left window origin */
|
||||
int DMesaGetIntegerv (GLenum pname, GLint *params);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library GGI bindings (GGIGL [giggle])
|
||||
* Version: 4.0
|
||||
* Copyright (C) 1995-2000 Brian Paul
|
||||
* Copyright (C) 1998 Uwe Maurer
|
||||
* Copyrigth (C) 2001 Filip Spacek
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GGIMESA_H
|
||||
#define GGIMESA_H
|
||||
|
||||
#define GGIMESA_MAJOR_VERSION 4
|
||||
#define GGIMESA_MINOR_VERSION 0
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <ggi/ggi.h>
|
||||
#include "GL/gl.h"
|
||||
|
||||
typedef struct ggi_mesa_context *ggi_mesa_context_t;
|
||||
|
||||
/*
|
||||
* Initialize Mesa GGI extension
|
||||
*/
|
||||
int ggiMesaInit(void);
|
||||
/*
|
||||
* Clean up Mesa GGI exension
|
||||
*/
|
||||
int ggiMesaExit(void);
|
||||
|
||||
/*
|
||||
* Attach Mesa GGI extension to the visual 'vis'
|
||||
*/
|
||||
int ggiMesaAttach(ggi_visual_t vis);
|
||||
/*
|
||||
* Detach Mesa GGI extension from the visual 'vis'
|
||||
*/
|
||||
int ggiMesaDetach(ggi_visual_t vis);
|
||||
|
||||
int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
|
||||
GLboolean stereo_flag, GLint depth_size,
|
||||
GLint stencil_size, GLint accum_red_size,
|
||||
GLint accum_green_size, GLint accum_blue_size,
|
||||
GLint accum_alpha_size, GLint num_samples);
|
||||
|
||||
/*
|
||||
* Create a new context capable of displaying on the visual vis.
|
||||
*/
|
||||
ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis);
|
||||
/*
|
||||
* Destroy the context 'ctx'
|
||||
*/
|
||||
void ggiMesaDestroyContext(ggi_mesa_context_t ctx);
|
||||
|
||||
/*
|
||||
* Make context 'ctx' the current context and bind it to visual 'vis'.
|
||||
* Note that the context must have been created with respect to that visual.
|
||||
*/
|
||||
void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis);
|
||||
|
||||
void ggiMesaSwapBuffers(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -67,8 +67,7 @@
|
|||
#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */
|
||||
# define GLAPI extern
|
||||
# define GLAPIENTRY __stdcall
|
||||
#elif (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303) \
|
||||
|| (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
|
||||
#elif defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
|
||||
# define GLAPI __attribute__((visibility("default")))
|
||||
# define GLAPIENTRY
|
||||
#endif /* WIN32 && !CYGWIN */
|
||||
|
|
@ -2196,6 +2195,21 @@ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEATIPROC) (GLenum modeRGB, GLen
|
|||
#endif /* GL_ATI_blend_equation_separate */
|
||||
|
||||
|
||||
/* GL_OES_EGL_image */
|
||||
#ifndef GL_OES_EGL_image
|
||||
typedef void* GLeglImageOES;
|
||||
#endif
|
||||
|
||||
#ifndef GL_OES_EGL_image
|
||||
#define GL_OES_EGL_image 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GLAPI void APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
|
||||
GLAPI void APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
|
||||
#endif
|
||||
typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
|
||||
typedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
** NOTE!!!!! If you add new functions to this file, or update
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ extern "C" {
|
|||
# define GLUTAPI extern
|
||||
#endif
|
||||
|
||||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
# define GLUTAPIENTRY
|
||||
# define GLUTAPIENTRYV
|
||||
|
|
|
|||
|
|
@ -1,340 +0,0 @@
|
|||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.1
|
||||
* Copyright (C) 1995-1998 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This header file is based on the REAL glut.h by Mark J. Kilgard.
|
||||
*
|
||||
* The DJGPP/ALLEGRO (DJA) GLUT implementation was written by
|
||||
* Bernhard Tschirren (bernie-t@geocities.com) for the sole purpose
|
||||
* of compiling all the sample programs (which use GLUT). Therefore,
|
||||
* is NOT AT ALL a complete version of GLUT!
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __AGLUT_H__
|
||||
#define __AGLUT_H__
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
#define GLUTCALLBACK
|
||||
#define APIENTRY
|
||||
#define GLUTAPI extern
|
||||
|
||||
#define GLUT_RGB 0
|
||||
#define GLUT_RGBA GLUT_RGB
|
||||
#define GLUT_INDEX 1
|
||||
#define GLUT_SINGLE 0
|
||||
#define GLUT_DOUBLE 2
|
||||
#define GLUT_ACCUM 4
|
||||
#define GLUT_ALPHA 8
|
||||
#define GLUT_DEPTH 16
|
||||
#define GLUT_STENCIL 32
|
||||
|
||||
/* Mouse buttons. */
|
||||
#define GLUT_LEFT_BUTTON 0
|
||||
#define GLUT_MIDDLE_BUTTON 1
|
||||
#define GLUT_RIGHT_BUTTON 2
|
||||
|
||||
/* Mouse button state. */
|
||||
#define GLUT_DOWN 0
|
||||
#define GLUT_UP 1
|
||||
|
||||
/* function keys */
|
||||
#define GLUT_KEY_F1 1
|
||||
#define GLUT_KEY_F2 2
|
||||
#define GLUT_KEY_F3 3
|
||||
#define GLUT_KEY_F4 4
|
||||
#define GLUT_KEY_F5 5
|
||||
#define GLUT_KEY_F6 6
|
||||
#define GLUT_KEY_F7 7
|
||||
#define GLUT_KEY_F8 8
|
||||
#define GLUT_KEY_F9 9
|
||||
#define GLUT_KEY_F10 10
|
||||
#define GLUT_KEY_F11 11
|
||||
#define GLUT_KEY_F12 12
|
||||
|
||||
/* directional keys */
|
||||
#define GLUT_KEY_LEFT 100
|
||||
#define GLUT_KEY_UP 101
|
||||
#define GLUT_KEY_RIGHT 102
|
||||
#define GLUT_KEY_DOWN 103
|
||||
#define GLUT_KEY_PAGE_UP 104
|
||||
#define GLUT_KEY_PAGE_DOWN 105
|
||||
#define GLUT_KEY_HOME 106
|
||||
#define GLUT_KEY_END 107
|
||||
#define GLUT_KEY_INSERT 108
|
||||
|
||||
/* Entry/exit state. */
|
||||
#define GLUT_LEFT 0
|
||||
#define GLUT_ENTERED 1
|
||||
|
||||
/* Visibility state. */
|
||||
#define GLUT_NOT_VISIBLE 0
|
||||
#define GLUT_VISIBLE 1
|
||||
|
||||
/* Color index component selection values. */
|
||||
#define GLUT_RED 0
|
||||
#define GLUT_GREEN 1
|
||||
#define GLUT_BLUE 2
|
||||
|
||||
/* Layers for use. */
|
||||
#define GLUT_NORMAL 0
|
||||
#define GLUT_OVERLAY 1
|
||||
|
||||
/* Stroke font constants (use these in GLUT program). */
|
||||
#define GLUT_STROKE_ROMAN ((void*)0)
|
||||
#define GLUT_STROKE_MONO_ROMAN ((void*)1)
|
||||
|
||||
/* Bitmap font constants (use these in GLUT program). */
|
||||
#define GLUT_BITMAP_9_BY_15 ((void*)2)
|
||||
#define GLUT_BITMAP_8_BY_13 ((void*)3)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
|
||||
#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
|
||||
#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
|
||||
#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
|
||||
#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
|
||||
|
||||
/* glutGet parameters. */
|
||||
#define GLUT_WINDOW_X 100
|
||||
#define GLUT_WINDOW_Y 101
|
||||
#define GLUT_WINDOW_WIDTH 102
|
||||
#define GLUT_WINDOW_HEIGHT 103
|
||||
#define GLUT_WINDOW_BUFFER_SIZE 104
|
||||
#define GLUT_WINDOW_STENCIL_SIZE 105
|
||||
#define GLUT_WINDOW_DEPTH_SIZE 106
|
||||
#define GLUT_WINDOW_RED_SIZE 107
|
||||
#define GLUT_WINDOW_GREEN_SIZE 108
|
||||
#define GLUT_WINDOW_BLUE_SIZE 109
|
||||
#define GLUT_WINDOW_ALPHA_SIZE 110
|
||||
#define GLUT_WINDOW_ACCUM_RED_SIZE 111
|
||||
#define GLUT_WINDOW_ACCUM_GREEN_SIZE 112
|
||||
#define GLUT_WINDOW_ACCUM_BLUE_SIZE 113
|
||||
#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 114
|
||||
#define GLUT_WINDOW_DOUBLEBUFFER 115
|
||||
#define GLUT_WINDOW_RGBA 116
|
||||
#define GLUT_WINDOW_PARENT 117
|
||||
#define GLUT_WINDOW_NUM_CHILDREN 118
|
||||
#define GLUT_WINDOW_COLORMAP_SIZE 119
|
||||
#define GLUT_WINDOW_NUM_SAMPLES 120
|
||||
#define GLUT_WINDOW_STEREO 121
|
||||
#define GLUT_WINDOW_CURSOR 122
|
||||
#define GLUT_SCREEN_WIDTH 200
|
||||
#define GLUT_SCREEN_HEIGHT 201
|
||||
#define GLUT_SCREEN_WIDTH_MM 202
|
||||
#define GLUT_SCREEN_HEIGHT_MM 203
|
||||
#define GLUT_MENU_NUM_ITEMS 300
|
||||
#define GLUT_DISPLAY_MODE_POSSIBLE 400
|
||||
#define GLUT_INIT_WINDOW_X 500
|
||||
#define GLUT_INIT_WINDOW_Y 501
|
||||
#define GLUT_INIT_WINDOW_WIDTH 502
|
||||
#define GLUT_INIT_WINDOW_HEIGHT 503
|
||||
#define GLUT_INIT_DISPLAY_MODE 504
|
||||
#define GLUT_ELAPSED_TIME 700
|
||||
#define GLUT_WINDOW_FORMAT_ID 123
|
||||
|
||||
/* glutDeviceGet parameters. */
|
||||
#define GLUT_HAS_KEYBOARD 600
|
||||
#define GLUT_HAS_MOUSE 601
|
||||
#define GLUT_HAS_SPACEBALL 602
|
||||
#define GLUT_HAS_DIAL_AND_BUTTON_BOX 603
|
||||
#define GLUT_HAS_TABLET 604
|
||||
#define GLUT_NUM_MOUSE_BUTTONS 605
|
||||
#define GLUT_NUM_SPACEBALL_BUTTONS 606
|
||||
#define GLUT_NUM_BUTTON_BOX_BUTTONS 607
|
||||
#define GLUT_NUM_DIALS 608
|
||||
#define GLUT_NUM_TABLET_BUTTONS 609
|
||||
#define GLUT_DEVICE_IGNORE_KEY_REPEAT 610
|
||||
#define GLUT_DEVICE_KEY_REPEAT 611
|
||||
#define GLUT_HAS_JOYSTICK 612
|
||||
#define GLUT_OWNS_JOYSTICK 613
|
||||
#define GLUT_JOYSTICK_BUTTONS 614
|
||||
#define GLUT_JOYSTICK_AXES 615
|
||||
#define GLUT_JOYSTICK_POLL_RATE 616
|
||||
|
||||
/* glutLayerGet parameters. */
|
||||
#define GLUT_OVERLAY_POSSIBLE 800
|
||||
#define GLUT_LAYER_IN_USE 801
|
||||
#define GLUT_HAS_OVERLAY 802
|
||||
#define GLUT_TRANSPARENT_INDEX 803
|
||||
#define GLUT_NORMAL_DAMAGED 804
|
||||
#define GLUT_OVERLAY_DAMAGED 805
|
||||
|
||||
/* glutVideoResizeGet parameters. */
|
||||
#define GLUT_VIDEO_RESIZE_POSSIBLE 900
|
||||
#define GLUT_VIDEO_RESIZE_IN_USE 901
|
||||
#define GLUT_VIDEO_RESIZE_X_DELTA 902
|
||||
#define GLUT_VIDEO_RESIZE_Y_DELTA 903
|
||||
#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 904
|
||||
#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 905
|
||||
#define GLUT_VIDEO_RESIZE_X 906
|
||||
#define GLUT_VIDEO_RESIZE_Y 907
|
||||
#define GLUT_VIDEO_RESIZE_WIDTH 908
|
||||
#define GLUT_VIDEO_RESIZE_HEIGHT 909
|
||||
|
||||
/* glutUseLayer parameters. */
|
||||
#define GLUT_NORMAL 0
|
||||
#define GLUT_OVERLAY 1
|
||||
|
||||
/* glutGetModifiers return mask. */
|
||||
#define GLUT_ACTIVE_SHIFT 1
|
||||
#define GLUT_ACTIVE_CTRL 2
|
||||
#define GLUT_ACTIVE_ALT 4
|
||||
|
||||
/* glutSetCursor parameters. */
|
||||
/* Basic arrows. */
|
||||
#define GLUT_CURSOR_RIGHT_ARROW 0
|
||||
#define GLUT_CURSOR_LEFT_ARROW 1
|
||||
/* Symbolic cursor shapes. */
|
||||
#define GLUT_CURSOR_INFO 2
|
||||
#define GLUT_CURSOR_DESTROY 3
|
||||
#define GLUT_CURSOR_HELP 4
|
||||
#define GLUT_CURSOR_CYCLE 5
|
||||
#define GLUT_CURSOR_SPRAY 6
|
||||
#define GLUT_CURSOR_WAIT 7
|
||||
#define GLUT_CURSOR_TEXT 8
|
||||
#define GLUT_CURSOR_CROSSHAIR 9
|
||||
/* Directional cursors. */
|
||||
#define GLUT_CURSOR_UP_DOWN 10
|
||||
#define GLUT_CURSOR_LEFT_RIGHT 11
|
||||
/* Sizing cursors. */
|
||||
#define GLUT_CURSOR_TOP_SIDE 12
|
||||
#define GLUT_CURSOR_BOTTOM_SIDE 13
|
||||
#define GLUT_CURSOR_LEFT_SIDE 14
|
||||
#define GLUT_CURSOR_RIGHT_SIDE 15
|
||||
#define GLUT_CURSOR_TOP_LEFT_CORNER 16
|
||||
#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
|
||||
#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
|
||||
#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
|
||||
/* Inherit from parent window. */
|
||||
#define GLUT_CURSOR_INHERIT 100
|
||||
/* Blank cursor. */
|
||||
#define GLUT_CURSOR_NONE 101
|
||||
/* Fullscreen crosshair (if available). */
|
||||
#define GLUT_CURSOR_FULL_CROSSHAIR 102
|
||||
|
||||
/* GLUT initialization sub-API. */
|
||||
GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
|
||||
GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
|
||||
GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
|
||||
GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
|
||||
GLUTAPI void APIENTRY glutMainLoop(void);
|
||||
|
||||
/* GLUT window sub-API. */
|
||||
GLUTAPI int APIENTRY glutCreateWindow(const char *title);
|
||||
GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
|
||||
GLUTAPI void APIENTRY glutDestroyWindow(int win);
|
||||
GLUTAPI void APIENTRY glutPostRedisplay(void);
|
||||
GLUTAPI void APIENTRY glutSwapBuffers(void);
|
||||
GLUTAPI int APIENTRY glutGetWindow(void);
|
||||
GLUTAPI void APIENTRY glutSetWindow(int win);
|
||||
GLUTAPI void APIENTRY glutSetWindowTitle(const char *title);
|
||||
GLUTAPI void APIENTRY glutSetIconTitle(const char *title);
|
||||
GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
|
||||
GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
|
||||
GLUTAPI void APIENTRY glutPopWindow(void);
|
||||
GLUTAPI void APIENTRY glutPushWindow(void);
|
||||
GLUTAPI void APIENTRY glutIconifyWindow(void);
|
||||
GLUTAPI void APIENTRY glutShowWindow(void);
|
||||
GLUTAPI void APIENTRY glutHideWindow(void);
|
||||
|
||||
/* GLUT overlay sub-API. */
|
||||
GLUTAPI void APIENTRY glutEstablishOverlay(void);
|
||||
GLUTAPI void APIENTRY glutRemoveOverlay(void);
|
||||
GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
|
||||
GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
|
||||
GLUTAPI void APIENTRY glutShowOverlay(void);
|
||||
GLUTAPI void APIENTRY glutHideOverlay(void);
|
||||
|
||||
/* GLUT menu sub-API. */
|
||||
GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *)(int));
|
||||
GLUTAPI void APIENTRY glutDestroyMenu(int menu);
|
||||
GLUTAPI int APIENTRY glutGetMenu(void);
|
||||
GLUTAPI void APIENTRY glutSetMenu(int menu);
|
||||
GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
|
||||
GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
|
||||
GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
|
||||
GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
|
||||
GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
|
||||
GLUTAPI void APIENTRY glutAttachMenu(int button);
|
||||
GLUTAPI void APIENTRY glutDetachMenu(int button);
|
||||
|
||||
/* GLUT window callback sub-API. */
|
||||
GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
|
||||
GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
|
||||
GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
|
||||
GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
|
||||
GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
|
||||
GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
|
||||
GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
|
||||
GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
|
||||
GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
|
||||
GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
|
||||
GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
|
||||
GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
|
||||
GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
|
||||
GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
|
||||
GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
|
||||
GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
|
||||
GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
|
||||
GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
|
||||
GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
|
||||
GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
|
||||
GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
|
||||
GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
|
||||
|
||||
/* GLUT color index sub-API. */
|
||||
GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
|
||||
GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component);
|
||||
GLUTAPI void APIENTRY glutCopyColormap(int win);
|
||||
|
||||
/* GLUT state retrieval sub-API. */
|
||||
GLUTAPI int APIENTRY glutGet(GLenum type);
|
||||
GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
|
||||
|
||||
/* GLUT font sub-API */
|
||||
GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
|
||||
GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
|
||||
GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
|
||||
GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
|
||||
|
||||
/* GLUT pre-built models sub-API */
|
||||
GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
|
||||
GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
|
||||
GLUTAPI void APIENTRY glutWireCube(GLdouble size);
|
||||
GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
|
||||
GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
|
||||
GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
|
||||
GLUTAPI void APIENTRY glutWireDodecahedron(void);
|
||||
GLUTAPI void APIENTRY glutSolidDodecahedron(void);
|
||||
GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
|
||||
GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
|
||||
GLUTAPI void APIENTRY glutWireOctahedron(void);
|
||||
GLUTAPI void APIENTRY glutSolidOctahedron(void);
|
||||
GLUTAPI void APIENTRY glutWireTetrahedron(void);
|
||||
GLUTAPI void APIENTRY glutSolidTetrahedron(void);
|
||||
GLUTAPI void APIENTRY glutWireIcosahedron(void);
|
||||
GLUTAPI void APIENTRY glutSolidIcosahedron(void);
|
||||
|
||||
#endif /* __AGLUT_H__ */
|
||||
|
|
@ -751,4 +751,59 @@ struct __DRIdri2ExtensionRec {
|
|||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* This extension provides functionality to enable various EGLImage
|
||||
* extensions.
|
||||
*/
|
||||
#define __DRI_IMAGE "DRI_IMAGE"
|
||||
#define __DRI_IMAGE_VERSION 1
|
||||
|
||||
/**
|
||||
* These formats correspond to the similarly named MESA_FORMAT_*
|
||||
* tokens, except in the native endian of the CPU. For example, on
|
||||
* little endian __DRI_IMAGE_FORMAT_XRGB8888 corresponds to
|
||||
* MESA_FORMAT_XRGB8888, but MESA_FORMAT_XRGB8888_REV on big endian.
|
||||
*/
|
||||
#define __DRI_IMAGE_FORMAT_RGB565 0x1001
|
||||
#define __DRI_IMAGE_FORMAT_XRGB8888 0x1002
|
||||
#define __DRI_IMAGE_FORMAT_ARGB8888 0x1003
|
||||
|
||||
typedef struct __DRIimageRec __DRIimage;
|
||||
typedef struct __DRIimageExtensionRec __DRIimageExtension;
|
||||
struct __DRIimageExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*createImageFromName)(__DRIcontext *context,
|
||||
int width, int height, int format,
|
||||
int name, int pitch,
|
||||
void *loaderPrivate);
|
||||
|
||||
__DRIimage *(*createImageFromRenderbuffer)(__DRIcontext *context,
|
||||
int renderbuffer,
|
||||
void *loaderPrivate);
|
||||
|
||||
void (*destroyImage)(__DRIimage *image);
|
||||
};
|
||||
|
||||
/**
|
||||
* This extension must be implemented by the loader and passed to the
|
||||
* driver at screen creation time. The EGLImage entry points in the
|
||||
* various client APIs take opaque EGLImage handles and use this
|
||||
* extension to map them to a __DRIimage. At version 1, this
|
||||
* extensions allows mapping EGLImage pointers to __DRIimage pointers,
|
||||
* but future versions could support other EGLImage-like, opaque types
|
||||
* with new lookup functions.
|
||||
*/
|
||||
#define __DRI_IMAGE_LOOKUP "DRI_IMAGE_LOOKUP"
|
||||
#define __DRI_IMAGE_LOOKUP_VERSION 1
|
||||
|
||||
typedef struct __DRIimageLookupExtensionRec __DRIimageLookupExtension;
|
||||
struct __DRIimageLookupExtensionRec {
|
||||
__DRIextension base;
|
||||
|
||||
__DRIimage *(*lookupEGLImage)(__DRIcontext *context, void *image,
|
||||
void *loaderPrivate);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,79 +0,0 @@
|
|||
/****************************************************************************
|
||||
*
|
||||
* Mesa bindings for SciTech MGL
|
||||
*
|
||||
* Copyright (C) 1996 SciTech Software.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Filename: mglmesa.h
|
||||
* Version: Revision: 1.1.1.1
|
||||
*
|
||||
* Language: ANSI C
|
||||
* Environment: Any
|
||||
*
|
||||
* Description: Header file for the Mesa/OpenGL interface bindings for the
|
||||
* SciTech MGL graphics library. Uses the MGL internal
|
||||
* device context structures to get direct access to the
|
||||
* high performance MGL rasterization functions for maximum
|
||||
* performance. Utilizes the VESA VBE/AF Accelerator Functions
|
||||
* via the MGL's accelerated device driver functions, as well
|
||||
* as basic DirectDraw accelerated functions provided by the
|
||||
* MGL.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __MGLMESA_H
|
||||
#define __MGLMESA_H
|
||||
|
||||
#include "mgraph.h"
|
||||
|
||||
/*------------------------- Function Prototypes ---------------------------*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Use "C" linkage when in C++ mode */
|
||||
#endif
|
||||
|
||||
#ifndef __WINDOWS__
|
||||
#define GLAPIENTRY
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
bool GLAPIENTRY MGLMesaInitDLL(MGLCallbacks *cb,char *version);
|
||||
#endif
|
||||
void GLAPIENTRY MGLMesaChooseVisual(MGLDC *dc,MGLVisual *visual);
|
||||
bool GLAPIENTRY MGLMesaSetVisual(MGLDC *dc,MGLVisual *visual);
|
||||
bool GLAPIENTRY MGLMesaCreateContext(MGLDC *dc,bool forceMemDC);
|
||||
void GLAPIENTRY MGLMesaDestroyContext(MGLDC *dc);
|
||||
void GLAPIENTRY MGLMesaMakeCurrent(MGLDC *dc);
|
||||
void GLAPIENTRY MGLMesaSwapBuffers(MGLDC *dc,bool waitVRT);
|
||||
|
||||
/* Palette manipulation support. The reason we provide palette manipulation
|
||||
* routines is so that when rendering in double buffered modes with a
|
||||
* software backbuffer, the palette for the backbuffer is kept consistent
|
||||
* with the hardware front buffer.
|
||||
*/
|
||||
|
||||
void GLAPIENTRY MGLMesaSetPaletteEntry(MGLDC *dc,int entry,uchar red,uchar green,uchar blue);
|
||||
void GLAPIENTRY MGLMesaSetPalette(MGLDC *dc,palette_t *pal,int numColors,int startIndex);
|
||||
void GLAPIENTRY MGLMesaRealizePalette(MGLDC *dc,int numColors,int startIndex,int waitVRT);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of "C" linkage for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __MGLMESA_H */
|
||||
|
|
@ -1,482 +0,0 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.1
|
||||
*
|
||||
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, 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
|
||||
* BRIAN PAUL 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 miniglx.h
|
||||
* \brief Mini GLX interface functions.
|
||||
* \author Brian Paul
|
||||
*
|
||||
* See comments miniglx.c for more information.
|
||||
*/
|
||||
|
||||
#ifndef MINIGLX_H
|
||||
#define MINIGLX_H
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* \name Replacement Xlib/GLX types
|
||||
*/
|
||||
/*@{*/
|
||||
/**
|
||||
* \brief Boolean type.
|
||||
*
|
||||
* It can have the values #True or #False.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef int Bool;
|
||||
#endif
|
||||
typedef int MINI_Bool;
|
||||
|
||||
/**
|
||||
* \brief Color map.
|
||||
*
|
||||
* Alias for private ::MiniGLXColormapRec structure.
|
||||
*/
|
||||
typedef struct MiniGLXColormapRec *MINI_Colormap;
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXColormapRec *Colormap;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \brief Window attributes.
|
||||
*/
|
||||
typedef struct MiniGLXSetWindowAttributesRec {
|
||||
int background_pixel; /**< \brief background pixel */
|
||||
int border_pixel; /**< \brief border pixel value */
|
||||
MINI_Colormap colormap; /**< \brief color map to be associated with window */
|
||||
int event_mask; /**< \brief set of events that should be saved */
|
||||
} XSetWindowAttributes;
|
||||
|
||||
/**
|
||||
* \brief Visual.
|
||||
*
|
||||
* Alias for the private ::MiniGLXVisualRec structure.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef struct MiniGLXVisualRec Visual;
|
||||
|
||||
/**
|
||||
* \brief Visual information.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef unsigned long VisualID;
|
||||
#endif
|
||||
typedef unsigned long MINI_VisualID;
|
||||
typedef struct MiniGLXXVisualInfoRec {
|
||||
Visual *visual; /**< \brief pointer to the GLX Visual */
|
||||
MINI_VisualID visualid; /**< \brief visual ID */
|
||||
int screen; /**< \brief screen number */
|
||||
int depth; /**< \brief bit depth */
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
int c_class; /**< \brief class */
|
||||
#else
|
||||
int class; /**< \brief class */
|
||||
#endif
|
||||
int bits_per_rgb; /**< \brief total bits per pixel */
|
||||
} XVisualInfo;
|
||||
|
||||
/**
|
||||
* \brief GLX Frame Buffer Configuration (for pbuffers)
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef struct MiniGLXFBConfigRec {
|
||||
XVisualInfo *visInfo;
|
||||
} GLXFBConfig;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Display handle.
|
||||
*
|
||||
* Alias for the private ::MiniGLXDisplayRec structure.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXDisplayRec Display;
|
||||
#endif
|
||||
typedef struct MiniGLXDisplayRec MINI_Display;
|
||||
|
||||
/**
|
||||
* \brief Window handle.
|
||||
*
|
||||
* Alias for the private ::MiniGLXWindowRec structure.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXWindowRec *Window;
|
||||
#endif
|
||||
typedef struct MiniGLXWindowRec *MINI_Window;
|
||||
|
||||
/**
|
||||
* \brief Drawable.
|
||||
*
|
||||
* Alias for the private ::MiniGLXWindowRec structure.
|
||||
*
|
||||
* For Mini GLX only the full-screen window can be used as source and
|
||||
* destination in graphics operations.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
#ifndef MINIGLX_NO_XTYPES
|
||||
typedef struct MiniGLXWindowRec *Drawable;
|
||||
#endif
|
||||
typedef struct MiniGLXWindowRec *MINI_Drawable;
|
||||
|
||||
/**
|
||||
* \brief GLX drawable.
|
||||
*
|
||||
* Alias for the private ::MiniGLXWindowRec structure.
|
||||
*
|
||||
* Same as #Drawable.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef struct MiniGLXWindowRec *GLXDrawable;
|
||||
|
||||
/**
|
||||
* \brief GLX pbuffer.
|
||||
*
|
||||
* Alias for the private ::MiniGLXWindowRec structure.
|
||||
*
|
||||
* Same as #Drawable.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef struct MiniGLXWindowRec *GLXPbuffer;
|
||||
|
||||
/**
|
||||
* \brief GLX context.
|
||||
*
|
||||
* Alias for the private ::MiniGLXContext structure.
|
||||
*
|
||||
* \sa \ref datatypes.
|
||||
*/
|
||||
typedef struct MiniGLXContextRec *GLXContext;
|
||||
/*@}*/
|
||||
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window window;
|
||||
int x, y;
|
||||
int width, height;
|
||||
int count; /* if non-zero, at least this many more */
|
||||
} XExposeEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window parent; /* parent of the window */
|
||||
MINI_Window window; /* window id of window created */
|
||||
int x, y; /* window location */
|
||||
int width, height; /* size of window */
|
||||
int border_width; /* border width */
|
||||
MINI_Bool override_redirect; /* creation should be overridden */
|
||||
} XCreateWindowEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
} XDestroyWindowEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
MINI_Bool from_configure;
|
||||
} XUnmapEvent;
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window event;
|
||||
MINI_Window window;
|
||||
MINI_Bool override_redirect; /* boolean, is override set... */
|
||||
} XMapEvent;
|
||||
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
unsigned long serial; /* # of last request processed by server */
|
||||
MINI_Bool send_event; /* true if this came from a SendEvent request */
|
||||
MINI_Display *display; /* Display the event was read from */
|
||||
MINI_Window parent;
|
||||
MINI_Window window;
|
||||
} XMapRequestEvent;
|
||||
|
||||
typedef union _XEvent {
|
||||
int type; /* must not be changed; first element */
|
||||
XExposeEvent xexpose;
|
||||
XCreateWindowEvent xcreatewindow;
|
||||
XDestroyWindowEvent xdestroywindow;
|
||||
XUnmapEvent xunmap;
|
||||
XMapEvent xmap;
|
||||
XMapRequestEvent xmaprequest;
|
||||
long pad[24];
|
||||
} XEvent;
|
||||
|
||||
|
||||
/**
|
||||
* \name Xlib constants
|
||||
*/
|
||||
/*@{*/
|
||||
#define False 0
|
||||
#define True 1
|
||||
#define None 0
|
||||
#define AllocNone 0
|
||||
#define InputOutput 1
|
||||
#define ExposureMask (1L<<15)
|
||||
#define StructureNotifyMask (1L<<17)
|
||||
#define CWBackPixel (1L<<1)
|
||||
#define CWBorderPixel (1L<<3)
|
||||
#define CWEventMask (1L<<11)
|
||||
#define CWColormap (1L<<13)
|
||||
#define PseudoColor 3
|
||||
#define TrueColor 4
|
||||
#define VisualIDMask 0x1
|
||||
#define VisualScreenMask 0x2
|
||||
#define Expose 12
|
||||
#define CreateNotify 16
|
||||
#define DestroyNotify 17
|
||||
#define UnmapNotify 18
|
||||
#define MapNotify 19
|
||||
#define MapRequest 20
|
||||
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* \name Standard GLX tokens
|
||||
*/
|
||||
/*@{*/
|
||||
#define GLX_USE_GL 1
|
||||
#define GLX_BUFFER_SIZE 2
|
||||
#define GLX_LEVEL 3
|
||||
#define GLX_RGBA 4
|
||||
#define GLX_DOUBLEBUFFER 5
|
||||
#define GLX_STEREO 6
|
||||
#define GLX_AUX_BUFFERS 7
|
||||
#define GLX_RED_SIZE 8
|
||||
#define GLX_GREEN_SIZE 9
|
||||
#define GLX_BLUE_SIZE 10
|
||||
#define GLX_ALPHA_SIZE 11
|
||||
#define GLX_DEPTH_SIZE 12
|
||||
#define GLX_STENCIL_SIZE 13
|
||||
#define GLX_ACCUM_RED_SIZE 14
|
||||
#define GLX_ACCUM_GREEN_SIZE 15
|
||||
#define GLX_ACCUM_BLUE_SIZE 16
|
||||
#define GLX_ACCUM_ALPHA_SIZE 17
|
||||
#define GLX_BAD_ATTRIBUTE 1
|
||||
#define GLX_BAD_VISUAL 4
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* \name Unique to Mini GLX
|
||||
*
|
||||
* At compile time, the Mini GLX interface version can be tested with the
|
||||
* MINI_GLX_VERSION_1_x preprocessor tokens.
|
||||
*
|
||||
* \sa glXQueryVersion()
|
||||
*/
|
||||
/*@{*/
|
||||
/** \brief Defined if version 1.0 of Mini GLX is supported. */
|
||||
#define MINI_GLX_VERSION_1_0 1
|
||||
/** \brief Defined if version 1.1 of Mini GLX is supported. */
|
||||
#define MINI_GLX_VERSION_1_1 1
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
* \name Server-specific functions
|
||||
*/
|
||||
extern MINI_Display *
|
||||
__miniglx_StartServer( const char *display_name );
|
||||
|
||||
extern int
|
||||
__miniglx_Select( MINI_Display *dpy, int maxfd,
|
||||
fd_set *rfds, fd_set *wfds, fd_set *xfds,
|
||||
struct timeval *tv );
|
||||
|
||||
|
||||
/**
|
||||
* \name Simulated Xlib functions
|
||||
*/
|
||||
/*@{*/
|
||||
extern MINI_Display *
|
||||
XOpenDisplay( const char *dpy_name );
|
||||
|
||||
|
||||
extern void
|
||||
XCloseDisplay( MINI_Display *display );
|
||||
|
||||
extern MINI_Window
|
||||
XCreateWindow( MINI_Display *display, MINI_Window parent, int x, int y,
|
||||
unsigned int width, unsigned int height,
|
||||
unsigned int border_width, int depth, unsigned int winclass,
|
||||
Visual *visual, unsigned long valuemask,
|
||||
XSetWindowAttributes *attributes );
|
||||
|
||||
extern int
|
||||
XNextEvent(MINI_Display *display, XEvent *event_return);
|
||||
|
||||
extern MINI_Bool
|
||||
XCheckMaskEvent( MINI_Display *dpy, long event_mask, XEvent *event_return );
|
||||
|
||||
/**
|
||||
* \brief Return the root window.
|
||||
*
|
||||
* \param display the display handle. It is ignored by Mini GLX, but should be
|
||||
* the value returned by XOpenDisplay().
|
||||
* \param screen the screen number on the host server. It is ignored by Mini
|
||||
* GLX but should be zero.
|
||||
*
|
||||
* \return the root window. Always zero on Mini GLX.
|
||||
*/
|
||||
#define RootWindow(display, screen) 0
|
||||
#define DefaultScreen(dpy) 0
|
||||
|
||||
extern void
|
||||
XDestroyWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
extern void
|
||||
XMapWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
/* Should clients have access to this?
|
||||
*/
|
||||
extern void
|
||||
XUnmapWindow( MINI_Display *display, MINI_Window w );
|
||||
|
||||
extern MINI_Colormap
|
||||
XCreateColormap( MINI_Display *display, MINI_Window w, Visual *visual, int alloc );
|
||||
|
||||
extern void
|
||||
XFreeColormap( MINI_Display *display, MINI_Colormap cmap );
|
||||
|
||||
extern void
|
||||
XFree( void *data );
|
||||
|
||||
extern XVisualInfo *
|
||||
XGetVisualInfo( MINI_Display *display, long vinfo_mask,
|
||||
XVisualInfo *vinfo_template, int *nitems_return );
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* \name GLX functions
|
||||
*/
|
||||
/*@{*/
|
||||
extern XVisualInfo*
|
||||
glXChooseVisual( MINI_Display *dpy, int screen, int *attribList );
|
||||
|
||||
extern int
|
||||
glXGetConfig( MINI_Display *dpy, XVisualInfo *vis, int attrib, int *value );
|
||||
|
||||
extern GLXContext
|
||||
glXCreateContext( MINI_Display *dpy, XVisualInfo *vis,
|
||||
GLXContext shareList, MINI_Bool direct );
|
||||
|
||||
extern void
|
||||
glXDestroyContext( MINI_Display *dpy, GLXContext ctx );
|
||||
|
||||
extern MINI_Bool
|
||||
glXMakeCurrent( MINI_Display *dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
|
||||
extern void
|
||||
glXSwapBuffers( MINI_Display *dpy, GLXDrawable drawable );
|
||||
|
||||
extern GLXContext
|
||||
glXGetCurrentContext( void );
|
||||
|
||||
extern GLXDrawable
|
||||
glXGetCurrentDrawable( void );
|
||||
|
||||
extern void
|
||||
(*glXGetProcAddress(const GLubyte *procname))( void );
|
||||
|
||||
extern MINI_Bool
|
||||
glXQueryVersion( MINI_Display *dpy, int *major, int *minor );
|
||||
|
||||
/* Added in MiniGLX 1.1 */
|
||||
extern GLXPbuffer
|
||||
glXCreatePbuffer( MINI_Display *dpy, GLXFBConfig config, const int *attribList );
|
||||
|
||||
extern void
|
||||
glXDestroyPbuffer( MINI_Display *dpy, GLXPbuffer pbuf );
|
||||
|
||||
extern GLXFBConfig *
|
||||
glXChooseFBConfig( MINI_Display *dpy, int screen, const int *attribList,
|
||||
int *nitems );
|
||||
|
||||
extern XVisualInfo *
|
||||
glXGetVisualFromFBConfig( MINI_Display *dpy, GLXFBConfig config );
|
||||
|
||||
extern void *glXAllocateMemoryMESA(Display *dpy, int scrn,
|
||||
size_t size, float readFreq,
|
||||
float writeFreq, float priority);
|
||||
|
||||
extern void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer);
|
||||
|
||||
extern GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
|
||||
const void *pointer );
|
||||
/*@}*/
|
||||
|
||||
extern void
|
||||
__glXScrEnableExtension( void *, const char * name );
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MINIGLX_H */
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 4.0
|
||||
* Copyright (C) 1995-2001 Brian Paul
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* SVGA/Mesa interface for Linux.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Intro to using the VGA/Mesa interface
|
||||
*
|
||||
* 1. #include the <vga.h> file
|
||||
* 2. Call vga_init() to initialize the SVGA library.
|
||||
* 3. Call vga_setmode() to specify the screen size and color depth.
|
||||
* 4. Call SVGAMesaCreateContext() to setup a Mesa context. If using 8-bit
|
||||
* color Mesa assumes color index mode, if using 16-bit or deeper color
|
||||
* Mesa assumes RGB mode.
|
||||
* 5. Call SVGAMesaMakeCurrent() to activate the Mesa context.
|
||||
* 6. You can now use the Mesa API functions.
|
||||
* 7. Before exiting, call SVGAMesaDestroyContext() then vga_setmode(TEXT)
|
||||
* to restore the original text screen.
|
||||
*
|
||||
* Notes
|
||||
* 1. You must run your executable as root (or use the set UID-bit) because
|
||||
* the SVGA library requires it.
|
||||
* 2. The SVGA driver is not fully implemented yet. See svgamesa.c for what
|
||||
* has to be done yet.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SVGAMESA_H
|
||||
#define SVGAMESA_H
|
||||
|
||||
|
||||
#define SVGAMESA_MAJOR_VERSION 4
|
||||
#define SVGAMESA_MINOR_VERSION 0
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "GL/gl.h"
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This is the SVGAMesa context 'handle':
|
||||
*/
|
||||
typedef struct svgamesa_context *SVGAMesaContext;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* doubleBuffer flag new in version 2.4
|
||||
*/
|
||||
extern int SVGAMesaInit( int GraphMode );
|
||||
|
||||
extern int SVGAMesaClose( void );
|
||||
|
||||
extern SVGAMesaContext SVGAMesaCreateContext( GLboolean doubleBuffer );
|
||||
|
||||
extern void SVGAMesaDestroyContext( SVGAMesaContext ctx );
|
||||
|
||||
extern void SVGAMesaMakeCurrent( SVGAMesaContext ctx );
|
||||
|
||||
extern void SVGAMesaSwapBuffers( void );
|
||||
|
||||
extern void SVGAMesaSetCI(int ndx, GLubyte red, GLubyte green, GLubyte blue);
|
||||
|
||||
extern SVGAMesaContext SVGAMesaGetCurrentContext( void );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -1,8 +1,13 @@
|
|||
Import('*')
|
||||
|
||||
if env['platform'] == 'embedded':
|
||||
Return()
|
||||
|
||||
SConscript([
|
||||
'util/SConscript',
|
||||
])
|
||||
|
||||
Import('*')
|
||||
Import('util')
|
||||
|
||||
progs_env = env.Clone()
|
||||
|
||||
|
|
@ -15,40 +20,40 @@ if progs_env['platform'] == 'windows':
|
|||
'gdi32',
|
||||
])
|
||||
|
||||
if platform != 'embedded':
|
||||
# OpenGL
|
||||
if progs_env['platform'] == 'windows':
|
||||
progs_env.Prepend(LIBS = ['glu32', 'opengl32'])
|
||||
else:
|
||||
progs_env.Prepend(LIBS = ['GLU', 'GL'])
|
||||
# OpenGL
|
||||
if progs_env['platform'] == 'windows':
|
||||
progs_env.Prepend(LIBS = ['glu32', 'opengl32'])
|
||||
else:
|
||||
progs_env.Prepend(LIBS = ['GLU', 'GL'])
|
||||
|
||||
# Glut
|
||||
progs_env.Prepend(LIBPATH = [glut.dir])
|
||||
progs_env.Prepend(LIBS = [glut.name])
|
||||
# Glut
|
||||
progs_env.Prepend(LIBPATH = [glut.dir])
|
||||
progs_env.Prepend(LIBS = [glut.name])
|
||||
|
||||
# GLEW
|
||||
progs_env.Prepend(LIBS = [glew])
|
||||
# GLEW
|
||||
progs_env.Prepend(LIBS = [glew])
|
||||
|
||||
progs_env.Prepend(CPPPATH = [
|
||||
'#progs/util',
|
||||
])
|
||||
progs_env.Prepend(CPPPATH = [
|
||||
'#progs/util',
|
||||
])
|
||||
|
||||
progs_env.Prepend(LIBS = [
|
||||
util,
|
||||
])
|
||||
progs_env.Prepend(LIBS = [
|
||||
util,
|
||||
])
|
||||
|
||||
Export('progs_env')
|
||||
Export('progs_env')
|
||||
|
||||
SConscript([
|
||||
'demos/SConscript',
|
||||
'glsl/SConscript',
|
||||
'redbook/SConscript',
|
||||
'samples/SConscript',
|
||||
'tests/SConscript',
|
||||
'trivial/SConscript',
|
||||
'vp/SConscript',
|
||||
'vpglsl/SConscript',
|
||||
'fp/SConscript',
|
||||
'wgl/SConscript',
|
||||
'perf/SConscript',
|
||||
])
|
||||
SConscript([
|
||||
'demos/SConscript',
|
||||
'glsl/SConscript',
|
||||
'redbook/SConscript',
|
||||
'samples/SConscript',
|
||||
'tests/SConscript',
|
||||
'trivial/SConscript',
|
||||
'vp/SConscript',
|
||||
'vpglsl/SConscript',
|
||||
'fp/SConscript',
|
||||
'wgl/SConscript',
|
||||
'perf/SConscript',
|
||||
'gallium/unit/SConscript',
|
||||
])
|
||||
|
|
|
|||
1
progs/demos/.gitignore
vendored
1
progs/demos/.gitignore
vendored
|
|
@ -1,6 +1,7 @@
|
|||
arbfplight
|
||||
arbfslight
|
||||
arbocclude
|
||||
arbocclude2
|
||||
bounce
|
||||
clearspd
|
||||
copypix
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ PROGS = \
|
|||
arbfplight \
|
||||
arbfslight \
|
||||
arbocclude \
|
||||
arbocclude2 \
|
||||
bounce \
|
||||
clearspd \
|
||||
copypix \
|
||||
|
|
|
|||
|
|
@ -4,14 +4,17 @@ progs = [
|
|||
'arbfplight',
|
||||
'arbfslight',
|
||||
'arbocclude',
|
||||
'arbocclude2',
|
||||
'bounce',
|
||||
'clearspd',
|
||||
'copypix',
|
||||
'cubemap',
|
||||
'dinoshade',
|
||||
'dissolve',
|
||||
'drawpix',
|
||||
'engine',
|
||||
'fbo_firecube',
|
||||
'fbotexture',
|
||||
'fire',
|
||||
'fogcoord',
|
||||
'fplight',
|
||||
|
|
@ -30,6 +33,7 @@ progs = [
|
|||
'multiarb',
|
||||
'paltex',
|
||||
'pointblast',
|
||||
'projtex',
|
||||
'ray',
|
||||
'readpix',
|
||||
'reflect',
|
||||
|
|
@ -50,9 +54,6 @@ progs = [
|
|||
'tunnel2',
|
||||
'vao_demo',
|
||||
'winpos',
|
||||
'dinoshade',
|
||||
'fbotexture',
|
||||
'projtex',
|
||||
]
|
||||
|
||||
for prog in progs:
|
||||
|
|
|
|||
|
|
@ -32,11 +32,12 @@
|
|||
#include <GL/glew.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#define TEST_DISPLAY_LISTS 0
|
||||
#define NUM_OCC 10
|
||||
|
||||
static GLboolean Anim = GL_TRUE;
|
||||
static GLfloat Xpos = 0;
|
||||
static GLuint OccQuery;
|
||||
static GLfloat Xpos[NUM_OCC], Ypos[NUM_OCC];
|
||||
static GLfloat Sign[NUM_OCC];
|
||||
static GLuint OccQuery[NUM_OCC];
|
||||
static GLint Win = 0;
|
||||
|
||||
|
||||
|
|
@ -54,38 +55,43 @@ PrintString(const char *s)
|
|||
static void Idle(void)
|
||||
{
|
||||
static int lastTime = 0;
|
||||
static int sign = +1;
|
||||
int time = glutGet(GLUT_ELAPSED_TIME);
|
||||
float step;
|
||||
int i;
|
||||
|
||||
if (lastTime == 0)
|
||||
lastTime = time;
|
||||
else if (time - lastTime < 20) /* 50Hz update */
|
||||
return;
|
||||
|
||||
step = (time - lastTime) / 1000.0 * sign;
|
||||
for (i = 0; i < NUM_OCC; i++) {
|
||||
|
||||
step = (time - lastTime) / 1000.0 * Sign[i];
|
||||
|
||||
Xpos[i] += step;
|
||||
|
||||
if (Xpos[i] > 2.5) {
|
||||
Xpos[i] = 2.5;
|
||||
Sign[i] = -1;
|
||||
}
|
||||
else if (Xpos[i] < -2.5) {
|
||||
Xpos[i] = -2.5;
|
||||
Sign[i] = +1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lastTime = time;
|
||||
|
||||
Xpos += step;
|
||||
|
||||
if (Xpos > 2.5) {
|
||||
Xpos = 2.5;
|
||||
sign = -1;
|
||||
}
|
||||
else if (Xpos < -2.5) {
|
||||
Xpos = -2.5;
|
||||
sign = +1;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
GLuint passed;
|
||||
GLint ready;
|
||||
char s[100];
|
||||
int i;
|
||||
|
||||
glClearColor(0.25, 0.25, 0.25, 0.0);
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
|
|
@ -96,97 +102,84 @@ static void Display( void )
|
|||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
|
||||
/* draw the occluding polygons */
|
||||
glColor3f(0, 0.6, 0.8);
|
||||
glColor3f(0, 0.4, 0.6);
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(-1.6, -1.5);
|
||||
glVertex2f(-0.4, -1.5);
|
||||
glVertex2f(-0.4, 1.5);
|
||||
glVertex2f(-1.6, 1.5);
|
||||
|
||||
glVertex2f( 0.4, -1.5);
|
||||
glVertex2f( 1.6, -1.5);
|
||||
glVertex2f( 1.6, 1.5);
|
||||
glVertex2f( 0.4, 1.5);
|
||||
glVertex2f(-1.6, -2.5);
|
||||
glVertex2f(-0.4, -2.5);
|
||||
glVertex2f(-0.4, 2.5);
|
||||
glVertex2f(-1.6, 2.5);
|
||||
glVertex2f( 0.4, -2.5);
|
||||
glVertex2f( 1.6, -2.5);
|
||||
glVertex2f( 1.6, 2.5);
|
||||
glVertex2f( 0.4, 2.5);
|
||||
glEnd();
|
||||
|
||||
/* draw the test polygon with occlusion testing */
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos, 0, -0.5);
|
||||
glScalef(0.3, 0.3, 1.0);
|
||||
glRotatef(-90.0 * Xpos, 0, 0, 1);
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
#if TEST_DISPLAY_LISTS
|
||||
glNewList(10, GL_COMPILE);
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
|
||||
glEndList();
|
||||
glCallList(10);
|
||||
#else
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
|
||||
#endif
|
||||
|
||||
glColorMask(0, 0, 0, 0);
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
/* draw the test polygons with occlusion testing */
|
||||
for (i = 0; i < NUM_OCC; i++) {
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos[i], Ypos[i], -0.5);
|
||||
glScalef(0.2, 0.2, 1.0);
|
||||
glRotatef(-90.0 * Xpos[i], 0, 0, 1);
|
||||
|
||||
#if TEST_DISPLAY_LISTS
|
||||
glNewList(11, GL_COMPILE);
|
||||
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
|
||||
glEndList();
|
||||
glCallList(11);
|
||||
#else
|
||||
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
|
||||
#endif
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery[i]);
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
|
||||
|
||||
do {
|
||||
/* do useful work here, if any */
|
||||
glGetQueryObjectivARB(OccQuery, GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
|
||||
} while (!ready);
|
||||
glGetQueryObjectuivARB(OccQuery, GL_QUERY_RESULT_ARB, &passed);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
/* turn off occlusion testing */
|
||||
glColorMask(1, 1, 1, 1);
|
||||
glDepthMask(GL_TRUE);
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
/* draw the orange rect, so we can see what's going on */
|
||||
glColor3f(0.8, 0.5, 0);
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
/* Draw the rectangles now.
|
||||
* Draw orange if result was ready
|
||||
* Draw red if result was not ready.
|
||||
*/
|
||||
for (i = 0; i < NUM_OCC; i++) {
|
||||
GLuint passed;
|
||||
GLint ready;
|
||||
|
||||
glPopMatrix();
|
||||
glGetQueryObjectivARB(OccQuery[i], GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
|
||||
|
||||
glGetQueryObjectuivARB(OccQuery[i], GL_QUERY_RESULT_ARB, &passed);
|
||||
|
||||
/* Print result message */
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
if (!ready)
|
||||
glColor3f(1, 0, 0);
|
||||
else
|
||||
glColor3f(0.8, 0.5, 0);
|
||||
|
||||
glColor3f(1, 1, 1);
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
sprintf(s, " %4d Fragments Visible", passed);
|
||||
glRasterPos3f(-0.50, -0.7, 0);
|
||||
PrintString(s);
|
||||
if (!passed) {
|
||||
glRasterPos3f(-0.25, -0.8, 0);
|
||||
PrintString("Fully Occluded");
|
||||
if (!ready || passed) {
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos[i], Ypos[i], -0.5);
|
||||
glScalef(0.2, 0.2, 1.0);
|
||||
glRotatef(-90.0 * Xpos[i], 0, 0, 1);
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
{
|
||||
char s[10];
|
||||
glRasterPos3f(0.45, Ypos[i], 1.0);
|
||||
sprintf(s, "%4d", passed);
|
||||
PrintString(s);
|
||||
}
|
||||
}
|
||||
#else
|
||||
glRasterPos3f(-0.25, -0.8, 0);
|
||||
PrintString("GL_ARB_occlusion_query not available at compile time");
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
|
@ -222,14 +215,17 @@ static void Key( unsigned char key, int x, int y )
|
|||
static void SpecialKey( int key, int x, int y )
|
||||
{
|
||||
const GLfloat step = 0.1;
|
||||
int i;
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case GLUT_KEY_LEFT:
|
||||
Xpos -= step;
|
||||
for (i = 0; i < NUM_OCC; i++)
|
||||
Xpos[i] -= step;
|
||||
break;
|
||||
case GLUT_KEY_RIGHT:
|
||||
Xpos += step;
|
||||
for (i = 0; i < NUM_OCC; i++)
|
||||
Xpos[i] += step;
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
|
|
@ -240,29 +236,33 @@ static void Init( void )
|
|||
{
|
||||
const char *ext = (const char *) glGetString(GL_EXTENSIONS);
|
||||
GLint bits;
|
||||
int i;
|
||||
|
||||
if (!strstr(ext, "GL_ARB_occlusion_query")) {
|
||||
printf("Sorry, this demo requires the GL_ARB_occlusion_query extension\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
glGetQueryivARB(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, &bits);
|
||||
if (!bits) {
|
||||
printf("Hmmm, GL_QUERY_COUNTER_BITS_ARB is zero!\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
glGetIntegerv(GL_DEPTH_BITS, &bits);
|
||||
printf("Depthbits: %d\n", bits);
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
glGenQueriesARB(1, &OccQuery);
|
||||
assert(OccQuery > 0);
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
glGenQueriesARB(NUM_OCC, OccQuery);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
for (i = 0; i < NUM_OCC; i++) {
|
||||
float t = (float) i / (NUM_OCC - 1);
|
||||
Xpos[i] = 2.5 * t;
|
||||
Ypos[i] = 4.0 * (t - 0.5);
|
||||
Sign[i] = 1.0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -276,7 +276,10 @@ int main( int argc, char *argv[] )
|
|||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutSpecialFunc( SpecialKey );
|
||||
glutIdleFunc( Idle );
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
glutDisplayFunc( Display );
|
||||
Init();
|
||||
glutMainLoop();
|
||||
|
|
|
|||
314
progs/demos/arbocclude2.c
Normal file
314
progs/demos/arbocclude2.c
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
/*
|
||||
* GL_ARB_occlusion_query demo
|
||||
*
|
||||
* Brian Paul
|
||||
* 12 June 2003
|
||||
*
|
||||
* Copyright (C) 2003 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, 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
|
||||
* BRIAN PAUL 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.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <GL/glew.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
static GLboolean Anim = GL_TRUE;
|
||||
static GLfloat Xpos = 0;
|
||||
static GLuint OccQuery1;
|
||||
static GLuint OccQuery2;
|
||||
static GLint Win = 0;
|
||||
|
||||
|
||||
static void
|
||||
PrintString(const char *s)
|
||||
{
|
||||
while (*s) {
|
||||
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void Idle(void)
|
||||
{
|
||||
static int lastTime = 0;
|
||||
static int sign = +1;
|
||||
int time = glutGet(GLUT_ELAPSED_TIME);
|
||||
float step;
|
||||
|
||||
if (lastTime == 0)
|
||||
lastTime = time;
|
||||
else if (time - lastTime < 20) /* 50Hz update */
|
||||
return;
|
||||
|
||||
step = (time - lastTime) / 1000.0 * sign;
|
||||
lastTime = time;
|
||||
|
||||
Xpos += step;
|
||||
|
||||
if (Xpos > 2.5) {
|
||||
Xpos = 2.5;
|
||||
sign = -1;
|
||||
}
|
||||
else if (Xpos < -2.5) {
|
||||
Xpos = -2.5;
|
||||
sign = +1;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
GLuint passed1, passed2;
|
||||
GLint ready;
|
||||
char s[100];
|
||||
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
|
||||
/* draw the occluding polygons */
|
||||
glColor3f(0, 0.6, 0.8);
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(-1.6, -1.5);
|
||||
glVertex2f(-0.4, -1.5);
|
||||
glVertex2f(-0.4, 1.5);
|
||||
glVertex2f(-1.6, 1.5);
|
||||
|
||||
glVertex2f( 0.4, -1.5);
|
||||
glVertex2f( 1.6, -1.5);
|
||||
glVertex2f( 1.6, 1.5);
|
||||
glVertex2f( 0.4, 1.5);
|
||||
glEnd();
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
glColorMask(0, 0, 0, 0);
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
/* draw the first polygon with occlusion testing */
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos, 0.4, -0.5);
|
||||
glScalef(0.3, 0.3, 1.0);
|
||||
glRotatef(-90.0 * Xpos, 0, 0, 1);
|
||||
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery1);
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
|
||||
|
||||
/* draw the second polygon with occlusion testing */
|
||||
glPopMatrix();
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos, -0.4, -0.5);
|
||||
glScalef(0.3, 0.3, 1.0);
|
||||
|
||||
glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery2);
|
||||
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
glEndQueryARB(GL_SAMPLES_PASSED_ARB);
|
||||
|
||||
/* turn off occlusion testing */
|
||||
glColorMask(1, 1, 1, 1);
|
||||
glDepthMask(GL_TRUE);
|
||||
|
||||
do {
|
||||
/* do useful work here, if any */
|
||||
glGetQueryObjectivARB(OccQuery1, GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
|
||||
} while (!ready);
|
||||
glGetQueryObjectuivARB(OccQuery1, GL_QUERY_RESULT_ARB, &passed1);
|
||||
|
||||
do {
|
||||
/* do useful work here, if any */
|
||||
glGetQueryObjectivARB(OccQuery2, GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
|
||||
} while (!ready);
|
||||
glGetQueryObjectuivARB(OccQuery2, GL_QUERY_RESULT_ARB, &passed2);
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
/* draw the second rect, so we can see what's going on */
|
||||
glColor3f(0.8, 0.5, 0);
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
glPopMatrix();
|
||||
glPushMatrix();
|
||||
glTranslatef(Xpos, 0.4, -0.5);
|
||||
glScalef(0.3, 0.3, 1.0);
|
||||
glRotatef(-90.0 * Xpos, 0, 0, 1);
|
||||
|
||||
/* draw the first rect, so we can see what's going on */
|
||||
glBegin(GL_POLYGON);
|
||||
glVertex3f(-1, -1, 0);
|
||||
glVertex3f( 1, -1, 0);
|
||||
glVertex3f( 1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
/* Print result message */
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
|
||||
glColor3f(1, 1, 1);
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
sprintf(s, " %4d Fragments Visible", passed1);
|
||||
glRasterPos3f(-0.50, -0.6, 0);
|
||||
PrintString(s);
|
||||
if (!passed1) {
|
||||
glRasterPos3f(-0.25, -0.7, 0);
|
||||
PrintString("Fully Occluded");
|
||||
}
|
||||
sprintf(s, " %4d Fragments Visible", passed2);
|
||||
glRasterPos3f(-0.50, -0.8, 0);
|
||||
PrintString(s);
|
||||
if (!passed2) {
|
||||
glRasterPos3f(-0.25, -0.9, 0);
|
||||
PrintString("Fully Occluded");
|
||||
}
|
||||
#else
|
||||
glRasterPos3f(-0.25, -0.8, 0);
|
||||
PrintString("GL_ARB_occlusion_query not available at compile time");
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
glViewport( 0, 0, width, height );
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
glutDestroyWindow(Win);
|
||||
exit(0);
|
||||
break;
|
||||
case ' ':
|
||||
Anim = !Anim;
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void SpecialKey( int key, int x, int y )
|
||||
{
|
||||
const GLfloat step = 0.1;
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case GLUT_KEY_LEFT:
|
||||
Xpos -= step;
|
||||
break;
|
||||
case GLUT_KEY_RIGHT:
|
||||
Xpos += step;
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Init( void )
|
||||
{
|
||||
const char *ext = (const char *) glGetString(GL_EXTENSIONS);
|
||||
GLint bits;
|
||||
|
||||
if (!strstr(ext, "GL_ARB_occlusion_query")) {
|
||||
printf("Sorry, this demo requires the GL_ARB_occlusion_query extension\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
glGetQueryivARB(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, &bits);
|
||||
if (!bits) {
|
||||
printf("Hmmm, GL_QUERY_COUNTER_BITS_ARB is zero!\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
glGetIntegerv(GL_DEPTH_BITS, &bits);
|
||||
printf("Depthbits: %d\n", bits);
|
||||
|
||||
#if defined(GL_ARB_occlusion_query)
|
||||
glGenQueriesARB(1, &OccQuery1);
|
||||
assert(OccQuery1 > 0);
|
||||
glGenQueriesARB(1, &OccQuery2);
|
||||
assert(OccQuery2 > 0);
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInitWindowSize( 400, 400 );
|
||||
glutInit( &argc, argv );
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
|
||||
Win = glutCreateWindow(argv[0]);
|
||||
glewInit();
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutSpecialFunc( SpecialKey );
|
||||
glutIdleFunc( Idle );
|
||||
glutDisplayFunc( Display );
|
||||
Init();
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
||||
4
progs/directfb/.gitignore
vendored
4
progs/directfb/.gitignore
vendored
|
|
@ -1,4 +0,0 @@
|
|||
df_gears
|
||||
df_morph3d
|
||||
df_reflect
|
||||
multi_window
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
# progs/directfb/Makefile
|
||||
|
||||
TOP = ../..
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
INCDIR = $(TOP)/include -I$(TOP)/progs
|
||||
|
||||
LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME)
|
||||
|
||||
CFLAGS += $(shell pkg-config --cflags directfb)
|
||||
APP_LIB_DEPS += $(shell pkg-config --libs directfb)
|
||||
|
||||
LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) $(APP_LIB_DEPS)
|
||||
|
||||
PROGS = df_gears \
|
||||
df_reflect \
|
||||
df_morph3d \
|
||||
multi_window
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c
|
||||
|
||||
.c: $(LIB_DEP)
|
||||
$(CC) -I$(INCDIR) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default: $(PROGS)
|
||||
|
||||
|
||||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o *~
|
||||
|
||||
|
|
@ -1,480 +0,0 @@
|
|||
/*
|
||||
(c) Copyright 2001 convergence integrated media GmbH.
|
||||
All rights reserved.
|
||||
|
||||
Written by Denis Oliver Kropp <dok@convergence.de> and
|
||||
Andreas Hundt <andi@convergence.de>.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfbgl.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
|
||||
|
||||
/* the super interface */
|
||||
IDirectFB *dfb;
|
||||
|
||||
/* the primary surface (surface of primary layer) */
|
||||
IDirectFBSurface *primary;
|
||||
|
||||
/* the GL context */
|
||||
IDirectFBGL *primary_gl;
|
||||
|
||||
/* our font */
|
||||
IDirectFBFont *font;
|
||||
|
||||
/* event buffer */
|
||||
IDirectFBEventBuffer *events;
|
||||
|
||||
/* macro for a safe call to DirectFB functions */
|
||||
#define DFBCHECK(x...) \
|
||||
{ \
|
||||
err = x; \
|
||||
if (err != DFB_OK) { \
|
||||
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
|
||||
DirectFBErrorFatal( #x, err ); \
|
||||
} \
|
||||
}
|
||||
|
||||
static int screen_width, screen_height;
|
||||
|
||||
static unsigned long T0 = 0;
|
||||
static GLint Frames = 0;
|
||||
static GLfloat fps = 0;
|
||||
|
||||
static inline unsigned long get_millis()
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, NULL);
|
||||
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
}
|
||||
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
||||
Draw a gear wheel. You'll probably want to call this function when
|
||||
building a display list since we do a lot of trig here.
|
||||
|
||||
Input: inner_radius - radius of hole at center
|
||||
outer_radius - radius at center of teeth
|
||||
width - width of gear
|
||||
teeth - number of teeth
|
||||
tooth_depth - depth of tooth
|
||||
|
||||
**/
|
||||
|
||||
static void
|
||||
gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
||||
GLint teeth, GLfloat tooth_depth)
|
||||
{
|
||||
GLint i;
|
||||
GLfloat r0, r1, r2;
|
||||
GLfloat angle, da;
|
||||
GLfloat u, v, len;
|
||||
|
||||
r0 = inner_radius;
|
||||
r1 = outer_radius - tooth_depth / 2.0;
|
||||
r2 = outer_radius + tooth_depth / 2.0;
|
||||
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
|
||||
glShadeModel(GL_FLAT);
|
||||
|
||||
glNormal3f(0.0, 0.0, 1.0);
|
||||
|
||||
/* draw front face */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
if (i < teeth) {
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw front sides of teeth */
|
||||
glBegin(GL_QUADS);
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glNormal3f(0.0, 0.0, -1.0);
|
||||
|
||||
/* draw back face */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
if (i < teeth) {
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw back sides of teeth */
|
||||
glBegin(GL_QUADS);
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw outward faces of teeth */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
u = r2 * cos(angle + da) - r1 * cos(angle);
|
||||
v = r2 * sin(angle + da) - r1 * sin(angle);
|
||||
len = sqrt(u * u + v * v);
|
||||
u /= len;
|
||||
v /= len;
|
||||
glNormal3f(v, -u, 0.0);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
||||
u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
|
||||
v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
|
||||
glNormal3f(v, -u, 0.0);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
||||
}
|
||||
|
||||
glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
|
||||
glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
|
||||
|
||||
glEnd();
|
||||
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
/* draw inside radius cylinder */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glNormal3f(-cos(angle), -sin(angle), 0.0);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
}
|
||||
|
||||
static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
|
||||
static GLfloat inc_rotx = 0, inc_roty = 0, inc_rotz = 0;
|
||||
static GLint gear1, gear2, gear3;
|
||||
static GLfloat angle = 0.0;
|
||||
|
||||
static void
|
||||
draw(void)
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(view_rotx, 1.0, 0.0, 0.0);
|
||||
glRotatef(view_roty, 0.0, 1.0, 0.0);
|
||||
glRotatef(view_rotz, 0.0, 0.0, 1.0);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(-3.0, -2.0, 0.0);
|
||||
glRotatef(angle, 0.0, 0.0, 1.0);
|
||||
glCallList(gear1);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(3.1, -2.0, 0.0);
|
||||
glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
|
||||
glCallList(gear2);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(-3.1, 4.2, 0.0);
|
||||
glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
|
||||
glCallList(gear3);
|
||||
glPopMatrix();
|
||||
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
/* new window size or exposure */
|
||||
static void
|
||||
reshape(int width, int height)
|
||||
{
|
||||
GLfloat h = (GLfloat) height / (GLfloat) width;
|
||||
|
||||
glViewport(0, 0, (GLint) width, (GLint) height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -40.0);
|
||||
}
|
||||
|
||||
static void
|
||||
init(int argc, char *argv[])
|
||||
{
|
||||
static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
|
||||
static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0};
|
||||
static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
|
||||
static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
|
||||
GLint i;
|
||||
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, pos);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
/* make the gears */
|
||||
gear1 = glGenLists(1);
|
||||
glNewList(gear1, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
|
||||
gear(1.0, 4.0, 1.0, 20, 0.7);
|
||||
glEndList();
|
||||
|
||||
gear2 = glGenLists(1);
|
||||
glNewList(gear2, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
|
||||
gear(0.5, 2.0, 2.0, 10, 0.7);
|
||||
glEndList();
|
||||
|
||||
gear3 = glGenLists(1);
|
||||
glNewList(gear3, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
|
||||
gear(1.3, 2.0, 0.5, 10, 0.7);
|
||||
glEndList();
|
||||
|
||||
glEnable(GL_NORMALIZE);
|
||||
|
||||
for ( i=1; i<argc; i++ ) {
|
||||
if (strcmp(argv[i], "-info")==0) {
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
|
||||
printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
|
||||
printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
int quit = 0;
|
||||
DFBResult err;
|
||||
DFBSurfaceDescription dsc;
|
||||
|
||||
DFBCHECK(DirectFBInit( &argc, &argv ));
|
||||
|
||||
/* create the super interface */
|
||||
DFBCHECK(DirectFBCreate( &dfb ));
|
||||
|
||||
/* create an event buffer for all devices with these caps */
|
||||
DFBCHECK(dfb->CreateInputEventBuffer( dfb, DICAPS_KEYS | DICAPS_AXES,
|
||||
DFB_FALSE, &events ));
|
||||
|
||||
/* set our cooperative level to DFSCL_FULLSCREEN
|
||||
for exclusive access to the primary layer */
|
||||
dfb->SetCooperativeLevel( dfb, DFSCL_FULLSCREEN );
|
||||
|
||||
/* get the primary surface, i.e. the surface of the
|
||||
primary layer we have exclusive access to */
|
||||
dsc.flags = DSDESC_CAPS;
|
||||
dsc.caps = DSCAPS_PRIMARY | DSCAPS_DOUBLE;
|
||||
|
||||
DFBCHECK(dfb->CreateSurface( dfb, &dsc, &primary ));
|
||||
|
||||
/* get the size of the surface and fill it */
|
||||
DFBCHECK(primary->GetSize( primary, &screen_width, &screen_height ));
|
||||
DFBCHECK(primary->FillRectangle( primary, 0, 0,
|
||||
screen_width, screen_height ));
|
||||
primary->Flip( primary, NULL, 0 );
|
||||
|
||||
/* create the default font and set it */
|
||||
DFBCHECK(dfb->CreateFont( dfb, NULL, NULL, &font ));
|
||||
DFBCHECK(primary->SetFont( primary, font ));
|
||||
|
||||
/* get the GL context */
|
||||
DFBCHECK(primary->GetGL( primary, &primary_gl ));
|
||||
|
||||
DFBCHECK(primary_gl->Lock( primary_gl ));
|
||||
|
||||
init(argc, argv);
|
||||
reshape(screen_width, screen_height);
|
||||
|
||||
DFBCHECK(primary_gl->Unlock( primary_gl ));
|
||||
|
||||
T0 = get_millis();
|
||||
|
||||
while (!quit) {
|
||||
DFBInputEvent evt;
|
||||
unsigned long t;
|
||||
|
||||
DFBCHECK(primary_gl->Lock( primary_gl ));
|
||||
|
||||
draw();
|
||||
|
||||
DFBCHECK(primary_gl->Unlock( primary_gl ));
|
||||
|
||||
if (fps) {
|
||||
char buf[64];
|
||||
|
||||
snprintf(buf, 64, "%4.1f FPS\n", fps);
|
||||
|
||||
primary->SetColor( primary, 0xff, 0, 0, 0xff );
|
||||
primary->DrawString( primary, buf, -1, screen_width - 5, 5, DSTF_TOPRIGHT );
|
||||
}
|
||||
|
||||
primary->Flip( primary, NULL, 0 );
|
||||
Frames++;
|
||||
|
||||
|
||||
t = get_millis();
|
||||
if (t - T0 >= 2000) {
|
||||
GLfloat seconds = (t - T0) / 1000.0;
|
||||
|
||||
fps = Frames / seconds;
|
||||
|
||||
T0 = t;
|
||||
Frames = 0;
|
||||
}
|
||||
|
||||
|
||||
while (events->GetEvent( events, DFB_EVENT(&evt) ) == DFB_OK) {
|
||||
switch (evt.type) {
|
||||
case DIET_KEYPRESS:
|
||||
switch (evt.key_symbol) {
|
||||
case DIKS_ESCAPE:
|
||||
quit = 1;
|
||||
break;
|
||||
case DIKS_CURSOR_UP:
|
||||
inc_rotx = 5.0;
|
||||
break;
|
||||
case DIKS_CURSOR_DOWN:
|
||||
inc_rotx = -5.0;
|
||||
break;
|
||||
case DIKS_CURSOR_LEFT:
|
||||
inc_roty = 5.0;
|
||||
break;
|
||||
case DIKS_CURSOR_RIGHT:
|
||||
inc_roty = -5.0;
|
||||
break;
|
||||
case DIKS_PAGE_UP:
|
||||
inc_rotz = 5.0;
|
||||
break;
|
||||
case DIKS_PAGE_DOWN:
|
||||
inc_rotz = -5.0;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
break;
|
||||
case DIET_KEYRELEASE:
|
||||
switch (evt.key_symbol) {
|
||||
case DIKS_CURSOR_UP:
|
||||
inc_rotx = 0;
|
||||
break;
|
||||
case DIKS_CURSOR_DOWN:
|
||||
inc_rotx = 0;
|
||||
break;
|
||||
case DIKS_CURSOR_LEFT:
|
||||
inc_roty = 0;
|
||||
break;
|
||||
case DIKS_CURSOR_RIGHT:
|
||||
inc_roty = 0;
|
||||
break;
|
||||
case DIKS_PAGE_UP:
|
||||
inc_rotz = 0;
|
||||
break;
|
||||
case DIKS_PAGE_DOWN:
|
||||
inc_rotz = 0;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
break;
|
||||
case DIET_AXISMOTION:
|
||||
if (evt.flags & DIEF_AXISREL) {
|
||||
switch (evt.axis) {
|
||||
case DIAI_X:
|
||||
view_roty += evt.axisrel / 2.0;
|
||||
break;
|
||||
case DIAI_Y:
|
||||
view_rotx += evt.axisrel / 2.0;
|
||||
break;
|
||||
case DIAI_Z:
|
||||
view_rotz += evt.axisrel / 2.0;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
angle += 2.0;
|
||||
|
||||
view_rotx += inc_rotx;
|
||||
view_roty += inc_roty;
|
||||
view_rotz += inc_rotz;
|
||||
}
|
||||
|
||||
/* release our interfaces to shutdown DirectFB */
|
||||
primary_gl->Release( primary_gl );
|
||||
primary->Release( primary );
|
||||
font->Release( font );
|
||||
events->Release( events );
|
||||
dfb->Release( dfb );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,489 +0,0 @@
|
|||
/*
|
||||
(c) Copyright 2001 convergence integrated media GmbH.
|
||||
All rights reserved.
|
||||
|
||||
Written by Denis Oliver Kropp <dok@convergence.de> and
|
||||
Andreas Hundt <andi@convergence.de>.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfbgl.h>
|
||||
|
||||
#include <GL/glu.h>
|
||||
|
||||
#include "util/showbuffer.c"
|
||||
#include "util/readtex.c"
|
||||
|
||||
|
||||
/* the super interface */
|
||||
IDirectFB *dfb;
|
||||
|
||||
/* the primary surface (surface of primary layer) */
|
||||
IDirectFBSurface *primary;
|
||||
|
||||
/* the GL context */
|
||||
IDirectFBGL *primary_gl;
|
||||
|
||||
/* our font */
|
||||
IDirectFBFont *font;
|
||||
|
||||
/* event buffer */
|
||||
IDirectFBEventBuffer *events;
|
||||
|
||||
/* macro for a safe call to DirectFB functions */
|
||||
#define DFBCHECK(x...) \
|
||||
{ \
|
||||
err = x; \
|
||||
if (err != DFB_OK) { \
|
||||
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
|
||||
DirectFBErrorFatal( #x, err ); \
|
||||
} \
|
||||
}
|
||||
|
||||
static int screen_width, screen_height;
|
||||
|
||||
static unsigned long T0 = 0;
|
||||
static GLint Frames = 0;
|
||||
static GLfloat fps = 0;
|
||||
|
||||
static inline unsigned long get_millis()
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, NULL);
|
||||
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
}
|
||||
|
||||
/*******************************/
|
||||
|
||||
#define DEG2RAD (3.14159/180.0)
|
||||
|
||||
#define TABLE_TEXTURE "../images/tile.rgb"
|
||||
|
||||
static GLint ImgWidth, ImgHeight;
|
||||
static GLenum ImgFormat;
|
||||
static GLubyte *Image = NULL;
|
||||
|
||||
#define MAX_OBJECTS 2
|
||||
static GLint table_list;
|
||||
static GLint objects_list[MAX_OBJECTS];
|
||||
|
||||
static GLfloat xrot, yrot;
|
||||
static GLfloat spin;
|
||||
|
||||
static GLint Width = 400, Height = 300;
|
||||
static GLenum ShowBuffer = GL_NONE;
|
||||
|
||||
|
||||
static void make_table( void )
|
||||
{
|
||||
static GLfloat table_mat[] = { 1.0, 1.0, 1.0, 0.6 };
|
||||
static GLfloat gray[] = { 0.4, 0.4, 0.4, 1.0 };
|
||||
|
||||
table_list = glGenLists(1);
|
||||
glNewList( table_list, GL_COMPILE );
|
||||
|
||||
/* load table's texture */
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_mat );
|
||||
/* glMaterialfv( GL_FRONT, GL_EMISSION, gray );*/
|
||||
glMaterialfv( GL_FRONT, GL_DIFFUSE, table_mat );
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT, gray );
|
||||
|
||||
/* draw textured square for the table */
|
||||
glPushMatrix();
|
||||
glScalef( 4.0, 4.0, 4.0 );
|
||||
glBegin( GL_POLYGON );
|
||||
glNormal3f( 0.0, 1.0, 0.0 );
|
||||
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, 0.0, 1.0 );
|
||||
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
|
||||
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, -1.0 );
|
||||
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 0.0, -1.0 );
|
||||
glEnd();
|
||||
glPopMatrix();
|
||||
|
||||
glDisable( GL_TEXTURE_2D );
|
||||
|
||||
glEndList();
|
||||
}
|
||||
|
||||
|
||||
static void make_objects( void )
|
||||
{
|
||||
GLUquadricObj *q;
|
||||
|
||||
static GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
|
||||
static GLfloat green[] = { 0.2, 1.0, 0.2, 1.0 };
|
||||
static GLfloat black[] = { 0.0, 0.0, 0.0, 0.0 };
|
||||
|
||||
q = gluNewQuadric();
|
||||
gluQuadricDrawStyle( q, GLU_FILL );
|
||||
gluQuadricNormals( q, GLU_SMOOTH );
|
||||
|
||||
objects_list[0] = glGenLists(1);
|
||||
glNewList( objects_list[0], GL_COMPILE );
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan );
|
||||
glMaterialfv( GL_FRONT, GL_EMISSION, black );
|
||||
gluCylinder( q, 0.5, 0.5, 1.0, 15, 1 );
|
||||
glEndList();
|
||||
|
||||
objects_list[1] = glGenLists(1);
|
||||
glNewList( objects_list[1], GL_COMPILE );
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
|
||||
glMaterialfv( GL_FRONT, GL_EMISSION, black );
|
||||
gluCylinder( q, 1.5, 0.0, 2.5, 15, 1 );
|
||||
glEndList();
|
||||
}
|
||||
|
||||
|
||||
static void init( void )
|
||||
{
|
||||
make_table();
|
||||
make_objects();
|
||||
|
||||
Image = LoadRGBImage( TABLE_TEXTURE, &ImgWidth, &ImgHeight, &ImgFormat );
|
||||
if (!Image) {
|
||||
printf("Couldn't read %s\n", TABLE_TEXTURE);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, ImgWidth, ImgHeight,
|
||||
ImgFormat, GL_UNSIGNED_BYTE, Image);
|
||||
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||
|
||||
xrot = 30.0;
|
||||
yrot = 50.0;
|
||||
spin = 0.0;
|
||||
|
||||
glShadeModel( GL_FLAT );
|
||||
|
||||
glEnable( GL_LIGHT0 );
|
||||
glEnable( GL_LIGHTING );
|
||||
|
||||
glClearColor( 0.5, 0.5, 0.9, 0.0 );
|
||||
|
||||
glEnable( GL_NORMALIZE );
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void reshape(int w, int h)
|
||||
{
|
||||
GLfloat yAspect = 2.5;
|
||||
GLfloat xAspect = yAspect * (float) w / (float) h;
|
||||
Width = w;
|
||||
Height = h;
|
||||
glViewport(0, 0, w, h);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum( -xAspect, xAspect, -yAspect, yAspect, 10.0, 30.0 );
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void draw_objects( GLfloat eyex, GLfloat eyey, GLfloat eyez )
|
||||
{
|
||||
(void) eyex;
|
||||
(void) eyey;
|
||||
(void) eyez;
|
||||
#ifndef USE_ZBUFFER
|
||||
if (eyex<0.5) {
|
||||
#endif
|
||||
glPushMatrix();
|
||||
glTranslatef( 1.0, 1.5, 0.0 );
|
||||
glRotatef( spin, 1.0, 0.5, 0.0 );
|
||||
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
|
||||
glCallList( objects_list[0] );
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
|
||||
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
|
||||
glRotatef( spin, 1.0, 0.5, 0.0 );
|
||||
glScalef( 0.5, 0.5, 0.5 );
|
||||
glCallList( objects_list[1] );
|
||||
glPopMatrix();
|
||||
#ifndef USE_ZBUFFER
|
||||
}
|
||||
else {
|
||||
glPushMatrix();
|
||||
glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*spin) ), 0.0 );
|
||||
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
|
||||
glRotatef( spin, 1.0, 0.5, 0.0 );
|
||||
glScalef( 0.5, 0.5, 0.5 );
|
||||
glCallList( objects_list[1] );
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( 1.0, 1.5, 0.0 );
|
||||
glRotatef( spin, 1.0, 0.5, 0.0 );
|
||||
glRotatef( 0.5*spin, 0.0, 0.5, 1.0 );
|
||||
glCallList( objects_list[0] );
|
||||
glPopMatrix();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void draw_table( void )
|
||||
{
|
||||
glCallList( table_list );
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void draw( void )
|
||||
{
|
||||
static GLfloat light_pos[] = { 0.0, 20.0, 0.0, 1.0 };
|
||||
GLfloat dist = 20.0;
|
||||
GLfloat eyex, eyey, eyez;
|
||||
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
|
||||
eyex = dist * cos(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
|
||||
eyez = dist * sin(yrot*DEG2RAD) * cos(xrot*DEG2RAD);
|
||||
eyey = dist * sin(xrot*DEG2RAD);
|
||||
|
||||
/* view from top */
|
||||
glPushMatrix();
|
||||
gluLookAt( eyex, eyey, eyez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
|
||||
|
||||
glLightfv( GL_LIGHT0, GL_POSITION, light_pos );
|
||||
|
||||
/* draw table into stencil planes */
|
||||
glDisable( GL_DEPTH_TEST );
|
||||
glEnable( GL_STENCIL_TEST );
|
||||
glStencilFunc( GL_ALWAYS, 1, 0xffffffff );
|
||||
glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );
|
||||
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
|
||||
draw_table();
|
||||
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
|
||||
|
||||
glEnable( GL_DEPTH_TEST );
|
||||
|
||||
/* render view from below (reflected viewport) */
|
||||
/* only draw where stencil==1 */
|
||||
if (eyey>0.0) {
|
||||
glPushMatrix();
|
||||
|
||||
glStencilFunc( GL_EQUAL, 1, 0xffffffff ); /* draw if ==1 */
|
||||
glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
|
||||
glScalef( 1.0, -1.0, 1.0 );
|
||||
|
||||
/* Reposition light in reflected space. */
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
|
||||
|
||||
draw_objects(eyex, eyey, eyez);
|
||||
glPopMatrix();
|
||||
|
||||
/* Restore light's original unreflected position. */
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
|
||||
}
|
||||
|
||||
glDisable( GL_STENCIL_TEST );
|
||||
|
||||
glEnable( GL_BLEND );
|
||||
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||
|
||||
glEnable( GL_TEXTURE_2D );
|
||||
draw_table();
|
||||
glDisable( GL_TEXTURE_2D );
|
||||
glDisable( GL_BLEND );
|
||||
|
||||
/* view from top */
|
||||
glPushMatrix();
|
||||
|
||||
draw_objects(eyex, eyey, eyez);
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
if (ShowBuffer == GL_DEPTH) {
|
||||
ShowDepthBuffer(Width, Height, 1.0, 0.0);
|
||||
}
|
||||
else if (ShowBuffer == GL_STENCIL) {
|
||||
ShowStencilBuffer(Width, Height, 255.0, 0.0);
|
||||
}
|
||||
else if (ShowBuffer == GL_ALPHA) {
|
||||
ShowAlphaBuffer(Width, Height);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************/
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
int quit = 0;
|
||||
DFBResult err;
|
||||
DFBSurfaceDescription dsc;
|
||||
|
||||
DFBCHECK(DirectFBInit( &argc, &argv ));
|
||||
|
||||
/* create the super interface */
|
||||
DFBCHECK(DirectFBCreate( &dfb ));
|
||||
|
||||
/* create an event buffer for all devices with these caps */
|
||||
DFBCHECK(dfb->CreateInputEventBuffer( dfb, DICAPS_ALL, DFB_FALSE, &events ));
|
||||
|
||||
/* set our cooperative level to DFSCL_FULLSCREEN
|
||||
for exclusive access to the primary layer */
|
||||
dfb->SetCooperativeLevel( dfb, DFSCL_FULLSCREEN );
|
||||
|
||||
/* get the primary surface, i.e. the surface of the
|
||||
primary layer we have exclusive access to */
|
||||
dsc.flags = DSDESC_CAPS;
|
||||
dsc.caps = (DFBSurfaceCapabilities)(DSCAPS_PRIMARY | DSCAPS_DOUBLE);
|
||||
|
||||
DFBCHECK(dfb->CreateSurface( dfb, &dsc, &primary ));
|
||||
|
||||
/* get the size of the surface and fill it */
|
||||
DFBCHECK(primary->GetSize( primary, &screen_width, &screen_height ));
|
||||
DFBCHECK(primary->FillRectangle( primary, 0, 0,
|
||||
screen_width, screen_height ));
|
||||
|
||||
/* create the default font and set it */
|
||||
DFBCHECK(dfb->CreateFont( dfb, NULL, NULL, &font ));
|
||||
DFBCHECK(primary->SetFont( primary, font ));
|
||||
|
||||
/* get the GL context */
|
||||
DFBCHECK(primary->GetGL( primary, &primary_gl ));
|
||||
|
||||
DFBCHECK(primary_gl->Lock( primary_gl ));
|
||||
|
||||
init();
|
||||
reshape(screen_width, screen_height);
|
||||
|
||||
DFBCHECK(primary_gl->Unlock( primary_gl ));
|
||||
|
||||
T0 = get_millis();
|
||||
|
||||
while (!quit) {
|
||||
DFBInputEvent evt;
|
||||
unsigned long t;
|
||||
|
||||
DFBCHECK(primary_gl->Lock( primary_gl ));
|
||||
|
||||
draw();
|
||||
|
||||
DFBCHECK(primary_gl->Unlock( primary_gl ));
|
||||
|
||||
if (fps) {
|
||||
char buf[64];
|
||||
|
||||
sprintf(buf, "%4.1f FPS\n", fps);
|
||||
primary->SetColor( primary, 0xff, 0, 0, 0xff );
|
||||
primary->DrawString( primary, buf, -1, screen_width - 5, 5, DSTF_TOPRIGHT );
|
||||
}
|
||||
|
||||
primary->Flip( primary, NULL, (DFBSurfaceFlipFlags)0 );
|
||||
Frames++;
|
||||
|
||||
|
||||
t = get_millis();
|
||||
if (t - T0 >= 1000) {
|
||||
GLfloat seconds = (t - T0) / 1000.0;
|
||||
|
||||
fps = Frames / seconds;
|
||||
|
||||
T0 = t;
|
||||
Frames = 0;
|
||||
}
|
||||
|
||||
|
||||
while (events->GetEvent( events, DFB_EVENT(&evt) ) == DFB_OK) {
|
||||
switch (evt.type) {
|
||||
case DIET_KEYPRESS:
|
||||
switch (DFB_LOWER_CASE(evt.key_symbol)) {
|
||||
case DIKS_ESCAPE:
|
||||
quit = 1;
|
||||
break;
|
||||
case DIKS_CURSOR_UP:
|
||||
xrot += 3.0;
|
||||
if ( xrot > 85 )
|
||||
xrot = 85;
|
||||
break;
|
||||
case DIKS_CURSOR_DOWN:
|
||||
xrot -= 3.0;
|
||||
if ( xrot < 5 )
|
||||
xrot = 5;
|
||||
break;
|
||||
case DIKS_CURSOR_LEFT:
|
||||
yrot += 3.0;
|
||||
break;
|
||||
case DIKS_CURSOR_RIGHT:
|
||||
yrot -= 3.0;
|
||||
break;
|
||||
case DIKS_SMALL_D:
|
||||
ShowBuffer = GL_DEPTH;
|
||||
break;
|
||||
case DIKS_SMALL_S:
|
||||
ShowBuffer = GL_STENCIL;
|
||||
break;
|
||||
case DIKS_SMALL_A:
|
||||
ShowBuffer = GL_ALPHA;
|
||||
break;
|
||||
default:
|
||||
ShowBuffer = GL_NONE;
|
||||
}
|
||||
break;
|
||||
case DIET_AXISMOTION:
|
||||
if (evt.flags & DIEF_AXISREL) {
|
||||
switch (evt.axis) {
|
||||
case DIAI_X:
|
||||
yrot += evt.axisrel / 2.0;
|
||||
break;
|
||||
case DIAI_Y:
|
||||
xrot += evt.axisrel / 2.0;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
spin += 2.0;
|
||||
yrot += 3.0;
|
||||
}
|
||||
|
||||
/* release our interfaces to shutdown DirectFB */
|
||||
primary_gl->Release( primary_gl );
|
||||
primary->Release( primary );
|
||||
font->Release( font );
|
||||
events->Release( events );
|
||||
dfb->Release( dfb );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1,240 +0,0 @@
|
|||
/*
|
||||
(c) Copyright 2001 convergence integrated media GmbH.
|
||||
All rights reserved.
|
||||
|
||||
Written by Denis Oliver Kropp <dok@convergence.de> and
|
||||
Andreas Hundt <andi@convergence.de>.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the
|
||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfbgl.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
IDirectFBWindow *window;
|
||||
IDirectFBSurface *surface;
|
||||
IDirectFBGL *gl;
|
||||
|
||||
int width;
|
||||
int height;
|
||||
|
||||
unsigned long last_time;
|
||||
int frames;
|
||||
float fps;
|
||||
} Context;
|
||||
|
||||
static const GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
|
||||
|
||||
static IDirectFB *dfb;
|
||||
static IDirectFBDisplayLayer *layer;
|
||||
static IDirectFBFont *font;
|
||||
static IDirectFBEventBuffer *events = NULL;
|
||||
|
||||
/* macro for a safe call to DirectFB functions */
|
||||
#define DFBCHECK(x...) \
|
||||
do { \
|
||||
ret = x; \
|
||||
if (ret != DFB_OK) { \
|
||||
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
|
||||
DirectFBErrorFatal( #x, ret ); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
static inline unsigned long get_millis()
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, NULL);
|
||||
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
setup( Context *context )
|
||||
{
|
||||
GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
|
||||
|
||||
context->surface->GetSize( context->surface,
|
||||
&context->width, &context->height );
|
||||
|
||||
context->gl->Lock( context->gl );
|
||||
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, pos);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glViewport(0, 0, context->width, context->height);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(70.0, context->width / (float) context->height, 1.0, 80.0);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -40.0);
|
||||
|
||||
context->gl->Unlock( context->gl );
|
||||
}
|
||||
|
||||
static void
|
||||
update( Context *context )
|
||||
{
|
||||
unsigned long t;
|
||||
IDirectFBSurface *surface = context->surface;
|
||||
static __u8 r = 0, g = 0, b = 0;
|
||||
|
||||
|
||||
context->gl->Lock( context->gl );
|
||||
|
||||
glClearColor( r++/255.0, g++/255.0, b++/255.0, 1.0 );
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
context->gl->Unlock( context->gl );
|
||||
|
||||
if (context->fps) {
|
||||
char buf[16];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%.1f FPS\n", context->fps);
|
||||
|
||||
surface->SetColor( surface, 0xff, 0x00, 0x00, 0xff );
|
||||
surface->DrawString( surface, buf, -1,
|
||||
context->width - 5, 5, DSTF_TOPRIGHT );
|
||||
}
|
||||
|
||||
surface->Flip( surface, NULL, 0 );
|
||||
|
||||
context->frames++;
|
||||
|
||||
t = get_millis();
|
||||
if (t - context->last_time >= 2000) {
|
||||
float seconds = (t - context->last_time) / 1000.0f;
|
||||
|
||||
context->fps = context->frames / seconds;
|
||||
|
||||
context->last_time = t;
|
||||
context->frames = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main( int argc, char *argv[] )
|
||||
{
|
||||
DFBResult ret;
|
||||
int i;
|
||||
int quit = 0;
|
||||
const int num = 2;
|
||||
Context contexts[num];
|
||||
|
||||
DFBCHECK(DirectFBInit( &argc, &argv ));
|
||||
|
||||
/* create the super interface */
|
||||
DFBCHECK(DirectFBCreate( &dfb ));
|
||||
|
||||
DFBCHECK(dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer ));
|
||||
|
||||
/* create the default font */
|
||||
DFBCHECK(dfb->CreateFont( dfb, NULL, NULL, &font ));
|
||||
|
||||
for (i=0; i<num; i++) {
|
||||
IDirectFBWindow *window;
|
||||
IDirectFBSurface *surface;
|
||||
IDirectFBGL *gl;
|
||||
DFBWindowDescription desc;
|
||||
|
||||
desc.flags = DWDESC_POSX | DWDESC_POSY |
|
||||
DWDESC_WIDTH | DWDESC_HEIGHT;
|
||||
desc.posx = (i%3) * 200 + 10;
|
||||
desc.posy = (i/3) * 200 + 10;
|
||||
desc.width = 180;
|
||||
desc.height = 180;
|
||||
|
||||
DFBCHECK(layer->CreateWindow( layer, &desc, &window ));
|
||||
DFBCHECK(window->GetSurface( window, &surface ));
|
||||
DFBCHECK(surface->GetGL( surface, &gl ));
|
||||
|
||||
contexts[i].window = window;
|
||||
contexts[i].surface = surface;
|
||||
contexts[i].gl = gl;
|
||||
|
||||
contexts[i].last_time = get_millis();
|
||||
contexts[i].frames = 0;
|
||||
contexts[i].fps = 0;
|
||||
|
||||
setup( &contexts[i] );
|
||||
|
||||
if (events)
|
||||
DFBCHECK(window->AttachEventBuffer( window, events ));
|
||||
else
|
||||
DFBCHECK(window->CreateEventBuffer( window, &events ));
|
||||
|
||||
DFBCHECK(surface->SetFont( surface, font ));
|
||||
|
||||
window->SetOpacity( window, 0xff );
|
||||
}
|
||||
|
||||
while (!quit) {
|
||||
DFBWindowEvent evt;
|
||||
|
||||
for (i=0; i<num; i++)
|
||||
update( &contexts[i] );
|
||||
|
||||
while (events->GetEvent( events, DFB_EVENT(&evt) ) == DFB_OK) {
|
||||
switch (evt.type) {
|
||||
case DWET_KEYDOWN:
|
||||
switch (evt.key_symbol) {
|
||||
case DIKS_ESCAPE:
|
||||
quit = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
events->Release( events );
|
||||
|
||||
for (i=0; i<num; i++) {
|
||||
contexts[i].gl->Release( contexts[i].gl );
|
||||
contexts[i].surface->Release( contexts[i].surface );
|
||||
contexts[i].window->Release( contexts[i].window );
|
||||
}
|
||||
|
||||
font->Release( font );
|
||||
layer->Release( layer );
|
||||
dfb->Release( dfb );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -48,19 +48,19 @@ eglinfo: eglinfo.o $(HEADERS) $(LIB_DEP)
|
|||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
|
||||
|
||||
eglgears: eglgears.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
|
||||
|
||||
eglscreen: eglscreen.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
|
||||
|
||||
peglgears: peglgears.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(LIBDRM_LIB) -lm
|
||||
|
||||
xeglgears: xeglgears.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lX11
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lX11 -lm
|
||||
|
||||
xeglthreads: xeglthreads.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lX11
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lX11 -lm
|
||||
|
||||
xegl_tri: xegl_tri.o $(HEADERS) $(LIB_DEP)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) -lX11
|
||||
|
|
|
|||
|
|
@ -156,7 +156,42 @@ PrintModes(EGLDisplay d)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
PrintExtensions(EGLDisplay d)
|
||||
{
|
||||
const char *extensions, *p, *end, *next;
|
||||
int column;
|
||||
|
||||
printf("EGL extensions string:\n");
|
||||
|
||||
extensions = eglQueryString(d, EGL_EXTENSIONS);
|
||||
|
||||
column = 0;
|
||||
end = extensions + strlen(extensions);
|
||||
|
||||
for (p = extensions; p < end; p = next + 1) {
|
||||
next = strchr(p, ' ');
|
||||
if (next == NULL)
|
||||
next = end;
|
||||
|
||||
if (column > 0 && column + next - p + 1 > 70) {
|
||||
printf("\n");
|
||||
column = 0;
|
||||
}
|
||||
if (column == 0)
|
||||
printf(" ");
|
||||
else
|
||||
printf(" ");
|
||||
column += next - p + 1;
|
||||
|
||||
printf("%.*s", (int) (next - p), p);
|
||||
|
||||
p = next + 1;
|
||||
}
|
||||
|
||||
if (column > 0)
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
|
|
@ -175,8 +210,8 @@ main(int argc, char *argv[])
|
|||
#ifdef EGL_VERSION_1_2
|
||||
printf("EGL client APIs: %s\n", eglQueryString(d, EGL_CLIENT_APIS));
|
||||
#endif
|
||||
printf("EGL extensions string:\n");
|
||||
printf(" %s\n", eglQueryString(d, EGL_EXTENSIONS));
|
||||
|
||||
PrintExtensions(d);
|
||||
|
||||
PrintConfigs(d);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
*/
|
||||
|
||||
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#define EGL_EGLEXT_PROTOTYPES
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
|
@ -42,6 +45,8 @@
|
|||
#include <GL/gl.h>
|
||||
#include <EGL/egl.h>
|
||||
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
|
||||
#define BENCHMARK
|
||||
|
||||
|
|
@ -335,9 +340,13 @@ struct egl_manager {
|
|||
EGLSurface win;
|
||||
EGLSurface pix;
|
||||
EGLSurface pbuf;
|
||||
EGLImageKHR image;
|
||||
|
||||
EGLBoolean verbose;
|
||||
EGLint major, minor;
|
||||
|
||||
GC gc;
|
||||
GLuint fbo;
|
||||
};
|
||||
|
||||
static struct egl_manager *
|
||||
|
|
@ -469,6 +478,8 @@ egl_manager_create_window(struct egl_manager *eman, const char *name,
|
|||
}
|
||||
}
|
||||
|
||||
eman->gc = XCreateGC(eman->xdpy, eman->xwin, 0, NULL);
|
||||
|
||||
XMapWindow(eman->xdpy, eman->xwin);
|
||||
|
||||
return EGL_TRUE;
|
||||
|
|
@ -525,20 +536,28 @@ egl_manager_destroy(struct egl_manager *eman)
|
|||
if (eman->xpix != None)
|
||||
XFreePixmap(eman->xdpy, eman->xpix);
|
||||
|
||||
XFreeGC(eman->xdpy, eman->gc);
|
||||
|
||||
free(eman);
|
||||
}
|
||||
|
||||
enum { GEARS_WINDOW, GEARS_PIXMAP, GEARS_PBUFFER_COPY, GEARS_PBUFFER_TEXTURE };
|
||||
enum {
|
||||
GEARS_WINDOW,
|
||||
GEARS_PIXMAP,
|
||||
GEARS_PIXMAP_TEXTURE,
|
||||
GEARS_PBUFFER,
|
||||
GEARS_PBUFFER_TEXTURE,
|
||||
GEARS_RENDERBUFFER
|
||||
};
|
||||
|
||||
static void
|
||||
texture_gears(struct egl_manager *eman)
|
||||
texture_gears(struct egl_manager *eman, int surface_type)
|
||||
{
|
||||
static const GLint verts[12] =
|
||||
{ -5, -6, -10, 5, -6, -10, -5, 4, 10, 5, 4, 10 };
|
||||
static const GLint tex_coords[8] = { 0, 0, 1, 0, 0, 1, 1, 1 };
|
||||
static const GLuint indices[4] = { 0, 1, 2, 3 };
|
||||
|
||||
eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
|
||||
eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
|
||||
|
||||
glClearColor(0, 0, 0, 0);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
|
@ -554,22 +573,42 @@ texture_gears(struct egl_manager *eman)
|
|||
glVertexPointer(3, GL_INT, 0, verts);
|
||||
glTexCoordPointer(2, GL_INT, 0, tex_coords);
|
||||
|
||||
eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
|
||||
if (surface_type == GEARS_PBUFFER_TEXTURE)
|
||||
eglBindTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
|
||||
|
||||
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, indices);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
|
||||
glDisableClientState(GL_VERTEX_ARRAY);
|
||||
glDisableClientState(GL_COLOR_ARRAY);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
|
||||
if (surface_type == GEARS_PBUFFER_TEXTURE)
|
||||
eglReleaseTexImage(eman->dpy, eman->pbuf, EGL_BACK_BUFFER);
|
||||
|
||||
eglSwapBuffers(eman->dpy, eman->win);
|
||||
}
|
||||
|
||||
static void
|
||||
copy_gears(struct egl_manager *eman,
|
||||
EGLint tile_w, EGLint tile_h, EGLint w, EGLint h)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
eglWaitClient();
|
||||
|
||||
for (x = 0; x < w; x += tile_w) {
|
||||
for (y = 0; y < h; y += tile_h) {
|
||||
|
||||
XCopyArea(eman->xdpy, eman->xpix, eman->xwin, eman->gc,
|
||||
0, 0, tile_w, tile_h, x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
|
||||
{
|
||||
GC gc = XCreateGC(eman->xdpy, eman->xwin, 0, NULL);
|
||||
EGLint orig_w = w, orig_h = h;
|
||||
int window_w = w, window_h = h;
|
||||
|
||||
if (surface_type == EGL_PBUFFER_BIT)
|
||||
printf("there will be no screen update if "
|
||||
|
|
@ -584,10 +623,10 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
|
|||
/* we'll redraw below */
|
||||
break;
|
||||
case ConfigureNotify:
|
||||
w = event.xconfigure.width;
|
||||
h = event.xconfigure.height;
|
||||
window_w = event.xconfigure.width;
|
||||
window_h = event.xconfigure.height;
|
||||
if (surface_type == EGL_WINDOW_BIT)
|
||||
reshape(w, h);
|
||||
reshape(window_w, window_h);
|
||||
break;
|
||||
case KeyPress:
|
||||
{
|
||||
|
|
@ -622,7 +661,6 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
|
|||
static int frames = 0;
|
||||
static double tRot0 = -1.0, tRate0 = -1.0;
|
||||
double dt, t = current_time();
|
||||
int x, y;
|
||||
if (tRot0 < 0.0)
|
||||
tRot0 = t;
|
||||
dt = t - tRot0;
|
||||
|
|
@ -633,34 +671,43 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
|
|||
if (angle > 3600.0)
|
||||
angle -= 3600.0;
|
||||
|
||||
if (surface_type == GEARS_PBUFFER_TEXTURE)
|
||||
eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
|
||||
|
||||
draw();
|
||||
switch (surface_type) {
|
||||
case GEARS_WINDOW:
|
||||
draw();
|
||||
eglSwapBuffers(eman->dpy, eman->win);
|
||||
break;
|
||||
case GEARS_PBUFFER_TEXTURE:
|
||||
case GEARS_PBUFFER_COPY:
|
||||
if (surface_type == GEARS_PBUFFER_TEXTURE) {
|
||||
texture_gears(eman);
|
||||
} else {
|
||||
if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix))
|
||||
break;
|
||||
}
|
||||
eglWaitClient();
|
||||
/* fall through */
|
||||
case GEARS_PIXMAP:
|
||||
eglWaitClient();
|
||||
for (x = 0; x < w; x += orig_w) {
|
||||
for (y = 0; y < h; y += orig_h) {
|
||||
XCopyArea(eman->xdpy, eman->xpix, eman->xwin, gc,
|
||||
0, 0, orig_w, orig_h, x, y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case GEARS_PBUFFER:
|
||||
draw();
|
||||
if (!eglCopyBuffers(eman->dpy, eman->pbuf, eman->xpix))
|
||||
break;
|
||||
copy_gears(eman, w, h, window_w, window_h);
|
||||
break;
|
||||
|
||||
case GEARS_PBUFFER_TEXTURE:
|
||||
eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
|
||||
draw();
|
||||
texture_gears(eman, surface_type);
|
||||
break;
|
||||
|
||||
case GEARS_PIXMAP:
|
||||
draw();
|
||||
copy_gears(eman, w, h, window_w, window_h);
|
||||
break;
|
||||
|
||||
case GEARS_PIXMAP_TEXTURE:
|
||||
eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
|
||||
draw();
|
||||
texture_gears(eman, surface_type);
|
||||
break;
|
||||
|
||||
case GEARS_RENDERBUFFER:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
|
||||
draw();
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
texture_gears(eman, surface_type);
|
||||
break;
|
||||
}
|
||||
|
||||
frames++;
|
||||
|
||||
|
|
@ -676,8 +723,6 @@ event_loop(struct egl_manager *eman, EGLint surface_type, EGLint w, EGLint h)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
XFreeGC(eman->xdpy, gc);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -689,10 +734,20 @@ usage(void)
|
|||
printf(" -fullscreen run in fullscreen mode\n");
|
||||
printf(" -info display OpenGL renderer info\n");
|
||||
printf(" -pixmap use pixmap surface\n");
|
||||
printf(" -pbuffer-copy use pbuffer surface and eglCopyBuffers\n");
|
||||
printf(" -pixmap-texture use pixmap surface and texture using EGLImage\n");
|
||||
printf(" -pbuffer use pbuffer surface and eglCopyBuffers\n");
|
||||
printf(" -pbuffer-texture use pbuffer surface and eglBindTexImage\n");
|
||||
printf(" -renderbuffer renderbuffer as EGLImage and bind as texture from\n");
|
||||
}
|
||||
|
||||
static const char *names[] = {
|
||||
"window",
|
||||
"pixmap",
|
||||
"pixmap_texture",
|
||||
"pbuffer",
|
||||
"pbuffer_texture",
|
||||
"renderbuffer"
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
|
|
@ -715,6 +770,7 @@ main(int argc, char *argv[])
|
|||
GLboolean printInfo = GL_FALSE;
|
||||
GLboolean fullscreen = GL_FALSE;
|
||||
EGLBoolean ret;
|
||||
GLuint texture, color_rb, depth_rb;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
|
|
@ -732,14 +788,21 @@ main(int argc, char *argv[])
|
|||
surface_type = GEARS_PIXMAP;
|
||||
attribs[1] = EGL_PIXMAP_BIT;
|
||||
}
|
||||
else if (strcmp(argv[i], "-pbuffer-copy") == 0) {
|
||||
surface_type = GEARS_PBUFFER_COPY;
|
||||
else if (strcmp(argv[i], "-pixmap-texture") == 0) {
|
||||
surface_type = GEARS_PIXMAP_TEXTURE;
|
||||
attribs[1] = EGL_PIXMAP_BIT;
|
||||
}
|
||||
else if (strcmp(argv[i], "-pbuffer") == 0) {
|
||||
surface_type = GEARS_PBUFFER;
|
||||
attribs[1] = EGL_PBUFFER_BIT;
|
||||
}
|
||||
else if (strcmp(argv[i], "-pbuffer-texture") == 0) {
|
||||
surface_type = GEARS_PBUFFER_TEXTURE;
|
||||
attribs[1] = EGL_PBUFFER_BIT;
|
||||
}
|
||||
else if (strcmp(argv[i], "-renderbuffer") == 0) {
|
||||
surface_type = GEARS_RENDERBUFFER;
|
||||
}
|
||||
else {
|
||||
usage();
|
||||
return -1;
|
||||
|
|
@ -761,28 +824,32 @@ main(int argc, char *argv[])
|
|||
return -1;
|
||||
}
|
||||
|
||||
snprintf(win_title, sizeof(win_title), "xeglgears (%s)",
|
||||
(surface_type == GEARS_WINDOW) ? "window" :
|
||||
(surface_type == GEARS_PIXMAP) ? "pixmap" : "pbuffer");
|
||||
snprintf(win_title, sizeof(win_title),
|
||||
"xeglgears (%s)", names[surface_type]);
|
||||
|
||||
ret = egl_manager_create_window(eman, win_title, winWidth, winHeight,
|
||||
EGL_TRUE, fullscreen, NULL);
|
||||
if (!ret)
|
||||
return -1;
|
||||
|
||||
/* create surface(s) */
|
||||
switch (surface_type) {
|
||||
case GEARS_WINDOW:
|
||||
ret = egl_manager_create_window(eman, win_title, winWidth, winHeight,
|
||||
EGL_TRUE, fullscreen, NULL);
|
||||
if (ret)
|
||||
ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
|
||||
break;
|
||||
case GEARS_PIXMAP:
|
||||
ret = (egl_manager_create_window(eman, win_title, winWidth, winHeight,
|
||||
EGL_FALSE, fullscreen, NULL) &&
|
||||
egl_manager_create_pixmap(eman, eman->xwin,
|
||||
EGL_TRUE, NULL));
|
||||
case GEARS_PIXMAP_TEXTURE:
|
||||
ret = egl_manager_create_pixmap(eman, eman->xwin, EGL_TRUE, NULL);
|
||||
if (surface_type == GEARS_PIXMAP_TEXTURE)
|
||||
eman->image = eglCreateImageKHR (eman->dpy, eman->ctx,
|
||||
EGL_NATIVE_PIXMAP_KHR,
|
||||
(EGLClientBuffer) eman->xpix, NULL);
|
||||
if (ret)
|
||||
ret = eglMakeCurrent(eman->dpy, eman->pix, eman->pix, eman->ctx);
|
||||
break;
|
||||
case GEARS_PBUFFER:
|
||||
case GEARS_PBUFFER_TEXTURE:
|
||||
case GEARS_PBUFFER_COPY:
|
||||
{
|
||||
EGLint pbuf_attribs[] = {
|
||||
EGL_WIDTH, winWidth,
|
||||
|
|
@ -791,20 +858,69 @@ main(int argc, char *argv[])
|
|||
EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
|
||||
EGL_NONE
|
||||
};
|
||||
ret = (egl_manager_create_window(eman, win_title, winWidth, winHeight,
|
||||
EGL_FALSE, fullscreen, NULL) &&
|
||||
egl_manager_create_pixmap(eman, eman->xwin,
|
||||
ret = (egl_manager_create_pixmap(eman, eman->xwin,
|
||||
EGL_TRUE, NULL) &&
|
||||
egl_manager_create_pbuffer(eman, pbuf_attribs));
|
||||
if (ret)
|
||||
ret = eglMakeCurrent(eman->dpy, eman->pbuf, eman->pbuf, eman->ctx);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case GEARS_RENDERBUFFER:
|
||||
ret = eglMakeCurrent(eman->dpy, eman->win, eman->win, eman->ctx);
|
||||
if (ret == EGL_FALSE)
|
||||
printf("failed to make context current\n");
|
||||
|
||||
glGenFramebuffers(1, &eman->fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, eman->fbo);
|
||||
|
||||
glGenRenderbuffers(1, &color_rb);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_rb);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_RGBA, winWidth, winHeight);
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_COLOR_ATTACHMENT0_EXT,
|
||||
GL_RENDERBUFFER_EXT,
|
||||
color_rb);
|
||||
|
||||
eman->image = eglCreateImageKHR(eman->dpy, eman->ctx,
|
||||
EGL_GL_RENDERBUFFER_KHR,
|
||||
(EGLClientBuffer) color_rb, NULL);
|
||||
|
||||
glGenRenderbuffers(1, &depth_rb);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER_EXT,
|
||||
GL_DEPTH_COMPONENT, winWidth, winHeight);
|
||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
||||
GL_DEPTH_ATTACHMENT_EXT,
|
||||
GL_RENDERBUFFER_EXT,
|
||||
depth_rb);
|
||||
|
||||
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE) {
|
||||
printf("framebuffer not complete\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = EGL_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (surface_type) {
|
||||
case GEARS_PIXMAP_TEXTURE:
|
||||
case GEARS_RENDERBUFFER:
|
||||
glGenTextures(1, &texture);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eman->image);
|
||||
break;
|
||||
case GEARS_PBUFFER_TEXTURE:
|
||||
glGenTextures(1, &texture);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
egl_manager_destroy(eman);
|
||||
XCloseDisplay(x_dpy);
|
||||
|
|
|
|||
|
|
@ -56,14 +56,6 @@ default: $(UTIL_FILES) $(PROGS)
|
|||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o
|
||||
-rm -f getproclist.h
|
||||
|
||||
|
||||
# auto code generation
|
||||
getprocaddress: getprocaddress.c getproclist.h
|
||||
|
||||
getproclist.h: $(TOP)/src/mesa/glapi/gl_API.xml getprocaddress.c getprocaddress.py
|
||||
python getprocaddress.py > getproclist.h
|
||||
|
||||
|
||||
texrect: texrect.o readtex.o
|
||||
|
|
|
|||
|
|
@ -543,7 +543,7 @@ class Context(Object):
|
|||
gallium.PIPE_FORMAT_R32G32_FLOAT: '2f',
|
||||
gallium.PIPE_FORMAT_R32G32B32_FLOAT: '3f',
|
||||
gallium.PIPE_FORMAT_R32G32B32A32_FLOAT: '4f',
|
||||
gallium.PIPE_FORMAT_B8G8R8A8_UNORM: '4B',
|
||||
gallium.PIPE_FORMAT_A8R8G8B8_UNORM: '4B',
|
||||
gallium.PIPE_FORMAT_R8G8B8A8_UNORM: '4B',
|
||||
gallium.PIPE_FORMAT_R16G16B16_SNORM: '3h',
|
||||
}[velem.src_format]
|
||||
|
|
@ -551,7 +551,6 @@ class Context(Object):
|
|||
data = vbuf.buffer.read()
|
||||
values = unpack_from(format, data, offset)
|
||||
sys.stdout.write('\t\t{' + ', '.join(map(str, values)) + '},\n')
|
||||
assert len(values) == velem.nr_components
|
||||
sys.stdout.write('\t},\n')
|
||||
sys.stdout.flush()
|
||||
|
||||
|
|
@ -572,7 +571,7 @@ class Context(Object):
|
|||
|
||||
sys.stdout.write('\t{\n')
|
||||
for i in range(start, start + count):
|
||||
if i >= start + 16:
|
||||
if i >= start + 16 and not self.interpreter.verbosity(3):
|
||||
sys.stdout.write('\t...\n')
|
||||
break
|
||||
offset = i*isize
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ def test(dev):
|
|||
|
||||
# framebuffer
|
||||
cbuf = dev.texture_create(
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
width, height,
|
||||
tex_usage=PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
).get_surface()
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ def test(dev):
|
|||
|
||||
# framebuffer
|
||||
cbuf = dev.texture_create(
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
width, height,
|
||||
tex_usage=PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
).get_surface()
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ def is_depth_stencil_format(format):
|
|||
# FIXME: make and use binding to util_format_is_depth_or_stencil
|
||||
return format in (
|
||||
PIPE_FORMAT_Z32_UNORM,
|
||||
PIPE_FORMAT_Z24S8_UNORM,
|
||||
PIPE_FORMAT_Z24X8_UNORM,
|
||||
PIPE_FORMAT_S8Z24_UNORM,
|
||||
PIPE_FORMAT_X8Z24_UNORM,
|
||||
PIPE_FORMAT_Z16_UNORM,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ def test(dev, name):
|
|||
|
||||
# framebuffer
|
||||
cbuf = dev.texture_create(
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
width, height,
|
||||
tex_usage=PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
).get_surface()
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ def test(dev, name):
|
|||
|
||||
# framebuffer
|
||||
cbuf = dev.texture_create(
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
width, height,
|
||||
tex_usage=PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
).get_surface()
|
||||
|
|
|
|||
|
|
@ -131,15 +131,15 @@ def main():
|
|||
]
|
||||
|
||||
formats = [
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_A8R8G8B8_SRGB,
|
||||
PIPE_FORMAT_R5G6B5_UNORM,
|
||||
PIPE_FORMAT_A1R5G5B5_UNORM,
|
||||
PIPE_FORMAT_A4R4G4B4_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_SRGB,
|
||||
PIPE_FORMAT_B5G6R5_UNORM,
|
||||
PIPE_FORMAT_B5G5R5A1_UNORM,
|
||||
PIPE_FORMAT_B4G4R4A4_UNORM,
|
||||
PIPE_FORMAT_Z32_UNORM,
|
||||
PIPE_FORMAT_Z24S8_UNORM,
|
||||
PIPE_FORMAT_Z24X8_UNORM,
|
||||
PIPE_FORMAT_S8Z24_UNORM,
|
||||
PIPE_FORMAT_X8Z24_UNORM,
|
||||
PIPE_FORMAT_Z16_UNORM,
|
||||
PIPE_FORMAT_S8_UNORM,
|
||||
PIPE_FORMAT_A8_UNORM,
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ class TextureTest(TestCase):
|
|||
|
||||
src_texture = dev.texture_create(
|
||||
target = target,
|
||||
format = PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
format = PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
width = dst_surface.width,
|
||||
height = dst_surface.height,
|
||||
depth = 1,
|
||||
|
|
@ -149,7 +149,7 @@ class TextureTest(TestCase):
|
|||
|
||||
# framebuffer
|
||||
cbuf_tex = dev.texture_create(
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
width,
|
||||
height,
|
||||
tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
|
|
@ -251,15 +251,15 @@ def main():
|
|||
]
|
||||
|
||||
formats = [
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
#PIPE_FORMAT_A8R8G8B8_SRGB,
|
||||
PIPE_FORMAT_R5G6B5_UNORM,
|
||||
PIPE_FORMAT_A1R5G5B5_UNORM,
|
||||
PIPE_FORMAT_A4R4G4B4_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
#PIPE_FORMAT_B8G8R8A8_SRGB,
|
||||
PIPE_FORMAT_B5G6R5_UNORM,
|
||||
PIPE_FORMAT_B5G5R5A1_UNORM,
|
||||
PIPE_FORMAT_B4G4R4A4_UNORM,
|
||||
#PIPE_FORMAT_Z32_UNORM,
|
||||
#PIPE_FORMAT_Z24S8_UNORM,
|
||||
#PIPE_FORMAT_Z24X8_UNORM,
|
||||
#PIPE_FORMAT_S8Z24_UNORM,
|
||||
#PIPE_FORMAT_X8Z24_UNORM,
|
||||
#PIPE_FORMAT_Z16_UNORM,
|
||||
#PIPE_FORMAT_S8_UNORM,
|
||||
PIPE_FORMAT_A8_UNORM,
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ class TextureColorSampleTest(TestCase):
|
|||
|
||||
# framebuffer
|
||||
cbuf_tex = dev.texture_create(
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
width,
|
||||
height,
|
||||
tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
|
|
@ -383,14 +383,14 @@ class TextureDepthSampleTest(TestCase):
|
|||
|
||||
# framebuffer
|
||||
cbuf_tex = dev.texture_create(
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
width,
|
||||
height,
|
||||
tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
)
|
||||
|
||||
zsbuf_tex = dev.texture_create(
|
||||
PIPE_FORMAT_Z24X8_UNORM,
|
||||
PIPE_FORMAT_X8Z24_UNORM,
|
||||
width,
|
||||
height,
|
||||
tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET,
|
||||
|
|
@ -498,15 +498,15 @@ def main():
|
|||
]
|
||||
|
||||
color_formats = [
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
#PIPE_FORMAT_A8R8G8B8_SRGB,
|
||||
PIPE_FORMAT_R5G6B5_UNORM,
|
||||
PIPE_FORMAT_A1R5G5B5_UNORM,
|
||||
PIPE_FORMAT_A4R4G4B4_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
#PIPE_FORMAT_B8G8R8A8_SRGB,
|
||||
PIPE_FORMAT_B5G6R5_UNORM,
|
||||
PIPE_FORMAT_B5G5R5A1_UNORM,
|
||||
PIPE_FORMAT_B4G4R4A4_UNORM,
|
||||
PIPE_FORMAT_A8_UNORM,
|
||||
PIPE_FORMAT_L8_UNORM,
|
||||
PIPE_FORMAT_YCBCR,
|
||||
PIPE_FORMAT_UYVY,
|
||||
PIPE_FORMAT_DXT1_RGB,
|
||||
#PIPE_FORMAT_DXT1_RGBA,
|
||||
#PIPE_FORMAT_DXT3_RGBA,
|
||||
|
|
@ -515,8 +515,8 @@ def main():
|
|||
|
||||
depth_formats = [
|
||||
PIPE_FORMAT_Z32_UNORM,
|
||||
PIPE_FORMAT_Z24S8_UNORM,
|
||||
PIPE_FORMAT_Z24X8_UNORM,
|
||||
PIPE_FORMAT_S8Z24_UNORM,
|
||||
PIPE_FORMAT_X8Z24_UNORM,
|
||||
PIPE_FORMAT_Z16_UNORM,
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -111,15 +111,15 @@ def main():
|
|||
]
|
||||
|
||||
formats = [
|
||||
PIPE_FORMAT_A8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_X8R8G8B8_UNORM,
|
||||
PIPE_FORMAT_A8R8G8B8_SRGB,
|
||||
PIPE_FORMAT_R5G6B5_UNORM,
|
||||
PIPE_FORMAT_A1R5G5B5_UNORM,
|
||||
PIPE_FORMAT_A4R4G4B4_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8X8_UNORM,
|
||||
PIPE_FORMAT_B8G8R8A8_SRGB,
|
||||
PIPE_FORMAT_B5G6R5_UNORM,
|
||||
PIPE_FORMAT_B5G5R5A1_UNORM,
|
||||
PIPE_FORMAT_B4G4R4A4_UNORM,
|
||||
PIPE_FORMAT_Z32_UNORM,
|
||||
PIPE_FORMAT_Z24S8_UNORM,
|
||||
PIPE_FORMAT_Z24X8_UNORM,
|
||||
PIPE_FORMAT_S8Z24_UNORM,
|
||||
PIPE_FORMAT_X8Z24_UNORM,
|
||||
PIPE_FORMAT_Z16_UNORM,
|
||||
PIPE_FORMAT_S8_UNORM,
|
||||
PIPE_FORMAT_A8_UNORM,
|
||||
|
|
|
|||
20
progs/gallium/unit/SConscript
Normal file
20
progs/gallium/unit/SConscript
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
Import('*')
|
||||
|
||||
env = env.Clone()
|
||||
|
||||
env.Prepend(LIBS = [gallium])
|
||||
|
||||
progs = [
|
||||
'u_format_test'
|
||||
]
|
||||
|
||||
for prog in progs:
|
||||
prog = env.Program(
|
||||
target = prog,
|
||||
source = prog + '.c',
|
||||
)
|
||||
|
||||
# http://www.scons.org/wiki/UnitTests
|
||||
test_alias = env.Alias('unit', [prog], prog[0].abspath)
|
||||
AlwaysBuild(test_alias)
|
||||
|
||||
242
progs/gallium/unit/u_format_test.c
Normal file
242
progs/gallium/unit/u_format_test.c
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2009-2010 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 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 ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_format_tests.h"
|
||||
#include "util/u_format_pack.h"
|
||||
|
||||
|
||||
static boolean
|
||||
test_format_unpack_4f(const struct util_format_test_case *test)
|
||||
{
|
||||
float unpacked[4];
|
||||
unsigned i;
|
||||
boolean success;
|
||||
|
||||
util_format_unpack_4f(test->format, unpacked, test->packed);
|
||||
|
||||
success = TRUE;
|
||||
for (i = 0; i < 4; ++i)
|
||||
if (test->unpacked[i] != unpacked[i])
|
||||
success = FALSE;
|
||||
|
||||
if (!success) {
|
||||
printf("FAILED: (%f %f %f %f) obtained\n", unpacked[0], unpacked[1], unpacked[2], unpacked[3]);
|
||||
printf(" (%f %f %f %f) expected\n", test->unpacked[0], test->unpacked[1], test->unpacked[2], test->unpacked[3]);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
static boolean
|
||||
test_format_pack_4f(const struct util_format_test_case *test)
|
||||
{
|
||||
uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
|
||||
unsigned i;
|
||||
boolean success;
|
||||
|
||||
memset(packed, 0, sizeof packed);
|
||||
|
||||
util_format_pack_4f(test->format, packed, test->unpacked[0], test->unpacked[1], test->unpacked[2], test->unpacked[3]);
|
||||
|
||||
success = TRUE;
|
||||
for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i)
|
||||
if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
|
||||
success = FALSE;
|
||||
|
||||
if (!success) {
|
||||
/* TODO: print more than 4 bytes */
|
||||
printf("FAILED: (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) obtained\n",
|
||||
packed[0], packed[1], packed[2], packed[3],
|
||||
packed[4], packed[5], packed[6], packed[7],
|
||||
packed[8], packed[9], packed[10], packed[11],
|
||||
packed[12], packed[13], packed[14], packed[15]);
|
||||
printf(" (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) expected\n",
|
||||
test->packed[0], test->packed[1], test->packed[2], test->packed[3],
|
||||
test->packed[4], test->packed[5], test->packed[6], test->packed[7],
|
||||
test->packed[8], test->packed[9], test->packed[10], test->packed[11],
|
||||
test->packed[12], test->packed[13], test->packed[14], test->packed[15]);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
static boolean
|
||||
convert_4f_to_4ub(uint8_t *dst, const double *src)
|
||||
{
|
||||
unsigned i;
|
||||
boolean accurate = TRUE;
|
||||
|
||||
for (i = 0; i < 4; ++i) {
|
||||
if (src[i] < 0.0) {
|
||||
accurate = FALSE;
|
||||
dst[i] = 0;
|
||||
}
|
||||
else if (src[i] > 1.0) {
|
||||
accurate = FALSE;
|
||||
dst[i] = 255;
|
||||
}
|
||||
else {
|
||||
dst[i] = src[i] * 255.0;
|
||||
}
|
||||
}
|
||||
|
||||
return accurate;
|
||||
}
|
||||
|
||||
|
||||
static boolean
|
||||
test_format_unpack_4ub(const struct util_format_test_case *test)
|
||||
{
|
||||
uint8_t unpacked[4];
|
||||
uint8_t expected[4];
|
||||
unsigned i;
|
||||
boolean success;
|
||||
|
||||
util_format_unpack_4ub(test->format, unpacked, test->packed);
|
||||
|
||||
convert_4f_to_4ub(expected, test->unpacked);
|
||||
|
||||
success = TRUE;
|
||||
for (i = 0; i < 4; ++i)
|
||||
if (expected[i] != unpacked[i])
|
||||
success = FALSE;
|
||||
|
||||
if (!success) {
|
||||
printf("FAILED: (0x%02x 0x%02x 0x%02x 0x%02x) obtained\n", unpacked[0], unpacked[1], unpacked[2], unpacked[3]);
|
||||
printf(" (0x%02x 0x%02x 0x%02x 0x%02x) expected\n", expected[0], expected[1], expected[2], expected[3]);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
static boolean
|
||||
test_format_pack_4ub(const struct util_format_test_case *test)
|
||||
{
|
||||
uint8_t unpacked[4];
|
||||
uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
|
||||
unsigned i;
|
||||
boolean success;
|
||||
|
||||
if (!convert_4f_to_4ub(unpacked, test->unpacked)) {
|
||||
/*
|
||||
* Skip test cases which cannot be represented by four unorm bytes.
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
memset(packed, 0, sizeof packed);
|
||||
|
||||
util_format_pack_4ub(test->format, packed, unpacked[0], unpacked[1], unpacked[2], unpacked[3]);
|
||||
|
||||
success = TRUE;
|
||||
for (i = 0; i < UTIL_FORMAT_MAX_PACKED_BYTES; ++i)
|
||||
if ((test->packed[i] & test->mask[i]) != (packed[i] & test->mask[i]))
|
||||
success = FALSE;
|
||||
|
||||
if (!success) {
|
||||
/* TODO: print more than 4 bytes */
|
||||
printf("FAILED: (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) obtained\n",
|
||||
packed[0], packed[1], packed[2], packed[3],
|
||||
packed[4], packed[5], packed[6], packed[7],
|
||||
packed[8], packed[9], packed[10], packed[11],
|
||||
packed[12], packed[13], packed[14], packed[15]);
|
||||
printf(" (%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x) expected\n",
|
||||
test->packed[0], test->packed[1], test->packed[2], test->packed[3],
|
||||
test->packed[4], test->packed[5], test->packed[6], test->packed[7],
|
||||
test->packed[8], test->packed[9], test->packed[10], test->packed[11],
|
||||
test->packed[12], test->packed[13], test->packed[14], test->packed[15]);
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
typedef boolean
|
||||
(*test_func_t)(const struct util_format_test_case *test);
|
||||
|
||||
|
||||
static boolean
|
||||
test_one(test_func_t func, const char *suffix)
|
||||
{
|
||||
enum pipe_format last_format = PIPE_FORMAT_NONE;
|
||||
unsigned i;
|
||||
bool success = TRUE;
|
||||
|
||||
for (i = 0; i < util_format_nr_test_cases; ++i) {
|
||||
const struct util_format_test_case *test = &util_format_test_cases[i];
|
||||
if (test->format != last_format) {
|
||||
const struct util_format_description *format_desc;
|
||||
format_desc = util_format_description(test->format);
|
||||
printf("Testing util_format_%s_%s ...\n", format_desc->short_name, suffix);
|
||||
last_format = test->format;
|
||||
}
|
||||
|
||||
if (!func(&util_format_test_cases[i]))
|
||||
success = FALSE;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
static boolean
|
||||
test_all(void)
|
||||
{
|
||||
bool success = TRUE;
|
||||
|
||||
if (!test_one(&test_format_pack_4f, "pack_4f"))
|
||||
success = FALSE;
|
||||
|
||||
if (!test_one(&test_format_unpack_4f, "unpack_4f"))
|
||||
success = FALSE;
|
||||
|
||||
if (!test_one(&test_format_pack_4ub, "pack_4ub"))
|
||||
success = FALSE;
|
||||
|
||||
if (!test_one(&test_format_unpack_4ub, "unpack_4ub"))
|
||||
success = FALSE;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
boolean success;
|
||||
|
||||
success = test_all();
|
||||
|
||||
return success ? 0 : 1;
|
||||
}
|
||||
|
|
@ -1,377 +0,0 @@
|
|||
/*
|
||||
test program for the ggi-mesa driver
|
||||
|
||||
Copyright (C) 1997,1998 Uwe Maurer - uwe_maurer@t-online.de
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/ggimesa.h>
|
||||
#include <ggi/ggi.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
ggi_visual_t vis,vis_mem;
|
||||
|
||||
GGIMesaContext ctx;
|
||||
|
||||
int screen_x=GGI_AUTO,screen_y=GGI_AUTO;
|
||||
ggi_graphtype bpp=GT_AUTO;
|
||||
|
||||
//#define ZBUFFER
|
||||
|
||||
//#define SMOOTH_NORMALS
|
||||
|
||||
void Init()
|
||||
{
|
||||
GLfloat h=(GLfloat)3/4;
|
||||
GLfloat pos[4]={5,5,-20,0};
|
||||
GLfloat specular[4]={.4,.4,.4,1};
|
||||
GLfloat diffuse[4]={.3,.3,.3,1};
|
||||
GLfloat ambient[4]={.2,.2,.2,1};
|
||||
|
||||
int err;
|
||||
|
||||
if (ggiInit()<0)
|
||||
{
|
||||
printf("ggiInit() failed\n");
|
||||
exit(1);
|
||||
}
|
||||
ctx=GGIMesaCreateContext();
|
||||
if (ctx==NULL)
|
||||
{
|
||||
printf("Can't create Context!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
vis=ggiOpen(NULL);
|
||||
vis_mem=ggiOpen("display-memory",NULL);
|
||||
if (vis==NULL || vis_mem==NULL)
|
||||
{
|
||||
printf("Can't open ggi_visuals!\n");
|
||||
exit(1);
|
||||
}
|
||||
err=ggiSetGraphMode(vis,screen_x,screen_y,screen_x,screen_y,bpp);
|
||||
err+=ggiSetGraphMode(vis_mem,screen_x,screen_y,screen_x,screen_y,bpp);
|
||||
if (err)
|
||||
{
|
||||
printf("Can't set %ix%i\n",screen_x,screen_y);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (GGIMesaSetVisual(ctx,vis_mem,GL_TRUE,GL_FALSE)<0)
|
||||
{
|
||||
printf("GGIMesaSetVisual() failed!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
GGIMesaMakeCurrent(ctx);
|
||||
|
||||
glViewport(0,0,screen_x,screen_y);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-1,1,-h,h,1,50);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0,0,-9);
|
||||
glShadeModel(GL_FLAT);
|
||||
|
||||
glFrontFace(GL_CW);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
|
||||
glLightfv(GL_LIGHT0,GL_POSITION,pos);
|
||||
|
||||
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
|
||||
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
|
||||
glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
|
||||
|
||||
#ifdef ZBUFFER
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#define MAX_VERTS 1000
|
||||
#define MAX_TRIS 2000
|
||||
#define MAX_LEN 1024
|
||||
#define MAX_F 100000000
|
||||
|
||||
void LoadAsc(GLuint *list,char *file)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
GLfloat p[MAX_VERTS][3];
|
||||
GLfloat normal[MAX_VERTS][3];
|
||||
float ncount[MAX_VERTS];
|
||||
int v[MAX_TRIS][3];
|
||||
char line[MAX_LEN];
|
||||
char *s;
|
||||
int i,j;
|
||||
int verts,faces;
|
||||
GLuint v0,v1,v2;
|
||||
GLfloat n[3];
|
||||
GLfloat len,k;
|
||||
GLfloat min[3]={MAX_F,MAX_F,MAX_F};
|
||||
GLfloat max[3]={-MAX_F,-MAX_F,-MAX_F};
|
||||
char *coord_str[]={"X","Z","Y"};
|
||||
|
||||
fp=fopen(file,"r");
|
||||
if (!fp)
|
||||
{
|
||||
printf("Can't open %s!\n",file);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (strncmp(fgets(line,MAX_LEN,fp),"Tri-mesh",8)) ;
|
||||
|
||||
s=strstr(line,":")+1;
|
||||
verts=atoi(s);
|
||||
s=strstr(s,":")+1;
|
||||
faces=atoi(s);
|
||||
|
||||
if (verts>MAX_VERTS)
|
||||
{
|
||||
printf("Too many vertices..\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (strncmp(fgets(line,MAX_LEN,fp),"Vertex list",11)) ;
|
||||
|
||||
for (i=0;i<verts;i++)
|
||||
{
|
||||
while (strncmp(fgets(line,MAX_LEN,fp),"Vertex",6)) ;
|
||||
for (j=0;j<3;j++)
|
||||
{
|
||||
s=strstr(line,coord_str[j])+2;
|
||||
k=atoi(s);
|
||||
if (k>max[j]) max[j]=k;
|
||||
if (k<min[j]) min[j]=k;
|
||||
p[i][j]=k;
|
||||
}
|
||||
|
||||
}
|
||||
len=0;
|
||||
for (i=0;i<3;i++)
|
||||
{
|
||||
k=max[i]-min[i];
|
||||
if (k>len) {len=k;j=i;}
|
||||
n[i]=(max[i]+min[i])/2;
|
||||
}
|
||||
|
||||
len/=2;
|
||||
|
||||
for (i=0;i<verts;i++)
|
||||
{
|
||||
for (j=0;j<3;j++)
|
||||
{
|
||||
p[i][j]-=n[j];
|
||||
p[i][j]/=len;
|
||||
}
|
||||
}
|
||||
|
||||
*list=glGenLists(1);
|
||||
glNewList(*list,GL_COMPILE);
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
memset(ncount,0,sizeof(ncount));
|
||||
memset(normal,0,sizeof(normal));
|
||||
|
||||
while (strncmp(fgets(line,MAX_LEN,fp),"Face list",9)) ;
|
||||
for (i=0;i<faces;i++)
|
||||
{
|
||||
while (strncmp(fgets(line,MAX_LEN,fp),"Face",4)) ;
|
||||
s=strstr(line,"A")+2;
|
||||
v0=v[i][0]=atoi(s);
|
||||
s=strstr(line,"B")+2;
|
||||
v1=v[i][1]=atoi(s);
|
||||
s=strstr(line,"C")+2;
|
||||
v2=v[i][2]=atoi(s);
|
||||
n[0]=((p[v1][1]-p[v0][1])*(p[v2][2]-p[v0][2])
|
||||
- (p[v1][2]-p[v0][2])*(p[v2][1]-p[v0][1]));
|
||||
n[1]=((p[v1][2]-p[v0][2])*(p[v2][0]-p[v0][0])
|
||||
- (p[v1][0]-p[v0][0])*(p[v2][2]-p[v0][2]));
|
||||
n[2]=((p[v1][0]-p[v0][0])*(p[v2][1]-p[v0][1])
|
||||
- (p[v1][1]-p[v0][1])*(p[v2][0]-p[v0][0]));
|
||||
len=n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
|
||||
len=sqrt(len);
|
||||
n[0]/=len;
|
||||
n[1]/=len;
|
||||
n[2]/=len;
|
||||
#ifdef SMOOTH_NORMALS
|
||||
for (j=0;j<3;j++){
|
||||
normal[v[i][j]][0]+=n[0];
|
||||
normal[v[i][j]][1]+=n[1];
|
||||
normal[v[i][j]][2]+=n[2];
|
||||
ncount[v[i][j]]++;
|
||||
}
|
||||
#else
|
||||
glNormal3fv(n);
|
||||
for (j=0;j<3;j++)
|
||||
glVertex3fv(p[v[i][j]]);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SMOOTH_NORMALS
|
||||
for (i=0;i<verts;i++) {
|
||||
for (j=0;j<3;j++) {
|
||||
normal[i][j]/=ncount[i];
|
||||
}
|
||||
}
|
||||
for (i=0;i<faces;i++) {
|
||||
for (j=0;j<3;j++) {
|
||||
glNormal3f(normal[v[i][j]][0],
|
||||
normal[v[i][j]][1],
|
||||
normal[v[i][j]][2]);
|
||||
glVertex3fv(p[v[i][j]]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
glEnd();
|
||||
glEndList();
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
double Display(GLuint l,int *maxframes)
|
||||
{
|
||||
int x,y;
|
||||
GLfloat col[]={.25,0,.25,1};
|
||||
int frames=0;
|
||||
struct timeval start,stop;
|
||||
double len;
|
||||
GLfloat rotate=0;
|
||||
|
||||
gettimeofday(&start,NULL);
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
glClearColor(0,0,0,0);
|
||||
glClearIndex(0);
|
||||
|
||||
#ifdef ZBUFFER
|
||||
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
||||
#else
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
#endif
|
||||
|
||||
glPushMatrix();
|
||||
|
||||
glRotatef(30,1,0,0);
|
||||
glRotatef(rotate/10,0,0,1);
|
||||
glTranslatef(-6,-4,0);
|
||||
for (y=0;y<3;y++)
|
||||
{
|
||||
glPushMatrix();
|
||||
for (x=0;x<5;x++)
|
||||
{
|
||||
glPushMatrix();
|
||||
glRotatef(rotate,y+1,-x-1,0);
|
||||
|
||||
col[0]=(GLfloat)(x+1)/4;
|
||||
col[1]=0;
|
||||
col[2]=(GLfloat)(y+1)/2;
|
||||
glMaterialfv(GL_FRONT,GL_AMBIENT,col);
|
||||
glCallList(l);
|
||||
glPopMatrix();
|
||||
glTranslatef(3,0,0);
|
||||
}
|
||||
glPopMatrix();
|
||||
glTranslatef(0,4,0);
|
||||
}
|
||||
glPopMatrix();
|
||||
glFinish();
|
||||
|
||||
ggiPutBox(vis,0,0,screen_x,screen_y,ggiDBGetBuffer(vis,0)->read);
|
||||
rotate+=10;
|
||||
frames++;
|
||||
if (frames==(*maxframes)) break;
|
||||
|
||||
if (ggiKbhit(vis))
|
||||
{
|
||||
*maxframes=frames;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gettimeofday(&stop,NULL);
|
||||
len=(double)(stop.tv_sec-start.tv_sec)+
|
||||
(double)(stop.tv_usec-start.tv_usec)/1e6;
|
||||
return len;
|
||||
}
|
||||
|
||||
void visible(int vis)
|
||||
{
|
||||
if (vis == GLUT_VISIBLE)
|
||||
glutIdleFunc(idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
||||
|
||||
glutInitWindowPosition(0, 0);
|
||||
glutInitWindowSize(300, 300);
|
||||
glutCreateWindow("asc-view");
|
||||
init();
|
||||
|
||||
glutDisplayFunc(draw);
|
||||
glutReshapeFunc(reshape);
|
||||
glutKeyboardFunc(key);
|
||||
glutSpecialFunc(special);
|
||||
glutVisibilityFunc(visible);
|
||||
|
||||
glutMainLoop();
|
||||
#if 0
|
||||
GLuint l;
|
||||
char *file;
|
||||
int maxframes=0;
|
||||
double len;
|
||||
|
||||
Init();
|
||||
|
||||
file=(argc>1) ? argv[1] : "asc/box.asc";
|
||||
if (argc>2) maxframes=atoi(argv[2]);
|
||||
|
||||
if (argc==1)
|
||||
{
|
||||
printf("usage: %s filename.asc\n",argv[0]);
|
||||
}
|
||||
|
||||
LoadAsc(&l,file);
|
||||
|
||||
len=Display(l,&maxframes);
|
||||
|
||||
printf("\ttime: %.3f sec\n",len);
|
||||
printf("\tframes: %i\n",maxframes);
|
||||
printf("\tfps: %.3f \n",(double)maxframes/len);
|
||||
|
||||
GGIMesaDestroyContext(ctx);
|
||||
ggiClose(vis);
|
||||
ggiClose(vis_mem);
|
||||
ggiExit();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
Terminating on signal 11
|
||||
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
function foobar() {
|
||||
echo "foo!"
|
||||
}
|
||||
|
||||
foobar
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
|
||||
|
||||
Named object: "Object01"
|
||||
Tri-mesh, Vertices: 8 Faces: 12
|
||||
Vertex list:
|
||||
Vertex 0: X: -20 Y: -19.999998 Z: 20.000002
|
||||
Vertex 1: X: 20 Y: -19.999998 Z: 20.000002
|
||||
Vertex 2: X: 20 Y: 20.000002 Z: 19.999998
|
||||
Vertex 3: X: -20 Y: 20.000002 Z: 19.999998
|
||||
Vertex 4: X: -20 Y: -20.000002 Z: -19.999998
|
||||
Vertex 5: X: 20 Y: -20.000002 Z: -19.999998
|
||||
Vertex 6: X: 20 Y: 19.999998 Z: -20.000002
|
||||
Vertex 7: X: -20 Y: 19.999998 Z: -20.000002
|
||||
Face list:
|
||||
Face 0: A:0 B:1 C:2 AB:1 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 1: A:0 B:2 C:3 AB:0 BC:1 CA:1
|
||||
Smoothing: 1
|
||||
Face 2: A:0 B:4 C:5 AB:1 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 3: A:0 B:5 C:1 AB:0 BC:1 CA:1
|
||||
Smoothing: 2
|
||||
Face 4: A:1 B:5 C:6 AB:1 BC:1 CA:0
|
||||
Smoothing: 3
|
||||
Face 5: A:1 B:6 C:2 AB:0 BC:1 CA:1
|
||||
Smoothing: 3
|
||||
Face 6: A:2 B:6 C:7 AB:1 BC:1 CA:0
|
||||
Smoothing: 4
|
||||
Face 7: A:2 B:7 C:3 AB:0 BC:1 CA:1
|
||||
Smoothing: 4
|
||||
Face 8: A:3 B:7 C:4 AB:1 BC:1 CA:0
|
||||
Smoothing: 5
|
||||
Face 9: A:3 B:4 C:0 AB:0 BC:1 CA:1
|
||||
Smoothing: 5
|
||||
Face 10: A:4 B:7 C:6 AB:1 BC:1 CA:0
|
||||
Smoothing: 6
|
||||
Face 11: A:4 B:6 C:5 AB:0 BC:1 CA:1
|
||||
Smoothing: 6
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page 1
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,198 +0,0 @@
|
|||
Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
|
||||
|
||||
Named object: "Object01"
|
||||
Tri-mesh, Vertices: 34 Faces: 64
|
||||
Vertex list:
|
||||
Vertex 0: X: 60.167416 Y: -87.419525 Z: -53.3088
|
||||
Vertex 1: X: 76.70787 Y: -87.419518 Z: -29.84565
|
||||
Vertex 2: X: 83.0103 Y: -87.419518 Z: -1.838764
|
||||
Vertex 3: X: 78.115204 Y: -87.419518 Z: 26.448057
|
||||
Vertex 4: X: 62.767834 Y: -87.41951 Z: 50.708401
|
||||
Vertex 5: X: 39.304672 Y: -87.41951 Z: 67.248848
|
||||
Vertex 6: X: 11.297782 Y: -87.41951 Z: 73.551254
|
||||
Vertex 7: X: -16.989004 Y: -87.41951 Z: 68.656158
|
||||
Vertex 8: X: -41.249344 Y: -87.41951 Z: 53.308777
|
||||
Vertex 9: X: -57.789783 Y: -87.419518 Z: 29.845612
|
||||
Vertex 10: X: -64.092194 Y: -87.419518 Z: 1.838721
|
||||
Vertex 11: X: -59.197079 Y: -87.419518 Z: -26.448097
|
||||
Vertex 12: X: -43.849678 Y: -87.419525 Z: -50.708427
|
||||
Vertex 13: X: -20.386503 Y: -87.419525 Z: -67.248856
|
||||
Vertex 14: X: 7.62039 Y: -87.419525 Z: -73.551239
|
||||
Vertex 15: X: 35.907204 Y: -87.419525 Z: -68.656105
|
||||
Vertex 16: X: 101.684875 Y: 94.590591 Z: -96.955391
|
||||
Vertex 17: X: 131.767838 Y: 94.590591 Z: -54.281792
|
||||
Vertex 18: X: 143.230377 Y: 94.590599 Z: -3.344275
|
||||
Vertex 19: X: 134.327423 Y: 94.590607 Z: 48.102379
|
||||
Vertex 20: X: 106.414383 Y: 94.590607 Z: 92.225876
|
||||
Vertex 21: X: 63.740765 Y: 94.590607 Z: 122.3088
|
||||
Vertex 22: X: 12.803238 Y: 94.590614 Z: 133.771301
|
||||
Vertex 23: X: -38.643349 Y: 94.590607 Z: 124.868355
|
||||
Vertex 24: X: -82.766846 Y: 94.590607 Z: 96.955307
|
||||
Vertex 25: X: -112.849762 Y: 94.590607 Z: 54.281677
|
||||
Vertex 26: X: -124.312256 Y: 94.590599 Z: 3.344152
|
||||
Vertex 27: X: -115.409271 Y: 94.590591 Z: -48.102493
|
||||
Vertex 28: X: -87.496201 Y: 94.590591 Z: -92.225967
|
||||
Vertex 29: X: -44.822552 Y: 94.590591 Z: -122.308861
|
||||
Vertex 30: X: 6.114983 Y: 94.590584 Z: -133.771332
|
||||
Vertex 31: X: 57.561623 Y: 94.590591 Z: -124.868301
|
||||
Vertex 32: X: 9.459057 Y: -87.419518 Z: 0.000008
|
||||
Vertex 33: X: 9.459057 Y: 94.590599 Z: -0.000008
|
||||
Face list:
|
||||
Face 0: A:0 B:1 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 1: A:1 B:2 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 2: A:2 B:3 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 3: A:3 B:4 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 4: A:4 B:5 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 5: A:5 B:6 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 6: A:6 B:7 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 7: A:7 B:8 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 8: A:8 B:9 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 9: A:9 B:10 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 10: A:10 B:11 C:32 AB:1 BC:0 CA:0
|
||||
|
||||
Page 1
|
||||
|
||||
|
||||
|
||||
Smoothing: 1
|
||||
Face 11: A:11 B:12 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 12: A:12 B:13 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 13: A:13 B:14 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 14: A:14 B:15 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 15: A:15 B:0 C:32 AB:1 BC:0 CA:0
|
||||
Smoothing: 1
|
||||
Face 16: A:0 B:16 C:17 AB:1 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 17: A:0 B:17 C:1 AB:0 BC:1 CA:1
|
||||
Smoothing: 2
|
||||
Face 18: A:1 B:17 C:18 AB:1 BC:1 CA:0
|
||||
Smoothing: 3
|
||||
Face 19: A:1 B:18 C:2 AB:0 BC:1 CA:1
|
||||
Smoothing: 3
|
||||
Face 20: A:2 B:18 C:19 AB:1 BC:1 CA:0
|
||||
Smoothing: 4
|
||||
Face 21: A:2 B:19 C:3 AB:0 BC:1 CA:1
|
||||
Smoothing: 4
|
||||
Face 22: A:3 B:19 C:20 AB:1 BC:1 CA:0
|
||||
Smoothing: 5
|
||||
Face 23: A:3 B:20 C:4 AB:0 BC:1 CA:1
|
||||
Smoothing: 5
|
||||
Face 24: A:4 B:20 C:21 AB:1 BC:1 CA:0
|
||||
Smoothing: 6
|
||||
Face 25: A:4 B:21 C:5 AB:0 BC:1 CA:1
|
||||
Smoothing: 6
|
||||
Face 26: A:5 B:21 C:22 AB:1 BC:1 CA:0
|
||||
Smoothing: 7
|
||||
Face 27: A:5 B:22 C:6 AB:0 BC:1 CA:1
|
||||
Smoothing: 7
|
||||
Face 28: A:6 B:22 C:23 AB:1 BC:1 CA:0
|
||||
Smoothing: 8
|
||||
Face 29: A:6 B:23 C:7 AB:0 BC:1 CA:1
|
||||
Smoothing: 8
|
||||
Face 30: A:7 B:23 C:24 AB:1 BC:1 CA:0
|
||||
Smoothing: 9
|
||||
Face 31: A:7 B:24 C:8 AB:0 BC:1 CA:1
|
||||
Smoothing: 9
|
||||
Face 32: A:8 B:24 C:25 AB:1 BC:1 CA:0
|
||||
Smoothing: 10
|
||||
Face 33: A:8 B:25 C:9 AB:0 BC:1 CA:1
|
||||
Smoothing: 10
|
||||
Face 34: A:9 B:25 C:26 AB:1 BC:1 CA:0
|
||||
Smoothing: 11
|
||||
Face 35: A:9 B:26 C:10 AB:0 BC:1 CA:1
|
||||
Smoothing: 11
|
||||
Face 36: A:10 B:26 C:27 AB:1 BC:1 CA:0
|
||||
Smoothing: 12
|
||||
Face 37: A:10 B:27 C:11 AB:0 BC:1 CA:1
|
||||
Smoothing: 12
|
||||
Face 38: A:11 B:27 C:28 AB:1 BC:1 CA:0
|
||||
Smoothing: 13
|
||||
Face 39: A:11 B:28 C:12 AB:0 BC:1 CA:1
|
||||
Smoothing: 13
|
||||
Face 40: A:12 B:28 C:29 AB:1 BC:1 CA:0
|
||||
Smoothing: 14
|
||||
|
||||
Page 2
|
||||
|
||||
|
||||
|
||||
Face 41: A:12 B:29 C:13 AB:0 BC:1 CA:1
|
||||
Smoothing: 14
|
||||
Face 42: A:13 B:29 C:30 AB:1 BC:1 CA:0
|
||||
Smoothing: 15
|
||||
Face 43: A:13 B:30 C:14 AB:0 BC:1 CA:1
|
||||
Smoothing: 15
|
||||
Face 44: A:14 B:30 C:31 AB:1 BC:1 CA:0
|
||||
Smoothing: 16
|
||||
Face 45: A:14 B:31 C:15 AB:0 BC:1 CA:1
|
||||
Smoothing: 16
|
||||
Face 46: A:15 B:31 C:16 AB:1 BC:1 CA:0
|
||||
Smoothing: 17
|
||||
Face 47: A:15 B:16 C:0 AB:0 BC:1 CA:1
|
||||
Smoothing: 17
|
||||
Face 48: A:16 B:33 C:17 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 49: A:17 B:33 C:18 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 50: A:18 B:33 C:19 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 51: A:19 B:33 C:20 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 52: A:20 B:33 C:21 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 53: A:21 B:33 C:22 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 54: A:22 B:33 C:23 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 55: A:23 B:33 C:24 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 56: A:24 B:33 C:25 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 57: A:25 B:33 C:26 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 58: A:26 B:33 C:27 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 59: A:27 B:33 C:28 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 60: A:28 B:33 C:29 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 61: A:29 B:33 C:30 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 62: A:30 B:33 C:31 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
Face 63: A:31 B:33 C:16 AB:0 BC:0 CA:1
|
||||
Smoothing: 18
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page 3
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,339 +0,0 @@
|
|||
|
||||
/*
|
||||
* 3-D gear wheels. This program is in the public domain.
|
||||
*
|
||||
* Brian Paul
|
||||
*/
|
||||
|
||||
/* Conversion to GLUT by Mark J. Kilgard */
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265
|
||||
#endif
|
||||
|
||||
static GLint T0 = 0;
|
||||
static GLint Frames = 0;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Draw a gear wheel. You'll probably want to call this function when
|
||||
building a display list since we do a lot of trig here.
|
||||
|
||||
Input: inner_radius - radius of hole at center
|
||||
outer_radius - radius at center of teeth
|
||||
width - width of gear
|
||||
teeth - number of teeth
|
||||
tooth_depth - depth of tooth
|
||||
|
||||
**/
|
||||
|
||||
static void
|
||||
gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
||||
GLint teeth, GLfloat tooth_depth)
|
||||
{
|
||||
GLint i;
|
||||
GLfloat r0, r1, r2;
|
||||
GLfloat angle, da;
|
||||
GLfloat u, v, len;
|
||||
|
||||
r0 = inner_radius;
|
||||
r1 = outer_radius - tooth_depth / 2.0;
|
||||
r2 = outer_radius + tooth_depth / 2.0;
|
||||
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
|
||||
glShadeModel(GL_FLAT);
|
||||
|
||||
glNormal3f(0.0, 0.0, 1.0);
|
||||
|
||||
/* draw front face */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
if (i < teeth) {
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw front sides of teeth */
|
||||
glBegin(GL_QUADS);
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glNormal3f(0.0, 0.0, -1.0);
|
||||
|
||||
/* draw back face */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
if (i < teeth) {
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw back sides of teeth */
|
||||
glBegin(GL_QUADS);
|
||||
da = 2.0 * M_PI / teeth / 4.0;
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw outward faces of teeth */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i < teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
|
||||
u = r2 * cos(angle + da) - r1 * cos(angle);
|
||||
v = r2 * sin(angle + da) - r1 * sin(angle);
|
||||
len = sqrt(u * u + v * v);
|
||||
u /= len;
|
||||
v /= len;
|
||||
glNormal3f(v, -u, 0.0);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
|
||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
|
||||
glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
|
||||
u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
|
||||
v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
|
||||
glNormal3f(v, -u, 0.0);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
|
||||
glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
|
||||
glNormal3f(cos(angle), sin(angle), 0.0);
|
||||
}
|
||||
|
||||
glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
|
||||
glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
|
||||
|
||||
glEnd();
|
||||
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
/* draw inside radius cylinder */
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
for (i = 0; i <= teeth; i++) {
|
||||
angle = i * 2.0 * M_PI / teeth;
|
||||
glNormal3f(-cos(angle), -sin(angle), 0.0);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
|
||||
glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
}
|
||||
|
||||
static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
|
||||
static GLint gear1, gear2, gear3;
|
||||
static GLfloat angle = 0.0;
|
||||
|
||||
static void
|
||||
draw(void)
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(view_rotx, 1.0, 0.0, 0.0);
|
||||
glRotatef(view_roty, 0.0, 1.0, 0.0);
|
||||
glRotatef(view_rotz, 0.0, 0.0, 1.0);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(-3.0, -2.0, 0.0);
|
||||
glRotatef(angle, 0.0, 0.0, 1.0);
|
||||
glCallList(gear1);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(3.1, -2.0, 0.0);
|
||||
glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
|
||||
glCallList(gear2);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(-3.1, 4.2, 0.0);
|
||||
glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
|
||||
glCallList(gear3);
|
||||
glPopMatrix();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
glutSwapBuffers();
|
||||
|
||||
Frames++;
|
||||
{
|
||||
GLint t = glutGet(GLUT_ELAPSED_TIME);
|
||||
if (t - T0 >= 5000) {
|
||||
GLfloat seconds = (t - T0) / 1000.0;
|
||||
GLfloat fps = Frames / seconds;
|
||||
printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
|
||||
T0 = t;
|
||||
Frames = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
idle(void)
|
||||
{
|
||||
angle += 2.0;
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
/* change view angle, exit upon ESC */
|
||||
/* ARGSUSED1 */
|
||||
static void
|
||||
key(unsigned char k, int x, int y)
|
||||
{
|
||||
switch (k) {
|
||||
case 'z':
|
||||
view_rotz += 5.0;
|
||||
break;
|
||||
case 'Z':
|
||||
view_rotz -= 5.0;
|
||||
break;
|
||||
case 27: /* Escape */
|
||||
exit(0); /* FIXME: Shutdown and free resources cleanly in ggiglut */
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
/* change view angle */
|
||||
/* ARGSUSED1 */
|
||||
static void
|
||||
special(int k, int x, int y)
|
||||
{
|
||||
switch (k) {
|
||||
case GLUT_KEY_UP:
|
||||
view_rotx += 5.0;
|
||||
break;
|
||||
case GLUT_KEY_DOWN:
|
||||
view_rotx -= 5.0;
|
||||
break;
|
||||
case GLUT_KEY_LEFT:
|
||||
view_roty += 5.0;
|
||||
break;
|
||||
case GLUT_KEY_RIGHT:
|
||||
view_roty -= 5.0;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
/* new window size or exposure */
|
||||
static void
|
||||
reshape(int width, int height)
|
||||
{
|
||||
GLfloat h = (GLfloat) height / (GLfloat) width;
|
||||
|
||||
glViewport(0, 0, (GLint) width, (GLint) height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -40.0);
|
||||
}
|
||||
|
||||
static void
|
||||
init(void)
|
||||
{
|
||||
static GLfloat pos[4] =
|
||||
{5.0, 5.0, 10.0, 0.0};
|
||||
static GLfloat red[4] =
|
||||
{0.8, 0.1, 0.0, 1.0};
|
||||
static GLfloat green[4] =
|
||||
{0.0, 0.8, 0.2, 1.0};
|
||||
static GLfloat blue[4] =
|
||||
{0.2, 0.2, 1.0, 1.0};
|
||||
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, pos);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
/* make the gears */
|
||||
gear1 = glGenLists(1);
|
||||
glNewList(gear1, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
|
||||
gear(1.0, 4.0, 1.0, 20, 0.7);
|
||||
glEndList();
|
||||
|
||||
gear2 = glGenLists(1);
|
||||
glNewList(gear2, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
|
||||
gear(0.5, 2.0, 2.0, 10, 0.7);
|
||||
glEndList();
|
||||
|
||||
gear3 = glGenLists(1);
|
||||
glNewList(gear3, GL_COMPILE);
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
|
||||
gear(1.3, 2.0, 0.5, 10, 0.7);
|
||||
glEndList();
|
||||
|
||||
glEnable(GL_NORMALIZE);
|
||||
}
|
||||
|
||||
void
|
||||
visible(int vis)
|
||||
{
|
||||
if (vis == GLUT_VISIBLE)
|
||||
glutIdleFunc(idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
||||
|
||||
// glutInitWindowPosition(0, 0);
|
||||
// glutInitWindowSize(300, 300);
|
||||
glutCreateWindow("Gears");
|
||||
init();
|
||||
|
||||
glutDisplayFunc(draw);
|
||||
glutReshapeFunc(reshape);
|
||||
glutKeyboardFunc(key);
|
||||
glutSpecialFunc(special);
|
||||
glutVisibilityFunc(visible);
|
||||
|
||||
glutMainLoop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,390 +0,0 @@
|
|||
/* gears.c */
|
||||
|
||||
/*
|
||||
* 3-D gear wheels. This program is in the public domain.
|
||||
*
|
||||
* Brian Paul
|
||||
* modified by Uwe Maurer (uwe_maurer@t-online.de)
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <ggi/ggi.h>
|
||||
#include <GL/ggimesa.h>
|
||||
#ifndef M_PI
|
||||
# define M_PI 3.14159265
|
||||
#endif
|
||||
|
||||
|
||||
ggi_visual_t vis;
|
||||
char text[100];
|
||||
int db_flag,vis_x, vis_y, vir_x, vir_y, gt;
|
||||
|
||||
/*
|
||||
* Draw a gear wheel. You'll probably want to call this function when
|
||||
* building a display list since we do a lot of trig here.
|
||||
*
|
||||
* Input: inner_radius - radius of hole at center
|
||||
* outer_radius - radius at center of teeth
|
||||
* width - width of gear
|
||||
* teeth - number of teeth
|
||||
* tooth_depth - depth of tooth
|
||||
*/
|
||||
static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
|
||||
GLint teeth, GLfloat tooth_depth )
|
||||
{
|
||||
GLint i;
|
||||
GLfloat r0, r1, r2;
|
||||
GLfloat angle, da;
|
||||
GLfloat u, v, len;
|
||||
|
||||
r0 = inner_radius;
|
||||
r1 = outer_radius - tooth_depth/2.0;
|
||||
r2 = outer_radius + tooth_depth/2.0;
|
||||
|
||||
da = 2.0*M_PI / teeth / 4.0;
|
||||
|
||||
glShadeModel( GL_FLAT );
|
||||
|
||||
glNormal3f( 0.0, 0.0, 1.0 );
|
||||
|
||||
/* draw front face */
|
||||
glBegin( GL_QUAD_STRIP );
|
||||
for (i=0;i<=teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw front sides of teeth */
|
||||
glBegin( GL_QUADS );
|
||||
da = 2.0*M_PI / teeth / 4.0;
|
||||
for (i=0;i<teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
|
||||
glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
|
||||
glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
|
||||
glNormal3f( 0.0, 0.0, -1.0 );
|
||||
|
||||
/* draw back face */
|
||||
glBegin( GL_QUAD_STRIP );
|
||||
for (i=0;i<=teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
/* draw back sides of teeth */
|
||||
glBegin( GL_QUADS );
|
||||
da = 2.0*M_PI / teeth / 4.0;
|
||||
for (i=0;i<teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
|
||||
glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
|
||||
glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
|
||||
/* draw outward faces of teeth */
|
||||
glBegin( GL_QUAD_STRIP );
|
||||
for (i=0;i<teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
|
||||
glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
|
||||
u = r2*cos(angle+da) - r1*cos(angle);
|
||||
v = r2*sin(angle+da) - r1*sin(angle);
|
||||
len = sqrt( u*u + v*v );
|
||||
u /= len;
|
||||
v /= len;
|
||||
glNormal3f( v, -u, 0.0 );
|
||||
glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
|
||||
glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
|
||||
glNormal3f( cos(angle), sin(angle), 0.0 );
|
||||
glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
|
||||
glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
|
||||
u = r1*cos(angle+3*da) - r2*cos(angle+2*da);
|
||||
v = r1*sin(angle+3*da) - r2*sin(angle+2*da);
|
||||
glNormal3f( v, -u, 0.0 );
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
|
||||
glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
|
||||
glNormal3f( cos(angle), sin(angle), 0.0 );
|
||||
}
|
||||
|
||||
glVertex3f( r1*cos(0), r1*sin(0), width*0.5 );
|
||||
glVertex3f( r1*cos(0), r1*sin(0), -width*0.5 );
|
||||
|
||||
glEnd();
|
||||
|
||||
|
||||
glShadeModel( GL_SMOOTH );
|
||||
|
||||
/* draw inside radius cylinder */
|
||||
glBegin( GL_QUAD_STRIP );
|
||||
for (i=0;i<=teeth;i++) {
|
||||
angle = i * 2.0*M_PI / teeth;
|
||||
glNormal3f( -cos(angle), -sin(angle), 0.0 );
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
|
||||
glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
|
||||
}
|
||||
glEnd();
|
||||
|
||||
}
|
||||
|
||||
|
||||
static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0;
|
||||
static GLint gear1, gear2, gear3;
|
||||
static GLfloat angle = 0.0;
|
||||
|
||||
static GLuint limit;
|
||||
static GLuint count = 1;
|
||||
|
||||
|
||||
static void draw( void )
|
||||
{
|
||||
static int n = 0;
|
||||
glClearColor(0,0,0,0);
|
||||
glClearIndex(0);
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef( view_rotx, 1.0, 0.0, 0.0 );
|
||||
glRotatef( view_roty, 0.0, 1.0, 0.0 );
|
||||
glRotatef( view_rotz, 0.0, 0.0, 1.0 );
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( -3.0, -2.0, 0.0 );
|
||||
glRotatef( angle, 0.0, 0.0, 1.0 );
|
||||
glCallList(gear1);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( 3.1, -2.0, 0.0 );
|
||||
glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 );
|
||||
glCallList(gear2);
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef( -3.1, 4.2, 0.0 );
|
||||
glRotatef( -2.0*angle-25.0, 0.0, 0.0, 1.0 );
|
||||
glCallList(gear3);
|
||||
glPopMatrix();
|
||||
|
||||
glPopMatrix();
|
||||
glFlush();
|
||||
glFinish();
|
||||
|
||||
#if 0
|
||||
ggiSetGCForeground(vis,255);
|
||||
ggiPuts(vis,0,0,"Mesa -> GGI");
|
||||
ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y," Mesa -> GGI");
|
||||
|
||||
ggiPuts(vis,0,16,text);
|
||||
ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y+16,text);
|
||||
#endif
|
||||
|
||||
if(db_flag)
|
||||
ggiMesaSwapBuffers();
|
||||
|
||||
count++;
|
||||
if (count==limit) {
|
||||
exit(1);
|
||||
}
|
||||
++n;
|
||||
/*
|
||||
if (!(n%10)){
|
||||
ggi_color rgb = { 10000, 10000, 10000 };
|
||||
ggiSetSimpleMode(vis,vis_x+(n/10),vis_y+(n/10),db_flag?2:1, gt);
|
||||
glViewport(0, 0,vis_x+(n/10),vis_y+(n/10));
|
||||
ggiSetGCForeground(vis, ggiMapColor(vis, &rgb));
|
||||
ggiDrawBox(vis, 20, 20, 100, 100);
|
||||
if(db_flag)
|
||||
ggiSetWriteFrame(vis, 1);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
static void idle( void )
|
||||
{
|
||||
angle += 2.0;
|
||||
draw();
|
||||
}
|
||||
|
||||
/* new window size or exposure */
|
||||
static void reshape( int width, int height )
|
||||
{
|
||||
GLfloat h = (GLfloat) height / (GLfloat) width;
|
||||
|
||||
if(db_flag)
|
||||
glDrawBuffer(GL_BACK);
|
||||
else
|
||||
glDrawBuffer(GL_FRONT);
|
||||
glViewport(0, 0, (GLint)width, (GLint)height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum( -1.0, 1.0, -h, h, 5.0, 60.0 );
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -40.0 );
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void init( void )
|
||||
{
|
||||
static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 };
|
||||
static GLfloat red[4] = {0.9, 0.9, 0.9, 1.0 };
|
||||
static GLfloat green[4] = {0.0, 0.8, 0.9, 1.0 };
|
||||
static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
|
||||
|
||||
glLightfv( GL_LIGHT0, GL_POSITION, pos );
|
||||
glEnable( GL_CULL_FACE );
|
||||
glEnable( GL_LIGHTING );
|
||||
glEnable( GL_LIGHT0 );
|
||||
glEnable( GL_DEPTH_TEST );
|
||||
|
||||
/* make the gears */
|
||||
gear1 = glGenLists(1);
|
||||
glNewList(gear1, GL_COMPILE);
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red );
|
||||
glIndexi(1);
|
||||
gear( 1.0, 4.0, 1.0, 20, 0.7 );
|
||||
glEndList();
|
||||
|
||||
gear2 = glGenLists(1);
|
||||
glNewList(gear2, GL_COMPILE);
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
|
||||
glIndexi(2);
|
||||
gear( 0.5, 2.0, 2.0, 10, 0.7 );
|
||||
glEndList();
|
||||
|
||||
gear3 = glGenLists(1);
|
||||
glNewList(gear3, GL_COMPILE);
|
||||
glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue );
|
||||
glIndexi(3);
|
||||
gear( 1.3, 2.0, 0.5, 10, 0.7 );
|
||||
glEndList();
|
||||
|
||||
glEnable( GL_NORMALIZE );
|
||||
}
|
||||
|
||||
static void usage(char *s)
|
||||
{
|
||||
printf("%s visible_x visible_y virtual_x virtual_y bpp db_flag\n",s);
|
||||
printf("example:\n");
|
||||
printf("%s 320 200 320 400 8 1\n",s);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
ggi_mesa_context_t ctx;
|
||||
ggi_mode mode;
|
||||
int bpp;
|
||||
|
||||
limit=0;
|
||||
|
||||
if (argc<7) usage(argv[0]);
|
||||
|
||||
vis_x=atoi(argv[1]);
|
||||
vis_y=atoi(argv[2]);
|
||||
vir_x=atoi(argv[3]);
|
||||
vir_y=atoi(argv[4]);
|
||||
bpp=atoi(argv[5]);
|
||||
db_flag=atoi(argv[6]);
|
||||
|
||||
switch(bpp)
|
||||
{
|
||||
case 4: gt=GT_4BIT;break;
|
||||
case 8: gt=GT_8BIT;break;
|
||||
case 15:gt=GT_15BIT;break;
|
||||
case 16:gt=GT_16BIT;break;
|
||||
case 24:gt=GT_24BIT;break;
|
||||
case 32:gt=GT_32BIT;break;
|
||||
default:
|
||||
printf("%i Bits per Pixel ???\n",bpp);
|
||||
exit(1);
|
||||
}
|
||||
sprintf(text,"%sx%s %i colors, RGB mode, %s",
|
||||
argv[1],argv[2],1<<bpp,
|
||||
(db_flag) ? "doublebuffer" : "no doublebuffer");
|
||||
|
||||
if (ggiInit()<0)
|
||||
{
|
||||
printf("ggiInit() failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ggiMesaInit() < 0)
|
||||
{
|
||||
printf("ggiMesaInit failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
vis=ggiOpen(NULL);
|
||||
if (vis==NULL)
|
||||
{
|
||||
printf("ggiOpen() failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ggiSetSimpleMode(vis,vis_x,vis_y,db_flag ? 2 : 1,gt)<0)
|
||||
{
|
||||
printf("%s: can't set graphmode (%i %i %i %i) %i BPP\n",
|
||||
argv[0],vis_x,vis_y,vir_x,vir_y,bpp);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (ggiMesaAttach(vis) < 0)
|
||||
{
|
||||
printf("ggiMesaAttach failed\n");
|
||||
exit(1);
|
||||
}
|
||||
if (ggiMesaExtendVisual(vis, GL_FALSE, GL_FALSE, 16,
|
||||
0, 0, 0, 0, 0, 1) < 0)
|
||||
{
|
||||
printf ("GGIMesaSetVisual() failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ctx = ggiMesaCreateContext(vis);
|
||||
if (ctx==NULL)
|
||||
{
|
||||
printf("GGIMesaCreateContext() failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ggiMesaMakeCurrent(ctx, vis);
|
||||
ggiGetMode(vis,&mode);
|
||||
|
||||
reshape(mode.visible.x,mode.visible.y);
|
||||
|
||||
init();
|
||||
|
||||
while (!ggiKbhit(vis)) { /*sleep(1);*/ idle(); }
|
||||
|
||||
ggiMesaDestroyContext(ctx);
|
||||
ggiClose(vis);
|
||||
|
||||
printf("%s\n",text);
|
||||
|
||||
ggiExit();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
|
||||
|
||||
Named object: "Object01"
|
||||
Tri-mesh, Vertices: 20 Faces: 36
|
||||
Vertex list:
|
||||
Vertex 0: X: -210 Y: -432.781738 Z: 180.000031
|
||||
Vertex 1: X: -610.810303 Y: 144.260559 Z: 103.580154
|
||||
Vertex 2: X: 56.586655 Y: 144.260544 Z: -128.902023
|
||||
Vertex 3: X: -75.776352 Y: 144.260605 Z: 565.321838
|
||||
Vertex 4: X: -462.815979 Y: -347.937683 Z: 131.797302
|
||||
Vertex 5: X: -616.506042 Y: -126.67173 Z: 102.494209
|
||||
Vertex 6: X: -41.847229 Y: -347.937683 Z: -14.843644
|
||||
Vertex 7: X: 60.375015 Y: -126.671753 Z: -133.291641
|
||||
Vertex 8: X: -125.336807 Y: -347.937653 Z: 423.046448
|
||||
Vertex 9: X: -73.868958 Y: -126.671692 Z: 570.797424
|
||||
Vertex 10: X: -448.353271 Y: 237.304672 Z: -92.34951
|
||||
Vertex 11: X: -192.440964 Y: 237.304672 Z: -181.494431
|
||||
Vertex 12: X: 145.038193 Y: 237.304672 Z: 109.754745
|
||||
Vertex 13: X: 94.283768 Y: 237.304688 Z: 375.953766
|
||||
Vertex 14: X: -326.684937 Y: 237.304733 Z: 522.594727
|
||||
Vertex 15: X: -531.842834 Y: 237.304718 Z: 345.540588
|
||||
Vertex 16: X: -331.419525 Y: -225.964966 Z: -168.564438
|
||||
Vertex 17: X: 152.575485 Y: -225.964935 Z: 249.129868
|
||||
Vertex 18: X: -451.155914 Y: -225.964905 Z: 459.434662
|
||||
Vertex 19: X: -298.413483 Y: 423.31897 Z: 163.142761
|
||||
Face list:
|
||||
Face 0: A:0 B:4 C:6 AB:1 BC:1 CA:1
|
||||
Face 1: A:4 B:5 C:16 AB:1 BC:1 CA:1
|
||||
Face 2: A:4 B:16 C:6 AB:1 BC:1 CA:1
|
||||
Face 3: A:6 B:16 C:7 AB:1 BC:1 CA:1
|
||||
Face 4: A:5 B:1 C:10 AB:1 BC:1 CA:1
|
||||
Face 5: A:5 B:10 C:16 AB:1 BC:1 CA:1
|
||||
Face 6: A:16 B:10 C:11 AB:1 BC:1 CA:1
|
||||
Face 7: A:16 B:11 C:7 AB:1 BC:1 CA:1
|
||||
Face 8: A:7 B:11 C:2 AB:1 BC:1 CA:1
|
||||
Face 9: A:0 B:6 C:8 AB:1 BC:1 CA:1
|
||||
Face 10: A:6 B:7 C:17 AB:1 BC:1 CA:1
|
||||
Face 11: A:6 B:17 C:8 AB:1 BC:1 CA:1
|
||||
Face 12: A:8 B:17 C:9 AB:1 BC:1 CA:1
|
||||
Face 13: A:7 B:2 C:12 AB:1 BC:1 CA:1
|
||||
Face 14: A:7 B:12 C:17 AB:1 BC:1 CA:1
|
||||
Face 15: A:17 B:12 C:13 AB:1 BC:1 CA:1
|
||||
Face 16: A:17 B:13 C:9 AB:1 BC:1 CA:1
|
||||
Face 17: A:9 B:13 C:3 AB:1 BC:1 CA:1
|
||||
Face 18: A:0 B:8 C:4 AB:1 BC:1 CA:1
|
||||
Face 19: A:8 B:9 C:18 AB:1 BC:1 CA:1
|
||||
Face 20: A:8 B:18 C:4 AB:1 BC:1 CA:1
|
||||
Face 21: A:4 B:18 C:5 AB:1 BC:1 CA:1
|
||||
Face 22: A:9 B:3 C:14 AB:1 BC:1 CA:1
|
||||
Face 23: A:9 B:14 C:18 AB:1 BC:1 CA:1
|
||||
Face 24: A:18 B:14 C:15 AB:1 BC:1 CA:1
|
||||
Face 25: A:18 B:15 C:5 AB:1 BC:1 CA:1
|
||||
Face 26: A:5 B:15 C:1 AB:1 BC:1 CA:1
|
||||
Face 27: A:1 B:15 C:10 AB:1 BC:1 CA:1
|
||||
Face 28: A:15 B:14 C:19 AB:1 BC:1 CA:1
|
||||
Face 29: A:15 B:19 C:10 AB:1 BC:1 CA:1
|
||||
Face 30: A:10 B:19 C:11 AB:1 BC:1 CA:1
|
||||
Face 31: A:14 B:3 C:13 AB:1 BC:1 CA:1
|
||||
Face 32: A:14 B:13 C:19 AB:1 BC:1 CA:1
|
||||
Face 33: A:19 B:13 C:12 AB:1 BC:1 CA:1
|
||||
Face 34: A:19 B:12 C:11 AB:1 BC:1 CA:1
|
||||
|
||||
Page 1
|
||||
|
||||
|
||||
|
||||
Face 35: A:11 B:12 C:2 AB:1 BC:1 CA:1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page 2
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,264 +0,0 @@
|
|||
Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
|
||||
|
||||
Named object: "Object01"
|
||||
Tri-mesh, Vertices: 40 Faces: 80
|
||||
Vertex list:
|
||||
Vertex 0: X: -50.170624 Y: -0.000026 Z: -240.147842
|
||||
Vertex 1: X: -80.584503 Y: -63.958851 Z: -205.014572
|
||||
Vertex 2: X: -129.795166 Y: -39.528744 Z: -148.16774
|
||||
Vertex 3: X: -129.795166 Y: 39.528721 Z: -148.16774
|
||||
Vertex 4: X: -80.584503 Y: 63.958797 Z: -205.014572
|
||||
Vertex 5: X: 85.963654 Y: -0.000002 Z: 31.490465
|
||||
Vertex 6: X: 39.614838 Y: -63.958828 Z: 34.827602
|
||||
Vertex 7: X: -35.37915 Y: -39.528728 Z: 40.227196
|
||||
Vertex 8: X: -35.37912 Y: 39.528736 Z: 40.227188
|
||||
Vertex 9: X: 39.614838 Y: 63.95882 Z: 34.827595
|
||||
Vertex 10: X: -9.852051 Y: 0.000023 Z: 319.829254
|
||||
Vertex 11: X: -44.985352 Y: -63.958805 Z: 289.415405
|
||||
Vertex 12: X: -101.832199 Y: -39.528709 Z: 240.204758
|
||||
Vertex 13: X: -101.832184 Y: 39.528755 Z: 240.204773
|
||||
Vertex 14: X: -44.985352 Y: 63.958843 Z: 289.415405
|
||||
Vertex 15: X: -281.490326 Y: 0.000035 Z: 455.963654
|
||||
Vertex 16: X: -284.827484 Y: -63.958794 Z: 409.614868
|
||||
Vertex 17: X: -290.227112 Y: -39.528702 Z: 334.62085
|
||||
Vertex 18: X: -290.227112 Y: 39.528763 Z: 334.62088
|
||||
Vertex 19: X: -284.827484 Y: 63.958855 Z: 409.614838
|
||||
Vertex 20: X: -569.829163 Y: 0.000026 Z: 360.14798
|
||||
Vertex 21: X: -539.415344 Y: -63.958801 Z: 325.014709
|
||||
Vertex 22: X: -490.204712 Y: -39.528709 Z: 268.167847
|
||||
Vertex 23: X: -490.204712 Y: 39.528755 Z: 268.167847
|
||||
Vertex 24: X: -539.415344 Y: 63.958847 Z: 325.014679
|
||||
Vertex 25: X: -705.963684 Y: 0.000002 Z: 88.509598
|
||||
Vertex 26: X: -659.614807 Y: -63.958824 Z: 85.172462
|
||||
Vertex 27: X: -584.62085 Y: -39.528725 Z: 79.77285
|
||||
Vertex 28: X: -584.62085 Y: 39.52874 Z: 79.77285
|
||||
Vertex 29: X: -659.614868 Y: 63.958824 Z: 85.172447
|
||||
Vertex 30: X: -610.147827 Y: -0.000023 Z: -199.829361
|
||||
Vertex 31: X: -575.014587 Y: -63.958847 Z: -169.415497
|
||||
Vertex 32: X: -518.167725 Y: -39.528744 Z: -120.204819
|
||||
Vertex 33: X: -518.167725 Y: 39.528721 Z: -120.204834
|
||||
Vertex 34: X: -575.014587 Y: 63.958801 Z: -169.415497
|
||||
Vertex 35: X: -338.509338 Y: -0.000035 Z: -335.963745
|
||||
Vertex 36: X: -335.172241 Y: -63.958858 Z: -289.614868
|
||||
Vertex 37: X: -329.772675 Y: -39.528751 Z: -214.620865
|
||||
Vertex 38: X: -329.772675 Y: 39.528713 Z: -214.620865
|
||||
Vertex 39: X: -335.172241 Y: 63.95879 Z: -289.614899
|
||||
Face list:
|
||||
Face 0: A:0 B:6 C:1 AB:0 BC:1 CA:1
|
||||
Smoothing: 1
|
||||
Face 1: A:0 B:5 C:6 AB:1 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 2: A:1 B:7 C:2 AB:0 BC:1 CA:1
|
||||
Smoothing: 2
|
||||
Face 3: A:1 B:6 C:7 AB:1 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 4: A:2 B:8 C:3 AB:0 BC:1 CA:1
|
||||
Smoothing: 3
|
||||
Face 5: A:2 B:7 C:8 AB:1 BC:1 CA:0
|
||||
Smoothing: 3
|
||||
Face 6: A:3 B:9 C:4 AB:0 BC:1 CA:1
|
||||
Smoothing: 4
|
||||
Face 7: A:3 B:8 C:9 AB:1 BC:1 CA:0
|
||||
|
||||
Page 1
|
||||
|
||||
|
||||
|
||||
Smoothing: 4
|
||||
Face 8: A:4 B:5 C:0 AB:0 BC:1 CA:1
|
||||
Smoothing: 5
|
||||
Face 9: A:4 B:9 C:5 AB:1 BC:1 CA:0
|
||||
Smoothing: 5
|
||||
Face 10: A:5 B:11 C:6 AB:0 BC:1 CA:1
|
||||
Smoothing: 6
|
||||
Face 11: A:5 B:10 C:11 AB:1 BC:1 CA:0
|
||||
Smoothing: 6
|
||||
Face 12: A:6 B:12 C:7 AB:0 BC:1 CA:1
|
||||
Smoothing: 7
|
||||
Face 13: A:6 B:11 C:12 AB:1 BC:1 CA:0
|
||||
Smoothing: 7
|
||||
Face 14: A:7 B:13 C:8 AB:0 BC:1 CA:1
|
||||
Smoothing: 8
|
||||
Face 15: A:7 B:12 C:13 AB:1 BC:1 CA:0
|
||||
Smoothing: 8
|
||||
Face 16: A:8 B:14 C:9 AB:0 BC:1 CA:1
|
||||
Smoothing: 9
|
||||
Face 17: A:8 B:13 C:14 AB:1 BC:1 CA:0
|
||||
Smoothing: 9
|
||||
Face 18: A:9 B:10 C:5 AB:0 BC:1 CA:1
|
||||
Smoothing: 10
|
||||
Face 19: A:9 B:14 C:10 AB:1 BC:1 CA:0
|
||||
Smoothing: 10
|
||||
Face 20: A:10 B:16 C:11 AB:0 BC:1 CA:1
|
||||
Smoothing: 11
|
||||
Face 21: A:10 B:15 C:16 AB:1 BC:1 CA:0
|
||||
Smoothing: 11
|
||||
Face 22: A:11 B:17 C:12 AB:0 BC:1 CA:1
|
||||
Smoothing: 12
|
||||
Face 23: A:11 B:16 C:17 AB:1 BC:1 CA:0
|
||||
Smoothing: 12
|
||||
Face 24: A:12 B:18 C:13 AB:0 BC:1 CA:1
|
||||
Smoothing: 13
|
||||
Face 25: A:12 B:17 C:18 AB:1 BC:1 CA:0
|
||||
Smoothing: 13
|
||||
Face 26: A:13 B:19 C:14 AB:0 BC:1 CA:1
|
||||
Smoothing: 14
|
||||
Face 27: A:13 B:18 C:19 AB:1 BC:1 CA:0
|
||||
Smoothing: 14
|
||||
Face 28: A:14 B:15 C:10 AB:0 BC:1 CA:1
|
||||
Smoothing: 15
|
||||
Face 29: A:14 B:19 C:15 AB:1 BC:1 CA:0
|
||||
Smoothing: 15
|
||||
Face 30: A:15 B:21 C:16 AB:0 BC:1 CA:1
|
||||
Smoothing: 16
|
||||
Face 31: A:15 B:20 C:21 AB:1 BC:1 CA:0
|
||||
Smoothing: 16
|
||||
Face 32: A:16 B:22 C:17 AB:0 BC:1 CA:1
|
||||
Smoothing: 17
|
||||
Face 33: A:16 B:21 C:22 AB:1 BC:1 CA:0
|
||||
Smoothing: 17
|
||||
Face 34: A:17 B:23 C:18 AB:0 BC:1 CA:1
|
||||
Smoothing: 18
|
||||
Face 35: A:17 B:22 C:23 AB:1 BC:1 CA:0
|
||||
Smoothing: 18
|
||||
Face 36: A:18 B:24 C:19 AB:0 BC:1 CA:1
|
||||
Smoothing: 19
|
||||
Face 37: A:18 B:23 C:24 AB:1 BC:1 CA:0
|
||||
Smoothing: 19
|
||||
|
||||
Page 2
|
||||
|
||||
|
||||
|
||||
Face 38: A:19 B:20 C:15 AB:0 BC:1 CA:1
|
||||
Smoothing: 20
|
||||
Face 39: A:19 B:24 C:20 AB:1 BC:1 CA:0
|
||||
Smoothing: 20
|
||||
Face 40: A:20 B:26 C:21 AB:0 BC:1 CA:1
|
||||
Smoothing: 21
|
||||
Face 41: A:20 B:25 C:26 AB:1 BC:1 CA:0
|
||||
Smoothing: 21
|
||||
Face 42: A:21 B:27 C:22 AB:0 BC:1 CA:1
|
||||
Smoothing: 22
|
||||
Face 43: A:21 B:26 C:27 AB:1 BC:1 CA:0
|
||||
Smoothing: 22
|
||||
Face 44: A:22 B:28 C:23 AB:0 BC:1 CA:1
|
||||
Smoothing: 23
|
||||
Face 45: A:22 B:27 C:28 AB:1 BC:1 CA:0
|
||||
Smoothing: 23
|
||||
Face 46: A:23 B:29 C:24 AB:0 BC:1 CA:1
|
||||
Smoothing: 24
|
||||
Face 47: A:23 B:28 C:29 AB:1 BC:1 CA:0
|
||||
Smoothing: 24
|
||||
Face 48: A:24 B:25 C:20 AB:0 BC:1 CA:1
|
||||
Smoothing: 25
|
||||
Face 49: A:24 B:29 C:25 AB:1 BC:1 CA:0
|
||||
Smoothing: 25
|
||||
Face 50: A:25 B:31 C:26 AB:0 BC:1 CA:1
|
||||
Smoothing: 26
|
||||
Face 51: A:25 B:30 C:31 AB:1 BC:1 CA:0
|
||||
Smoothing: 26
|
||||
Face 52: A:26 B:32 C:27 AB:0 BC:1 CA:1
|
||||
Smoothing: 27
|
||||
Face 53: A:26 B:31 C:32 AB:1 BC:1 CA:0
|
||||
Smoothing: 27
|
||||
Face 54: A:27 B:33 C:28 AB:0 BC:1 CA:1
|
||||
Smoothing: 28
|
||||
Face 55: A:27 B:32 C:33 AB:1 BC:1 CA:0
|
||||
Smoothing: 28
|
||||
Face 56: A:28 B:34 C:29 AB:0 BC:1 CA:1
|
||||
Smoothing: 29
|
||||
Face 57: A:28 B:33 C:34 AB:1 BC:1 CA:0
|
||||
Smoothing: 29
|
||||
Face 58: A:29 B:30 C:25 AB:0 BC:1 CA:1
|
||||
Smoothing: 30
|
||||
Face 59: A:29 B:34 C:30 AB:1 BC:1 CA:0
|
||||
Smoothing: 30
|
||||
Face 60: A:30 B:36 C:31 AB:0 BC:1 CA:1
|
||||
Smoothing: 31
|
||||
Face 61: A:30 B:35 C:36 AB:1 BC:1 CA:0
|
||||
Smoothing: 31
|
||||
Face 62: A:31 B:37 C:32 AB:0 BC:1 CA:1
|
||||
Smoothing: 32
|
||||
Face 63: A:31 B:36 C:37 AB:1 BC:1 CA:0
|
||||
Smoothing: 32
|
||||
Face 64: A:32 B:38 C:33 AB:0 BC:1 CA:1
|
||||
Smoothing: 1
|
||||
Face 65: A:32 B:37 C:38 AB:1 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 66: A:33 B:39 C:34 AB:0 BC:1 CA:1
|
||||
Smoothing: 2
|
||||
Face 67: A:33 B:38 C:39 AB:1 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 68: A:34 B:35 C:30 AB:0 BC:1 CA:1
|
||||
|
||||
Page 3
|
||||
|
||||
|
||||
|
||||
Smoothing: 3
|
||||
Face 69: A:34 B:39 C:35 AB:1 BC:1 CA:0
|
||||
Smoothing: 3
|
||||
Face 70: A:35 B:1 C:36 AB:0 BC:1 CA:1
|
||||
Smoothing: 4
|
||||
Face 71: A:35 B:0 C:1 AB:1 BC:1 CA:0
|
||||
Smoothing: 4
|
||||
Face 72: A:36 B:2 C:37 AB:0 BC:1 CA:1
|
||||
Smoothing: 5
|
||||
Face 73: A:36 B:1 C:2 AB:1 BC:1 CA:0
|
||||
Smoothing: 5
|
||||
Face 74: A:37 B:3 C:38 AB:0 BC:1 CA:1
|
||||
Smoothing: 6
|
||||
Face 75: A:37 B:2 C:3 AB:1 BC:1 CA:0
|
||||
Smoothing: 6
|
||||
Face 76: A:38 B:4 C:39 AB:0 BC:1 CA:1
|
||||
Smoothing: 7
|
||||
Face 77: A:38 B:3 C:4 AB:1 BC:1 CA:0
|
||||
Smoothing: 7
|
||||
Face 78: A:39 B:0 C:35 AB:0 BC:1 CA:1
|
||||
Smoothing: 8
|
||||
Face 79: A:39 B:4 C:0 AB:1 BC:1 CA:0
|
||||
Smoothing: 8
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page 4
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,396 +0,0 @@
|
|||
Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
|
||||
|
||||
Named object: "Object01"
|
||||
Tri-mesh, Vertices: 64 Faces: 128
|
||||
Vertex list:
|
||||
Vertex 0: X: 61.483898 Y: 37.836231 Z: -70.94294
|
||||
Vertex 1: X: 82.867447 Y: 37.836235 Z: -41.288902
|
||||
Vertex 2: X: 91.275154 Y: 37.836239 Z: -5.70901
|
||||
Vertex 3: X: 85.427025 Y: 37.836243 Z: 30.380013
|
||||
Vertex 4: X: 66.213379 Y: 37.836243 Z: 61.483936
|
||||
Vertex 5: X: 36.559322 Y: 37.836246 Z: 82.86747
|
||||
Vertex 6: X: 0.979424 Y: 37.836246 Z: 91.275154
|
||||
Vertex 7: X: -35.109554 Y: 37.836246 Z: 85.42701
|
||||
Vertex 8: X: -66.213478 Y: 37.836246 Z: 66.213356
|
||||
Vertex 9: X: -87.597 Y: 37.836243 Z: 36.559303
|
||||
Vertex 10: X: -96.004677 Y: 37.836239 Z: 0.979406
|
||||
Vertex 11: X: -90.156517 Y: 37.836235 Z: -35.109615
|
||||
Vertex 12: X: -70.942848 Y: 37.836235 Z: -66.213516
|
||||
Vertex 13: X: -41.288776 Y: 37.836231 Z: -87.597023
|
||||
Vertex 14: X: -5.708872 Y: 37.836231 Z: -96.004692
|
||||
Vertex 15: X: 30.380142 Y: 37.836231 Z: -90.156502
|
||||
Vertex 16: X: 61.483898 Y: -38.14529 Z: -70.942932
|
||||
Vertex 17: X: 82.867447 Y: -38.145287 Z: -41.288895
|
||||
Vertex 18: X: 91.275154 Y: -38.145283 Z: -5.709003
|
||||
Vertex 19: X: 85.427025 Y: -38.145279 Z: 30.38002
|
||||
Vertex 20: X: 66.213379 Y: -38.145279 Z: 61.483944
|
||||
Vertex 21: X: 36.559322 Y: -38.145275 Z: 82.867477
|
||||
Vertex 22: X: 0.979424 Y: -38.145275 Z: 91.275162
|
||||
Vertex 23: X: -35.109554 Y: -38.145275 Z: 85.427017
|
||||
Vertex 24: X: -66.213478 Y: -38.145275 Z: 66.213364
|
||||
Vertex 25: X: -87.597 Y: -38.145279 Z: 36.559311
|
||||
Vertex 26: X: -96.004677 Y: -38.145283 Z: 0.979412
|
||||
Vertex 27: X: -90.156517 Y: -38.145287 Z: -35.109608
|
||||
Vertex 28: X: -70.942848 Y: -38.145287 Z: -66.213516
|
||||
Vertex 29: X: -41.288776 Y: -38.14529 Z: -87.597015
|
||||
Vertex 30: X: -5.708872 Y: -38.14529 Z: -96.004684
|
||||
Vertex 31: X: 30.380142 Y: -38.14529 Z: -90.156494
|
||||
Vertex 32: X: 29.53923 Y: 37.836235 Z: -36.632011
|
||||
Vertex 33: X: 40.224194 Y: 37.836239 Z: -21.814436
|
||||
Vertex 34: X: 44.425369 Y: 37.836239 Z: -4.035822
|
||||
Vertex 35: X: 41.503166 Y: 37.836239 Z: 13.997195
|
||||
Vertex 36: X: 31.902466 Y: 37.836243 Z: 29.539249
|
||||
Vertex 37: X: 17.084883 Y: 37.836243 Z: 40.224201
|
||||
Vertex 38: X: -0.693734 Y: 37.836243 Z: 44.425365
|
||||
Vertex 39: X: -18.726728 Y: 37.836243 Z: 41.503159
|
||||
Vertex 40: X: -34.26878 Y: 37.836243 Z: 31.902454
|
||||
Vertex 41: X: -44.953732 Y: 37.836239 Z: 17.084871
|
||||
Vertex 42: X: -49.154892 Y: 37.836239 Z: -0.693745
|
||||
Vertex 43: X: -46.232677 Y: 37.836239 Z: -18.726759
|
||||
Vertex 44: X: -36.631962 Y: 37.836235 Z: -34.268806
|
||||
Vertex 45: X: -21.814371 Y: 37.836235 Z: -44.953747
|
||||
Vertex 46: X: -4.035751 Y: 37.836235 Z: -49.1549
|
||||
Vertex 47: X: 13.997261 Y: 37.836235 Z: -46.23267
|
||||
Vertex 48: X: 29.53923 Y: -38.145287 Z: -36.632004
|
||||
Vertex 49: X: 40.224194 Y: -38.145283 Z: -21.814428
|
||||
Vertex 50: X: 44.425369 Y: -38.145283 Z: -4.035816
|
||||
Vertex 51: X: 41.503166 Y: -38.145283 Z: 13.997201
|
||||
Vertex 52: X: 31.902466 Y: -38.145279 Z: 29.539257
|
||||
Vertex 53: X: 17.084883 Y: -38.145279 Z: 40.224209
|
||||
Vertex 54: X: -0.693734 Y: -38.145279 Z: 44.425373
|
||||
Vertex 55: X: -18.726728 Y: -38.145279 Z: 41.503166
|
||||
|
||||
Page 1
|
||||
|
||||
|
||||
|
||||
Vertex 56: X: -34.26878 Y: -38.145279 Z: 31.902462
|
||||
Vertex 57: X: -44.953732 Y: -38.145283 Z: 17.084879
|
||||
Vertex 58: X: -49.154892 Y: -38.145283 Z: -0.693738
|
||||
Vertex 59: X: -46.232677 Y: -38.145283 Z: -18.726751
|
||||
Vertex 60: X: -36.631962 Y: -38.145287 Z: -34.268799
|
||||
Vertex 61: X: -21.814371 Y: -38.145287 Z: -44.953739
|
||||
Vertex 62: X: -4.035751 Y: -38.145287 Z: -49.154892
|
||||
Vertex 63: X: 13.997261 Y: -38.145287 Z: -46.232662
|
||||
Face list:
|
||||
Face 0: A:0 B:1 C:17 AB:1 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 1: A:0 B:17 C:16 AB:0 BC:1 CA:1
|
||||
Smoothing: 1
|
||||
Face 2: A:1 B:2 C:18 AB:1 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 3: A:1 B:18 C:17 AB:0 BC:1 CA:1
|
||||
Smoothing: 2
|
||||
Face 4: A:2 B:3 C:19 AB:1 BC:1 CA:0
|
||||
Smoothing: 3
|
||||
Face 5: A:2 B:19 C:18 AB:0 BC:1 CA:1
|
||||
Smoothing: 3
|
||||
Face 6: A:3 B:4 C:20 AB:1 BC:1 CA:0
|
||||
Smoothing: 4
|
||||
Face 7: A:3 B:20 C:19 AB:0 BC:1 CA:1
|
||||
Smoothing: 4
|
||||
Face 8: A:4 B:5 C:21 AB:1 BC:1 CA:0
|
||||
Smoothing: 5
|
||||
Face 9: A:4 B:21 C:20 AB:0 BC:1 CA:1
|
||||
Smoothing: 5
|
||||
Face 10: A:5 B:6 C:22 AB:1 BC:1 CA:0
|
||||
Smoothing: 6
|
||||
Face 11: A:5 B:22 C:21 AB:0 BC:1 CA:1
|
||||
Smoothing: 6
|
||||
Face 12: A:6 B:7 C:23 AB:1 BC:1 CA:0
|
||||
Smoothing: 7
|
||||
Face 13: A:6 B:23 C:22 AB:0 BC:1 CA:1
|
||||
Smoothing: 7
|
||||
Face 14: A:7 B:8 C:24 AB:1 BC:1 CA:0
|
||||
Smoothing: 8
|
||||
Face 15: A:7 B:24 C:23 AB:0 BC:1 CA:1
|
||||
Smoothing: 8
|
||||
Face 16: A:8 B:9 C:25 AB:1 BC:1 CA:0
|
||||
Smoothing: 9
|
||||
Face 17: A:8 B:25 C:24 AB:0 BC:1 CA:1
|
||||
Smoothing: 9
|
||||
Face 18: A:9 B:10 C:26 AB:1 BC:1 CA:0
|
||||
Smoothing: 10
|
||||
Face 19: A:9 B:26 C:25 AB:0 BC:1 CA:1
|
||||
Smoothing: 10
|
||||
Face 20: A:10 B:11 C:27 AB:1 BC:1 CA:0
|
||||
Smoothing: 11
|
||||
Face 21: A:10 B:27 C:26 AB:0 BC:1 CA:1
|
||||
Smoothing: 11
|
||||
Face 22: A:11 B:12 C:28 AB:1 BC:1 CA:0
|
||||
Smoothing: 12
|
||||
Face 23: A:11 B:28 C:27 AB:0 BC:1 CA:1
|
||||
Smoothing: 12
|
||||
Face 24: A:12 B:13 C:29 AB:1 BC:1 CA:0
|
||||
Smoothing: 13
|
||||
Face 25: A:12 B:29 C:28 AB:0 BC:1 CA:1
|
||||
Smoothing: 13
|
||||
|
||||
Page 2
|
||||
|
||||
|
||||
|
||||
Face 26: A:13 B:14 C:30 AB:1 BC:1 CA:0
|
||||
Smoothing: 14
|
||||
Face 27: A:13 B:30 C:29 AB:0 BC:1 CA:1
|
||||
Smoothing: 14
|
||||
Face 28: A:14 B:15 C:31 AB:1 BC:1 CA:0
|
||||
Smoothing: 15
|
||||
Face 29: A:14 B:31 C:30 AB:0 BC:1 CA:1
|
||||
Smoothing: 15
|
||||
Face 30: A:15 B:0 C:16 AB:1 BC:1 CA:0
|
||||
Smoothing: 16
|
||||
Face 31: A:15 B:16 C:31 AB:0 BC:1 CA:1
|
||||
Smoothing: 16
|
||||
Face 32: A:32 B:49 C:33 AB:0 BC:1 CA:1
|
||||
Smoothing: 17
|
||||
Face 33: A:32 B:48 C:49 AB:1 BC:1 CA:0
|
||||
Smoothing: 17
|
||||
Face 34: A:33 B:50 C:34 AB:0 BC:1 CA:1
|
||||
Smoothing: 18
|
||||
Face 35: A:33 B:49 C:50 AB:1 BC:1 CA:0
|
||||
Smoothing: 18
|
||||
Face 36: A:34 B:51 C:35 AB:0 BC:1 CA:1
|
||||
Smoothing: 19
|
||||
Face 37: A:34 B:50 C:51 AB:1 BC:1 CA:0
|
||||
Smoothing: 19
|
||||
Face 38: A:35 B:52 C:36 AB:0 BC:1 CA:1
|
||||
Smoothing: 20
|
||||
Face 39: A:35 B:51 C:52 AB:1 BC:1 CA:0
|
||||
Smoothing: 20
|
||||
Face 40: A:36 B:53 C:37 AB:0 BC:1 CA:1
|
||||
Smoothing: 21
|
||||
Face 41: A:36 B:52 C:53 AB:1 BC:1 CA:0
|
||||
Smoothing: 21
|
||||
Face 42: A:37 B:54 C:38 AB:0 BC:1 CA:1
|
||||
Smoothing: 22
|
||||
Face 43: A:37 B:53 C:54 AB:1 BC:1 CA:0
|
||||
Smoothing: 22
|
||||
Face 44: A:38 B:55 C:39 AB:0 BC:1 CA:1
|
||||
Smoothing: 23
|
||||
Face 45: A:38 B:54 C:55 AB:1 BC:1 CA:0
|
||||
Smoothing: 23
|
||||
Face 46: A:39 B:56 C:40 AB:0 BC:1 CA:1
|
||||
Smoothing: 24
|
||||
Face 47: A:39 B:55 C:56 AB:1 BC:1 CA:0
|
||||
Smoothing: 24
|
||||
Face 48: A:40 B:57 C:41 AB:0 BC:1 CA:1
|
||||
Smoothing: 25
|
||||
Face 49: A:40 B:56 C:57 AB:1 BC:1 CA:0
|
||||
Smoothing: 25
|
||||
Face 50: A:41 B:58 C:42 AB:0 BC:1 CA:1
|
||||
Smoothing: 26
|
||||
Face 51: A:41 B:57 C:58 AB:1 BC:1 CA:0
|
||||
Smoothing: 26
|
||||
Face 52: A:42 B:59 C:43 AB:0 BC:1 CA:1
|
||||
Smoothing: 27
|
||||
Face 53: A:42 B:58 C:59 AB:1 BC:1 CA:0
|
||||
Smoothing: 27
|
||||
Face 54: A:43 B:60 C:44 AB:0 BC:1 CA:1
|
||||
Smoothing: 28
|
||||
Face 55: A:43 B:59 C:60 AB:1 BC:1 CA:0
|
||||
Smoothing: 28
|
||||
Face 56: A:44 B:61 C:45 AB:0 BC:1 CA:1
|
||||
|
||||
Page 3
|
||||
|
||||
|
||||
|
||||
Smoothing: 29
|
||||
Face 57: A:44 B:60 C:61 AB:1 BC:1 CA:0
|
||||
Smoothing: 29
|
||||
Face 58: A:45 B:62 C:46 AB:0 BC:1 CA:1
|
||||
Smoothing: 30
|
||||
Face 59: A:45 B:61 C:62 AB:1 BC:1 CA:0
|
||||
Smoothing: 30
|
||||
Face 60: A:46 B:63 C:47 AB:0 BC:1 CA:1
|
||||
Smoothing: 31
|
||||
Face 61: A:46 B:62 C:63 AB:1 BC:1 CA:0
|
||||
Smoothing: 31
|
||||
Face 62: A:47 B:48 C:32 AB:0 BC:1 CA:1
|
||||
Smoothing: 32
|
||||
Face 63: A:47 B:63 C:48 AB:1 BC:1 CA:0
|
||||
Smoothing: 32
|
||||
Face 64: A:0 B:32 C:33 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 65: A:0 B:33 C:1 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 66: A:1 B:33 C:34 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 67: A:1 B:34 C:2 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 68: A:2 B:34 C:35 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 69: A:2 B:35 C:3 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 70: A:3 B:35 C:36 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 71: A:3 B:36 C:4 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 72: A:4 B:36 C:37 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 73: A:4 B:37 C:5 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 74: A:5 B:37 C:38 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 75: A:5 B:38 C:6 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 76: A:6 B:38 C:39 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 77: A:6 B:39 C:7 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 78: A:7 B:39 C:40 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 79: A:7 B:40 C:8 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 80: A:8 B:40 C:41 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 81: A:8 B:41 C:9 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 82: A:9 B:41 C:42 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 83: A:9 B:42 C:10 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 84: A:10 B:42 C:43 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 85: A:10 B:43 C:11 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 86: A:11 B:43 C:44 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
|
||||
Page 4
|
||||
|
||||
|
||||
|
||||
Face 87: A:11 B:44 C:12 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 88: A:12 B:44 C:45 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 89: A:12 B:45 C:13 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 90: A:13 B:45 C:46 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 91: A:13 B:46 C:14 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 92: A:14 B:46 C:47 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 93: A:14 B:47 C:15 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 94: A:15 B:47 C:32 AB:0 BC:1 CA:0
|
||||
Smoothing: 1
|
||||
Face 95: A:15 B:32 C:0 AB:0 BC:0 CA:1
|
||||
Smoothing: 1
|
||||
Face 96: A:16 B:17 C:49 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 97: A:16 B:49 C:48 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 98: A:17 B:18 C:50 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 99: A:17 B:50 C:49 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 100: A:18 B:19 C:51 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 101: A:18 B:51 C:50 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 102: A:19 B:20 C:52 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 103: A:19 B:52 C:51 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 104: A:20 B:21 C:53 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 105: A:20 B:53 C:52 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 106: A:21 B:22 C:54 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 107: A:21 B:54 C:53 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 108: A:22 B:23 C:55 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 109: A:22 B:55 C:54 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 110: A:23 B:24 C:56 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 111: A:23 B:56 C:55 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 112: A:24 B:25 C:57 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 113: A:24 B:57 C:56 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 114: A:25 B:26 C:58 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 115: A:25 B:58 C:57 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 116: A:26 B:27 C:59 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 117: A:26 B:59 C:58 AB:0 BC:1 CA:0
|
||||
|
||||
Page 5
|
||||
|
||||
|
||||
|
||||
Smoothing: 2
|
||||
Face 118: A:27 B:28 C:60 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 119: A:27 B:60 C:59 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 120: A:28 B:29 C:61 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 121: A:28 B:61 C:60 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 122: A:29 B:30 C:62 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 123: A:29 B:62 C:61 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 124: A:30 B:31 C:63 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 125: A:30 B:63 C:62 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
Face 126: A:31 B:16 C:48 AB:1 BC:0 CA:0
|
||||
Smoothing: 2
|
||||
Face 127: A:31 B:48 C:63 AB:0 BC:1 CA:0
|
||||
Smoothing: 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Page 6
|
||||
|
||||
|
||||
|
||||
|
|
@ -69,6 +69,9 @@ $(PROG_OBJS): $(UTIL_HEADERS)
|
|||
|
||||
$(PROGS): $(UTIL_OBJS)
|
||||
|
||||
.o:
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
||||
|
||||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o *~
|
||||
|
|
|
|||
6
progs/miniglx/.gitignore
vendored
6
progs/miniglx/.gitignore
vendored
|
|
@ -1,6 +0,0 @@
|
|||
manytex
|
||||
miniglxsample
|
||||
miniglxtest
|
||||
sample_server
|
||||
sample_server2
|
||||
texline
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
# Makefile for miniglx demo programs
|
||||
|
||||
TOP = ../..
|
||||
|
||||
include $(TOP)/configs/current
|
||||
|
||||
|
||||
SOURCES = miniglxtest.c \
|
||||
miniglxsample.c \
|
||||
sample_server.c \
|
||||
sample_server2.c \
|
||||
manytex.c \
|
||||
texline.c
|
||||
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
PROGS = $(SOURCES:%.c=%)
|
||||
|
||||
INCLUDES = \
|
||||
-I. \
|
||||
-I$(TOP)/include
|
||||
|
||||
LIBS = -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LIB) -l$(GL_LIB) $(APP_LIB_DEPS)
|
||||
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c
|
||||
|
||||
.c:
|
||||
$(CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(INCLUDES) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default: depend $(PROGS)
|
||||
|
||||
clean:
|
||||
-rm -f $(PROGS)
|
||||
-rm -f *.o
|
||||
|
||||
|
||||
depend: $(SOURCES)
|
||||
rm -f depend
|
||||
touch depend
|
||||
$(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) > /dev/null
|
||||
|
||||
|
||||
# Emacs tags
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find ../include`
|
||||
|
||||
|
||||
include depend
|
||||
|
|
@ -1,477 +0,0 @@
|
|||
|
||||
/*
|
||||
* Test the GLFBDev interface. Only tested with radeonfb driver!!!!
|
||||
*/
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/types.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/kd.h>
|
||||
#include <linux/vt.h>
|
||||
#include <GL/glut.h>
|
||||
#include "GL/glfbdev.h"
|
||||
|
||||
#define DEFAULT_DEPTH 8
|
||||
|
||||
static struct fb_fix_screeninfo FixedInfo;
|
||||
static struct fb_var_screeninfo VarInfo, OrigVarInfo;
|
||||
static int DesiredDepth = 0;
|
||||
static int OriginalVT = -1;
|
||||
static int ConsoleFD = -1;
|
||||
static int FrameBufferFD = -1;
|
||||
static caddr_t FrameBuffer = (caddr_t) -1;
|
||||
static caddr_t MMIOAddress = (caddr_t) -1;
|
||||
|
||||
|
||||
static void
|
||||
print_fixed_info(const struct fb_fix_screeninfo *fixed, const char *s)
|
||||
{
|
||||
static const char *visuals[] = {
|
||||
"MONO01", "MONO10", "TRUECOLOR", "PSEUDOCOLOR",
|
||||
"DIRECTCOLOR", "STATIC_PSEUDOCOLOR"
|
||||
};
|
||||
|
||||
printf("%s info -----------------------\n", s);
|
||||
printf("id = %16s\n", fixed->id);
|
||||
printf("smem_start = 0x%x\n", fixed->smem_start);
|
||||
printf("smem_len = %d (0x%x)\n", fixed->smem_len, fixed->smem_len);
|
||||
printf("type = 0x%x\n", fixed->type);
|
||||
printf("type_aux = 0x%x\n", fixed->type_aux);
|
||||
printf("visual = 0x%x (%s)\n", fixed->visual, visuals[fixed->visual]);
|
||||
printf("xpanstep = %d\n", fixed->xpanstep);
|
||||
printf("ypanstep = %d\n", fixed->ypanstep);
|
||||
printf("ywrapstep = %d\n", fixed->ywrapstep);
|
||||
printf("line_length = %d\n", fixed->line_length);
|
||||
printf("mmio_start = 0x%x\n", fixed->mmio_start);
|
||||
printf("mmio_len = %d (0x%x)\n", fixed->mmio_len, fixed->mmio_len);
|
||||
printf("accel = 0x%x\n", fixed->accel);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
print_var_info(const struct fb_var_screeninfo *var, const char *s)
|
||||
{
|
||||
printf("%s info -----------------------\n", s);
|
||||
printf("xres = %d\n", var->xres);
|
||||
printf("yres = %d\n", var->yres);
|
||||
printf("xres_virtual = %d\n", var->xres_virtual);
|
||||
printf("yres_virtual = %d\n", var->yres_virtual);
|
||||
printf("xoffset = %d\n", var->xoffset);
|
||||
printf("yoffset = %d\n", var->yoffset);
|
||||
printf("bits_per_pixel = %d\n", var->bits_per_pixel);
|
||||
printf("grayscale = %d\n", var->grayscale);
|
||||
|
||||
printf("red.offset = %d length = %d msb_right = %d\n",
|
||||
var->red.offset, var->red.length, var->red.msb_right);
|
||||
printf("green.offset = %d length = %d msb_right = %d\n",
|
||||
var->green.offset, var->green.length, var->green.msb_right);
|
||||
printf("blue.offset = %d length = %d msb_right = %d\n",
|
||||
var->blue.offset, var->blue.length, var->blue.msb_right);
|
||||
printf("transp.offset = %d length = %d msb_right = %d\n",
|
||||
var->transp.offset, var->transp.length, var->transp.msb_right);
|
||||
|
||||
printf("nonstd = %d\n", var->nonstd);
|
||||
printf("activate = %d\n", var->activate);
|
||||
printf("height = %d mm\n", var->height);
|
||||
printf("width = %d mm\n", var->width);
|
||||
printf("accel_flags = 0x%x\n", var->accel_flags);
|
||||
printf("pixclock = %d\n", var->pixclock);
|
||||
printf("left_margin = %d\n", var->left_margin);
|
||||
printf("right_margin = %d\n", var->right_margin);
|
||||
printf("upper_margin = %d\n", var->upper_margin);
|
||||
printf("lower_margin = %d\n", var->lower_margin);
|
||||
printf("hsync_len = %d\n", var->hsync_len);
|
||||
printf("vsync_len = %d\n", var->vsync_len);
|
||||
printf("sync = %d\n", var->sync);
|
||||
printf("vmode = %d\n", var->vmode);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
signal_handler(int signumber)
|
||||
{
|
||||
signal(signumber, SIG_IGN); /* prevent recursion! */
|
||||
fprintf(stderr, "error: got signal %d (exiting)\n", signumber);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
initialize_fbdev( void )
|
||||
{
|
||||
char ttystr[1000];
|
||||
int fd, vtnumber, ttyfd;
|
||||
int sz;
|
||||
|
||||
if (geteuid()) {
|
||||
fprintf(stderr, "error: you need to be root\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#if 1
|
||||
/* open the framebuffer device */
|
||||
FrameBufferFD = open("/dev/fb0", O_RDWR);
|
||||
if (FrameBufferFD < 0) {
|
||||
fprintf(stderr, "Error opening /dev/fb0: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* open /dev/tty0 and get the vt number */
|
||||
if ((fd = open("/dev/tty0", O_WRONLY, 0)) < 0) {
|
||||
fprintf(stderr, "error opening /dev/tty0\n");
|
||||
exit(1);
|
||||
}
|
||||
if (ioctl(fd, VT_OPENQRY, &vtnumber) < 0 || vtnumber < 0) {
|
||||
fprintf(stderr, "error: couldn't get a free vt\n");
|
||||
exit(1);
|
||||
}
|
||||
close(fd);
|
||||
|
||||
/* open the console tty */
|
||||
sprintf(ttystr, "/dev/tty%d", vtnumber); /* /dev/tty1-64 */
|
||||
ConsoleFD = open(ttystr, O_RDWR | O_NDELAY, 0);
|
||||
if (ConsoleFD < 0) {
|
||||
fprintf(stderr, "error couldn't open console fd\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* save current vt number */
|
||||
{
|
||||
struct vt_stat vts;
|
||||
if (ioctl(ConsoleFD, VT_GETSTATE, &vts) == 0)
|
||||
OriginalVT = vts.v_active;
|
||||
}
|
||||
|
||||
/* disconnect from controlling tty */
|
||||
ttyfd = open("/dev/tty", O_RDWR);
|
||||
if (ttyfd >= 0) {
|
||||
ioctl(ttyfd, TIOCNOTTY, 0);
|
||||
close(ttyfd);
|
||||
}
|
||||
|
||||
/* some magic to restore the vt when we exit */
|
||||
{
|
||||
struct vt_mode vt;
|
||||
if (ioctl(ConsoleFD, VT_ACTIVATE, vtnumber) != 0)
|
||||
printf("ioctl VT_ACTIVATE: %s\n", strerror(errno));
|
||||
if (ioctl(ConsoleFD, VT_WAITACTIVE, vtnumber) != 0)
|
||||
printf("ioctl VT_WAITACTIVE: %s\n", strerror(errno));
|
||||
|
||||
if (ioctl(ConsoleFD, VT_GETMODE, &vt) < 0) {
|
||||
fprintf(stderr, "error: ioctl VT_GETMODE: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
vt.mode = VT_PROCESS;
|
||||
vt.relsig = SIGUSR1;
|
||||
vt.acqsig = SIGUSR1;
|
||||
if (ioctl(ConsoleFD, VT_SETMODE, &vt) < 0) {
|
||||
fprintf(stderr, "error: ioctl(VT_SETMODE) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* go into graphics mode */
|
||||
if (ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||
fprintf(stderr, "error: ioctl(KDSETMODE, KD_GRAPHICS) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/* open the framebuffer device */
|
||||
FrameBufferFD = open("/dev/fb0", O_RDWR);
|
||||
if (FrameBufferFD < 0) {
|
||||
fprintf(stderr, "Error opening /dev/fb0: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get the fixed screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
|
||||
fprintf(stderr, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print_fixed_info(&FixedInfo, "Fixed");
|
||||
|
||||
|
||||
/* get the variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) {
|
||||
fprintf(stderr, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print_var_info(&OrigVarInfo, "Orig Var");
|
||||
|
||||
/* operate on a copy */
|
||||
VarInfo = OrigVarInfo;
|
||||
|
||||
/* set the depth, resolution, etc */
|
||||
DesiredDepth = 32;
|
||||
if (DesiredDepth)
|
||||
VarInfo.bits_per_pixel = DesiredDepth;
|
||||
|
||||
if (VarInfo.bits_per_pixel == 16) {
|
||||
VarInfo.red.offset = 11;
|
||||
VarInfo.green.offset = 5;
|
||||
VarInfo.blue.offset = 0;
|
||||
VarInfo.red.length = 5;
|
||||
VarInfo.green.length = 6;
|
||||
VarInfo.blue.length = 5;
|
||||
VarInfo.transp.offset = 0;
|
||||
VarInfo.transp.length = 0;
|
||||
}
|
||||
else if (VarInfo.bits_per_pixel == 32) {
|
||||
VarInfo.red.offset = 16;
|
||||
VarInfo.green.offset = 8;
|
||||
VarInfo.blue.offset = 0;
|
||||
VarInfo.transp.offset = 24;
|
||||
VarInfo.red.length = 8;
|
||||
VarInfo.green.length = 8;
|
||||
VarInfo.blue.length = 8;
|
||||
VarInfo.transp.length = 8;
|
||||
}
|
||||
/* timing values taken from /etc/fb.modes (1280x1024 @ 75Hz) */
|
||||
VarInfo.xres_virtual = VarInfo.xres = 1280;
|
||||
VarInfo.yres_virtual = VarInfo.yres = 1024;
|
||||
VarInfo.pixclock = 7408;
|
||||
VarInfo.left_margin = 248;
|
||||
VarInfo.right_margin = 16;
|
||||
VarInfo.upper_margin = 38;
|
||||
VarInfo.lower_margin = 1;
|
||||
VarInfo.hsync_len = 144;
|
||||
VarInfo.vsync_len = 3;
|
||||
|
||||
VarInfo.xoffset = 0;
|
||||
VarInfo.yoffset = 0;
|
||||
VarInfo.nonstd = 0;
|
||||
VarInfo.vmode &= ~FB_VMODE_YWRAP; /* turn off scrolling */
|
||||
|
||||
/* set new variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
|
||||
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
print_var_info(&VarInfo, "New Var");
|
||||
|
||||
if (FixedInfo.visual != FB_VISUAL_TRUECOLOR &&
|
||||
FixedInfo.visual != FB_VISUAL_DIRECTCOLOR) {
|
||||
fprintf(stderr, "non-TRUE/DIRECT-COLOR visuals (0x%x) not supported by this demo.\n", FixedInfo.visual);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* initialize colormap */
|
||||
if (FixedInfo.visual == FB_VISUAL_DIRECTCOLOR) {
|
||||
struct fb_cmap cmap;
|
||||
unsigned short red[256], green[256], blue[256];
|
||||
int i;
|
||||
|
||||
/* we're assuming 256 entries here */
|
||||
printf("initializing directcolor colormap\n");
|
||||
cmap.start = 0;
|
||||
cmap.len = 256;
|
||||
cmap.red = red;
|
||||
cmap.green = green;
|
||||
cmap.blue = blue;
|
||||
cmap.transp = NULL;
|
||||
for (i = 0; i < cmap.len; i++) {
|
||||
red[i] = green[i] = blue[i] = (i << 8) | i;
|
||||
}
|
||||
if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &cmap) < 0) {
|
||||
fprintf(stderr, "ioctl(FBIOPUTCMAP) failed [%d]\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* fbdev says the frame buffer is at offset zero, and the mmio region
|
||||
* is immediately after.
|
||||
*/
|
||||
|
||||
/* mmap the framebuffer into our address space */
|
||||
FrameBuffer = (caddr_t) mmap(0, /* start */
|
||||
FixedInfo.smem_len, /* bytes */
|
||||
PROT_READ | PROT_WRITE, /* prot */
|
||||
MAP_SHARED, /* flags */
|
||||
FrameBufferFD, /* fd */
|
||||
0 /* offset */);
|
||||
if (FrameBuffer == (caddr_t) - 1) {
|
||||
fprintf(stderr, "error: unable to mmap framebuffer: %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
printf("FrameBuffer = %p\n", FrameBuffer);
|
||||
|
||||
#if 1
|
||||
/* mmap the MMIO region into our address space */
|
||||
MMIOAddress = (caddr_t) mmap(0, /* start */
|
||||
FixedInfo.mmio_len, /* bytes */
|
||||
PROT_READ | PROT_WRITE, /* prot */
|
||||
MAP_SHARED, /* flags */
|
||||
FrameBufferFD, /* fd */
|
||||
FixedInfo.smem_len /* offset */);
|
||||
if (MMIOAddress == (caddr_t) - 1) {
|
||||
fprintf(stderr, "error: unable to mmap mmio region: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
printf("MMIOAddress = %p\n", MMIOAddress);
|
||||
|
||||
/* try out some simple MMIO register reads */
|
||||
if (1)
|
||||
{
|
||||
typedef unsigned int CARD32;
|
||||
typedef unsigned char CARD8;
|
||||
#define RADEON_CONFIG_MEMSIZE 0x00f8
|
||||
#define RADEON_MEM_SDRAM_MODE_REG 0x0158
|
||||
#define MMIO_IN32(base, offset) \
|
||||
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset))
|
||||
#define INREG(addr) MMIO_IN32(MMIOAddress, addr)
|
||||
int sz, type;
|
||||
const char *typeStr[] = {"SDR", "DDR", "64-bit SDR"};
|
||||
sz = INREG(RADEON_CONFIG_MEMSIZE);
|
||||
type = INREG(RADEON_MEM_SDRAM_MODE_REG);
|
||||
printf("RADEON_CONFIG_MEMSIZE = %d (%d MB)\n", sz, sz / 1024 / 1024);
|
||||
printf("RADEON_MEM_SDRAM_MODE_REG >> 30 = %d (%s)\n",
|
||||
type >> 30, typeStr[type>>30]);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
shutdown_fbdev( void )
|
||||
{
|
||||
struct vt_mode VT;
|
||||
|
||||
printf("cleaning up...\n");
|
||||
/* restore original variable screen info */
|
||||
if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo)) {
|
||||
fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
munmap(MMIOAddress, FixedInfo.mmio_len);
|
||||
munmap(FrameBuffer, FixedInfo.smem_len);
|
||||
close(FrameBufferFD);
|
||||
|
||||
/* restore text mode */
|
||||
ioctl(ConsoleFD, KDSETMODE, KD_TEXT);
|
||||
|
||||
/* set vt */
|
||||
if (ioctl(ConsoleFD, VT_GETMODE, &VT) != -1) {
|
||||
VT.mode = VT_AUTO;
|
||||
ioctl(ConsoleFD, VT_SETMODE, &VT);
|
||||
}
|
||||
|
||||
/* restore original vt */
|
||||
if (OriginalVT >= 0) {
|
||||
ioctl(ConsoleFD, VT_ACTIVATE, OriginalVT);
|
||||
OriginalVT = -1;
|
||||
}
|
||||
|
||||
close(ConsoleFD);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gltest( void )
|
||||
{
|
||||
static const int attribs[] = {
|
||||
GLFBDEV_DOUBLE_BUFFER,
|
||||
GLFBDEV_DEPTH_SIZE, 16,
|
||||
GLFBDEV_NONE
|
||||
};
|
||||
GLFBDevContextPtr ctx;
|
||||
GLFBDevBufferPtr buf;
|
||||
GLFBDevVisualPtr vis;
|
||||
int bytes, r, g, b, a;
|
||||
float ang;
|
||||
|
||||
printf("GLFBDEV_VENDOR = %s\n", glFBDevGetString(GLFBDEV_VENDOR));
|
||||
printf("GLFBDEV_VERSION = %s\n", glFBDevGetString(GLFBDEV_VERSION));
|
||||
|
||||
/* framebuffer size */
|
||||
bytes = VarInfo.xres_virtual * VarInfo.yres_virtual * VarInfo.bits_per_pixel / 8;
|
||||
|
||||
vis = glFBDevCreateVisual( &FixedInfo, &VarInfo, attribs );
|
||||
assert(vis);
|
||||
|
||||
buf = glFBDevCreateBuffer( &FixedInfo, &VarInfo, vis, FrameBuffer, NULL, bytes );
|
||||
assert(buf);
|
||||
|
||||
ctx = glFBDevCreateContext( vis, NULL );
|
||||
assert(buf);
|
||||
|
||||
b = glFBDevMakeCurrent( ctx, buf, buf );
|
||||
assert(b);
|
||||
|
||||
/*printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));*/
|
||||
glGetIntegerv(GL_RED_BITS, &r);
|
||||
glGetIntegerv(GL_GREEN_BITS, &g);
|
||||
glGetIntegerv(GL_BLUE_BITS, &b);
|
||||
glGetIntegerv(GL_ALPHA_BITS, &a);
|
||||
printf("RED_BITS=%d GREEN_BITS=%d BLUE_BITS=%d ALPHA_BITS=%d\n",
|
||||
r, g, b, a);
|
||||
|
||||
glClearColor(0.5, 0.5, 1.0, 0);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-1, 1, -1, 1, 2, 30);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glTranslatef(0, 0, -15);
|
||||
glViewport(0, 0, VarInfo.xres_virtual, VarInfo.yres_virtual);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
for (ang = 0; ang <= 180; ang += 15) {
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glPushMatrix();
|
||||
glRotatef(ang, 1, 0, 0);
|
||||
glutSolidTorus(1, 3, 40, 20);
|
||||
glPopMatrix();
|
||||
glFBDevSwapBuffers(buf);
|
||||
}
|
||||
|
||||
/* clean up */
|
||||
b = glFBDevMakeCurrent( NULL, NULL, NULL);
|
||||
assert(b);
|
||||
|
||||
glFBDevDestroyContext(ctx);
|
||||
glFBDevDestroyBuffer(buf);
|
||||
glFBDevDestroyVisual(vis);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main( int argc, char *argv[] )
|
||||
{
|
||||
signal(SIGUSR1, signal_handler); /* exit if someone tries a vt switch */
|
||||
signal(SIGSEGV, signal_handler); /* catch segfaults */
|
||||
|
||||
initialize_fbdev();
|
||||
gltest();
|
||||
shutdown_fbdev();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,381 +0,0 @@
|
|||
|
||||
/*
|
||||
* test handling of many texture maps
|
||||
* Also tests texture priority and residency.
|
||||
*
|
||||
* Brian Paul
|
||||
* August 2, 2000
|
||||
*/
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
|
||||
static GLint NumTextures = 20;
|
||||
static GLuint *TextureID = NULL;
|
||||
static GLint *TextureWidth = NULL, *TextureHeight = NULL;
|
||||
static GLboolean *TextureResidency = NULL;
|
||||
static GLint TexWidth = 128, TexHeight = 128;
|
||||
static GLfloat Zrot = 0;
|
||||
static GLboolean Anim = GL_TRUE;
|
||||
static GLint WinWidth = 500, WinHeight = 400;
|
||||
static GLboolean MipMap = GL_FALSE;
|
||||
static GLboolean LinearFilter = GL_FALSE;
|
||||
static GLboolean RandomSize = GL_FALSE;
|
||||
static GLint Rows, Columns;
|
||||
static GLint LowPriorityCount = 0;
|
||||
|
||||
|
||||
static void Idle( void )
|
||||
{
|
||||
Zrot += 1.0;
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
GLfloat spacing = WinWidth / Columns;
|
||||
GLfloat size = spacing * 0.4;
|
||||
GLint i;
|
||||
|
||||
/* test residency */
|
||||
if (0)
|
||||
{
|
||||
GLboolean b;
|
||||
GLint i, resident;
|
||||
b = glAreTexturesResident(NumTextures, TextureID, TextureResidency);
|
||||
if (b) {
|
||||
printf("all resident\n");
|
||||
}
|
||||
else {
|
||||
resident = 0;
|
||||
for (i = 0; i < NumTextures; i++) {
|
||||
if (TextureResidency[i]) {
|
||||
resident++;
|
||||
}
|
||||
}
|
||||
printf("%d of %d texture resident\n", resident, NumTextures);
|
||||
}
|
||||
}
|
||||
|
||||
/* render the textured quads */
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
for (i = 0; i < NumTextures; i++) {
|
||||
GLint row = i / Columns;
|
||||
GLint col = i % Columns;
|
||||
GLfloat x = col * spacing + spacing * 0.5;
|
||||
GLfloat y = row * spacing + spacing * 0.5;
|
||||
|
||||
GLfloat maxDim = (TextureWidth[i] > TextureHeight[i])
|
||||
? TextureWidth[i] : TextureHeight[i];
|
||||
GLfloat w = TextureWidth[i] / maxDim;
|
||||
GLfloat h = TextureHeight[i] / maxDim;
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(x, y, 0.0);
|
||||
glRotatef(Zrot, 0, 0, 1);
|
||||
glScalef(size, size, 1);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, TextureID[i]);
|
||||
glBegin(GL_POLYGON);
|
||||
#if 0
|
||||
glTexCoord2f(0, 0); glVertex2f(-1, -1);
|
||||
glTexCoord2f(1, 0); glVertex2f( 1, -1);
|
||||
glTexCoord2f(1, 1); glVertex2f( 1, 1);
|
||||
glTexCoord2f(0, 1); glVertex2f(-1, 1);
|
||||
#else
|
||||
glTexCoord2f(0, 0); glVertex2f(-w, -h);
|
||||
glTexCoord2f(1, 0); glVertex2f( w, -h);
|
||||
glTexCoord2f(1, 1); glVertex2f( w, h);
|
||||
glTexCoord2f(0, 1); glVertex2f(-w, h);
|
||||
#endif
|
||||
glEnd();
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
WinWidth = width;
|
||||
WinHeight = height;
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glOrtho(0, width, 0, height, -1, 1);
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a random int in [min, max].
|
||||
*/
|
||||
static int RandomInt(int min, int max)
|
||||
{
|
||||
int i = rand();
|
||||
int j = i % (max - min + 1);
|
||||
return min + j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void Init( void )
|
||||
{
|
||||
GLint i;
|
||||
|
||||
if (RandomSize) {
|
||||
printf("Creating %d %s random-size textures, ", NumTextures,
|
||||
MipMap ? "Mipmapped" : "non-Mipmapped");
|
||||
}
|
||||
else {
|
||||
printf("Creating %d %s %d x %d textures, ", NumTextures,
|
||||
MipMap ? "Mipmapped" : "non-Mipmapped",
|
||||
TexWidth, TexHeight);
|
||||
}
|
||||
|
||||
if (LinearFilter) {
|
||||
printf("bilinear filtering\n");
|
||||
}
|
||||
else {
|
||||
printf("nearest filtering\n");
|
||||
}
|
||||
|
||||
|
||||
/* compute number of rows and columns of rects */
|
||||
{
|
||||
GLfloat area = (GLfloat) (WinWidth * WinHeight) / (GLfloat) NumTextures;
|
||||
GLfloat edgeLen = sqrt(area);
|
||||
|
||||
Columns = WinWidth / edgeLen;
|
||||
Rows = (NumTextures + Columns - 1) / Columns;
|
||||
printf("Rows: %d Cols: %d\n", Rows, Columns);
|
||||
}
|
||||
|
||||
|
||||
if (!TextureID) {
|
||||
TextureID = (GLuint *) malloc(sizeof(GLuint) * NumTextures);
|
||||
assert(TextureID);
|
||||
glGenTextures(NumTextures, TextureID);
|
||||
}
|
||||
|
||||
if (!TextureResidency) {
|
||||
TextureResidency = (GLboolean *) malloc(sizeof(GLboolean) * NumTextures);
|
||||
assert(TextureResidency);
|
||||
}
|
||||
|
||||
if (!TextureWidth) {
|
||||
TextureWidth = (GLint *) malloc(sizeof(GLint) * NumTextures);
|
||||
assert(TextureWidth);
|
||||
}
|
||||
if (!TextureHeight) {
|
||||
TextureHeight = (GLint *) malloc(sizeof(GLint) * NumTextures);
|
||||
assert(TextureHeight);
|
||||
}
|
||||
|
||||
for (i = 0; i < NumTextures; i++) {
|
||||
GLubyte color[4];
|
||||
GLubyte *texImage;
|
||||
GLint j, row, col;
|
||||
|
||||
row = i / Columns;
|
||||
col = i % Columns;
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, TextureID[i]);
|
||||
|
||||
if (i < LowPriorityCount)
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5F);
|
||||
|
||||
if (RandomSize) {
|
||||
#if 0
|
||||
int k = (glutGet(GLUT_ELAPSED_TIME) % 7) + 2;
|
||||
TexWidth = 1 << k;
|
||||
TexHeight = 1 << k;
|
||||
#else
|
||||
TexWidth = 1 << RandomInt(2, 7);
|
||||
TexHeight = 1 << RandomInt(2, 7);
|
||||
printf("Random size of %3d: %d x %d\n", i, TexWidth, TexHeight);
|
||||
#endif
|
||||
}
|
||||
|
||||
TextureWidth[i] = TexWidth;
|
||||
TextureHeight[i] = TexHeight;
|
||||
|
||||
texImage = (GLubyte*) malloc(4 * TexWidth * TexHeight * sizeof(GLubyte));
|
||||
assert(texImage);
|
||||
|
||||
/* determine texture color */
|
||||
color[0] = (GLint) (255.0 * ((float) col / (Columns - 1)));
|
||||
color[1] = 127;
|
||||
color[2] = (GLint) (255.0 * ((float) row / (Rows - 1)));
|
||||
color[3] = 255;
|
||||
|
||||
/* fill in solid-colored teximage */
|
||||
for (j = 0; j < TexWidth * TexHeight; j++) {
|
||||
texImage[j*4+0] = color[0];
|
||||
texImage[j*4+1] = color[1];
|
||||
texImage[j*4+2] = color[2];
|
||||
texImage[j*4+3] = color[3];
|
||||
}
|
||||
|
||||
if (MipMap) {
|
||||
GLint level = 0;
|
||||
GLint w = TexWidth, h = TexHeight;
|
||||
while (1) {
|
||||
glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w, h, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, texImage);
|
||||
if (w == 1 && h == 1)
|
||||
break;
|
||||
if (w > 1)
|
||||
w /= 2;
|
||||
if (h > 1)
|
||||
h /= 2;
|
||||
level++;
|
||||
/*printf("%d: %d x %d\n", level, w, h);*/
|
||||
}
|
||||
if (LinearFilter) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
GL_LINEAR_MIPMAP_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
}
|
||||
else {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
GL_NEAREST_MIPMAP_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Set corners to white */
|
||||
int k = 0;
|
||||
texImage[k+0] = texImage[k+1] = texImage[k+2] = texImage[k+3] = 255;
|
||||
k = (TexWidth - 1) * 4;
|
||||
texImage[k+0] = texImage[k+1] = texImage[k+2] = texImage[k+3] = 255;
|
||||
k = (TexWidth * TexHeight - TexWidth) * 4;
|
||||
texImage[k+0] = texImage[k+1] = texImage[k+2] = texImage[k+3] = 255;
|
||||
k = (TexWidth * TexHeight - 1) * 4;
|
||||
texImage[k+0] = texImage[k+1] = texImage[k+2] = texImage[k+3] = 255;
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexWidth, TexHeight, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, texImage);
|
||||
if (LinearFilter) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
}
|
||||
else {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
}
|
||||
}
|
||||
|
||||
free(texImage);
|
||||
}
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
const GLfloat step = 3.0;
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 'a':
|
||||
Anim = !Anim;
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
break;
|
||||
case 's':
|
||||
Idle();
|
||||
break;
|
||||
case 'z':
|
||||
Zrot -= step;
|
||||
break;
|
||||
case 'Z':
|
||||
Zrot += step;
|
||||
break;
|
||||
case ' ':
|
||||
Init();
|
||||
break;
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
GLint i;
|
||||
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( WinWidth, WinHeight );
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
glutCreateWindow(argv[0]);
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Display );
|
||||
if (Anim)
|
||||
glutIdleFunc(Idle);
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "-n") == 0) {
|
||||
NumTextures = atoi(argv[i+1]);
|
||||
if (NumTextures <= 0) {
|
||||
printf("Error, bad number of textures\n");
|
||||
return 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(argv[i], "-mipmap") == 0) {
|
||||
MipMap = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-linear") == 0) {
|
||||
LinearFilter = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-size") == 0) {
|
||||
TexWidth = atoi(argv[i+1]);
|
||||
TexHeight = atoi(argv[i+2]);
|
||||
assert(TexWidth >= 1);
|
||||
assert(TexHeight >= 1);
|
||||
i += 2;
|
||||
}
|
||||
else if (strcmp(argv[i], "-randomsize") == 0) {
|
||||
RandomSize = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-lowpri") == 0) {
|
||||
LowPriorityCount = atoi(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
else {
|
||||
printf("Usage:\n");
|
||||
printf(" manytex [options]\n");
|
||||
printf("Options:\n");
|
||||
printf(" -n <number of texture objects>\n");
|
||||
printf(" -size <width> <height> - specify texture size\n");
|
||||
printf(" -randomsize - use random size textures\n");
|
||||
printf(" -mipmap - generate mipmaps\n");
|
||||
printf(" -linear - use linear filtering instead of nearest\n");
|
||||
printf(" -lowpri <n> - Set lower priority on <n> textures\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Init();
|
||||
|
||||
glutMainLoop();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,128 +0,0 @@
|
|||
|
||||
#define USE_MINIGLX 1 /* 1 = use Mini GLX, 0 = use Xlib/GLX */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <GL/gl.h>
|
||||
|
||||
#if USE_MINIGLX
|
||||
#include <GL/miniglx.h>
|
||||
#else
|
||||
#include <GL/glx.h>
|
||||
#include <X11/Xlib.h>
|
||||
#endif
|
||||
|
||||
static void _subset_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
|
||||
{
|
||||
glBegin( GL_QUADS );
|
||||
glVertex2f( x1, y1 );
|
||||
glVertex2f( x2, y1 );
|
||||
glVertex2f( x2, y2 );
|
||||
glVertex2f( x1, y2 );
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Create a simple double-buffered RGBA window.
|
||||
*/
|
||||
static Window
|
||||
MakeWindow(Display * dpy, unsigned int width, unsigned int height)
|
||||
{
|
||||
int visAttributes[] = {
|
||||
GLX_RGBA,
|
||||
GLX_RED_SIZE, 1,
|
||||
GLX_GREEN_SIZE, 1,
|
||||
GLX_BLUE_SIZE, 1,
|
||||
GLX_DOUBLEBUFFER,
|
||||
None
|
||||
};
|
||||
XSetWindowAttributes attr;
|
||||
unsigned long attrMask;
|
||||
Window root;
|
||||
Window win;
|
||||
GLXContext ctx;
|
||||
XVisualInfo *visinfo;
|
||||
|
||||
root = RootWindow(dpy, 0);
|
||||
|
||||
/* Choose GLX visual / pixel format */
|
||||
visinfo = glXChooseVisual(dpy, 0, visAttributes);
|
||||
if (!visinfo) {
|
||||
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Create the window */
|
||||
attr.background_pixel = 0;
|
||||
attr.border_pixel = 0;
|
||||
attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
|
||||
attrMask = CWBackPixel | CWBorderPixel | CWColormap;
|
||||
win = XCreateWindow(dpy, root, 0, 0, width, height,
|
||||
0, visinfo->depth, InputOutput,
|
||||
visinfo->visual, attrMask, &attr);
|
||||
if (!win) {
|
||||
printf("Error: XCreateWindow failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Display the window */
|
||||
XMapWindow(dpy, win);
|
||||
|
||||
/* Create GLX rendering context */
|
||||
ctx = glXCreateContext(dpy, visinfo, NULL, True);
|
||||
if (!ctx) {
|
||||
printf("Error: glXCreateContext failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Bind the rendering context and window */
|
||||
glXMakeCurrent(dpy, win, ctx);
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
|
||||
return win;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Draw a few frames of a rotating square.
|
||||
*/
|
||||
static void
|
||||
DrawFrames(Display * dpy, Window win)
|
||||
{
|
||||
int angle;
|
||||
glShadeModel(GL_FLAT);
|
||||
glClearColor(0.5, 0.5, 0.5, 1.0);
|
||||
for (angle = 0; angle < 360; angle += 10) {
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glColor3f(1.0, 1.0, 0.0);
|
||||
glPushMatrix();
|
||||
glRotatef(angle, 0, 0, 1);
|
||||
_subset_Rectf(-0.8, -0.8, 0.8, 0.8);
|
||||
glPopMatrix();
|
||||
glXSwapBuffers(dpy, win);
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
Display *dpy;
|
||||
Window win;
|
||||
|
||||
dpy = XOpenDisplay(NULL);
|
||||
if (!dpy) {
|
||||
printf("Error: XOpenDisplay failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
win = MakeWindow(dpy, 300, 300);
|
||||
|
||||
DrawFrames(dpy, win);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
/*
|
||||
* Test the mini GLX interface.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <GL/gl.h>
|
||||
#define USE_MINI_GLX 1
|
||||
#if USE_MINI_GLX
|
||||
#include <GL/miniglx.h>
|
||||
#else
|
||||
#include <GL/glx.h>
|
||||
#endif
|
||||
|
||||
static GLXContext ctx;
|
||||
|
||||
static GLuint NumFrames = 100;
|
||||
static GLuint NumDisplays = 1;
|
||||
static GLboolean Texture = GL_FALSE;
|
||||
static GLboolean SingleBuffer = GL_FALSE;
|
||||
static GLboolean Sleeps = GL_TRUE;
|
||||
|
||||
|
||||
static void
|
||||
rect(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
|
||||
{
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0); glColor3f(0, 0, 1); glVertex2f(x1, y1);
|
||||
glTexCoord2f(1, 0); glColor3f(1, 0, 0); glVertex2f(x2, y1);
|
||||
glTexCoord2f(1, 1); glColor3f(0, 1, 0); glVertex2f(x2, y2);
|
||||
glTexCoord2f(0, 1); glColor3f(0, 0, 0); glVertex2f(x1, y2);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
redraw(Display *dpy, Window w, int rot)
|
||||
{
|
||||
GLfloat a;
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(rot, 0, 0, 1);
|
||||
glScalef(.5, .5, .5);
|
||||
for (a = 0.0; a < 360.0; a += 30.0) {
|
||||
glPushMatrix();
|
||||
glRotatef(a, 0, 0, 1);
|
||||
glRotatef(40, 1, 0, 0);
|
||||
glColor3f(a / 360.0, 1-a/360.0, 0);
|
||||
rect(0.3, -0.25, 1.5, 0.25);
|
||||
glPopMatrix();
|
||||
}
|
||||
glPopMatrix();
|
||||
|
||||
if (SingleBuffer)
|
||||
glFlush();
|
||||
else
|
||||
glXSwapBuffers(dpy, w);
|
||||
}
|
||||
|
||||
|
||||
static Window
|
||||
make_window(Display *dpy, unsigned int width, unsigned int height)
|
||||
{
|
||||
int attrib_single[] = { GLX_RGBA,
|
||||
GLX_RED_SIZE, 1,
|
||||
GLX_GREEN_SIZE, 1,
|
||||
GLX_BLUE_SIZE, 1,
|
||||
GLX_DEPTH_SIZE, 1,
|
||||
None };
|
||||
int attrib_double[] = { GLX_RGBA,
|
||||
GLX_RED_SIZE, 1,
|
||||
GLX_GREEN_SIZE, 1,
|
||||
GLX_BLUE_SIZE, 1,
|
||||
GLX_DEPTH_SIZE, 1,
|
||||
GLX_DOUBLEBUFFER,
|
||||
None };
|
||||
int *attrib = SingleBuffer ? attrib_single : attrib_double;
|
||||
int scrnum = 0;
|
||||
XSetWindowAttributes attr;
|
||||
unsigned long mask;
|
||||
Window root;
|
||||
Window win;
|
||||
XVisualInfo *visinfo;
|
||||
|
||||
root = RootWindow(dpy, scrnum);
|
||||
|
||||
if (!(visinfo = glXChooseVisual(dpy, scrnum, attrib))) {
|
||||
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!(ctx = glXCreateContext(dpy, visinfo, NULL, True))) {
|
||||
printf("Error: glXCreateContext failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* window attributes */
|
||||
attr.background_pixel = 0;
|
||||
attr.border_pixel = 0;
|
||||
attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
|
||||
attr.event_mask = StructureNotifyMask | ExposureMask;
|
||||
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
|
||||
|
||||
win = XCreateWindow(dpy, root, 0, 0, width, height,
|
||||
0, visinfo->depth, InputOutput,
|
||||
visinfo->visual, mask, &attr);
|
||||
if (!win) {
|
||||
printf("Error: XCreateWindow failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
glXMakeCurrent(dpy, win, ctx);
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
|
||||
return win;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
event_loop(Display *dpy, Window win)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("Drawing %d frames\n", NumFrames);
|
||||
|
||||
for (i = 0; i < NumFrames; i++) {
|
||||
redraw(dpy, win, -i*2);
|
||||
if (Sleeps) {
|
||||
usleep(20000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
runtest(void)
|
||||
{
|
||||
Display *dpy;
|
||||
Window win;
|
||||
|
||||
dpy = XOpenDisplay(NULL);
|
||||
if (!dpy) {
|
||||
printf("Error: XOpenDisplay failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
win = make_window(dpy, 800, 600);
|
||||
|
||||
srand(getpid());
|
||||
|
||||
/* init GL state */
|
||||
glClearColor(0.5, 0.5, 0.5, 1.0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
if (Texture) {
|
||||
GLubyte image[16][16][4];
|
||||
GLint i, j;
|
||||
for (i = 0; i < 16; i++) {
|
||||
for (j = 0; j < 16; j++) {
|
||||
if (((i / 2) ^ (j / 2)) & 1) {
|
||||
image[i][j][0] = 255;
|
||||
image[i][j][1] = 255;
|
||||
image[i][j][2] = 255;
|
||||
image[i][j][3] = 255;
|
||||
}
|
||||
else {
|
||||
image[i][j][0] = 128;
|
||||
image[i][j][1] = 128;
|
||||
image[i][j][2] = 128;
|
||||
image[i][j][3] = 128;
|
||||
}
|
||||
}
|
||||
}
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, image);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
}
|
||||
if (SingleBuffer) {
|
||||
glDrawBuffer(GL_FRONT);
|
||||
glReadBuffer(GL_FRONT);
|
||||
}
|
||||
else {
|
||||
glDrawBuffer(GL_BACK);
|
||||
}
|
||||
|
||||
XMapWindow(dpy, win);
|
||||
|
||||
/* wait for window to get mapped */
|
||||
{
|
||||
XEvent e;
|
||||
while (1) {
|
||||
XNextEvent(dpy, &e);
|
||||
if (e.type == MapNotify && e.xmap.window == win) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event_loop(dpy, win);
|
||||
|
||||
glXDestroyContext(dpy, ctx);
|
||||
XDestroyWindow(dpy, win);
|
||||
|
||||
XCloseDisplay(dpy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage:\n");
|
||||
printf(" -f N render N frames (default %d)\n", NumFrames);
|
||||
printf(" -d N do N display cycles\n");
|
||||
printf(" -t texturing\n");
|
||||
printf(" -s single buffering\n");
|
||||
printf(" -n no usleep() delay\n");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
parse_args(int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "-f") == 0) {
|
||||
NumFrames = atoi(argv[i + 1]);
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(argv[i], "-d") == 0) {
|
||||
NumDisplays = atoi(argv[i + 1]);
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(argv[i], "-n") == 0) {
|
||||
Sleeps = GL_FALSE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-s") == 0) {
|
||||
SingleBuffer = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-t") == 0) {
|
||||
Texture = GL_TRUE;
|
||||
}
|
||||
else {
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
for (i = 0; i < NumDisplays; i++) {
|
||||
if (runtest() != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
|
||||
/*
|
||||
* Sample server that just keeps first available window mapped.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/miniglx.h>
|
||||
|
||||
struct client {
|
||||
struct client *next;
|
||||
Window windowid;
|
||||
int mappable;
|
||||
};
|
||||
|
||||
struct client *clients = 0, *mapped_client = 0;
|
||||
|
||||
|
||||
static struct client *find_client( Window id )
|
||||
{
|
||||
struct client *c;
|
||||
|
||||
for (c = clients ; c ; c = c->next)
|
||||
if (c->windowid == id)
|
||||
return c;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
Display *dpy;
|
||||
XEvent ev;
|
||||
|
||||
dpy = __miniglx_StartServer(NULL);
|
||||
if (!dpy) {
|
||||
fprintf(stderr, "Error: __miniglx_StartServer failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (XNextEvent( dpy, &ev )) {
|
||||
struct client *c;
|
||||
|
||||
switch (ev.type) {
|
||||
case MapRequest:
|
||||
fprintf(stderr, "MapRequest\n");
|
||||
c = find_client(ev.xmaprequest.window);
|
||||
if (!c) break;
|
||||
c->mappable = True;
|
||||
break;
|
||||
|
||||
case UnmapNotify:
|
||||
fprintf(stderr, "UnmapNotify\n");
|
||||
c = find_client(ev.xunmap.window);
|
||||
if (!c) break;
|
||||
c->mappable = False;
|
||||
if (c == mapped_client)
|
||||
mapped_client = 0;
|
||||
break;
|
||||
|
||||
case CreateNotify:
|
||||
fprintf(stderr, "CreateNotify\n");
|
||||
c = malloc(sizeof(*c));
|
||||
c->next = clients;
|
||||
c->windowid = ev.xcreatewindow.window;
|
||||
c->mappable = False;
|
||||
clients = c;
|
||||
break;
|
||||
|
||||
case DestroyNotify:
|
||||
fprintf(stderr, "DestroyNotify\n");
|
||||
c = find_client(ev.xdestroywindow.window);
|
||||
if (!c) break;
|
||||
if (c == clients)
|
||||
clients = c->next;
|
||||
else {
|
||||
struct client *t;
|
||||
for (t = clients ; t->next != c ; t = t->next)
|
||||
;
|
||||
t->next = c->next;
|
||||
}
|
||||
|
||||
if (c == mapped_client)
|
||||
mapped_client = 0;
|
||||
|
||||
free(c);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Search for first mappable client if none already mapped.
|
||||
*/
|
||||
if (!mapped_client) {
|
||||
for (c = clients ; c ; c = c->next) {
|
||||
if (c->mappable) {
|
||||
XMapWindow( dpy, c->windowid );
|
||||
mapped_client = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
XCloseDisplay( dpy );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,228 +0,0 @@
|
|||
|
||||
/*
|
||||
* Sample server that just keeps first available window mapped.
|
||||
*
|
||||
* It also reads and echos anything that happens on stdin as an
|
||||
* example of tracking events from sources other than miniglx clients.
|
||||
*
|
||||
* It reads & writes without blocking, so that eg. piping a lot of
|
||||
* text to stdin and then hitting 'ctrl-S' on the output stream won't
|
||||
* cause it to stop handling miniglx events.
|
||||
*
|
||||
* See select_tut in the linux manual pages for a good overview of the
|
||||
* select(2) system call.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/miniglx.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
struct client {
|
||||
struct client *next;
|
||||
Window windowid;
|
||||
int mappable;
|
||||
};
|
||||
|
||||
struct client *clients = 0, *mapped_client = 0;
|
||||
|
||||
#define BUFSZ 4096
|
||||
char rbuf[BUFSZ];
|
||||
int rbuf_count;
|
||||
|
||||
|
||||
static struct client *find_client( Window id )
|
||||
{
|
||||
struct client *c;
|
||||
|
||||
for (c = clients ; c ; c = c->next)
|
||||
if (c->windowid == id)
|
||||
return c;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
Display *dpy;
|
||||
XEvent ev;
|
||||
int autostart = 0;
|
||||
|
||||
if (argc == 2 && strcmp(argv[1], "-autostart") == 0)
|
||||
autostart = 1;
|
||||
|
||||
dpy = __miniglx_StartServer(NULL);
|
||||
if (!dpy) {
|
||||
fprintf(stderr, "Error: __miniglx_StartServer failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* How is vt switching communicated through the XNextEvent interface?
|
||||
*/
|
||||
while (1) {
|
||||
int r, n;
|
||||
struct timeval tv;
|
||||
fd_set rfds, wfds;
|
||||
int bored = 0;
|
||||
|
||||
FD_ZERO(&rfds);
|
||||
FD_ZERO(&wfds);
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
if (rbuf_count) {
|
||||
FD_SET( 1, &wfds ); /* notify when we can write out buffer */
|
||||
n = 1;
|
||||
}
|
||||
else {
|
||||
FD_SET( 0, &rfds ); /* else notify when new data to read */
|
||||
n = 0;
|
||||
}
|
||||
|
||||
/* __miniglx_Select waits until any of these file groups becomes
|
||||
* readable/writable/etc (like regular select), until timeout
|
||||
* expires (like regular select), until a signal is received
|
||||
* (like regular select) or until an event is available for
|
||||
* XCheckMaskEvent().
|
||||
*/
|
||||
r = __miniglx_Select( dpy, n+1, &rfds, &wfds, 0, &tv );
|
||||
|
||||
/* This can happen if select() is interrupted by a signal:
|
||||
*/
|
||||
if (r < 0 && errno != EINTR && errno != EAGAIN) {
|
||||
perror ("select()");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (tv.tv_sec == 0 && tv.tv_usec == 0)
|
||||
bored = 1;
|
||||
|
||||
/* Check and handle events on our local file descriptors
|
||||
*/
|
||||
if (FD_ISSET( 0, &rfds )) {
|
||||
/* Something on stdin */
|
||||
assert(rbuf_count == 0);
|
||||
r = read(0, rbuf, BUFSZ);
|
||||
if (r < 1) {
|
||||
perror("read");
|
||||
abort();
|
||||
}
|
||||
rbuf_count = r;
|
||||
}
|
||||
|
||||
if (FD_ISSET( 1, &wfds )) {
|
||||
/* Can write to stdout */
|
||||
assert(rbuf_count > 0);
|
||||
r = write(1, rbuf, rbuf_count);
|
||||
if (r < 1) {
|
||||
perror("write");
|
||||
abort();
|
||||
}
|
||||
rbuf_count -= r;
|
||||
if (rbuf_count)
|
||||
memmove(rbuf + r, rbuf, rbuf_count);
|
||||
}
|
||||
|
||||
|
||||
/* Check and handle events generated by miniglx:
|
||||
*/
|
||||
while (XCheckMaskEvent( dpy, ~0, &ev )) {
|
||||
struct client *c;
|
||||
bored = 0;
|
||||
|
||||
fprintf(stderr, "Received event %d\n", ev.type);
|
||||
|
||||
switch (ev.type) {
|
||||
case CreateNotify:
|
||||
fprintf(stderr, "CreateNotify -- new client\n");
|
||||
c = malloc(sizeof(*c));
|
||||
c->next = clients;
|
||||
c->windowid = ev.xcreatewindow.window;
|
||||
c->mappable = False;
|
||||
clients = c;
|
||||
break;
|
||||
|
||||
case DestroyNotify:
|
||||
fprintf(stderr, "DestroyNotify\n");
|
||||
c = find_client(ev.xdestroywindow.window);
|
||||
if (!c) break;
|
||||
if (c == clients)
|
||||
clients = c->next;
|
||||
else {
|
||||
struct client *t;
|
||||
for (t = clients ; t->next != c ; t = t->next)
|
||||
;
|
||||
t->next = c->next;
|
||||
}
|
||||
|
||||
if (c == mapped_client)
|
||||
mapped_client = 0;
|
||||
|
||||
free(c);
|
||||
break;
|
||||
|
||||
case MapRequest:
|
||||
fprintf(stderr, "MapRequest\n");
|
||||
c = find_client(ev.xmaprequest.window);
|
||||
if (!c) break;
|
||||
c->mappable = True;
|
||||
break;
|
||||
|
||||
case UnmapNotify:
|
||||
fprintf(stderr, "UnmapNotify\n");
|
||||
c = find_client(ev.xunmap.window);
|
||||
if (!c) break;
|
||||
c->mappable = False;
|
||||
if (c == mapped_client)
|
||||
mapped_client = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Search for first mappable client if none already mapped.
|
||||
*/
|
||||
if (!mapped_client) {
|
||||
struct client *c;
|
||||
for (c = clients ; c ; c = c->next) {
|
||||
if (c->mappable) {
|
||||
XMapWindow( dpy, c->windowid );
|
||||
mapped_client = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!clients && autostart) {
|
||||
system("nohup ./texline &");
|
||||
system("nohup ./manytex &");
|
||||
}
|
||||
}
|
||||
else if (bored) {
|
||||
struct client *c;
|
||||
/* bored of mapped client now, let's try & find another one */
|
||||
for (c = mapped_client->next ; c && !c->mappable ; c = c->next)
|
||||
;
|
||||
if (!c)
|
||||
for (c = clients ; c && !c->mappable ; c = c->next)
|
||||
;
|
||||
if (c && c != mapped_client) {
|
||||
XUnmapWindow( dpy, mapped_client->windowid );
|
||||
XMapWindow( dpy, c->windowid );
|
||||
mapped_client = c;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "I'm bored!\n");
|
||||
}
|
||||
}
|
||||
|
||||
XCloseDisplay( dpy );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,267 +0,0 @@
|
|||
|
||||
/*
|
||||
* Test textured lines.
|
||||
*
|
||||
* Brian Paul
|
||||
* September 2000
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
#include "../util/readtex.c" /* I know, this is a hack. */
|
||||
|
||||
#define TEXTURE_FILE "../images/girl.rgb"
|
||||
|
||||
static GLboolean Antialias = GL_FALSE;
|
||||
static GLboolean Animate = GL_FALSE;
|
||||
static GLint Texture = 1;
|
||||
static GLboolean Stipple = GL_FALSE;
|
||||
static GLfloat LineWidth = 1.0;
|
||||
|
||||
static GLfloat Xrot = -60.0, Yrot = 0.0, Zrot = 0.0;
|
||||
static GLfloat DYrot = 1.0;
|
||||
static GLboolean Points = GL_FALSE;
|
||||
static GLfloat Scale = 1.0;
|
||||
|
||||
static void Idle( void )
|
||||
{
|
||||
if (Animate) {
|
||||
Zrot += DYrot;
|
||||
glutPostRedisplay();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
GLfloat x, y, s, t;
|
||||
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(Xrot, 1.0, 0.0, 0.0);
|
||||
glRotatef(Yrot, 0.0, 1.0, 0.0);
|
||||
glRotatef(Zrot, 0.0, 0.0, 1.0);
|
||||
glScalef(Scale, Scale, Scale);
|
||||
|
||||
if (Texture)
|
||||
glColor3f(1, 1, 1);
|
||||
|
||||
if (Points) {
|
||||
glBegin(GL_POINTS);
|
||||
for (t = 0.0; t <= 1.0; t += 0.025) {
|
||||
for (s = 0.0; s <= 1.0; s += 0.025) {
|
||||
x = s * 2.0 - 1.0;
|
||||
y = t * 2.0 - 1.0;
|
||||
if (!Texture)
|
||||
glColor3f(1, 0, 1);
|
||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, t, s);
|
||||
glTexCoord2f(s, t);
|
||||
glVertex2f(x, y);
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
else {
|
||||
glBegin(GL_LINES);
|
||||
for (t = 0.0; t <= 1.0; t += 0.025) {
|
||||
x = t * 2.0 - 1.0;
|
||||
if (!Texture)
|
||||
glColor3f(1, 0, 1);
|
||||
glTexCoord2f(t, 0.0);
|
||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, t);
|
||||
glVertex2f(x, -1.0);
|
||||
if (!Texture)
|
||||
glColor3f(0, 1, 0);
|
||||
glTexCoord2f(t, 1.0);
|
||||
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, t);
|
||||
glVertex2f(x, 1.0);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
GLfloat ar = (float) width / height;
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -ar, ar, -1.0, 1.0, 10.0, 100.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -12.0 );
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 'a':
|
||||
Antialias = !Antialias;
|
||||
if (Antialias) {
|
||||
glEnable(GL_LINE_SMOOTH);
|
||||
glEnable(GL_POINT_SMOOTH);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
else {
|
||||
glDisable(GL_LINE_SMOOTH);
|
||||
glDisable(GL_POINT_SMOOTH);
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
Texture++;
|
||||
if (Texture > 2)
|
||||
Texture = 0;
|
||||
if (Texture == 0) {
|
||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
}
|
||||
else if (Texture == 1) {
|
||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
}
|
||||
else {
|
||||
glActiveTextureARB(GL_TEXTURE0_ARB);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
}
|
||||
break;
|
||||
case 'w':
|
||||
LineWidth -= 0.25;
|
||||
if (LineWidth < 0.25)
|
||||
LineWidth = 0.25;
|
||||
glLineWidth(LineWidth);
|
||||
glPointSize(LineWidth);
|
||||
break;
|
||||
case 'W':
|
||||
LineWidth += 0.25;
|
||||
if (LineWidth > 8.0)
|
||||
LineWidth = 8.0;
|
||||
glLineWidth(LineWidth);
|
||||
glPointSize(LineWidth);
|
||||
break;
|
||||
case 'p':
|
||||
Points = !Points;
|
||||
break;
|
||||
case 's':
|
||||
Stipple = !Stipple;
|
||||
if (Stipple)
|
||||
glEnable(GL_LINE_STIPPLE);
|
||||
else
|
||||
glDisable(GL_LINE_STIPPLE);
|
||||
break;
|
||||
case ' ':
|
||||
Animate = !Animate;
|
||||
if (Animate)
|
||||
glutIdleFunc(Idle);
|
||||
else
|
||||
glutIdleFunc(NULL);
|
||||
break;
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
printf("LineWidth, PointSize = %f\n", LineWidth);
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void SpecialKey( int key, int x, int y )
|
||||
{
|
||||
float step = 3.0;
|
||||
(void) x;
|
||||
(void) y;
|
||||
|
||||
switch (key) {
|
||||
case GLUT_KEY_UP:
|
||||
Xrot += step;
|
||||
break;
|
||||
case GLUT_KEY_DOWN:
|
||||
Xrot -= step;
|
||||
break;
|
||||
case GLUT_KEY_LEFT:
|
||||
Yrot += step;
|
||||
break;
|
||||
case GLUT_KEY_RIGHT:
|
||||
Yrot -= step;
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Init( int argc, char *argv[] )
|
||||
{
|
||||
GLuint u;
|
||||
for (u = 0; u < 2; u++) {
|
||||
glActiveTextureARB(GL_TEXTURE0_ARB + u);
|
||||
glBindTexture(GL_TEXTURE_2D, 10+u);
|
||||
if (u == 0)
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
if (u == 0)
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||
else
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
|
||||
printf("Error: couldn't load texture image\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
glLineStipple(1, 0xff);
|
||||
|
||||
if (argc > 1 && strcmp(argv[1], "-info")==0) {
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
|
||||
printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
|
||||
printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowSize( 400, 300 );
|
||||
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
|
||||
glutCreateWindow(argv[0] );
|
||||
|
||||
Init(argc, argv);
|
||||
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutSpecialFunc( SpecialKey );
|
||||
glutDisplayFunc( Display );
|
||||
if (Animate)
|
||||
glutIdleFunc( Idle );
|
||||
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -48,7 +48,7 @@ int main(int argc, char** argv)
|
|||
unsigned stride = width * 4;
|
||||
unsigned size = stride * height;
|
||||
const char *filename = "mybin.bin";
|
||||
enum pipe_format format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
||||
enum pipe_format format = PIPE_FORMAT_B8G8R8A8_UNORM;
|
||||
|
||||
dump(width, height, stride, format, rbug_read(filename, size), size);
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
{
|
||||
int n;
|
||||
GLubyte* pixels;
|
||||
size_t num_read;
|
||||
|
||||
FILE* infile = fopen( filename, "rb" );
|
||||
|
||||
|
|
@ -83,8 +84,10 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
exit(1);
|
||||
}
|
||||
|
||||
fread( width, sizeof( GLsizei ), 1, infile );
|
||||
fread( height, sizeof( GLsizei ), 1, infile );
|
||||
num_read = fread( width, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
num_read = fread( height, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
|
||||
*width = bswap(*width);
|
||||
*height = bswap(*height);
|
||||
|
|
@ -101,7 +104,8 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
return NULL;
|
||||
}
|
||||
|
||||
fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
num_read = fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
assert(num_read == n);
|
||||
|
||||
fclose( infile );
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
{
|
||||
int n;
|
||||
GLubyte* pixels;
|
||||
size_t num_read;
|
||||
|
||||
FILE* infile = fopen( filename, "rb" );
|
||||
|
||||
|
|
@ -91,8 +92,10 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
exit(1);
|
||||
}
|
||||
|
||||
fread( width, sizeof( GLsizei ), 1, infile );
|
||||
fread( height, sizeof( GLsizei ), 1, infile );
|
||||
num_read = fread( width, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
num_read = fread( height, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
|
||||
*width = bswap(*width);
|
||||
*height = bswap(*height);
|
||||
|
|
@ -106,7 +109,8 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
return NULL;
|
||||
}
|
||||
|
||||
fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
num_read = fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
assert(num_read == n);
|
||||
|
||||
fclose( infile );
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
*/
|
||||
#include <GL/glew.h>
|
||||
#include <GL/glut.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
|
@ -78,6 +79,7 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
{
|
||||
int n;
|
||||
GLubyte* pixels;
|
||||
size_t num_read;
|
||||
|
||||
FILE* infile = fopen( filename, "rb" );
|
||||
|
||||
|
|
@ -86,8 +88,10 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
return NULL;
|
||||
}
|
||||
|
||||
fread( width, sizeof( GLsizei ), 1, infile );
|
||||
fread( height, sizeof( GLsizei ), 1, infile );
|
||||
num_read = fread( width, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
num_read = fread( height, sizeof( GLsizei ), 1, infile );
|
||||
assert(num_read == 1);
|
||||
|
||||
*width = bswap(*width);
|
||||
*height = bswap(*height);
|
||||
|
|
@ -101,7 +105,8 @@ readImage( const char* filename, GLsizei* width, GLsizei *height )
|
|||
return NULL;
|
||||
}
|
||||
|
||||
fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
num_read = fread( pixels, sizeof( GLubyte ), n, infile );
|
||||
assert(num_read == n);
|
||||
|
||||
fclose( infile );
|
||||
|
||||
|
|
|
|||
1
progs/tests/.gitignore
vendored
1
progs/tests/.gitignore
vendored
|
|
@ -104,6 +104,7 @@ vptorus
|
|||
vpwarpmesh
|
||||
yuvrect
|
||||
yuvsquare
|
||||
zbitmap
|
||||
zcomp
|
||||
zdrawpix
|
||||
zreaddraw
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue